词频/TFIDF两种方式统计词云图

1.数据预处理

对数据提取中文,分词,并去除停用词。

import codecs
import jieba
filePath='./data.csv'
stopwords = set()
fr = codecs.open('./stop_words.txt', 'r', 'utf-8')
for word in fr:
   stopwords.add(str(word).strip())
fr.close()

text=[]
with open(filePath,'r') as fileTrainRaw:
    i = 0
    for line in fileTrainRaw:  # 按行读取文件
        #去除非中文符号并进行jieba分词,并过滤停用词
        line = " ".join(re.findall(u'[\u4e00-\u9fa5]+', line))
        line = list(jieba.cut(line, cut_all=False, HMM=True))
        line = list(filter(lambda x: x not in stopwords, line))
        line = [str(i) for i in line if i != ' ']
        if len(line) != 0 :
            text.append(' '.join(line))

2.词频/TFIDF统计

2.1 词频统计

import collections 
word_counts = collections.Counter(text) # 对分词做词频统计

2.2 TFIDF统计

from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer  
from sklearn.feature_extraction.text import CountVectorizer  
from collections import defaultdict
tlist = text
vectorizer=CountVectorizer()#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
transformer = TfidfTransformer(smooth_idf = False)#该类会统计每个词语的tf-idf权值
tfidf = transformer.fit_transform(vectorizer.fit_transform(tlist))  #第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵  

word=vectorizer.get_feature_names()#获取词袋模型中的所有词语  
weight=tfidf.toarray()#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重  

tfidf_list = defaultdict(list)
tfidf_avg = {}
for i in range(len(weight)):#打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for遍历某一类文本下的词语权重  
    for j in range(len(word)): 
        #获取每个词语对应的权重值
        tfidf_list[word[j]].append(weight[i][j])
#对每个词语求权重值平均
for i,j in tfidf_list.items():
    tfidf_avg[i] = sum(j)/len(j)

这里采用TFIDF计算得到每个文档中每个词语的权重值之后,对所有文档的词语进行全局权重值平均,可以间接反映词语在所有文档中的重要程度。这里的文档都是相同主题类型文档。

3.词云图制作

from wordcloud import WordCloud, ImageColorGenerator
from PIL import Image
font_path = './yahei.ttf'
wc = WordCloud(font_path=font_path,  # 设置字体
               background_color="white",  # 背景颜色
               max_words=100,  # 词云显示的最大词数
               stopwords=stopwords,
               max_font_size=100,  # 字体最大值
               width=1000, height=860, margin=2,# 设置图片默认的大小,但是如果使用背景图片的话,那么保存的图片大小将会按照其大小保存,margin为词语边缘距离
#               prefer_horizontal=1,
               )
#wc.generate_from_frequencies(word_counts)
wc.generate_from_frequencies(tfidf_avg)
plt.imshow(wc, interpolation="bilinear")
plt.axis("off")
plt.figure()
#wc.to_file("wordCount.png")
wc.to_file("tfidfAvg.png")

3.1 词频词云图

词频/TFIDF两种方式统计词云图_第1张图片
词频统计2.png

3.2 TFIDF词云图

词频/TFIDF两种方式统计词云图_第2张图片
TFIDF统计2.png

4.总结

  1. TFIDF权重值平均的方式得到的关键词更能凸显主题,比如其词云图中排在前几位的词语包含了调查,问卷,评分,答题,报名等这些词语,而词频统计词云图中这些词语都排在了较后的位置,而这些词语恰恰可以反映文档的主题。

你可能感兴趣的:(词频/TFIDF两种方式统计词云图)