基于詞頻的文本相似度
-
- 文本
- 分詞
- 統計詞頻
- 詞頻向量
- 相似度計算
- 應用
項目源碼: https://github.com/zhang2172268/mygit/tree/master/textSimilarity/textSimilarity
文本
- 原理(基于詞頻):統計詞頻,建構詞頻特征向量,利用特征向量夾角餘弦表示文本相似度。 統計文本中每個詞出現的次數,即詞頻,通過詞頻建構文本向量,通過計算兩個文本向量之間的餘弦相似度,反映兩個文本之間的相似度;這類算法也有缺點,沒有很好地解決文本資料中存在的自然語言問題,即同義詞和多義詞。
基于詞頻的文本相似度 - 文本分詞->去掉停用詞->統計詞頻->建構詞頻向量->計算餘弦相似度
分詞
第一步進行文本分詞
詞是最小的能夠獨立活動的有意義的語言成分,英文單詞之間是以空格作為自然分界符的,而漢語是以字為基本的書寫機關,詞語之間沒有明顯的區分标記,是以中文是一定要分詞的。
- 基于jieba分詞第三方庫。
- 介紹一下jieba第三方庫所用到的算法。
- 基于字首詞典實作高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖 (DAG);
- 采用了動态規劃查找最大機率路徑, 找出基于詞頻的最大切分組合;
- 對于未登入詞,采用了基于漢字成詞能力的 HMM 模型,使用了 Viterbi 算法。
- 我主要是用這個庫來實作文本的精确分詞,接着拿到這些詞的出現的頻率,建構基于詞頻的特征向量。通過特征向量借助多種算法來求文本相似度。
- 注:在linux下編碼方式是UTF-8的,但是在windows下編碼方式是GBK的;但是jieba 分詞隻支援UTF-8編碼方式,是以我在windows下VS中使用jieba 時,要先将詞的編碼方式進行轉換。
第二步去掉停用詞
人類語言包含很多功能詞。與其他詞相比,功能詞沒有什麼實際含義。 停用詞主要包括數字、标點符号及使用頻率特高的詞(代詞,語氣助詞、副詞、介詞、連接配接詞 )等。
我
我們
怎麼辦
總之
此外 然而 不如 不妨 。 , ?
…
停用詞不代表實際意義,是以不需要統計停用詞的詞頻,停用詞不參與建構詞頻向量。
統計詞頻
第三步統計詞頻
- 詞頻
- 詞頻即為單詞在文章中出現的次數。
- 詞頻的大小一般可以反映一個詞在一篇文章中的重要性,詞頻越大,可以認為該詞越重要。
- 一篇文章的語義可以由一組關鍵詞簡要概括,比如"今天早上八點鐘,我要去教室上課",關鍵詞"八點,教室,上課"。
- 分詞編碼
- 在建構文本詞頻向量時,需要考慮向量的意義,也必須保證向量的一緻性,這樣才有可比性。
-
意義:文本的語義,用詞頻來表示
一緻性:如何保證一緻性?向量中的每一維值都應該表示相同的意思。
更具體的說,一緻性就展現在兩個文本向量的每一維都應該表示同一個詞的詞頻。
舉個例子:
文檔1:今天/有事/,/沒辦法/去/教室/上課/了
文檔2:真想/去/教室/上課/,/但是/今天/有事/,/去不了/教室/了
文檔1中的詞頻:[今天:1,有事:1,沒辦法:1,去:1,教室:1,上課:1,了:1]
文檔2中的詞頻:[真想:1,去:1,教室:2,上課:1,但是:1, 今天:1,有事:1,去不了:1,了:1]
-
去掉停用詞之後:
文檔1中的詞頻:[有事:1,沒辦法:1,去:1,教室:1,上課:1]
文檔2中的詞頻:[真想:1,去:1,教室:2,上課:1, 有事:1,去不了:1]
- 直接用上述詞頻建構每一個文本的詞頻向量無意義,每一維表示的意思不同,兩個向量沒有可比性。
- 建構一緻的詞頻向量:給每一維的詞頻編碼,然後去看每一維的詞頻向量。
-
把兩個文本中的所有有效詞全部編碼,對于長文本可以按詞頻從大到小排序,取前n個關鍵詞按照碼值建構詞頻向量.
比如:
文檔1中的詞頻:[有事:1,沒辦法:1,去:1,教室:1,上課:1]
文檔2中的詞頻:[真想:1,去:1,教室:2,上課:1, 有事:1,去不了:1]
所有有效詞:比特,去,真想,上課,有事,去不了,沒辦法
給所有有效詞編碼:教室:0,去:1,真想:2,上課:3,有事:4,去不了:5,沒辦法:6
詞頻向量
第四步統計詞頻向量
通過上述詞的編碼值,建構詞頻向量
文檔1中的詞頻:[0:1,1:1,2:0,3:1,4:1,5:0,6:1]
文檔2中的詞頻:[0:2,1:1,2:1,3:1, 4:1,5:1,6:0]
文檔1詞頻向量:[1,1,0,1,1,0,1]
文檔2詞頻向量:[2,1,1,1, 1,1,0]
相似度計算
第五步計算餘弦相似度
餘弦相似度,是通過計算兩個向量的夾角餘弦值來評估他們的相似度:
其它常用計算向量相似度的方式:歐幾裡得距離,jaccard系數(類似餘弦相似度),曼哈頓距離(類似歐幾裡得距離)。
應用
論文檢測,文本分類。