1. 程式人生 > >TF-IDF演算法簡介

TF-IDF演算法簡介

http://cnn237111.blog.51cto.com/2359144/1423795

TF-IDF演算法全稱為term frequency–inverse document frequency。TF就是term frequency的縮寫,意為詞頻。IDF則是inverse document frequency的縮寫,意為逆文件頻率。

該演算法在資訊處理中通常用來抽取關鍵詞。比如,對一個文章提取關鍵詞作為搜尋詞,就可以採用TF-IDF演算法。

要找出一篇文章中的關鍵詞,通常的思路就是,就是找到出現次數最多的詞。如果某個詞很重要,它應該在這篇文章中多次出現。於是,我們進行"詞頻"(Term Frequency,縮寫為TF)統計。

但是通常,一篇中文的文章中,都會有很多沒有實際意義的詞,比如“的”,“是”,“了”,這類詞是最常用的詞,稱為停用詞,稱它們為停用詞是因為在文字處理過程中如果遇到它們,則立即停止處理,將其扔掉。將這些詞扔掉減少了索引量,增加了檢索效率,並且通常都會提高檢索的效果。停用詞主要包括英文字元、數字、數學字元、標點符號及使用頻率特高的單漢字等。

當過濾掉所有的停用詞後,剩下的都是實際意義的詞,但也不能簡單的認為那個詞出現的次數多就是關鍵詞。比如在一篇如何組裝電腦的文章中,出現“CPU”,“主機板”等關鍵詞和出現“說明書”的次數一樣多,但很顯然,CPU,主機板等關鍵詞,更能確定這個文章的特性。也就是說,“CPU”,“主機板”等關鍵詞比“說明書”這個關鍵詞更重要,需要排在前面。所以我們就需要一個權重係數,用來調整各個關鍵詞的重要性。如果一個詞很少見,但是它在某個文章中反覆出現多次,那麼可以認為這個詞反應了這個文章的特性,可以把它作為關鍵詞。在資訊檢索中,這個權重非常重要,它決定了關鍵詞的重要度,這個權重叫做"逆文件頻率"(Inverse Document Frequency,縮寫為IDF),它的大小與一個詞的常見程度成反比。

在知道了詞頻和權重之後,兩者相乘,就得到一個詞的TF-IDF值,某個詞對文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的幾個詞,就是這篇文章的關鍵詞。

因此TF-IDF演算法的主要工作就是計算出TF*IDF值最大的那幾個詞,作為文章的關鍵詞。

計算TF*IDF值需要分成以下幾步:

首先需要切詞,也就是說把一個文章切成一個個可以作為關鍵字的詞語。由於中文不像英文那樣,可以通過空格切詞,因此到目前為止,中文分詞包括三種方法:

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,如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 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<stringdouble> d = new Dictionary<stringdouble>(); 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)); }

結果為:

4a8b1968bb7148caa79c710a643c7b2b[15]

用這幾個關鍵詞去百度裡面查詢,得到的查詢結果為:

eaef8dabe30d4703bb9a25215803e74d[15]

TF-IDF演算法的優點是簡單快速,結果比較符合實際情況。缺點是,單純以"詞頻"衡量一個詞的重要性,不夠全面,有時重要的詞可能出現次數並不多。而且,這種演算法無法體現詞的位置資訊,出現位置靠前的詞與出現位置靠後的詞,都被視為重要性相同,這是不正確的。(一種解決方法是,對全文的第一段和每一段的第一句話,給予較大的權重。)

當通過TF-IDF演算法找出文章的關鍵字後,可以運用到一些具體的場景。比如:根據關鍵字找出相似的文章。

參考文件:

http://zh.wikipedia.org/wiki/TF-IDF