情人节礼物------用她的照片和我们的聊天记录生成词云~

用到的知识点

  1. python读写文件
  2. python正则表达式过滤无用信息
  3. jieba分词自定义字典
  4. 停用词筛选、统计词频
  5. 调用wordcloud绘制词云

第一步

从电脑版蛐蛐导出聊天记录。(手机一般不可以)
情人节礼物------用她的照片和我们的聊天记录生成词云~
点击消息管理,右键点击想导出的联系人
情人节礼物------用她的照片和我们的聊天记录生成词云~

点击导出消息记录即可,选择保存方式为.txt

这里是在电脑消息记录和手机同步的情况下的操作。如果在自己不常用的电脑上可能消息记录并不全。需要手机进行消息记录同步,网上也有教程。

情人节礼物------用她的照片和我们的聊天记录生成词云~
txt文件格式是这样子滴,xxx是昵称

第二步

时间和昵称是无用文本消息,需要进行过滤【1,2】。

emmm先来用到的python包

import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import numpy as np
import PIL.Image as Image
import re

读写文件和正则表达式过滤的代码如下:

with open('2-month.txt', encoding="utf8") as fp:
    text = fp.read()

text1 = re.sub(r"\d{4}-\d{2}-\d{2} \d{1,2}:\d\d:\d\d|[表情]|[图片]|\[|\]", "", text)  # 得到过滤时间后的文本
text2 = text1.replace('y','xxx') #y是原本的昵称,xxx是需要替换为的字符串
fh = open('2_clean_temp.txt', 'w', encoding='utf-8')
fh.write(text2)
fh.close()

Python 正则表达式|菜鸟教程
python re模块(正则表达式) sub()函数详解
简单来说,sub函数传入三个必选参数,分别是pattern, repl, string

pattern

模式字符串 ,即要匹配的字符串
代码中

"\d{4}-\d{2}-\d{2} \d{1,2}:\d\d:\d\d|[表情]|[图片]|\[|\]"

表示匹配4位整数-2位整数-2位整数 1或2位整数:2位整数:2位整数 ------匹配时间
[表情] 和 [图片] ------匹配txt无法显示的表情和图片

repl

要替换为的字符串,代码中替换为空字符串

string

要处理的文本

过滤完成后将文本保存

第三步

接着打开过滤后的文本进行jieba分词,同时定义自己的词典。即某些词不会被分开【3】

你们肯定会有一些属于你们之间的称呼哈哈哈哈,或者是一些地名等等,为了不让它们被分开,所以定义自己的词典。

with open('2_clean_temp.txt', encoding="utf8") as fp:
    text1 = fp.read()
jieba.load_userdict("./dict.txt")#加载自定义字典
word_list = jieba.lcut(text1, cut_all=False)  # 分词
# print(word_list) # 查看分词结果,更新自定义词典

词典格式为:一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。

例如:情人节礼物------用她的照片和我们的聊天记录生成词云~

这里用新建txt文件作为词典比较方便。

jieba分词

jieba分词详解
有三种匹配模型,精确模式、全模式和搜索引擎模式:

jieba.cut(sentence,cut_all=False,HMM=True) # 精确模式
jieba.cut(sentence,cut_all=True,HMM=True) # 全模式
jieba.cut_for_search (sentence, HMM=True) # 搜索引擎模式

得到结果

sentence = "今天天气真好。"
#---------------result----------------
'今天天气 真 好' # 精确模式
'今天 今天天气 天天 天气 真好' # 全模式
'今天 天天 天气 今天天气 真 好' # 搜索引擎模式

如果调用lcut,则得到list结果

第四步

删除停用词并统计词频方便后续词云绘制【4】

word_count={} #定义字典进行存储,较为方便
stopwords = [line.strip() for line in open("stopword.txt",encoding="UTF-8").readlines()] #加载停用词,逐行读取
for word in word_list:
        if word not in stopwords: #如果不在停用词列表中
            word_count[word] = word_count.get(word, 0) + 1 #就将次数加一
