核心思想是計算文檔中壹個詞的標準化TF值,然後計算該詞在整個語料庫中的標準化IDF值。這裏的標準化是指對原有的計算公式做了壹些改動,以達到更好的測量結果,避免壹些極端情況的發生。這個字的TF-IDF值等於TF*IDF。計算這個文檔中所有單詞的TF-IDF值,並從高到低排序,這樣我們就可以提取出我們想要的盡可能多的關鍵詞。
TF-IDF的優點是速度快,結果相對符合實際情況。缺點是當文檔中兩個單詞的IDF值相同時,出現頻率較低的單詞可能更重要。而且TF-IDF算法不能反映我的詞的位置信息,把出現在前面位置的詞和出現在後面位置的詞視為同等重要,這是不正確的。現有的解決方案是對第壹段和每段的第壹句給予更大的權重。
應用2:計算文本相似度
我明白如何計算每個單詞的TF-IDF值。那麽計算文本相似度就很容易了。我們已經計算了文章中每個單詞的TF-IDF值,因此我們可以將文章表征為該單詞的TF-IDF數值向量。要計算兩個文本的相似度,只需計算余弦即可。余弦值越大,兩個文本越相似。
應用3:自動摘要
2007年,美國學者的論文
以第壹張圖為例,其中cluster-* *有七個詞,其中四個是關鍵詞。所以它的重要性得分等於(4*4)/7=2.3。然後,找出聚類重要性得分最高的句子(比如5個句子)放在壹起,形成這篇文章的自動摘要。看見
Summarizer(originalText,maxSummarySize):
//?計算文本的詞頻並生成列表,如[(10,' the '),?(3,“語言”),?(8,“代碼”)...]
詞頻?=?getWordCounts(originalText)
//?過濾掉停用詞,列表就變成[(3,?語言’),?(8,?代碼’)...]
contentWordFrequences?=?filtStopWords(詞頻)
//?根據詞頻大小,列表為[‘碼’,?“語言”...]
contentWordsSortbyFreq?=?sortByFreqThenDropFreq(內容詞頻率)
//?把文章分成句子
句子?=?獲取句子(原始文本)
//?選擇關鍵字首次出現的句子。
setSummarySentences?=?{}
foreach?詞?在?contentWordsSortbyFreq:
firstMatchingSentence?=?搜索(句子,?word)
setsummarysentences . add(firstMatchingSentence)
如果?setSummarySentences.size()?=?maxSummarySize:
破裂
//?按照出現的順序對所選的句子進行總結。
總結?=?""
foreach?句子?在?句子:
如果?句子?在?setSummarySentences:
總結?=?總結?+?"?"?+?句子
回歸?類似的summary的算法已經寫成了工具,比如基於Java的Classifier4J庫的SimpleSummariser模塊,基於C語言的OTS庫,基於classifier4J的C#實現和python實現。