当前位置:   article > 正文

谁说程序员不浪漫?Python导出微信聊天记录生成爱的词云图_python词云图导出

python词云图导出

data.write(i[0]+‘\n’)

将筛选结果写入 聊天记录.txt

data.close()

cursor.close()

conn.close()

关闭连接

记得把csv文件的编码格式转换成utf-8哦,不然可能会运行不下去:

当然你还可以用正则表达式去除以下内容

  1. 微信发送的数据:wxid.*

  2. __表情:[.]*

不过我觉得这些也是必要的聊天信息之一,留着也无妨,因此在这里就不加入进去啦

最后得到的文本格式就是一行一句聊天内容,处理后我们就准备好进入下一个环节了!那就是令人激动的!生成词云

第二步,根据第一步得到的聊天数据生成词云

1. 导入我们的聊天记录,并对每一行进行分词

聊天记录是一行一行的句子,我们需要使用分词工具把这一行行句子分解成由词语组成的数组,这时候我们就需要用到结巴分词了。

分词后我们还需要去除词语里一些语气词、标点符号等等(停用词),然后还要自定义一些词典,比如说你们之间恩恩爱爱的话,一般结巴分词是无法识别出来的,需要你自行定义,比如说:小傻瓜别感冒了,一般分词结果是

小/傻瓜/别/感冒/了

如果你把“小傻瓜”加入到自定义词典里(我们下面的例子里是mywords.txt),则分词结果则会是

小傻瓜/别/感冒/了

下面对我们的聊天记录进行分词:

segment.py

import jieba

import codecs

def load_file_segment():

读取文本文件并分词

jieba.load_userdict(“mywords.txt”)

加载我们自己的词典

f = codecs.open(u"聊天记录.txt",‘r’,encoding=‘utf-8’)

打开文件

content = f.read()

读取文件到content中

f.close()

关闭文件

segment=[]

保存分词结果

segs=jieba.cut(content)

对整体进行分词

for seg in segs:

if len(seg) > 1 and seg != ‘\r\n’:

如果说分词得到的结果非单字,且不是换行符,则加入到数组中

segment.append(seg)

return segment

print(load_file_segment())

在这个函数里,我们使用了codecs打开我们的聊天记录文件,然后进行结巴分词,最终返回一个包含所有词语的数组。记得运行前要安装jieba分词包,默认你已经安装了python3.

windows打开CMD/macOS系统打开Terminal 输入:

pip install jieba

安装完成后,在编辑器中输入我们刚刚的python代码,我将其命名为segment.py,切记在同个目录下放置 聊天记录.txt 及 自定义词表 mywords.txt, 然后在CMD/Terminal中输入命令运行

python segment.py

你就可以看见你们的聊天记录分词后的效果啦

2. 计算分词后的词语对应的频数

为了方便计算,我们需要引入一个叫pandas的包,然后为了计算每个词的个数,我们还要引入一个叫numpy的包,cmd/terminal中输入以下命令安装pandas和numpy:

  • pip install pandas

  • pip install numpy

详细的解析我都写在下方的注释里啦,大家可以自行阅读并实践。不过需要注意的是,里面的load_file_segment()是我们第一步里的函数,如果你不知道如何把这两个步骤合在一起,没关系,最后我们会提供一份完整的代码.

import pandas

import numpy

def get_words_count_dict():

segment = load_file_segment()

获得分词结果

df = pandas.DataFrame({‘segment’:segment})

将分词数组转化为pandas数据结构

stopwords = pandas.read_csv(“stopwords.txt”,index_col=False,quoting=3,sep=“\t”,names=[‘stopword’],encoding=“utf-8”)

加载停用词

df = df[~df.segment.isin(stopwords.stopword)]

如果不是在停用词中

words_count = df.groupby(by=[‘segment’])[‘segment’].agg({“计数”:numpy.size})

按词分组,计算每个词的个数

words_count = words_count.reset_index().sort_values(by=“计数”,ascending=False)

