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 #返回最终聚类结果

 

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