本文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。ios
做者: Python實用寶典sql
PS:若有須要Python學習資料的小夥伴能夠加點擊下方連接自行獲取shell
http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef數據庫
瞧 這是否是一個有聲音、有畫面的小愛心~windows
今天 咱們採集情侶們之間的聊天平常數組
用此製做一份只屬於大家的小浪漫!瀏覽器
微信的備份功能並不能直接給你導出文本格式,它導出來實際上是一種叫sqlite的數據庫。若是說用網上流傳的方法提取文本數據,iOS則須要下載itunes備份整機,安卓則須要本機的root權限,不管是哪一種都很是麻煩,在這裏給你們介紹一種不須要整機備份和本機root權限,只導出和對象的聊天數據的方法。微信
那就是使用安卓模擬器導出,這樣既能ios/安卓通用,又可以避免對本機形成不良影響,首先須要用電腦版的微信備份你和你對象的聊天記錄。以windows系統爲例:網絡
下載夜神模擬器數據結構
在夜神模擬器中下載微信
使用windows客戶端版的微信進行備份,如圖左下角
點擊備份聊天記錄至電腦
手機端選擇備份的對象
點擊進入下方的選擇聊天記錄,而後選擇和你對象的記錄就能夠啦
導出完畢後打開模擬器,登陸模擬器的微信
登陸成功後返回電腦版微信登陸,打開備份與恢復,選擇恢復聊天記錄到手機
勾選咱們剛剛導出的聊天記錄,並在手機上點擊開始恢復
打開夜神模擬器的root權限
用模擬器的瀏覽器百度搜索RE文件管理器,下載(圖一)安裝後打開,會彈出對話框讓你給予root權限,選擇永久給予,打開RE文件管理器(圖二),進入如下文件夾(圖三), 這是應用存放數據的地方。
/data/data/com.tencent.mm/MicroMsg
而後進入一個由數字和字母組合而成的文件夾,如上 圖三 的 4262333387ddefc95fee35aa68003cc5
找到該文件夾下的EnMicroMsg.db文件,將其複製到夜神模擬器的共享文件夾(圖四)。共享文件夾的位置爲 /mnt/shell/emulated/0/others ( 圖五 ),如今訪問windows的 C:\Users\你的用戶名\Nox_share\OtherShare 獲取該數據庫文件( EnMicroMsg.db )
導出該數據庫後,使用一款叫 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())
計算分詞後的詞語對應的頻數
爲了方便計算,咱們須要引入一個叫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()