演算法集錦(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
- 商業合作請註明事宜哦
http://weixin.qq.com/r/AC91bd-EloLprZsO93oS (二維碼自動識別)
推薦閱讀:
※簡單的文本可視化—詞雲
※2017,那些出現在日記中的人:簡單的文本挖掘
※文本挖掘:預處理
※Python中文文本挖掘資料(轉貼怕自己忘記)
※構建用於文本聚類的空間向量模型時,應該如何作特徵選擇?