利用sklearn進行tfidf計算


轉自: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')

  


免責聲明!

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



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