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