TF-IDF介紹及Python實現文本聚類

TF-IDF 是一種統計方法,用以評估一字詞對於一個文件集或一個語料庫中的其中
一份文件的重要程度。字詞的重要性隨着它在文件中出現的次數成正比增加,但
同時會隨着它在語料庫中出現的頻率成反比下降。TF-IDF 加權的各種形式常被搜
索引擎應用,作爲文件與用戶查詢之間相關程度的度量或評級。除了 TF-IDF 以外,
因特網上的搜索引擎還會使用基於鏈接分析的評級方法,以確定文件在搜尋結果
中出現的順序。
詞頻 (term frequency, TF) 指的是某一個給定的詞語在該文件中出現的次數。這個數字
通常會被歸一化(一般是詞頻除以文章總詞數), 以防止它偏向長的文件。(同一個詞語
在長文件裏可能會比短文件有更高的詞頻,而不管該詞語重要與否。)

逆向文件頻率 (inverse document frequency, IDF) IDF 的主要思想是:如果包含詞條 t 的文檔
越少, IDF 越大,則說明詞條具有很好的類別區分能力。某一特定詞語的 IDF,可以由總文件
數目除以包含該詞語之文件的數目,再將得到的商取對數得到。

接下來,使用tf-idf方法結合kmeans聚類嘗試一個文本聚類實驗,使用的爲一個json文件,內含文件序號及文本內容。

# python3.6.4
from sklearn import cluster
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
def execute_cluster(tokens_list):
tolist={}
dict=load_array('testdoc.json')
for item in dict: 
  tolist[item[1]]=item[0]
  clusters_list=[]
  toklist=[]
  toklist2=[]
for stoken in tokens_list: #根據tolist替換原詞數字號得到序號--文本詞集的矩陣
  stopid=stoken['docid']
  stoptoken=stoken['tokenids']
  strtok=[]
  for item in stoptoken:
   strtok.append(tolist[item])
  toklist.append(' '.join(strtok))
print(toklist) #這裏 tolist 需符合傳入格式要求
vectorizer = CountVectorizer() #CountVectorizer 會將文本中的詞語轉換爲詞頻矩陣
cpmat = vectorizer.fit_transform(toklist)
vectorizer.fit(toklist)
word = vectorizer.get_feature_names()
print(word)
#print(cpmat)
transformer = TfidfTransformer() #該類會統計每個詞語的 tf-idf 權值
retfidf = transformer.fit_transform(cpmat) #得到文本 tfidf 矩陣
print(retfidf)
tfidf_train=retfidf.toarray() #調整格式方便傳入
print(tfidf_train)
km = cluster.KMeans(n_clusters=65, random_state=100,max_iter=500)
#放入上矩陣進行 kmeans 聚類
c=km.fit(tfidf_train)
t = c.labels_ # t 存儲每個樣本所屬的簇
print(t)
print("*******************************")
clusters_list=[] #將結果存入 cluster_list 中
con=0
for tt in t:
cc = {}
topics_list = load_array(train_topics_file)
cc['docid'] = tokens_list[con]['docid']
cc['cluster'] = tt
clusters_list.append(cc)
con+=1
print(clusters_list)
print(type(tokens_list), type(tokens_list[0]), list(tokens_list[0].items())) #僅用於
驗證數據格式
return clusters_list #返回最終聚類結果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章