明天又雙叒叕是一年一度的七夕戀愛節了! 又是一波絕好的機會!恩愛秀起來! 購物車清空!禮物送起來!朋友圈曬起來! 等等! 什麼?! 你還沒準備好七夕禮物麽? 但其實你不知道要送啥? 原來又雙叒叕要到了 全民不知道送什麼禮物的系列日子了… 需要Python軟體工具和學習資料的小伙伴可以點擊下方鏈接自行 ...
明天又雙叒叕是一年一度的七夕戀愛節了!
又是一波絕好的機會!恩愛秀起來!
購物車清空!禮物送起來!朋友圈曬起來!
等等! 什麼?!
你還沒準備好七夕禮物麽?
但其實你不知道要送啥?
原來又雙叒叕要到了
全民不知道送什麼禮物的系列日子了…
需要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. 登錄成功後返回電腦版微信登錄,打開備份與恢復,選擇恢復聊天記錄到手機
- 勾選我們剛剛導出的聊天記錄,併在手機上點擊開始恢復
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哦,不然可能會運行不下去:
當然你還可以用正則表達式去除以下內容
- 微信發送的數據:wxid.*
- 表情:[.]*
不過我覺得這些也是必要的聊天信息之一,留著也無妨,因此在這裡就不加入進去啦
最後得到的文本格式就是一行一句聊天內容,處理後我們就準備好進入下一個環節了!那就是令人激動的!生成詞雲
第二步,根據第一步得到的聊天數據生成詞雲
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實用寶典的官網的置頂文章,或者點擊下方閱讀原文直達!還有源代碼等著你哦!最後,祝大家有情人眾人眷屬!七夕完美相會!