Tf-Idf的python实现

现如今,深度学习的神经网络在处理文本方面也逐渐被人们挖掘出来,而神经网络只能接受数值类型的输入,所以在做文本情感分析的时候,就需要对文本进行处理,使之变成数值类型,因而向量化也就出现了。在向量化时我们也不必将分词结果中每个词都进行向量化,因为有些单词出现次数特别多,而且对情感分类是毫无意义的。比如之类的单词。这类词有个名字,叫“Stop_Word“(停用词)常用的停用词下载地址。这类词是可以完全忽略掉不做统计的。显然忽略掉这些词,词频记录的存储空间能够得到优化,而且构建速度也更快。那么如何来判断词语对文档的重要度呢,这里介绍一种方法:TF-IDF。TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF-IDF实际上是:TF * IDF。

TF(词频)的计算很简单,就是针对一个文件t,某个单词Nt 出现在该文档中的频率。比如文档“I love this movie”,单词“love”的TF为1/4。如果去掉停用词“I”和”it“,则为1/2。

IDF(逆向文件频率)的意义是,对于某个单词t,凡是出现了该单词的文档数Dt,占了全部测试文档D的比例,再求自然对数。比如单词“movie“一共出现了5次,而文档总数为12,因此IDF为ln(5/12)。


nlp_test0.txt文本内容如下:
沙瑞金赞叹易学习的胸怀,是金山的百姓有福,可是这件事对李达康的触动很大。易学习又回忆起他们三人分开的前一晚,大家一起喝酒话别,易学习被降职到道口县当县长,王大路下海经商,李达康连连赔礼道歉,觉得对不起大家,他最对不起的是王大路,就和易学习一起给王大路凑了5万块钱,王大路自己东挪西撮了5万块,开始下海经商。没想到后来王大路竟然做得风生水起。沙瑞金觉得他们三人,在困难时期还能以沫相助,很不容易。


nlp_test1.txt文本内容如下:
沙瑞金向毛娅打听他们家在京州的别墅,毛娅笑着说,王大路事业有成之后,要给欧阳菁和她公司的股权,她们没有要,王大路就在京州帝豪园买了三套别墅,可是李达康和易学习都不要,这些房子都在王大路的名下,欧阳菁好像去住过,毛娅不想去,她觉得房子太大很浪费,自己家住得就很踏实。

newDit.txt内容:自己新建一个txt文档,须注意每个词独占一行。
词典如下图格式

具体代码如下所示:

# encoding=utf-8
import jieba
jieba.load_userdict("newDict.txt")   # 加载用户自定义词典
from sklearn.feature_extraction.text import TfidfVectorizer
# print(dir(TfidfVectorizer))

def cut(txt_name1, txt_name2):
    with open(txt_name1, 'r') as f1:    # 以只读方式打开文件
        txt = f1.read()
        txt_encode = txt.encode('utf-8')
        txt_cut = jieba.cut(txt_encode)         # 切词
        result = ' '.join(txt_cut)
        # print(result)
    with open(txt_name2, 'w') as f2:    # 分词结果写入文件保存
        f2.write(result)
    f1.close()
    f2.close()

cut('nlp_test0.txt', 'nlp_test0_0.txt')     # 分别对文件调用cut方法分词
cut('nlp_test1.txt', 'nlp_test1_1.txt')

# 将停用词表从文件读出,并切分成一个数组备用
stopWords_dic = open('stop_words.txt', 'r')     # 从文件中读入停用词
stopWords_content = stopWords_dic.read()
stopWords_list = stopWords_content.splitlines()     # 转为list备用
stopWords_dic.close()

with open('nlp_test0_0.txt', 'r') as f3:
    res3 = f3.read()
with open('nlp_test1_1.txt', 'r') as f4:
    res4 = f4.read()

corpus = [res3, res4]
# print(corpus)
vector = TfidfVectorizer(stop_words=stopWords_list)
tf_idf = vector.fit_transform(corpus)
# print(tf_idf)

word_list = vector.get_feature_names()      # 获取词袋模型的所有词
weight_list = tf_idf.toarray()
# result1 = ''.join(word_list)
# result2 = ''.join(weight_list)
# print(result1, result2)
# with open('words_list.txt', 'w') as f3:
#     f3.write(result)


# 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
for i in range(len(weight_list)):
    print("-------第", i+1, "段文本的词语tf-idf权重------")
    for j in range(len(word_list)):
        print(word_list[j], weight_list[i][j])

最后的运行结果如下图所示:
第一个文本词语权重
第二个文本词语权重

有了每段文本的TF-IDF的特征向量,就可以利用这些数据作为神经网络的输入建立分类模型了。

如有问题,欢迎留言。

猜你喜欢

转载自blog.csdn.net/sinat_29694963/article/details/79115450