Python 情人節超強技能 導出微信聊天記錄生成詞雲

前言

本文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。ios

做者: Python實用寶典sql

PS:若有須要Python學習資料的小夥伴能夠加點擊下方連接自行獲取shell

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef數據庫

在這裏插入圖片描述

在這裏插入圖片描述

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

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

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

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

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

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

  1. 下載夜神模擬器數據結構

  2. 在夜神模擬器中下載微信

  3. 使用windows客戶端版的微信進行備份,如圖左下角

  4. 在這裏插入圖片描述

  5. 點擊備份聊天記錄至電腦 在這裏插入圖片描述

  6. 手機端選擇備份的對象

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

在這裏插入圖片描述 在這裏插入圖片描述

  1. 導出完畢後打開模擬器,登陸模擬器的微信

  2. 在這裏插入圖片描述

  3. 登陸成功後返回電腦版微信登陸,打開備份與恢復,選擇恢復聊天記錄到手機

  4. 在這裏插入圖片描述 在這裏插入圖片描述

  5. 勾選咱們剛剛導出的聊天記錄,並在手機上點擊開始恢復

  6. 在這裏插入圖片描述

  7. 打開夜神模擬器的root權限

  8. 在這裏插入圖片描述

  9. 用模擬器的瀏覽器百度搜索RE文件管理器,下載(圖一)安裝後打開,會彈出對話框讓你給予root權限,選擇永久給予,打開RE文件管理器(圖二),進入如下文件夾(圖三), 這是應用存放數據的地方。

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

在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述

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

  1. 找到該文件夾下的EnMicroMsg.db文件,將其複製到夜神模擬器的共享文件夾(圖四)。共享文件夾的位置爲 /mnt/shell/emulated/0/others ( 圖五 ),如今訪問windows的 C:\Users\你的用戶名\Nox_share\OtherShare 獲取該數據庫文件( EnMicroMsg.db ) 在這裏插入圖片描述 在這裏插入圖片描述

  2. 導出該數據庫後,使用一款叫 sqlcipher 的軟件讀取數據 將該字符串進行MD5計算後的前七位即是該數據庫的密碼,如 "355757010761231 857456862" 實際上中間沒有空格,而後放入MD5計算取前面七位數字,後續會詳細介紹。

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

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

在這裏插入圖片描述

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

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

在這裏插入圖片描述

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

在這裏插入圖片描述

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

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

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

在這裏插入圖片描述

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

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

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

 1 import pandas
 2 import csv, sqlite3
 3 conn= sqlite3.connect('chat_log.db')
 4 # 新建數據庫爲 chat_log.db
 5 df = pandas.read_csv('chat_logs.csv', sep=",")
 6 # 讀取咱們上一步提取出來的csv文件,這裏要改爲你本身的文件名
 7 df.to_sql('my_chat', conn, if_exists='append', index=False)
 8 # 存入my_chat表中
 9  
10 conn = sqlite3.connect('chat_log.db') 
11 # 鏈接數據庫
12 cursor = conn.cursor()
13 # 得到遊標
14 cursor.execute('select content from my_chat where length(content)<30') 
15 # 將content長度限定30如下,由於content中有時候會有微信發過來的東西
16 value=cursor.fetchall()
17 # fetchall返回篩選結果
18  
19 data=open("聊天記錄.txt",'w+',encoding='utf-8') 
20 for i in value:
21     data.write(i[0]+'\n')
22 # 將篩選結果寫入 聊天記錄.txt
23  
24 data.close()
25 cursor.close()
26 conn.close()
27 # 關閉鏈接

 

記得把csv文件的編碼格式轉換成utf-8哦,否則可能會運行不下去: 在這裏插入圖片描述

第二步,根據第一步獲得的聊天數據生成詞雲

. 導入咱們的聊天記錄,並對每一行進行分詞

聊天記錄是一行一行的句子,咱們須要使用分詞工具把這一行行句子分解成由詞語組成的數組,這時候咱們就須要用到結巴分詞了。

分詞後咱們還須要去除詞語裏一些語氣詞、標點符號等等(停用詞),而後還要自定義一些詞典,好比說大家之間恩恩愛愛的話,通常結巴分詞是沒法識別出來的,須要你自行定義,好比說:小傻瓜別感冒了,通常分詞結果是

小/傻瓜/別/感冒/了

若是你把「小傻瓜」加入到自定義詞典裏(咱們下面的例子裏是mywords.txt),則分詞結果則會是

小傻瓜/別/感冒/了

下面對咱們的聊天記錄進行分詞:

 1 import jieba
 2 import codecs
 3 def load_file_segment():
 4     # 讀取文本文件並分詞
 5     jieba.load_userdict("mywords.txt")
 6     # 加載咱們本身的詞典
 7     f = codecs.open(u"聊天記錄.txt",'r',encoding='utf-8')
 8     # 打開文件
 9     content = f.read()
