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


前言

本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。

作者: Python實用寶典

PS:如有需要Python學習資料的小伙伴可以加點擊下方鏈接自行獲取

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

在這里插入圖片描述

在這里插入圖片描述

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

今天 我們采集情侶們之間的聊天日常

用此制作一份只屬於你們的小浪漫!

第一步,我們需要導出自己和對象的數據~

微信的備份功能並不能直接給你導出文本格式,它導出來其實是一種叫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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM