誰說程序員不浪漫?Python導出微信聊天記錄生成愛的詞雲圖

明天又雙叒叕是一年一度的七夕戀愛節了!python

又是一波絕好的機會!恩愛秀起來!ios

購物車清空!禮物送起來!朋友圈曬起來!正則表達式


 

等等! 什麼?!sql

你還沒準備好七夕禮物麼?shell

但其實你不知道要送啥?數據庫

原來又雙叒叕要到了windows

全民不知道送什麼禮物的系列日子了…數組

須要Python軟件工具和學習資料的小夥伴能夠點擊下方連接自行獲取瀏覽器

http://note.youdao.com/noteshare?id=7e3c432b74512d52b75aafc4609451b9微信

哎呦 大家這些

磨人的小(lao)妖(you)精(tiao)!

Python卻是以爲你還能夠搶救一下!

說到詞雲應該不陌生,不知道的童靴往下看

詞雲,就是把網絡文本中出現頻率較高的

"關鍵詞"予以視覺上的突出

瀏覽者只要一眼掃過文本就能夠領略其主旨

瞧 這是否是一個有聲音、有畫面的小愛心~

今天 咱們採集情侶們之間的聊天平常

用此製做一份只屬於大家的小浪漫!


第一步,咱們須要導出本身和對象的數據~

微信的備份功能並不能直接給你導出文本格式,它導出來實際上是一種叫sqlite的數據庫。若是說用網上流傳的方法提取文本數據,iOS則須要下載itunes備份整機,安卓則須要本機的root權限,不管是哪一種都很是麻煩,在這裏給你們介紹一種不須要整機備份和本機root權限,只導出和對象的聊天數據的方法。

那就是使用安卓模擬器導出,這樣既能ios/安卓通用,又可以避免對本機形成不良影響,首先須要用電腦版的微信備份你和你對象的聊天記錄。以windows系統爲例:

1. 下載夜神模擬器
2. 在夜神模擬器中下載微信
3. 使用windows客戶端版的微信進行備份,如圖左下角
4. 點擊備份聊天記錄至電腦
5. 手機端選擇備份的對象

點擊進入下方的選擇聊天記錄,而後選擇和你對象的記錄就能夠啦

6. 導出完畢後打開模擬器,登陸模擬器的微信
7. 登陸成功後返回電腦版微信登陸,打開備份與恢復,選擇恢復聊天記錄到手機
  1. 勾選咱們剛剛導出的聊天記錄,並在手機上點擊開始恢復
9. 打開夜神模擬器的root權限
10. 用模擬器的瀏覽器百度搜索RE文件管理器,下載(圖一)安裝後打開,會彈出對話框讓你給予root權限,選擇永久給予,打開RE文件管理器(圖二),進入如下文件夾(圖三), 這是應用存放數據的地方。

/data/data/com.tencent.mm/MicroMsg

而後進入一個由數字和字母組合而成的文件夾,如上 圖三 的 4262333387ddefc95fee35aa68003cc5

11. 找到該文件夾下的EnMicroMsg.db文件,將其複製到夜神模擬器的共享文件夾(圖四)。共享文件夾的位置爲 /mnt/shell/emulated/0/others ( 圖五 ),如今訪問windows的 C:\Users\你的用戶名\Nox_share\OtherShare 獲取該數據庫
12. 導出該數據庫後,使用一款叫 **sqlcipher **的軟件讀取數據(連接: https://pan.baidu.com/s/1Im3n02yseo-4IxeDY9srqQ提取碼: ka4z)

在這以前,咱們還須要知道該數據庫的密碼,根據前人的經驗,該密碼的公式以下

字符串 " IMEI (手機序列號) UIN(用戶信息號)"

將該字符串進行MD5計算後的前七位即是該數據的密碼,如 "355757010761231 857456862" 實際上中間沒有空格,而後放入MD5計算取前面七位數字,後續會詳細介紹。

哇,真是「簡單易懂」啊,不要緊,接下來告訴你們IMEI和UIN怎麼得到。

首先是IMEI,在模擬器右上角的系統設置 —— 屬性設置裏就能夠找獲得啦,如圖所示。

如今咱們得到了IMEI號,那UIN號呢?

一樣地,用RE文件管理器打開這個文件

/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml

長按改文件,點擊右上角的三個點—選擇打開方式—文本瀏覽器,找到default_uin,後面的數字就是了 !

獲得這兩串數字後,就能夠開始計算密碼啦,若是個人IMEI是355757010762041,Uin是857749862,那麼合起來就是355757010762041857749862,將這串數字放入免費MD5在線計算

獲得的數字的前七位就是咱們的密碼了,像這一串就是 6782538.

而後咱們就能夠進入咱們的核心環節:使用 **sqlcipher **導出聊天文本數據!

點擊 File - open database - 選擇咱們剛剛的數據庫文件,會彈出框框讓你輸入密碼,咱們輸入剛剛獲得的七位密碼,就能夠進入到數據庫了,選擇message表格,這就是你與你的對象的聊天記錄!

咱們能夠將它導出成csv文件:File - export - table as csv.

接下來,咱們將使用Python代碼,將裏面真正的聊天內容:content信息提取出來,以下所示。雖然這個軟件也容許select,可是它select後不容許導出,很是很差用,所以還不如咱們本身寫一個:

#!/usr/bin/python import pandas import csv, sqlite3 conn= sqlite3.connect('chat_log.db') # 新建數據庫爲 chat_log.db df = pandas.read_csv('chat_logs.csv', sep=",") # 讀取咱們上一步提取出來的csv文件,這裏要改爲你本身的文件名 df.to_sql('my_chat', conn, if_exists='append', index=False) # 存入my_chat表中 conn = sqlite3.connect('chat_log.db') # 鏈接數據庫 cursor = conn.cursor() # 得到遊標 cursor.execute('select content from my_chat where length(content)<30') # 將content長度限定30如下,由於content中有時候會有微信發過來的東西 value=cursor.fetchall() # fetchall返回篩選結果 data=open("聊天記錄.txt",'w+',encoding='utf-8') for i in value: 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。

咱們還能夠控制詞雲字體的大小和數目的多少,使用下面這兩個參數:

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 進入代碼所在文件夾,運行:python wordcloud.py

獲得的圖像以下:

喜歡嗎?喜歡就拿去用吧!

怎麼樣,是否是很好看,若是你想要這些圖片的原圖作一個屬於本身的詞雲的話,請訪問python實用寶典的官網的置頂文章,或者點擊下方閱讀原文直達!還有源代碼等着你哦!最後,祝你們有情人衆人眷屬!七夕完美相會!

相關文章
相關標籤/搜索