10     # 讀取文件到content中
11     f.close()
12     # 關閉文件
13     segment=[]
14     # 保存分詞結果
15     segs=jieba.cut(content) 
16     # 對總體進行分詞
17     for seg in segs:
18         if len(seg) > 1 and seg != '\r\n':
19             # 若是說分詞獲得的結果非單字,且不是換行符,則加入到數組中
20             segment.append(seg)
21     return segment
22 print(load_file_segment())

 

  1. 計算分詞後的詞語對應的頻數

爲了方便計算,咱們須要引入一個叫pandas的包,而後爲了計算每一個詞的個數,咱們還要引入一個叫numpy的包,cmd/terminal中輸入如下命令安裝pandas和numpy:

pip install pandas
pip install numpy
 1 import pandas
 2 import numpy
 3 def get_words_count_dict():
 4     segment = load_file_segment()
 5     # 得到分詞結果
 6     df = pandas.DataFrame({'segment':segment})
 7     # 將分詞數組轉化爲pandas數據結構
 8     stopwords = pandas.read_csv("stopwords.txt",index_col=False,quoting=3,sep="\t",names=['stopword'],encoding="utf-8")
 9     # 加載停用詞
10     df = df[~df.segment.isin(stopwords.stopword)]
11     # 若是不是在停用詞中
12     words_count = df.groupby(by=['segment'])['segment'].agg({"計數":numpy.size})
13     # 按詞分組,計算每一個詞的個數
14     words_count = words_count.reset_index().sort_values(by="計數",ascending=False)
15     # reset_index是爲了保留segment字段,排序,數字大的在前面
16     return words_count
17 print(get_words_count_dict())

 

完整代碼,wordCloud.py 以下,附有詳細的解析:

 1 import jieba
 2 import numpy
 3 import codecs
 4 import pandas
 5 import matplotlib.pyplot as plt
 6 from scipy.misc import imread
 7 import matplotlib.pyplot as plt
 8 from wordcloud import WordCloud, ImageColorGenerator
 9 from wordcloud import WordCloud
10  
11 def load_file_segment():
12     # 讀取文本文件並分詞
13     jieba.load_userdict("mywords.txt")
14     # 加載咱們本身的詞典
15     f = codecs.open(u"聊天記錄.txt",'r',encoding='utf-8')
16     # 打開文件
17     content = f.read()
18     # 讀取文件到content中
19     f.close()
20     # 關閉文件
21     segment=[]
22     # 保存分詞結果
23     segs=jieba.cut(content) 
24     # 對總體進行分詞
25     for seg in segs:
26         if len(seg) > 1 and seg != '\r\n':
27             # 若是說分詞獲得的結果非單字,且不是換行符,則加入到數組中
28             segment.append(seg)
29     return segment
30  
31 def get_words_count_dict():
32     segment = load_file_segment()
33     # 得到分詞結果
34     df = pandas.DataFrame({'segment':segment})
35     # 將分詞數組轉化爲pandas數據結構
36     stopwords = pandas.read_csv("stopwords.txt",index_col=False,quoting=3,sep="\t",names=['stopword'],encoding="utf-8")
37     # 加載停用詞
38     df = df[~df.segment.isin(stopwords.stopword)]
39     # 若是不是在停用詞中
40     words_count = df.groupby(by=['segment'])['segment'].agg({"計數":numpy.size})
41     # 按詞分組,計算每一個詞的個數
42     words_count = words_count.reset_index().sort_values(by="計數",ascending=False)
43     # reset_index是爲了保留segment字段,排序,數字大的在前面
44     return words_count
45  
46 words_count = get_words_count_dict()
47 # 得到詞語和頻數
48  
49 bimg = imread('ai.jpg')
50 # 讀取咱們想要生成詞雲的模板圖片
51 wordcloud = WordCloud(background_color='white', mask=bimg, font_path='simhei.ttf')
52 # 得到詞雲對象,設定詞雲背景顏色及其圖片和字體
53  
54 # 若是你的背景色是透明的,請用這兩條語句替換上面兩條 
55 # bimg = imread('ai.png')
56 # wordcloud = WordCloud(background_color=None, mode='RGBA', mask=bimg, font_path='simhei.ttf')
57  
58 words = words_count.set_index("segment").to_dict()
59 # 將詞語和頻率轉爲字典
60 wordcloud = wordcloud.fit_words(words["計數"])
61 # 將詞語及頻率映射到詞雲對象上
62 bimgColors = ImageColorGenerator(bimg)
63 # 生成顏色
64 plt.axis("off")
65 # 關閉座標軸
66 plt.imshow(wordcloud.recolor(color_func=bimgColors))
67 # 繪色
68 plt.show()
相關文章
相關標籤/搜索