记录一次生成文本tf-idf过程。
tf-idf资料网上很多,这里就不介绍了。
这里使用Python的sklearn封装的tf-idf,代码如下:
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
__author__ = "yuquanle"
#计算文本的tf-idf,一行为文本的向量
from sklearn.feature_extraction.text importTfidfTransformer
from sklearn.feature_extraction.text importCountVectorizer
import numpy as np
if __name__ == "__main__":
corpus=[]
#输入数据的格式,一行为一个文本,中文要分词(可以使用jieba分词)
filepath = file("C:\\Users\\LLL\\Desktop\\treestructure\\data-nosymbol\\test_STS.input.surprise.OnWN.nosymbol.txt","r")
for line in filepath.readlines():
line = line.strip("\n")
corpus.append(line)
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是将文本转为词频矩阵
words = vectorizer.get_feature_names() # 获取词袋模型中的所有词语
weight = tfidf.toarray() # 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
#写文件
#写入词库名字,每一行一个词,向量的位置就是词的位置
fileout = file(r'C:\\Users\\LLL\\Desktop\\treestructure\\tf-idf-nosymbol\\OnWN.nosymbol.name.txt',"a+")
for word in words:
fileout.write(word+"\n")
fileout.write("\n")
#写入词袋tf-idf值,这里写入文本,为一个矩阵,矩阵的每一行为一个向量,即文本向量,维度为整个词库的大小,第i维数值为词库中第i个词的tf-idf 值
np.savetxt("C:\\Users\\LLL\\Desktop\\treestructure\\tf-idf-nosymbol\\OnWN.nosymbol.TF-IDF.txt",weight)
输入文本处理如下图格式,一行为一个doc:
此文本记录词库中每个词以及词在词库的位置:
tf-idf值,将tf-idf矩阵写入此文件,每一行为一个文本的文本向量,向量的第i维为 词库位置为i的词在这篇doc 的tf-idf值,如下图:
但是当我要得到每个词的具体tf-idf:
当数据集比较大时,使用
weight = tfidf.toarray()会报MemeryError,可以使用下面这种方法得到每个词的tf-idf:
with open("tomato-no_order_tfidf", "w", encoding="utf-8") as f:
for i in range(len(Corpus_data)):
# tfidf[i].getnnz()第i行句子的长度
weight = tfidf[i].toarray()
line = ""
for j in range(len(words)):
if weight[0][j] != 0:
line = line + words[j] + ":" + str(weight[0][j]) + " "
f.write(line)
f.write("\n")
print(line)