天天看點

基于詞頻的文本相似度

基于詞頻的文本相似度

    • 文本
    • 分詞
    • 統計詞頻
    • 詞頻向量
    • 相似度計算
    • 應用

項目源碼: 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系數(類似餘弦相似度),曼哈頓距離(類似歐幾裡得距離)。

應用

論文檢測,文本分類。

繼續閱讀