ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-02-15 21:57:58  阅读:232  来源: 互联网

标签:jieba font word 聊天记录 wordcloud 词云 ------ import txt


用到的知识点

  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站链接

标签:jieba,font,word,聊天记录,wordcloud,词云,------,import,txt
来源: https://blog.csdn.net/qq_45726331/article/details/113819079

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有