演算法集錦(2)|scikit-learn| 如何利用文本挖掘推薦Ted演講

點擊藍色字體,關註:九三智能控

當我第一次看到"Ted Talk"數據集的時候,腦子裡立刻冒出一些有意思的想法。首先,既然Ted Talk數據集包含了許多Ted演講的演講詞文本,那麼我們自然而然的就擁有了一個非常豐富且規範的預料庫。第二,既然這個語料庫有非常好的語言學屬性,那麼它可能是一個類似於Reuters 20 News Group這種非常優秀的數據集。所以,我們能不能利用這些演講文本,利用它們之間的相關性,搭建一個像Ted官方網站一樣的內容推薦系統呢?

當然,Ted官網用的推薦引擎,可定比本文採用的演算法更加複雜,因為它會利用用戶的歷史交互信息。而本文則提出了一種僅利用演講的台詞內容,就可以進行內容推薦的方法,這一方法在你沒有用戶交互數據,但仍希望能推薦給用戶一些相關聯的內容時非常有用。

接下來,我們介紹具體的方法。

步驟1:審查數據

所有的Ted Talk數據存儲在一個Excel表中,每個演講的台詞文本存儲在一列名為transcript的單元格內,就像下面的樣子。

import pandas as pdtranscripts=pd.read_csv("E:\Kaggle\ted-data\transcripts.csv")transcripts.head()

檢查完數據,我們發現可以從url一列中提取出演講的名稱。而我們的最終目標是利用transcript列的內容來獲得演講之間的相似度,然後推薦4個與給定演講最相似的視頻。

利用以下代碼可以輕鬆的提取演講名稱(title)。

transcripts[title]=transcripts[url].map(lambda x:x.split("/")[-1]) transcripts.head()

要想創建推薦系統,接下來需要完成以下幾個步驟。

(1)創建一個代表演講文本的向量空間模型

(2)建立向量空間模型的相似度矩陣

(3)基於相似度方法,為每一個演講選擇4個相似的演講。

步驟2:利用Tf-Idf創建文本向量

因為我們是基於演講內容進行推薦,所以首先要做的是建立一個便於比較的文本內容標識方法。一種可行的方法是創建文本的Tf-Idf向量。

語料集、文檔和向量空間

為了表示文本,我們可以將每個演講看做一個文檔(Document),將所有的文檔的詞語構成一個語料集(Corpus)。然後用一個布爾型的向量描述每個文檔,其中1表示這個詞出現在文檔中,0則表示該詞沒有出現。所以,每個文檔都可以看做向量空間(語料集)中的一個向量。

但這個簡單的方法存在的問題很明顯。首先,該方法中每個詞在文檔中的重要程度相同,但直觀來說,出現次數多的詞更適合描述一篇文檔。此外,當文檔比較長時,其與指定文檔的重疊的積累更大,從而導致推薦演算法更傾向於推薦長文檔。

為了解決簡單布爾演算法的缺陷,文檔可以通過Tf-Idf轉換成歐幾里得空間中的向量。空間的維度構成對應文檔中出現的關鍵詞(Term),每個文檔在向量空間中的位置由兩個子量的乘積得到:詞頻(Term Frequency)和反文檔頻率(Inverse document frequency)。

Tf-Idf(Term Frequency -Inverse Document Frequency)方法

可以通過考慮以下三個問題來確定一個單詞在文檔中的重要性。

(1)該詞是否在文檔中經常出現?

(2)該詞是否在語料集中很少出現 ?

(3)同時滿足(1)和(2)?

如果一個單詞在文檔中出現次數很多,但在其他文檔中很少出現,則該單詞在文檔中無疑是重要的。詞頻描述某個詞在文檔中出現的頻繁程度;而反文檔頻率是組合了詞頻後的第二個指標,旨在降低所有文檔中幾乎都會出現的關鍵詞的權重。二者的乘積即是Tf-Idf。

利用機器學習框架(比如scikit-learn)計算Tf-Idf並創建文本的向量空間非常簡單。

from sklearn.feature_extraction import text Text=transcripts[transcript].tolist() tfidf=text.TfidfVectorizer(input=Text,stop_words="english") matrix=tfidf.fit_transform(Text) #print(matrix.shape)

利用Tf-Idf方法,我們解決了演講內容的向量表示問題,接下來我們研究如何找到與指定內容相似的演講。

步驟3:找到相似的演講

為了度量兩個不同演講的相似性,需要計算二者的相似度。通常,利用餘弦相似度(Cosine Similarity)來處理Tf-Idf向量。我們可以建立一個餘弦相似度矩陣來表示各個演講之間的相似性。

### Get Similarity Scores using cosine similarity from sklearn.metrics.pairwise import cosine_similarity sim_unigram=cosine_similarity(matrix)

最後,我們基於餘弦相似度矩陣來實現為選定內容推薦4個相似的演講這一目標。也就是說,從上面的相似度矩陣中,在指定的行中,找出5個相似度最大的列來,代碼如下。

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]

接下來,讓我們驗證下本文演算法的可行性。從Ted演講集中選擇 一個演講:

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]

可以看到,利用Tf-Idf向量及餘弦相似度,我們成功的建立了基於演講內容的推薦演算法。

關注公眾號,並點擊閱讀原文,可獲取Ted Talk數據集和源代碼,密碼: 2jjx


微信群&商業合作:

  • 加入微信群:不定期分享資料,拓展行業人脈請在公眾號留言:「微信號+名字+研究領域/專業/學校/公司」,我們將很快與您聯繫。
  • 投稿(無稿費)請發郵件至:158354995@qq.com

  • 商業合作請註明事宜哦

weixin.qq.com/r/AC91bd- (二維碼自動識別)


推薦閱讀:

簡單的文本可視化—詞雲
2017,那些出現在日記中的人:簡單的文本挖掘
文本挖掘:預處理
Python中文文本挖掘資料(轉貼怕自己忘記)
構建用於文本聚類的空間向量模型時,應該如何作特徵選擇?

TAG:AI技術 | TED | 文本挖掘 |