轉自:http://blog.csdn.net/liuxuejiang158blog/article/details/31360765?utm_source=tuicool
在文本處理中,TF-IDF可以說是一個簡單粗暴的東西。它可以用作特征抽取,關鍵詞篩選等。
以網頁搜索“核能的應用”為例,關鍵字分成“核能”、“的”、“應用”。根據直覺,我們知道,包含這三個詞較多的網頁比包含它們較少的網頁相關性強。但是僅僅這樣,就會有漏洞,那就是文本長的比文本短的關鍵詞數量要多,所以相關性會偏向長文本的網頁。所以我們需要歸一化,即用比例代替數量。用關鍵詞數除以總的詞數,得到我們的“單文本詞頻(Term Frequency)”最后的TF為各個關鍵詞的TF相加。這樣還不夠,還是有漏洞。像“的”、“和”等這樣的常用字,對衡量相關性沒什么作用,但是幾乎所有的網頁都含有這樣的字,所以我們要忽略它們。於是就有了IDF(Inverse Document Frequency)
原理非常簡單,結合單詞的詞頻和包含該單詞的文檔數,統計一下,計算TF和IDF的乘積即可。但是自己的寫的代碼,在運算速度上,一般不盡人意,在自己寫了一段代碼之后,為了方便檢驗結果是否正確、效率如何,在網上尋找了一些開源代碼。這里用到了sklearn里面的TF-IDF。主要用到了兩個函數:CountVectorizer()和TfidfTransformer()。CountVectorizer是通過fit_transform函數將文本中的詞語轉換為詞頻矩陣,矩陣元素weight[i][j] 表示j詞在第i個文本下的詞頻,即各個詞語出現的次數;通過get_feature_names()可看到所有文本的關鍵字,通過toarray()可看到詞頻矩陣的結果。TfidfTransformer也有個fit_transform函數,它的作用是計算tf-idf值。
貼代碼:
#!/usr/bin/python # -*- coding: utf-8 -*-\ import string import sys reload(sys) sys.setdefaultencoding('utf8') from sklearn import feature_extraction from sklearn.feature_extraction.text import TfidfTransformer from sklearn.feature_extraction.text import CountVectorizer if __name__ == "__main__": corpus = [] tfidfdict = {} f_res = open('sk_tfidf.txt', 'w') for line in open('seg.txt', 'r').readlines(): #讀取一行語料作為一個文檔 corpus.append(line.strip()) vectorizer=CountVectorizer()#該類會將文本中的詞語轉換為詞頻矩陣,矩陣元素a[i][j] 表示j詞在i類文本下的詞頻 transformer=TfidfTransformer()#該類會統計每個詞語的tf-idf權值 tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))#第一個fit_transform是計算tf-idf,第二個fit_transform是將文本轉為詞頻矩陣 word=vectorizer.get_feature_names()#獲取詞袋模型中的所有詞語 weight=tfidf.toarray()#將tf-idf矩陣抽取出來,元素a[i][j]表示j詞在i類文本中的tf-idf權重 for i in range(len(weight)):#打印每類文本的tf-idf詞語權重,第一個for遍歷所有文本,第二個for便利某一類文本下的詞語權重 for j in range(len(word)): getword = word[j] getvalue = weight[i][j] if getvalue != 0: #去掉值為0的項 if tfidfdict.has_key(getword): #更新全局TFIDF值 tfidfdict[getword] += string.atof(getvalue) else: tfidfdict.update({getword:getvalue}) sorted_tfidf = sorted(tfidfdict.iteritems(), key=lambda d:d[1], reverse = True ) for i in sorted_tfidf: #寫入文件 f_res.write(i[0] + '\t' + str(i[1]) + '\n')