TF-IDF试用

记录一次生成文本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)


全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务