一、项目摘要
词云图是一种用于可视化文本数据的图表类型。它通过将文本中出现频率较高的单词以较大的尺寸显示在一张图片中,从而传达文本数据的关键信息。关于词云图我们一般的做法是根据文章分词后的词频高低,然后按照词频将关键字进行可视化处理,将其可视化成为一张图像。在我们使用词频高低作为选取词云图关键字的手段时,我们通常会遇到一些词频高的词语对于整个文本来说并不是很重要的情况。所以我们所做的工作就是在选取词云图关键字时改变其以词频为评判的标准,选用TF-IDF算法输出的高权重词语从而达到提升词云图的效果。TF-IDF是一种用于表示和评价文本中单词重要性的技术。指的是单词频率-逆文件频率。其基本思想是根据单词在文本中出现的频率和单词在整个文集中出现的频率来确定单词的重要性。
二、工作流程
1、文本处理处理方向的实验因为都是以词为单位的,所以首要的任务就是分词。分词技术有很多中,我们选择要选择适合处理中文文本数据的分词技术。分完词的同时我们再统计一下词频,为后面词云对比做一下数据准备。
ps:在我们分词的时候,我们需要根据需求添加关键词,来确保分词的时候这些词语不会被分割开来,lac.load_customization(keyword)这是LAC工具加载关键词的语句。同时我们也需要去除停用词,分词时会自动删除这些停用词。
2、我们先将词频按高低排序,然后取出排序前部分的词语 。作为生成常规词云图的关键词。
ps:我们在进行词频统计时,除了停用词可以去除不重要的词语外,我们还可以采用词性去除,低词频去除。
3、其次就是我们最重要的tf-idf词频-逆文件频率计算。TF-IDF权重(TF-IDF Weight):是将词频和逆文档频率相乘得到的结果。该值决定了单词对于文档的重要性。一个单词经过TF-IDF处理后,如果它在某个文档中出现的次数很高,同时在整个文档集合中又很少出现,那么它的TF-IDF值将会非常高,表明该单词对于这个文档的重要性很大。
ps:TF-IDF = TF * IDF
TF:单词在文档中出现的频率,
IDF:由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
4 、最后就是根据得到的词语列表绘制词云图。
三、相关代码
1、导入必要的库。wordcloud是词云库,TfidfVectorizer是我们计算tf-idf的模块库。
from LAC import LAC
import re
import os
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from wordcloud import WordCloud
import matplotlib.pyplot as plt # 绘制图像的模块
from wordcloud import ImageColorGenerator
from PIL import Image
2、对文章进行分词工作。在这一步中,我们处理了词性、词频、停用词对关键字造成的干扰。将{'f', 'TIME', 'LOC', 'm', 'd', 'a', 'nz', 'PER', 'ORG', 'r'}这些无关词性都剔除。同时删除了词频为1的词语。
def fenci (file):
new_filename = file.split('.')[0]
f = open(path+file, encoding="utf-8", errors='ignore')
file_object = open("/法律法规/resulttwo/"+new_filename+'new.txt', 'w', encoding="utf-8") # 创新新文件用于存储分词后的文章。
file_object.write(str(f)+'\n')
lac = LAC(mode='lac')# 装载LAC模型
#lac = LAC(mode='seg')
lac.load_customization(keyword) #LAC加载关键字
results = []
for line in f.readlines():
a=line[:]
line = re.sub('附件.*', '', line, flags=re.MULTILINE)
line = re.sub(r1, '', line) #去除文本中r1中包含的符号字母及数字
line = re.sub('\s+', '', line) # 文本去除换行符、缩进、空格
line = line.upper()
#print('line', line)
result = []
wordclasses = list()
counts = {}
endwordclasses = list() # 创建去除词性后的分词词性列表
endresult = list() # 创建去除词性后的分词结果列表
endendwordclasses = list() # 创建去除分词长度只有1个字后的分词词性列表
endendresult = list() # 创建去除分词长度只有1个字后的分词结果列表
if len(line)==0:
pass
else:
temp=lac.run(line)
for index, i in enumerate(temp[0]):
if i in stopwords:
pass
else:
result.append(i)
wordclasses.append(temp[1][index])
for index1, j in enumerate(wordclasses): # 去除不需要的词性
if j in cixing:
pass
else:
endwordclasses.append(j)
endresult.append(result[index1])
#print(endresult) #输出去除词性的分词结果
#print(endwordclasses) #输出去除词性后的分词词性
for index2, k in enumerate(endresult): # 去除分词长度等于1的分词
if len(k) == 1:
pass
else:
endendresult.append(k)
endendwordclasses.append(endwordclasses[index2])
results.append(k) # 统计单个文件的词频的列表
resultses.append(k) # 统计总词频的列表
file_object.write(str(result)+'\n')
file_object.write(str(wordclasses))
file_object.write('\n')
# 单个文件进行词频统计
for word in results:
counts[word] = counts.get(word, 0) + 1
#print('词频', counts)
file_object.write(str(counts) + '\n')
3、其次我们进行TF-IDF权重计算。进行TF-IDF计算时我们需要输入是分词后的文章并且以空格隔开各个词语的文本数据。
tfidf_model = TfidfVectorizer().fit(documents)
print(tfidf_model.vocabulary_)
feature = tfidf_model.get_feature_names()
sparse_result = tfidf_model.transform(documents)
print(sparse_result)
weight = sparse_result.toarray()
# 构建词与tf-idf的字典:
feature_TFIDF = {}
for i in range(len(weight)):
for j in range(len(feature)):
# print(feature[j], weight[i][j])
if feature[j] not in feature_TFIDF:
feature_TFIDF[feature[j]] = weight[i][j]
else:
feature_TFIDF[feature[j]] = max(feature_TFIDF[feature[j]], weight[i][j])
word_list = []
word_listes = []
featureList = sorted(feature_TFIDF.items(), key=lambda kv: (kv[1], kv[0]), reverse=True)
for i in range(1, 1000 if len(featureList) > 1000 else len(featureList)):
print(featureList[I]) #取出排名前1000的词语
# 整理文本:
word_list.append(featureList[i][0]) # 将TF-IDF排名中的词语单独取出
word_listes.append(featureList[i]) #将TF-IDF中整组取出带上权重
json_tf = open('加tfidf(1000).txt', 'w', encoding="utf-8") # 写入文件
json_tf.write(str(word_listes))
words = (" ".join(word_list))
4、进行完上面两步,我们就得到了词频按由高到低的前1000词语和TF-IDF权重前1000 的词语。这时我们就可以根据词语来绘制词云图。词云图的样式和展示的关键词数量。
wordcloud = WordCloud(background_color='white',
max_words=400,
font_path="Kai.ttf", # 当前目录下中文楷体 结尾有下载
width=1600,
colormap='Blues',
prefer_horizontal=1,
stopwords=stopw,
height=1000).generate(words)
wordcloud.to_file("TF-IDF词云图.png")
wordcloud = WordCloud(background_color='white',
max_words=400,
font_path="Kai.ttf", # 当前目录下中文楷体 结尾有下载
width=1600,
prefer_horizontal=1,
colormap='Blues',
stopwords=stopw,
height=1000).generate(sortcloud)
wordcloud.to_file("词频词云图.png")
四、总结
在这个项目中,通过词云图对TF-IDF运用可以让我对词频-逆文件频率的理解更加上升,知道了TF-IDF的中的词频是指该单词在该文档中所有单词的总占比,逆文件频率指的是该单词出现所在的文章的次数。我们通过TF_IDF的运用可以得到如果一个单词在很多的文档中出现,则意味着该单词的的重要性不高;反之则意味着该单词的重要性很高。