TF-IDF算法全稱爲term frequency–inverse document frequency。TF就是term frequency的縮寫,意爲詞頻。IDF則是inverse document frequency的縮寫,意爲逆文檔頻率。html
該算法在信息處理中一般用來抽取關鍵詞。好比,對一個文章提取關鍵詞做爲搜索詞,就能夠採用TF-IDF算法。算法
要找出一篇文章中的關鍵詞,一般的思路就是,就是找到出現次數最多的詞。若是某個詞很重要,它應該在這篇文章中屢次出現。因而,咱們進行"詞頻"(Term Frequency,縮寫爲TF)統計。c#
可是一般,一篇中文的文章中,都會有不少沒有實際意義的詞,好比「的」,「是」,「了」,這類詞是最經常使用的詞,稱爲停用詞,稱它們爲停用詞是由於在文本處理過程當中若是遇到它們,則當即中止處理,將其扔掉。將這些詞扔掉減小了索引量,增長了檢索效率,而且一般都會提升檢索的效果。停用詞主要包括英文字符、數字、數學字符、標點符號及使用頻率特高的單漢字等。ide
當過濾掉全部的停用詞後,剩下的都是實際意義的詞,但也不能簡單的認爲那個詞出現的次數多就是關鍵詞。好比在一篇如何組裝電腦的文章中,出現「CPU」,「主板」等關鍵詞和出現「說明書」的次數同樣多,但很顯然,CPU,主板等關鍵詞,更能肯定這個文章的特性。也就是說,「CPU」,「主板」等關鍵詞比「說明書」這個關鍵詞更重要,須要排在前面。因此咱們就須要一個權重係數,用來調整各個關鍵詞的重要性。若是一個詞不多見,可是它在某個文章中反覆出現屢次,那麼能夠認爲這個詞反應了這個文章的特性,能夠把它做爲關鍵詞。在信息檢索中,這個權重很是重要,它決定了關鍵詞的重要度,這個權重叫作"逆文檔頻率"(Inverse Document Frequency,縮寫爲IDF),它的大小與一個詞的常見程度成反比。工具
在知道了詞頻和權重以後,二者相乘,就獲得一個詞的TF-IDF值,某個詞對文章的重要性越高,它的TF-IDF值就越大。因此,排在最前面的幾個詞,就是這篇文章的關鍵詞。spa
所以TF-IDF算法的主要工做就是計算出TF*IDF值最大的那幾個詞,做爲文章的關鍵詞。3d
計算TF*IDF值須要分紅如下幾步:htm
首先須要切詞,也就是說把一個文章切成一個個能夠做爲關鍵字的詞語。因爲中文不像英文那樣,能夠經過空格切詞,所以到目前爲止,中文分詞包括三種方法:blog
1)基於字符串匹配的分詞;排序
2)基於理解的分詞;
3)基於統計的分詞。
目前還沒法證實哪種方法更準確,第一種方法是最先出現也是最成熟的算法,算法複雜度也是最低的。切詞首先須要一個語料庫,而後根據這個庫,匹配其中的詞語。目前較流行不少,可是支持.NET平臺的很少見,主要有中科院計算所ICTCLAS系統和盤古分詞,功能強大自帶詞典,同時支持用戶詞典,而且支持.NET開發者調用。
分詞完成後,就能夠計算詞頻。詞頻就是某歌詞在文章中出現的次數,因爲文章有長短,爲了規格化詞頻的,取詞頻爲一個相對值,而不是絕對值。這個相對值能夠有2種計算方法。
一種
詞頻(TF)=某關鍵詞出現次數/文章中關鍵詞總數
或者
詞頻(TF)=某關鍵詞出現次數/文章中出現最屢次數關鍵詞的出現次數
接着,計算逆文檔頻率(IDF)。計算IDF須要一個語料庫,它的計算公式很簡單
逆文檔頻率(IDF)=log(語料庫文檔總數/(包含該詞的文檔數+1)),之因此要+1是爲了防止分母爲0。因而可知,當一個詞被越多的文檔包含,則IDF值就越小,也就是所這個詞很常見,不是最重要的能區分文章特性的關鍵詞。
最後將TF和IDF相乘就獲得TF-IDF值。
前面提到的盤古分詞的詞庫中,已經包含了IDF的值,所以使用這個分詞工具,也能夠計算出各個關鍵詞的TF-IDF值,實現排序。
舉個例子,以下一個文章。
標題爲清華科研團隊重大突破 人類有望「餓死」癌細胞
京華時報訊(記者張曉鴿)昨天,清華大學宣佈:該校醫學院顏寧教授研究組在世界上首次解析了人源葡萄糖轉運蛋白GLUT1的晶體結構,初步揭示了它的工做機制以及相關疾病的致病機理,在人類攻克×××、糖尿病等重大疾病的探索道路上邁出了極爲重要的一步。將來,人類有望「餓死」癌細胞。
昨天的英國《天然》雜誌以長文的形式正式刊發了這一成果。據介紹,葡萄糖是地球上各類生物最重要、最基本的能量來源,也是人腦和神經系統最主要的供能物質。據估算,大腦平均天天消耗約120克葡萄糖,占人體葡萄糖總消耗量的一半以上。葡萄糖代謝的第一步就是進入細胞,但親水的葡萄糖溶於水,而疏水的細胞膜就像一層油,所以,葡萄糖自身沒法穿過細胞膜進入到細胞內發揮做用,必須依靠轉運蛋白這個「運輸機器」來完成。葡萄糖轉運蛋白鑲嵌於細胞膜上,如同在疏水的細胞膜上開了一扇一扇的門,可以將葡萄糖從細胞外轉運到細胞內。
顏寧教授介紹稱,葡萄糖轉運蛋白GLUT1幾乎存在於人體的每個細胞,是大腦、神經系統、肌肉等組織器官中最重要的葡萄糖轉運蛋白,對維持人體正常生理功能極爲重要。這種轉運蛋白的功能徹底缺失將致人死亡,功能部分缺失會致使大腦萎縮、智力低下、發育遲緩等疾病。
同時,這種轉運蛋白在癌細胞的新陳代謝中也發揮着重要功能。癌細胞須要消耗超量葡萄糖才能維持其生長擴增,轉運蛋白GLUT1在細胞中顯著過量每每意味着有癌變發生。
「所以,如能研究清楚GLUT1的組成、結果和工做機理,就有可能經過調控它實現葡萄糖轉運的人工干預。」顏寧教授說,這樣既能夠增長正常細胞的葡萄糖供應,達到治療相關疾病的目的,又能夠經過阻斷葡萄糖供應「餓死」癌細胞。
使用C#代碼調用盤古分詞的dll,以下:
static void Main(string[] args) { string text = ReadFile(@"D:\系統桌面\ar1.txt"); PanGu.Segment.Init(); Segment segment = new Segment(); //調用分詞方法 ICollection<WordInfo> words = segment.DoSegment(text); Dictionary<string, double> d = new Dictionary<string, double>(); foreach (var word in words) { //統計頻率 float tf = (float)System.Text.RegularExpressions.Regex.Matches(text, word.Word).Count / (float)words.Count; if (!d.ContainsKey(word.Word)) d[word.Word] = tf * word.Frequency; } //排序 var lst = d.Select(x => x.Key).OrderByDescending(x => d[x]).ToList(); //打印出前5個關鍵詞 lst.Take(5).ToList().ForEach(x => Console.WriteLine(x)); }
結果爲:
用這幾個關鍵詞去百度裏面查詢,獲得的查詢結果爲:
TF-IDF算法的優勢是簡單快速,結果比較符合實際狀況。缺點是,單純以"詞頻"衡量一個詞的重要性,不夠全面,有時重要的詞可能出現次數並很少。並且,這種算法沒法體現詞的位置信息,出現位置靠前的詞與出現位置靠後的詞,都被視爲重要性相同,這是不正確的。(一種解決方法是,對全文的第一段和每一段的第一句話,給予較大的權重。)
當經過TF-IDF算法找出文章的關鍵字後,能夠運用到一些具體的場景。好比:根據關鍵字找出類似的文章。
參考文檔:
http://www.ruanyifeng.com/blog/2013/03/tf-idf.html
http://zh.wikipedia.org/wiki/TF-IDF