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

来源:https://www.cnblogs.com/chengxyuan/archive/2019/11/29/11960108.html
-Advertisement-
Play Games

明天又雙叒叕是一年一度的七夕戀愛節了! 又是一波絕好的機會!恩愛秀起來! 購物車清空!禮物送起來!朋友圈曬起來! 等等! 什麼?! 你還沒準備好七夕禮物麽? 但其實你不知道要送啥? 原來又雙叒叕要到了 全民不知道送什麼禮物的系列日子了… 需要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. 登錄成功後返回電腦版微信登錄,打開備份與恢復,選擇恢復聊天記錄到手機
  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實用寶典的官網的置頂文章,或者點擊下方閱讀原文直達!還有源代碼等著你哦!最後,祝大家有情人眾人眷屬!七夕完美相會!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 安裝 SQLAlchemy 報錯 安裝命令 報錯截圖 編碼錯誤,這裡我們需要改下源碼 解決方案 重新安裝,安裝成功 參數文章: ...
  • 在python3.7 環境下 函數聲明時能在參數後加冒號,如圖: 可能有疑問,python不是動態類型語言 ,難不成還能指定參數類型? 來看一下列印結果: 但同時也確實能傳其他類型的值 如:f("test",123) 那結果如何呢? 如下: 當然會報錯了啊,返回值是一個字元串,int型不能參與字元串 ...
  • student類 package cn.itheima.Manag;/** * *標準類 * **/public class Student { //學號 private String id; //姓名 private String name; //年齡 private String age; // ...
  • 伺服器的監控通過安裝一些常用的監控軟體之外,有時也需要運行一些shell或Python腳本;shell下可以使用系統自帶的ps/free/top/df等shell命令,Python可以調用subprocess等模塊來運行shell命令,不過這麼做就比較麻煩。這裡有一個比較好用的第三方模塊:psuti ...
  • 1.在一個文件夾名為www.html3.com的web項目來實現,首先到nginx的配置文件nginx.conf做如下配置 python和html混合編寫的文件,我以文件尾碼為.phtml,通過伺服器配置讓它重定向到 /rewrite/ 2.進去項目目錄下的static/html/ 編寫一個1.ph ...
  • 函數1 函數2 函數3 —————————————————————————————————————————————————————————————————— 1調用2,將變數a的地址做實參,傳給2的指針變數b。形如&a —》 *b。 2調用3,若仍以&b —》*c,則在指針變數c中,存入的是b的地址 ...
  • A いっしょ / Be Together (結論/暴力) "題目鏈接" 題目大意: 有 $n$ 個數字,要將它們變成相等,對每一個數字最多操作一次,如將 $a \to b$ 的代價為 $(a b)^2$ ,求出最小的代價。 大致思路: 根據不等式的知識可以知道,假設最後數字變為 $x$,那麼 $x$ ...
  • 恢復內容開始 每次講爬蟲的時候都會從“發送請求” 開始講,講到解析頁面的時候可能大部分讀者都會卡住,因為這部分確實需要一點XPATH或者CSS選擇器的前置知識。那麼有沒有不需要這麼複雜的操作就能把頁面信息讀取出來的方法呢? 答案是:有。 Lassie是一個超簡單的頁面信息檢索工具,它能夠通過幾行代碼 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...