女朋友生日不知道送什么?快来尝试制作爱情词云吧!说到词云,大家应该都不陌生了。不知道的话,往下看词云,就是把网络文本中频繁出现的“关键词”直观地突出出来。观者扫文一眼,便可体会其要旨。看看这是不是有声有画的小爱心~今天我们收集情侣间的聊天记录,用它来为你打造一个小浪漫!第一步,我们要导出自己和对象的数据~微信的备份功能不能直接给你导出文本格式,它实际上是导出了一个叫sqlite的数据库。如果使用网上流传的方法提取文本数据,iOS需要下载itunes进行整机备份,Android需要机器的root权限。无论哪种方式都非常麻烦。这里介绍一种不需要全机备份和Nativeroot权限,只导出和对象聊天数据的方法。也就是用安卓模拟器导出,这样ios/安卓都可以通用,又可以避免对机器造成不良影响。首先,你需要使用电脑版微信备份你和伴侣的聊天记录。以windows系统为例:1.下载夜神模拟器2.在夜神模拟器中下载微信3.使用Windows客户端版微信进行备份,如图左下角4.点击备份聊天历史到电脑5.手机在终端选择备份对象点击下方进入聊天记录,然后选择有你对象的记录。选择聊天记录,点击你的对象~6.导出完成后,打开模拟器,进入模拟器微信登录成功7。登录成功后返回电脑版微信登录,打开备份还原,选择还原聊天记录到手机备份还原,勾选我们刚刚导出的聊天记录,在手机上点击开始还原9.打开夜间模拟器的root权限10.用模拟器的浏览器百度搜索RE文件管理器,下载(图1),安装后打开,会弹出对话框让你授予root权限,选择永久给予,打开RE文件管理器(图2),进入如下文件夹(图3),这是应用程序存放数据的地方。/data/data/com.tencent.mm/MicroMsg图1图2图3然后进入一个由数字和字母组成的文件夹,如上图3中的4262333387ddefc95fee35aa68003cc511。找到该文件夹??下的EnMicroMsg.db文件,将其复制到夜神模拟器的共享文件夹中(图4)。共享文件夹的位置是/mnt/shell/emulated/0/others(图5),现在在Windows中访问C:\Users\你的用户名\Nox_share\OtherShare得到数据库文件(EnMicroMsg.db)图45.12.导出数据库后,使用一个叫sqlcipher的软件读取数据(链接:https://pan.baidu.com/s/1Im3n02yseo-4IxeDY9srqQ提取码:ka4z)在此之前,我们需要知道数据库的密码,根据前辈的经验,密码的公式如下:字符串“IMEI(手机序列号)UIN(用户信息编号)”后的字符串进行MD5计算,前七位为密码数据库的,比如“355757010761231857456862”其实中间是没有空格的,然后放到MD5中计算前七位,后面会详细介绍。哇,真是“简单易懂”,没关系,我来告诉你如何获取IMEI和UIN。首先是IMEI,可以在模拟器右上角的系统设置-属性设置中找到,如图。IMEI现在我们得到了IMEI号,那么UIN号呢?同样用RE文件管理器打开这个文件/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml长按更改文件,点击右上角三个点—选择打开方式—文本浏览器,找到default_uin,下面的数字就是它了!得到这两串数字后,就可以开始计算密码了。如果我的IMEI是355757010762041,Uin是857749862,那么组合就是355757010762041857749862。把这串数字放到免费的MD5在线计算得到数字的前七位就是我们的密码,像这个字符串就是6782538。如果uin是负数,可以试试uin拼接手机IMEI码(即拼接正数的反义词),取MD5的32位小写密文的前7个字符。如果没有,请重新安装模拟器。那么我们就可以进入核心了:使用sqlcipher导出聊天文本数据!在sqlcipher中,点击文件——打开数据库——选择我们刚刚创建的数据库文件,会弹出一个框让你输入密码。我们输入刚刚得到的七位密码进入数据库。选择消息形式,就是你和你对象的关系。聊天记录!我们可以将其导出为csv文件:文件-导出-表为csv。接下来,我们将使用Python代码提取里面真正的聊天内容:内容信息,如下图。这个软件虽然也可以选择,但是选择之后不允许导出,非常不好用,所以我们还不如自己写一个:#!/usr/bin/pythonimportpandasimportcsv,sqlite3conn=sqlite3.connect('chat_log.db')#新建的数据库为chat_log.dbdf=pandas.read_csv('chat_logs.csv',sep=",")#读取我们上一步提取的csv文件,这里需要改成自己的filenamedf.to_sql('my_chat',conn,if_exists='append',index=False)#存入my_chat表conn=sqlite3.connect('chat_log.db')#连接数据库cursor=conn.cursor()#获取游标cursor.execute('selectcontentfrommy_chatwherelength(content)<30')#限制内容长度小于30,因为内容里有时候会有微信发的东西value=cursor.fetchall()#fetchall返回筛选结果data=open("聊天记录.txt",'w+',encoding='utf-8')foriinvalue:data.write(i[0]+'\\n')#将过滤结果写入聊天记录rds.txtdata.close()cursor.close()conn.close()#关闭连接记得把csv文件的编码格式转为utf-8,否则可能会失效:用记事本打开—文件—另存为——编码更改为UTF-8。当然你也可以用正则表达式去除微信发送的如下数据:wxid.*表情符号:\[.*\]不过我觉得这些也是必要的聊天信息之一,留着也无妨。所以这里我就不加了,有需要的同学可以看一下这个文档。最终的文本格式是一行一行的聊天内容。处理完之后,我们就可以进入下一个环节了!真令人兴奋!生成词云!!第二步,根据第一步得到的聊天数据生成词云导入我们的聊天记录,对每一行进行分词聊天记录是一行一行的句子,我们需要用分词工具来分解这个lineofsentencesintoAnarrayofwords,这时候我们就需要用到结巴分词了。分词之后,我们还需要去除词中的一些语气词、标点符号等(停用词),然后自定义一些词典。你自己定义,比如:小傻瓜,别感冒了,如果在自定义词典(mywords.txt在我们下面的例子中),分词结果会是littlefool/don't/cold/got。让我们对聊天记录进行分段:#segment.pyimportjiebaimportcodecsdefload_file_segment():#读取文本文件和分段单词jieba.load_userdict("mywords.txt")#加载我们自己的字典f=codecs.open(u"chatrecords.txt",'r',encoding='utf-8')#打开文件content=f.read()#读取文件到内容中f.close()#关闭文件segment=[]#保存分词结果segs=jieba.cut(content)#整词分词forseginsegs:iflen(seg)>1andseg!='\r\n':#如果分词结果不是单个词,则不是换行,然后添加到数组中包含所有单词。运行前记得安装jieba分词包。默认情况下,您已经安装了python3。如果没有,请参考这个文档:安装Pythonwindows,打开CMD/macOS系统,打开Terminal输入:pipinstalljieba**安装完成后,进入编辑器我们刚才的Python代码,我命名为segment.py,记住把chatrecords.txt和customvocabularymywords.txt放在同一个目录下,然后在CMD/Terminal输入命令运行pythonsegment.py就可以看到你的聊天记录分词后的效果2.计算频率对应分词后的单词,为了方便计算,我们需要引入一个包叫pandas,然后为了计算每个单词的个数,还需要引入一个包叫numpy包,输入如下命令在cmd/terminal中安装pandas和numpy:pipinstallpandas==0.25.1pipinstallnumpy我在下面的评论里写了详细的分析,大家可以自己阅读练习。不过需要注意的是,里面的load_file_segment()是我们第一步中的函数。如果您不知道如何将这两个步骤结合起来,也没关系。我们将在最后提供完整的代码。importpandasimportnumpydefget_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({"count":numpy.size})#按词分组,计算每个单词的个数Numberwords_count=words_count.reset_index().sort_values(by="count",ascending=False)#reset_index是保留段字段,排序,个数大returnwords_countprint(get_words_count_dict())同上第一步,运行这段代码,你可以看到每个单词及其对应的频率。需要注意的是,这里有一个加载停用词的操作。您需要将停用词列表放在当前文件夹中。我们这里提供停用词表下载:stopwords.txt3.词云生成终于结束了一部分!你高兴和兴奋吗?(滑稽的,在开始这一步之前,我们需要先安装好我们需要用到的包:pipinstallmatplotpipinstallscipy==1.2.1pipinstallwordcloud打开CMD/Terminal输入上面的命令安装,加上前面两个的包步骤,有:pipinstalljiebapipinstallcodecspipinstallpandas==0.25.1pipinstallnumpy如果你在安装这些包的时候有什么问题,记得在下方评论区提问,我们会一一解答。运行目录的文件结构如下:chatrecords.txtmywords.txt(没有自定义词可以为空)stopwords.txtwordCloud.pyai.jpg(可以是任意图片,喜欢就好)完整代码,wordCloud。py如下,附有详细解析(simhei字体可以在这里下载):#coding:utf-8importjiebaimportnumpyimportcodecsimportpandasimportmatplotlib.pyplotaspltfromscipy.miscimportimreadimportmatplotlib.pyplotaspltfromwordcloudimportWordCloud,ImageColorGeneratorfromwordCloud_degmentimportWordCloud_file():#读取文本文件和分词jieba.load_userdict("mywords.txt")#加载我们自己的字典f=codecs.open(u"chatrecords.txt",'r',encoding='utf-8')#打开文件content=f.read()#将文件读入内容f.close()#关闭文件segment=[]#保存分词结果segs=jieba.cut(content)#分词wholewordforseginsegs:iflen(seg)>1andseg!='\r\n':#如果分词结果不是单个词且不是换行符,加入数组segment.append(seg)returnsegmentdefget_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({"count":numpy.size})#按单词分组,计算每个单词的个数words_count=words_count.reset_index().sort_values(by="count",ascending=False)#reset_index是保留段字段,排序,编号的大的在前面returnwords_countwords_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["count"])#将词和频率映射到词云对象bimgColors=ImageColorGenerator(bimg)#生成颜色plt.axis("off")#关闭坐标轴plt.imshow(wordcloud.recolor(color_func=bimgColors))#Paintcolorplt.show()值得注意的是这里生成了bimg和wordcloud对象。我们知道png格式的背景一般都是透明的,所以如果你的图片是png格式的,在生成词云的时候要把背景色设置为None,然后mode设置为RGBA。我们还可以控制词云字体的大小和数量,使用下面两个参数:max_font_size=60,max_words=3000放入wordcloud=WordCloud(background_color='white',mask=bimg,max_font_size=60,max_words=3000,font_path='simhei.ttf')在运行之前,确保所有的包都安装好了,并且当前目录下有我们需要的所有文件。接下来,我们就可以利用我们的聊天记录来绘制心形词云啦!!!:CMD/Terminal进入代码所在文件夹,运行:pythonwordcloud.py得到的图像如下:ai.jpg这个结果你喜欢吗?喜欢就用吧!怎么样,是不是很美?如果你想用这些图片的原图制作自己的词云,请访问Python实战宝典官网(https://pythondict.com)顶部,或点击下方阅读原文!源代码等着你!最后祝各位爱人和家人!七夕的完美约会!我们的文章到此结束!如果喜欢我们的文章,请持续关注Python实战宝典!请记住我们的官网:https://pythondict.com,公众号:Python实战宝典。
