词云(wordcloud)

词云,英文常用名为wordcloud,顾名思义,就是把一些词语揉在一块做成云朵状。词云最初由美国西北大学新闻学副教授、新媒体专业主任里奇·戈登(Rich Gordon)提出,如今词云已经成为一种流行的数据可视化方式,“词云”对大量文本内容中出现频率较高的“关键词”的进行视觉上的突出,使读者只要一瞥词云就可以领略文本的主旨和关键内容。本文主要讲解利用python脚本语言生成词云。你可以从本文学到读取本地txt文件,jieba分词,加载默认词袋,加载中文停顿词,TF-IDF算法提取关键词,WordCloud生成词云并加载喜爱的背景。最后给出一个实例,下面一项一项来讲。

加载默认词袋

在使用jieba进行分词时,除了直接对文本进行分词外,还可以自行添加默认词,可以防止用户想要的那些词语被误分,从而达到优化分词效果的目的

jieba.load_userdict(r"D:\项目\社群分析\社群聊天记录分析\newdiskname.txt") #加载默认词袋

这里,我们添加了一个叫newdiskname.txt词袋,里面格式分为3个部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒,词频越高在分词时,能够被分出来的概率越大,并没有绝对性。

加载中文停顿词

停顿词,也叫停用词,是由英文单词stopword翻译过来的,原来在英语里面会遇到很多a,the,or等使用频率很多的词,常为冠词、介词,副词,连词等,这些词使用频率很高但是却无实体含义,如果做搜索引擎的话,如果把这些直接过滤掉,不仅可以减少工作量,提高工作效率,而且能够使得正真重要的实体词得到突出。网络上比较出名的有哈工大停用词表、四川大学机器智能实验室停用词库、百度停用词表等, 我们这里做成了本地chinesestopword.txt文件,直接读取即可。

jieba.analyse.set_stop_words(r"D:\项目\社群分析\社群聊天记录分析\chinesestopword.txt") #加载中文停顿词

TF-IDF 算法的关键词抽取

加载默认词袋,加载中文停顿词只是相当于数据预处理,而正真要对关键词抽取需要一套规则(算法),比较流行的算法有基于 TF-IDF 算法的关键词抽取和基于 TextRank 算法的关键词抽取,本项目用了前者,所以只对 TF-IDF进行解析。

TF-IDF的全称是Term Frequency - Inverse Document Frequency,翻译过来就是词频-逆文档频率。先来看TF,词频顾名思义就是一个词在文本里面出现的次数,如果出现的次数越多,那么词频越大,其重要性越高,其计算公式如下

某词出现的次数 所有词次数和

多频词按重数计算,现实中,往往是那些“的”和“是”等一些停顿词出现次数非常高,所以不能单单考虑词频这一个因素,这也说明前面添加中文停顿词的重要性,但是,还有一个问题,如果某两个词在文档中出现的频率几乎一样,如“上海”和“装修”这两个词,如果只考虑TF的话,“上海”和“装修”两个词的值应该一样,但是我们知道我们所有群聊都是上海群,“上海”这个词就非常常见了,反观“装修”就不那么常见了,当“上海”和“装修”两词出现相同次数,我们有理由相信““装修”比“上海”更为重要,那么我们怎么让“装修”的得分比“上海”高呢?这就是IDF的工作了。

IDF的思想也很简单,如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词。但是我们需要一个相当大的语料库用来模拟语言的使用环境,这样评价出来某个词的IDF值才客观,其计算公式如下

语料的文档数 包含该词的文档数

从公式我们可以看到在所有语料的文档中包含该词的文档数越大,分母越大,分数值越接近1,取对数log后IDF越趋向于0,说明该词越平凡常见没有什么区分度,分母之所以要加1,是为了避免分母为0,即所有文档都不包含该词。举个极端的例子,假设我们的语料里面有100000篇文档,其中99999包含“上海”这个词,最后算出来的IDF值是

最后我们把TF和IDF结合起来便得到TF-IDF公式

可以简单的说,TF-IDF的值与该词在文档中的出现次数成正比,与该词在整个语料中的出现次数(平凡度)成反比。jieba模块利用了analyse.extract_tags这个函数实现TF-IDF算法。

import jieba.analyse
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
sentence 为待提取的文本
topK 为返回K个 TF/IDF 权重最大的关键词,默认值为 20
withWeight 为是否一并返回关键词权重值,默认值为 False
allowPOS 仅包括指定词性的词,默认值为空,即不筛选

完整代码

代码中大部分都有注释,不懂的朋友可以进交流群来交流。

# -*- coding: utf-8 -*-
"""
Project name: wordcloud
Description: 生成词云
Created on Sun Aug  9 11:28:04 2020
@author: 帅帅de三叔    
"""
import jieba
import numpy as np
import jieba.analyse
from PIL import Image
from wordcloud import WordCloud
import matplotlib.pyplot as plt


def generatewordcloud(): #定义生成词云函数
    f = open(r"D:\项目\社群分析\社群聊天记录分析\rank_5.txt", 'r', encoding='UTF-8').read() #读取数据
    background_image = np.array(Image.open(r"D:\项目\社群分析\社群聊天记录分析\词云背景.jpg"))
    jieba.load_userdict(r"D:\项目\社群分析\社群聊天记录分析\newdiskname.txt") #加载默认词袋
    jieba.analyse.set_stop_words(r"D:\项目\社群分析\社群聊天记录分析\chinesestopword.txt") #加载中文停顿词
    ls = jieba.analyse.extract_tags(f, topK=500, withWeight=False, allowPOS=()) #tf-idf算法抽取前500个
    text = " ".join(ls)
    wc = WordCloud(font_path=r"C:/Windows/Fonts/simfang.ttf", background_color="white",
                   mask=background_image).generate(text) #生成词云
    plt.axis("off") #去掉坐标轴
    plt.imshow(wc, cmap=plt.cm.gray, interpolation='bilinear') #显示词云
    wc.to_file(r"D:\项目\社群分析\社群聊天记录分析\result.jpg") #保存到本地




if __name__ == '__main__':
   generatewordcloud()

效果预览

词云(wordcloud)_第1张图片

参考文献

1,https://github.com/fxsjy/jieba

2,https://baike.baidu.com/item/tf-idf/8816134?fr=aladdin

- - -The end- - - 


你可能喜欢

logistic回归模型(一)

python绘制笛卡尔直角坐标系

三行科创微信公众号欢迎投稿

稿件聚焦数学逻辑,数学工程,数学文化等领域

一经采用,我们将奉上酬劳

投稿邮箱:[email protected]

商务合作:17521754388

加入交流群,添加微信:melite01(备注 交流群)

你可能感兴趣的:(python,java,编程语言,数据挖掘,自然语言处理)