編者按:數(shù)據(jù)科學(xué)顧問Gunnvant Saini講解了如何基于Tf-Idf詞向量和余弦相似性根據(jù)字幕文件找出相似的TED演講。
好吧,我喜歡TED演講,誰不喜歡呢?當(dāng)我查看Kaggle上的TED數(shù)據(jù)集(rounakbanik/ted-talks)時,有不少發(fā)現(xiàn)。首先,由于數(shù)據(jù)集包含許多TED演講的字幕,因此我們有了一個非常豐富、語言學(xué)上結(jié)構(gòu)良好的語料。其次,由于該語料具備良好的語言學(xué)屬性,它很可能和Reuters 20 News Group或者古登堡語料庫差不好。這讓我靈機(jī)一動:
我有許多TED演講的字幕數(shù)據(jù),我能嘗試找到一種根據(jù)演講相似性推薦TED演講(就像TED官網(wǎng)做的那樣)的方法嗎?
當(dāng)然,TED官網(wǎng)所用的推薦系統(tǒng),會比我這里演示的復(fù)雜得多,同時涉及一些用戶交互的歷史數(shù)據(jù)。
本文想要演示如何僅僅基于內(nèi)容生成推薦。當(dāng)你不具備任何用戶交互數(shù)據(jù)時,比如在剛開始的時候,這一技術(shù)變得極為重要,它有助于向消費者提供內(nèi)容相關(guān)的上下文推薦。
數(shù)據(jù)
字幕儲存于transcript一列,每行對應(yīng)一個演講。
import pandas as pd
transcripts=pd.read_csv("E:\Kaggle\ted-data\transcripts.csv")
transcripts.head()
可以看到,從url很容易就能提取演講的標(biāo)題。我的目標(biāo)是使用字幕文本創(chuàng)建相似性的測度,然后為給定演講推薦4個最相似的演講。
transcripts['title']=transcripts['url'].map(lambda x:x.split("/")[-1])
transcripts.head()
好了,數(shù)據(jù)預(yù)處理完畢,我可以開始創(chuàng)建推薦系統(tǒng)了:
為字幕創(chuàng)建向量表示
為上一步創(chuàng)建的向量表示創(chuàng)建一個相似性矩陣
基于某種相似性測度,為每個演講選定4個最相似的演講
使用Tf-Idf創(chuàng)建詞向量
由于我們的最終目標(biāo)是基于內(nèi)容相似性推薦演講,我們首先要做的就是為字幕創(chuàng)建便于比較的表示。其中一種方法是為每個字幕創(chuàng)建一個tfidf向量。但是,到底什么是tfidf呢?讓我們先討論下這個概念。
語料庫、文檔和頻次矩陣
為了表示文本,我們將把每個字幕看成一個“文檔”,然后將所有文檔的集合看成一個“語料庫”。然后,二維碼將創(chuàng)建一個向量,表示每個文檔中詞匯出現(xiàn)的次數(shù),像這樣:
這些向量組成了一個矩陣,稱為頻次矩陣(count matrix)。不過,這樣的表示方式有一個問題。比如,“one”在文檔1中只出現(xiàn)過一次,但在其他文檔中均未出現(xiàn),所以“one”是一個重要的詞匯。但是如果我們查看文檔1的頻次向量,“one”的權(quán)重和“This”、“is”等詞一樣,都是1. 而Tf-Idf可以解決這一問題。
詞頻-逆向文檔頻率(Tf-Idf)
為了理解Tf-Idf如何幫助識別詞匯的重要性,讓我們詢問自己幾個問題,如何決定一個詞匯是否重要?
如果這個詞匯在文檔中多次出現(xiàn)?
如果這個詞匯很少在語料庫中出現(xiàn)?
同時滿足1和2?
如果一個詞匯在某個文檔中頻繁出現(xiàn),但在語料庫中的其他文檔中很少出現(xiàn),那么該詞匯對這個文檔很重要。詞頻(term frequency)衡量詞匯在給定文檔中出現(xiàn)的頻繁程度,而逆向文檔頻率(inverse document frequency)衡量詞匯在語料庫中出現(xiàn)的罕見程度。兩者之積Tf-Idf衡量詞匯的重要程度。使用sklearn機(jī)器學(xué)習(xí)框架,創(chuàng)建Tf-Idf向量表示非常直截了當(dāng):
from sklearn.feature_extraction import text
Text=transcripts['transcript'].tolist()
tfidf=text.TfidfVectorizer(input=Text,stop_words="english")
matrix=tfidf.fit_transform(Text)
現(xiàn)在我們已經(jīng)解決了如何在詞向量中體現(xiàn)詞匯重要性的問題,我們將開始考慮下一個問題,如何個找到給定文檔的相似文檔(在我們的例子中是TED演講字幕)?
查找相似文檔
通常,我們使用余弦相似度,衡量Tf-Idf向量的接近程度。也就是說,我將基于Tf-Idf向量創(chuàng)建一個余弦矩陣,表示文檔兩兩之間的相似程度:
同樣,使用sklearn做這個非常直接:
from sklearn.metrics.pairwise import cosine_similarity
sim_unigram=cosine_similarity(matrix)
創(chuàng)建了相似度矩陣后,我只需查詢這一矩陣,在每一行找出4個余弦相似度最高的列,就可以為每個文檔(字幕)選出最相似的4個文檔了。
def get_similar_articles(x):
return",".join(transcripts['title'].loc[x.argsort()[-5:-1]])
transcripts['similar_articles_unigram']=[get_similar_articles(x) for x in sim_unigram]
讓我們看下效果,比如,隨便挑一個演講,看看哪4個演講和它最相似:
transcripts['title'].str.replace("_"," ").str.upper().str.strip()[1]
'AL GORE ON AVERTING CLIMATE CRISIS'
transcripts['similar_articles_unigram'].str.replace("_"," ").str.upper().str.strip().str.split(" ")[1]
['RORY BREMNER S ONE MAN WORLD SUMMIT',
',ALICE BOWS LARKIN WE RE TOO LATE TO PREVENT CLIMATE CHANGE HERE S HOW WE ADAPT',
',TED HALSTEAD A CLIMATE SOLUTION WHERE ALL SIDES CAN WIN',
',AL GORE S NEW THINKING ON THE CLIMATE CRISIS']
顯然,從標(biāo)題上看,這些演講的主題是相似的。
-
向量
+關(guān)注
關(guān)注
0文章
55瀏覽量
11649 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1200瀏覽量
24619
原文標(biāo)題:TF-IDF和余弦相似度告訴你該看哪個TED演講
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論