TFIDF介紹


任務一:現在有一篇長文《中國的蜜蜂養殖》,用計算機提取它的關鍵詞。

1、詞頻:如果某個詞很重要,它應該在這篇文章中多次出現。我們進行"詞頻"(Term Frequency,縮寫為TF)統計。

2、停用詞:結果你肯定猜到了,出現次數最多的詞是----"的"、"是"、"在"----這一類最常用的詞。它們叫做"停用詞"(stop words),表示對找到結果毫無幫助、必須過濾掉的詞。

 

規則一:如果某個詞比較少見,但是它在這篇文章中多次出現,那么它很可能就反映了這篇文章的特性,正是我們所需要的關鍵詞。

  假設我們把它們都過濾掉了,只考慮剩下的有實際意義的詞

  發現"中國"、"蜜蜂"、"養殖"這三個詞的出現次數一樣多

  因為"中國"是很常見的詞,相對而言,"蜜蜂"和"養殖"不那么常見,"蜜蜂"和"養殖"的重要程度要大於"中國"

 

3、IDF :最常見的詞("的"、"是"、"在")給予最小的權重,

    較常見的詞("中國")給予較小的權重,

    較少見的詞("蜜蜂"、"養殖")給予較大的權重。

    這個權重叫做"逆文檔頻率"(Inverse Document Frequency,縮寫為IDF),

    它的大小與一個詞的常見程度成反比。

 

4、TF-IDF:"詞頻"(TF)和"逆文檔頻率"(IDF)以后,兩個值相乘,得到了一個詞的TF-IDF值。

    某個詞對文章的重要性越高,它的TF-IDF值就越大。

    所以,排在最前面的幾個詞,就是這篇文章的關鍵詞。

 

具體實現:

1、計算詞頻

  詞頻(TF) = 某個詞在文章中的出現次數

文章有長短之分,為了便於不同文章的比較,做"詞頻"標准化。

  詞頻(TF) = 某個詞在文章中的出現次數 / 文章總詞數

或者 詞頻(TF) = 某個詞在文章中的出現次數 / 擁有最高詞頻的詞的次數

 

2、某個詞在文章中的出現次數

這時,需要一個語料庫(corpus),用來模擬語言的使用環境。

逆文檔頻率(IDF) = log(語料庫的文檔總數/包含該詞的文檔總數+1)

 

3、計算TF-IDF

  TF-IDF = 詞頻(TF) * 逆文檔頻率(IDF)

  可以看到,TF-IDF與一個詞在文檔中的出現次數成正比,與該詞在整個語言中的出現次數成反比。

  所以,自動提取關鍵詞的算法就是計算出文檔的每個詞的TF-IDF值,

  然后按降序排列,取排在最前面的幾個詞。

 

從上表可見,"蜜蜂"的TF-IDF值最高,"養殖"其次,"中國"最低。(如果還計算"的"字的TF-IDF,那將是一個極其接近0的值。)

所以,如果只選擇一個詞,"蜜蜂"就是這篇文章的關鍵詞。

 

總結:

TF-IDF算法的優點是簡單快速,結果比較符合實際情況。

缺點是,單純以"詞頻"衡量一個詞的重要性,不夠全面,有時重要的詞可能出現次數並不多。

而且,這種算法無法體現詞的位置信息,出現位置靠前的詞與出現位置靠后的詞,都被視為重要性相同,這是不正確的。

(一種解決方法是,對全文的第一段和每一段的第一句話,給予較大的權重。)

 

任務二:TF-IDF與與余弦相似的應用:找相似文章

除了找到關鍵詞,還希望找到與原文章相似的其他文章

需要用到余弦相似性:

句子A:我喜歡看電視,不喜歡看電影

句子B:我不喜歡看電視,也不喜歡看電影

基本思路是:如果這兩句話的用詞越相似,它們的內容就應該越相似。

      因此,可以從詞頻入手,計算它們的相似程度。

 

1、分詞

  句子A:我/喜歡/看/電視,不/喜歡/看/電影。

  句子B:我/不/喜歡/看/電視,也/不/喜歡/看/電影。

2、列出所有值

  我,喜歡,看,電視,電影,不,也。

3、計算詞頻

  句子A:我 1,喜歡 2,看 2,電視 1,電影 1,不 1,也 0。

  句子B:我 1,喜歡 2,看 2,電視 1,電影 1,不 2,也 1

4、寫出詞頻向量。

  句子A:[1, 2, 2, 1, 1, 1, 0]

  句子B:[1, 2, 2, 1, 1, 2, 1]

我們可以通過夾角的大小,來判斷向量的相似程度。夾角越小,就代表越相似。

假定a向量是[x1, y1],b向量是[x2, y2],那么可以將余弦定理改寫成下面的形式

 結論:

  我們就得到了"找出相似文章"的一種算法:

  • 使用TF-IDF算法,找出兩篇文章的關鍵詞
  • 每篇文章各取出若干個關鍵詞(比如20個),合並成一個集合,計算每篇文章對於這個集合中的詞的詞頻(為了避免文章長度的差異,可以使用相對詞頻);
  • 生成兩篇文章各自的詞頻向量
  • 計算兩個向量的余弦相似度,值越大就表示越相似

計算兩個向量的余弦相似度,值越大就表示越相似

 

任務三:如何通過詞頻,對文章進行自動摘要

信息都包含在句子中,有些句子包含的信息多,有些句子包含的信息少。

"自動摘要"就是要找出那些包含信息最多的句子。

句子的信息量用"關鍵詞"來衡量。如果包含的關鍵詞越多,就說明這個句子越重要。

Luhn提出用"簇"(cluster)表示關鍵詞的聚集。所謂"簇"就是包含多個關鍵詞的句子片段。

 

只要關鍵詞之間的距離小於"門檻值",它們就被認為處於同一個簇之中。Luhn建議的門檻值是4或5。

也就是說,如果兩個關鍵詞之間有5個以上的其他詞,就可以把這兩個關鍵詞分在兩個簇。

簇的重要性 = (包含的關鍵詞數量)^2 / 簇的長度

其中的簇一共有7個詞,其中4個是關鍵詞。因此,它的重要性分值等於 ( 4 x 4 ) / 7 = 2.3。

 

然后,找出包含分值最高的簇的句子(比如5句),把它們合在一起,就構成了這篇文章的自動摘要

 1 Summarizer(originalText, maxSummarySize):
 2     // 計算原始文本的詞頻,生成一個數組,比如[(10,'the'), (3,'language'), (8,'code')...]
 3     wordFrequences = getWordCounts(originalText)
 4     // 過濾掉停用詞,數組變成[(3, 'language'), (8, 'code')...]
 5     contentWordFrequences = filtStopWords(wordFrequences)
 6     // 按照詞頻進行排序,數組變成['code', 'language'...]
 7     contentWordsSortbyFreq = sortByFreqThenDropFreq(contentWordFrequences)
 8     // 將文章分成句子
 9     sentences = getSentences(originalText)
10     // 選擇關鍵詞首先出現的句子
11     setSummarySentences = {}
12     foreach word in contentWordsSortbyFreq:
13       firstMatchingSentence = search(sentences, word)
14       setSummarySentences.add(firstMatchingSentence)
15       if setSummarySentences.size() = maxSummarySize:
16         break
17     // 將選中的句子按照出現順序,組成摘要
18     summary = ""
19     foreach sentence in sentences:
20       if sentence in setSummarySentences:
21         summary = summary + " " + sentence
22     return summary
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM