数据来源及功能:爬取大数据文摘点赞量前10的文章,将文章转换成txt文档,进行词频分析并生成词云分析图。
Step1:安装所需库
pip install re
pip install jieba
pip install collections
pip install numpy
pip install PIL
pip install wordcloud
pip install matplotlib.pyplot
Step2:导入扩展库
import re # 正则表达式库
import jieba.posseg # 词性获取
import collections # 词频统计库
import wordcloud # 词云展示库
import matplotlib.pyplot as plt # 图像展示库(这里以plt代表库的全称)
Step3:
-需要将“用户字典.txt”,“停用词库.txt” 两个文件保存为txt格式,放入文件同目录下。()
-“用户字典.txt” 可以根据需要进行增加统计词库,提高词频识别率。
-“停用词库.txt” 中的词库不纳入计算,可根据需求修改。
将要分析的内容全部放入当前目录下词云分析
Analysis_text = '词云分析.txt' # 分析文档
userdict = '用户词典.txt' # 用户词典
StopWords = '停用词库.txt' # 停用词库
number = 100 # 统计个数
Output = '词频.txt' # 输出文件
文章最后有完整的代码,直接复制即可。
#!/usr/bin/env python
# encoding: utf-8
# 导入扩展库
import re # 正则表达式库
import jieba # 结巴分词
import jieba.posseg # 词性获取
import collections # 词频统计库
import numpy # numpy数据处理库
from PIL import Image # 图像处理库
import wordcloud # 词云展示库
import matplotlib.pyplot as plt # 图像展示库(这里以plt代表库的全称)
if __name__ == '__main__':
# 主要功能自定义设置
# 将要分析的内容全部放入当前目录下词云分析.txt
Analysis_text = '词云分析.txt' # 分析文档
userdict = '用户词典.txt' # 用户词典
StopWords = '停用词库.txt' # 停用词库
number = 100 # 统计个数
Output = '词频.txt' # 输出文件
background = '词频背景.jpg' # 词频背景
# 读取文件
fn = open(Analysis_text,'r',encoding = 'UTF-8') # 打开文件
string_data = fn.read() # 读出整个文件
fn.close() # 关闭文件
# 文本预处理
pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"') # 定义正则表达式匹配模式(空格等)
string_data = re.sub(pattern, '', string_data) # 将符合模式的字符去除
# 动态调整词典
jieba.suggest_freq('', True) #True表示该词不能被分割,False表示该词能被分割
# 添加用户词典
jieba.load_userdict(userdict)
# 文本分词
seg_list_exact = jieba.cut(string_data, cut_all=False, HMM=True) # 精确模式分词+HMM
object_list = []
# 去除停用词(去掉一些意义不大的词,如标点符号、嗯、啊等)
with open(StopWords, 'r', encoding='UTF-8') as meaninglessFile:
stopwords = set(meaninglessFile.read().split('\n'))
stopwords.add(' ')
for word in seg_list_exact: # 循环读出每个分词
if word not in stopwords: # 如果不在去除词库中
object_list.append(word) # 分词追加到列表
# 词频统计
word_counts = collections.Counter(object_list) # 对分词做词频统计
word_counts_top = word_counts.most_common(number) # 获取前number个最高频的词
# 英文词性转中文词性字典:简洁版
En2Cn = {
'a': '形容词',
'ad': '形容词',
'ag': '形容词',
'al': '形容词',
'an': '形容词',
'b': '区别词',
'bl': '区别词',
'c': '连词',
'cc': '连词',
'd': '副词',
'e': '叹词',
'eng': '英文',
'f': '方位词',
'g': '语素',
'h': '前缀',
'i': '成语',
'j': '简称略语',
'k': '后缀',
'l': '习用语',
'm': '数词',
'mq': '数量词',
'n': '名词',
'ng': '名词',
'nl': '名词',
'nr': '名词',
'nr1': '名词',
'nr2': '名词',
'nrf': '名词',
'nrfg': '名词',
'nrj': '名词',
'nrt': '名词',
'ns': '名词',
'nsf': '名词',
'nt': '名词',
'nz': '名词',
'o': '拟声词',
'p': '介词',
'pba': '介词',
'pbei': '介词',
'q': '量词',
'qt': '量词',
'qv': '量词',
'r': '代词',
'rg': '代词',
'rr': '代词',
'rz': '代词',
'rzs': '代词',
'rzt': '代词',
'rzv': '代词',
'ry': '代词',
'rys': '代词',
'ryt': '代词',
'ryv': '代词',
's': '处所词',
't': '时间词',
'tg': '时间词',
'u': '助词',
'ude1': '助词',
'ude2': '助词',
'ude3': '助词',
'udeng': '助词',
'udh': '助词',
'uguo': '助词',
'ule': '助词',
'ulian': '助词',
'uls': '助词',
'usuo': '助词',
'uyy': '助词',
'uzhe': '助词',
'uzhi': '助词',
'v': '动词',
'vd': '动词',
'vf': '动词',
'vg': '动词',
'vi': '动词',
'vl': '动词',
'vn': '动词',
'vshi': '动词',
'vx': '动词',
'vyou': '动词',
'w': '标点符号',
'wb': '标点符号',
'wd': '标点符号',
'wf': '标点符号',
'wj': '标点符号',
'wh': '标点符号',
'wkz': '标点符号',
'wky': '标点符号',
'wm': '标点符号',
'wn': '标点符号',
'wp': '标点符号',
'ws': '标点符号',
'wt': '标点符号',
'ww': '标点符号',
'wyz': '标点符号',
'wyy': '标点符号',
'x': '字符串',
'xu': '字符串',
'xx': '字符串',
'y': '语气词',
'z': '状态词',
'un': '未知词',
}
# 英文词性转中文词性字典:详细版
En2Cn_Pro = {
'a' : '形容词',
'ad' : '形容词-副形词',
'ag' : '形容词-形容词性语素',
'al' : '形容词-形容词性惯用语',
'an' : '形容词-名形词',
'b' : '区别词',
'bl' : '区别词-区别词性惯用语',
'c' : '连词',
'cc' : '连词-并列连词',
'd' : '副词',
'e' : '叹词',
'eng' : '英文',
'f' : '方位词',
'g' : '语素',
'h' : '前缀',
'i' : '成语',
'j' : '简称略语',
'k' : '后缀',
'l' : '习用语',
'm' : '数词',
'mq' : '数量词',
'n' : '名词',
'ng' : '名词-名词性语素',
'nl' : '名词-名词性惯用语',
'nr' : '名词-人名',
'nr1' : '名词-汉语姓氏',
'nr2' : '名词-汉语名字',
'nrf' : '名词-音译人名',
'nrfg' : '名词-人名',
'nrj' : '名词-日语人名',
'ns' : '名词-地名',
'nsf' : '名词-音译地名',
'nt' : '名词-机构团体名',
'nz' : '名词-其他专名',
'o' : '拟声词',
'p' : '介词',
'pba' : '介词-“把”',
'pbei' : '介词-“被”',
'q' : '量词',
'qt' : '量词-动量词',
'qv' : '量词-时量词',
'r' : '代词',
'rg' : '代词-代词性语素',
'rr' : '代词-人称代词',
'rz' : '代词-指示代词',
'rzs' : '代词-处所指示代词',
'rzt' : '代词-时间指示代词',
'rzv' : '代词-谓词性指示代词',
'ry' : '代词-疑问代词',
'rys' : '代词-处所疑问代词',
'ryt' : '代词-时间疑问代词',
'ryv' : '代词-谓词性疑问代词',
's' : '处所词',
't' : '时间词',
'tg' : '时间词-时间词性语素',
'u' : '助词',
'ude1' : '助词-“的”“底”',
'ude2' : '助词-“地”',
'ude3' : '助词-“得”',
'udeng': '助词-“等”“等等”“云云”',
'udh' : '助词-“的话”',
'uguo' : '助词-“过”',
'ule' : '助词-“了”“喽”',
'ulian': '助词-“连”',
'uls' : '助词-“来讲”“来说”“而言”“说来”',
'usuo' : '助词-“所”',
'uyy' : '助词-“一样”“一般”“似的”“般”',
'uzhe' : '助词-“着”',
'uzhi' : '助词-“之”',
'v' : '动词',
'vd' : '动词-副动词',
'vf' : '动词-趋向动词',
'vg' : '动词-动词性语素',
'vi' : '动词-不及物动词(内动词)',
'vl' : '动词-动词性惯用语',
'vn' : '动词-名动词',
'vshi' : '动词-“是”',
'vx' : '动词-形式动词',
'vyou' : '动词-“有”',
'w' : '标点符号',
'wb' : '标点符号-百分号千分号,全角:% ‰ 半角:%',
'wd' : '标点符号-逗号,全角:, 半角:,',
'wf' : '标点符号-分号,全角:; 半角: ; ',
'wj' : '标点符号-句号,全角:。',
'wh' : '标点符号-单位符号,全角:¥ $ £ ° ℃ 半角 $',
'wkz' : '标点符号-左括号,全角:( 〔 [ { 《 【 〖 〈 半角:( [ { <',
'wky' : '标点符号-右括号,全角:) 〕 ] } 》 】 〗 〉 半角: ) ] { >',
'wm' : '标点符号-冒号,全角:: 半角: :',
'wn' : '标点符号-顿号,全角:、',
'wp' : '标点符号-破折号,全角:—— -- ——- 半角:—',
'ws' : '标点符号-省略号,全角:…… …',
'wt' : '标点符号-叹号,全角:! 半角:!',
'ww' : '标点符号-问号,全角:? 半角:?',
'wyz' : '标点符号-左引号,全角:“ ‘ 『',
'wyy' : '标点符号-右引号,全角:” ’ 』',
'x' : '字符串',
'xu' : '字符串-网址URL',
'xx' : '字符串-非语素字',
'y' : '语气词',
'z' : '状态词',
'un' : '未知词',
}
# 输出至工作台,并导出“词频.txt”文件
print('\n词语\t词频\t词性')
print('——————————')
fileOut = open(Output, 'w', encoding='UTF-8') # 创建文本文件;若已存在,则进行覆盖
fileOut.write('词语\t词频\t词性\n')
fileOut.write('——————————\n')
count = 0
for TopWord, Frequency in word_counts_top: # 获取词语和词频
for POS in jieba.posseg.cut(TopWord): # 获取词性
if count == number:
break
print(TopWord + '\t', str(Frequency) + '\t',
list(En2Cn.values())[list(En2Cn.keys()).index(POS.flag)]) # 逐行输出数据
fileOut.write(TopWord + '\t' + str(Frequency) + '\t' + list(En2Cn.values())[
list(En2Cn.keys()).index(POS.flag)] + '\n') # 逐行写入str格式数据
count += 1
fileOut.close() # 关闭文件
# 词频展示
print('\n开始制作词云……') # 提示当前状态
mask = numpy.array(Image.open(background)) # 定义词频背景
wc = wordcloud.WordCloud(
font_path='/System/Library/Fonts/Hiragino Sans GB.ttc', # 设置字体
background_color='white', # 背景颜色
mask=mask, # 文字颜色+形状(有mask参数再设定宽高是无效的)
max_words=number, # 显示词数
max_font_size=150 # 最大字号
)
wc.generate_from_frequencies(word_counts) # 从字典生成词云
print(word_counts)
# wc.recolor(color_func=wordcloud.ImageColorGenerator(mask)) # 将词云颜色设置为背景图方案
plt.figure('词云') # 弹框名称与大小
# plt.subplots_adjust(top=0.99, bottom=0.01, right=0.99, left=0.01, hspace=0, wspace=0) # 调整边距
plt.imshow(wc) # 处理词云
plt.axis('off') # 关闭坐标轴
print('制作完成!') # 提示当前状态
plt.show()