短文相似度匹配

一、原始落後的VSM

網上搜索關鍵詞「短文本 相似度」,出來的結果基本上都是以BOW(Bag of words)的VSM方案,大致流程如下:

分詞 —> 提取關鍵詞 —> 計算tf或if-idf,以向量的形式替換原文本 —> 文本相似度的問題轉變為計算向量相似度

一開始這樣的一個思路,很清晰明了,而且網上相應的資料也很多,然後就開搞吧。

1、把所有短文本去掉標點符號,用jieba分詞分好詞,去除停用詞,得到分好的文本;

2、按一定規則抽取特徵辭彙,作為後期向量的每一維;

3、用sklearn庫中的原生方法CountVectorizer、TfidfVectorizer等得到矩陣;

4、每個短文本計算對應得到的向量,採用K-Means聚類的方法進行非監督學習。

文本分類的大致思路基本上就如上所述,具體的細節調整就視實際情況而定。然而,想法是美好的,現實是殘酷的,全部分好詞的文本,抽取的特徵詞較多,即向量的維度較大,且向量是稀疏的,在使用K-Means時,會出現有個別cluster下的文本數量特別大;

經過多次嘗試之後,對CountVectorizer生成的詞頻矩陣使用LDA進行降維,即使用topic對文本進行建模,向量的維度是各個topic,每個維度的值就是該文本和該topic的近似度,該向量並不是稀疏的,一定程度上避免了稀疏性導致的兩文本很難匹配上的問題,實際的測試結果也證明,LDA可以解決上述個別cluster下文本數量異常大的問題,相比於PCA降維效果更好。

解決了一個問題後,就是要改進以提高分類的精確度。由於短文本的先天性特徵詞數量少的原因,所以,首先要解決的就是提升短文本的信息量;最開始是想到的是近義詞替換,網上找到現成的近義詞詞典,把相近的詞都替換為一個,增大短文本之間有重疊部分的概率,但是由於現成的近義詞詞典的局限性,對於當前項目適配性不是很好,所以測試結果一般。

而後看到短文本擴充的方法,根據現有短文本的辭彙去找出關聯的幾個詞,填充的現有的短文本中去,增大文本的信息量;word2vec,網上很多例子都是用word2vec尋找某個詞的關聯詞,所以我把近義詞替換改為了使用word2vec尋找關聯詞,但是實際結果也是一般,因為插入新詞之後,同時也會引入更多的雜訊,收效甚微。

頭疼。。。

二、Word Embedding --- OMG!!!

最後,終於開竅了,發現之前使用Word2vec相當於繞了一圈,使用word2vec計算出的詞向量找關聯詞,還不如直接使用詞向量,

然後,網上一搜,發現word embedding,原來如此,得到短文本每個詞的詞向量,然後做最簡單的均值處理,得到文本向量,然後用文本向量去和其他文本求相似度,效果秒殺之前的所有好嘛!!!終於可以睡個安穩覺了

相比於之前的方案,簡單高效,直接用語料庫訓練處model,然後使用該model計算出短文本中各個詞的詞向量,然後求一個equal weighted的mean值,刪代碼刪的我都肉疼==!

Word2vec使用的是gensim中的,還挺方便,不過大家也可以自己用tensorflow或keras自己寫一個網路來訓練;具體的準確度還取決於語料庫的大小。

現在有一個更快的庫就是fasttext,GitHub上有pre-trained的各語言的model,大家可以直接拿來用。

推薦閱讀:

一樣的打遊戲,不一樣的酷
從建立清晰的步驟開始——Machine Learning Project Checklist
馬庫斯:DeepMind新出的機器心智網路不錯,但有誤導性
強化學習——環境庫OpenAI Gym
機器學習面試之偏差方差

TAG:機器學習 | 深度學習DeepLearning | 文本挖掘 |