items = list(word_count.items()) 
items.sort(key=lambda x: x[1], reverse=True) #进行排序
dictItems = dict(items) #重新转换为字典,绘制词云要用到

这里停用词用到哈工大的停用词列表,自己再添加了一些。
中文停用词表——哈工大停用词表
可以自己新建txt文件,将停用词复制进去。

第五步

用wordcloud绘制词云

image_background = Image.open('2.jpg')
MASK = np.array(image_background)

font=r'C:\\Windows\\Fonts\\simhei.ttf'
my_wordcloud = WordCloud(background_color="white", max_words=500, max_font_size=45,
                         font_path=font,scale=20,mask =MASK).generate_from_frequencies(dictItems)

plt.imshow(my_wordcloud)  # 显示词云图
plt.axis('off') # 是否显示x轴、y轴下标  
plt.show()

如果只想得到矩形图片的词云,例如:
情人节礼物------用她的照片和我们的聊天记录生成词云~
那就不需要前两行代码

如果想生成这样效果的:
情人节礼物------用她的照片和我们的聊天记录生成词云~
那就需要抠图。需要将想要词云覆盖的部分抠出来,其他部分设置为白色背景。写入前两行代码,以及调用如下代码:

my_wordcloud = WordCloud(background_color="white", max_words=500, max_font_size=45,
                         font_path=font,scale=20,mask =MASK).generate_from_frequencies(dictItems)

Python之wordcloud库使用

一般来说。词云的清晰度可以通过scale这个参数调节
或者根据图片的分辨率、大小,调节max_words和max_font_size两个参数调整,得到字体清晰的词云

python词云库wordcloud的使用方法与实例详解
用到wordcloud的函数:generate_from_frequencies(dictItems)。这是根据词频绘制

其实也可以直接根据文本进行绘制,但是可能得不到自己想要的效果。如 generate_from_text(text)

为了显示中文,需要自己将字体路径加进来
font=r'C:\\Windows\\Fonts\\simhei.ttf' 路径都是C:\Windows\Fonts\,需要什么字体调整后面的simhei.ttf’即可,这个是黑体。

全部代码

import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import numpy as np
import PIL.Image as Image
import re

'''
保存过滤时间后的文本
'''
with open('2-month.txt', encoding="utf8") as fp:
    text = fp.read()

text1 = re.sub(r"\d{4}-\d{2}-\d{2} \d{1,2}:\d\d:\d\d|[表情]|[图片]|\[|\]", "", text)  # 得到过滤时间后的文本
text2 = text1.replace('渡','王彦景')
fh = open('2_clean_temp.txt', 'w', encoding='utf-8')
fh.write(text2)
fh.close()
'''
进行结巴分词
'''
with open('2_clean_temp.txt', encoding="utf8") as fp:
    text1 = fp.read()
jieba.load_userdict("./dict.txt")#加载自定义字典
word_list = jieba.lcut(text1, cut_all=False)  # 分词
# print(word_list)

word_count={}
stopwords = [line.strip() for line in open("stopword.txt",encoding="UTF-8").readlines()]
for word in word_list:
        if word not in stopwords:
            word_count[word] = word_count.get(word, 0) + 1
items = list(word_count.items())
items.sort(key=lambda x: x[1], reverse=True)
dictItems = dict(items)
# print(dictItems)
image_background = Image.open('2.jpg')
MASK = np.array(image_background)

font=r'C:\\Windows\\Fonts\\simhei.ttf'
my_wordcloud = WordCloud(background_color="white", max_words=500, max_font_size=45,
                         font_path=font,scale=20,mask =MASK).generate_from_frequencies(dictItems)

plt.imshow(my_wordcloud)  # 显示词云图
plt.axis('off') # 是否显示x轴、y轴下标  
plt.show()

到此就结束啦,俩人都很傻哈哈哈哈,情人节一天没咋理对方,都在制作情人节礼物哈哈哈哈。
到了晚上才发现我给她做了词云,她给我做了音乐视频嘿嘿。
这是最终我做的视频的效果:附上b站链接

上一篇:[Python] 中文分词


下一篇:结巴分词 & 词云