reset_index是为了保留segment字段,排序,数字大的在前面

return words_count

print(get_words_count_dict())

同第一步一样,运行这份代码你就可以看到每个词语及其对应的频数。需要注意的是,这里有个加载停用词的操作,你需要把停用词表放在当前文件夹下,我们这里提供一份停用词表下载:stopwords.txt

3. 生成词云

终于到了最后一部分啦!你是不是开心而又满怀激动的心情呢(滑稽,在这一步开始之前,我们需要先安装需要使用的包,我们需要用到的包有:

  • pip install matplot

  • pip install scipy

  • pip install wordcloud

打开CMD/Terminal 输入以上命令即可安装,加上之前两个步骤的包,有:

  • pip install jieba

  • pip install codecs

  • pip install pandas

  • pip install numpy

如果你在安装这些包的时候出现了什么问题,请记得在我们下方评论区提出,我们会一一解答的哦。

运行目录的文件结构如下:

  • 聊天记录.txt

  • mywords.txt(如果你没有自定义的词的话可以为空)

  • stopwords.txt

  • wordCloud.py

  • ai.jpg (可以为任意的图片,你喜欢就行)

完整代码,wordCloud.py 如下,附有详细的解析:

coding:utf-8

import jieba

import numpy

import codecs

import pandas

import matplotlib.pyplot as plt

from scipy.misc import imread

import matplotlib.pyplot as plt

from wordcloud import WordCloud, ImageColorGenerator

from wordcloud import WordCloud

def load_file_segment():

读取文本文件并分词

jieba.load_userdict(“mywords.txt”)

加载我们自己的词典

f = codecs.open(u"聊天记录.txt",‘r’,encoding=‘utf-8’)

打开文件

content = f.read()

读取文件到content中

f.close()

关闭文件

segment=[]

保存分词结果

segs=jieba.cut(content)

对整体进行分词

for seg in segs:

if len(seg) > 1 and seg != ‘\r\n’:

如果说分词得到的结果非单字,且不是换行符,则加入到数组中

segment.append(seg)

return segment

def get_words_count_dict():

segment = load_file_segment()

获得分词结果

df = pandas.DataFrame({‘segment’:segment})

将分词数组转化为pandas数据结构

stopwords = pandas.read_csv(“stopwords.txt”,index_col=False,quoting=3,sep=“\t”,names=[‘stopword’],encoding=“utf-8”)

加载停用词

df = df[~df.segment.isin(stopwords.stopword)]

如果不是在停用词中

words_count = df.groupby(by=[‘segment’])[‘segment’].agg({“计数”:numpy.size})

按词分组,计算每个词的个数

words_count = words_count.reset_index().sort_values(by=“计数”,ascending=False)

reset_index是为了保留segment字段,排序,数字大的在前面

return words_count

words_count = get_words_count_dict()

获得词语和频数

bimg = imread(‘ai.jpg’)

读取我们想要生成词云的模板图片

wordcloud = WordCloud(background_color=‘white’, mask=bimg, font_path=‘simhei.ttf’)

获得词云对象,设定词云背景颜色及其图片和字体

如果你的背景色是透明的,请用这两条语句替换上面两条

bimg = imread(‘ai.png’)

wordcloud = WordCloud(background_color=None, mode=‘RGBA’, mask=bimg, font_path=‘simhei.ttf’)

words = words_count.set_index(“segment”).to_dict()

将词语和频率转为字典

wordcloud = wordcloud.fit_words(words[“计数”])

将词语及频率映射到词云对象上

bimgColors = ImageColorGenerator(bimg)

生成颜色

plt.axis(“off”)

关闭坐标轴

plt.imshow(wordcloud.recolor(color_func=bimgColors))

绘色

plt.show()

值得注意的是这里面的bimg和wordcloud对象的生成,我们知道png格式背景一般是透明的,因此如果你的图像是png格式的话,其生成词云的时候背景色应该设为None,然后mode应该设为RGBA。

最后

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/669910
推荐阅读
相关标签