Author:AXYZdong 自動化專業 工科男
有一點思考,有一點想法,有一點理性!
定個小小目標,努力成爲習慣!在最美的年華遇見更好的自己!
CSDN@AXYZdong,CSDN首發,AXYZdong原創
唯一博客更新的地址爲: 👉 AXYZdong的博客 👈
▲ 果然 @全體成員 最多
Python大數據搜索
環境:Python 3.7
開發工具:自帶的IDLE
一、前期準備
1.提取QQ聊天記錄
1、QQ 聊天框打開消息管理
2、選擇需要提取聊天記錄的羣,然後右擊選擇導出聊天記錄
3、選擇保存爲 .txt 格式
4、保存後打開是這個樣子:
記得把這個 .txt
文件保存到與後面建立的 .py
文件的同一個目錄裏面
插播一條反爬蟲信息,讀者可以忽略:
2.準備相關的庫
pip install xxx
就可以了
import jieba
import re
import collections
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
from PIL import Image
import matplotlib.pyplot as plt
wordcloud 這個安裝時可能會報錯,可以嘗試以下方法:
- 到 這裏 手動下載
- cp37表示Python3.7版本,後面win32和win_amd64表示32位和64位
- 對應自己的Python版本和位數,選擇合適的下載
二、正則表達提取消息文本
file = open("**通知羣.txt", "r", encoding="utf-8")
one_name = ["***"]
two_name = ["***"]
timepat = re.compile(r"\d{4}-\d{1,2}-\d{1,2}")
1、設置編碼格式,使用 utf-8
編碼:
file = open("**通知羣.txt", "r", encoding="utf-8")
2、正則表達匹配日期,格式爲 年/月/日 或者 年-月-日
- \d 表示任意一個位的數字(0~9)
- \d{4} 表示這個數字爲 4 個長度,比如 2020
- \d{1,2} 表示 1~2 個長度,比如 6,06
\d{4}-\d{1,2}-\d{1,2}
三、提取羣成員的消息
flag = 0
lines = file.readlines()
one_s = []
two_s = []
for line in lines:
line = line.replace("[圖片]", "")
line = line.replace("[表情]", "")
line = line.replace("\n", "")
if flag == "one":
one_s.append(line)
flag = 0
if flag == "two":
two_s.append(line)
flag = 0
if re.search(timepat, line):
for w in one_name:
if w in line:
flag = "one"
break
for w in two_name:
if w in line:
flag = "two"
break
print(len(one_s)) # 打印輸出one這個成員消息條數
print(len(two_s)) # 打印輸出twe這個成員消息條數
print(one_s[0:99]) # 打印輸出one這個成員的所有消息
將羣成員發的消息保存至列表中,遍歷所有消息,符合時間正則的留下,並用 flag 進行標記,從而將特定的羣成員消息提取出來。
四、詞彙處理
remove_words = [u'的', u',',u'和', u'是', u'隨着', u'對於', u'對',u'等',u'能',u'都',u'。',u' ',u'、',u'中',u'在',u'了',
u'通常',u'如果',u'我們',u'需要',u'我',u'你',u'?',u"",u" ",u"就",u"不","啊",
u"吧",u"也",u"不是",u"就是",u"什麼",u"怎麼",u"這個",u"這麼",u"一個"]
k = 0
words = []
for s in two_s:
thelist = jieba.cut(s, cut_all = False)
for word in thelist:
if word not in remove_words:
if len(word) > 1:
words.append(word)
word_counts = collections.Counter(words)
words_top10 = word_counts.most_common(10)
print(words_top10) #打印前10詞頻
jieba.cut()
進行分詞,如果是常見詞(remove_words)
跳過,如果大於1的話就放入列表collections.Counter(words)
將經過分詞過得消息進行詞頻統計word_counts.most_common(10)
統計前10詞頻
五、製作詞雲
## 製作詞雲
backgroud_Image = plt.imread('面紗.jpg') #選擇背景圖片,圖片要與.py文件同一目錄
print('加載圖片成功!')
## 設置詞雲樣式
wc = WordCloud(
background_color='white', # 設置背景顏色
mask=backgroud_Image, # 設置背景圖片
font_path='C:\Windows\Fonts\msyhl.ttc', # 若是有中文的話,這句代碼必須添加,不然會出現方框,不出現漢字
max_words=2000, # 設置最大現實的字數
stopwords=STOPWORDS, # 設置停用詞
max_font_size=150, # 設置字體最大值
random_state=30 # 設置有多少種隨機生成狀態,即有多少種配色方案
)
wc.generate_from_frequencies(word_counts) #通過頻率生成詞雲
print('開始加載文本')
img_colors = ImageColorGenerator(backgroud_Image) #改變字體顏色
wc.recolor(color_func=img_colors) #字體顏色爲背景圖片的顏色
plt.imshow(wc) # 顯示詞雲圖
plt.axis('off') # 是否顯示x軸、y軸下標
plt.show()
print('生成詞雲成功!')
六、效果
當然這個背景、字體啥的都可以自己設置的。
七、完整代碼
# =============================================
# --*-- coding: utf-8 --*--
# @Time : 2020-06-08
# @Author : AXYZdong
# @CSDN : https://blog.csdn.net/qq_43328313
# @FileName: wc.py
# @Software: Python3.7
# =============================================
import jieba
import re
import collections
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
from PIL import Image
import matplotlib.pyplot as plt
file = open("**通知羣.txt", "r", encoding="utf-8")
one_name = ["***"]
two_name = ["***"]
timepat = re.compile(r"\d{4}-\d{1,2}-\d{1,2}")
## 分析羣聊天記錄,並通過jieba分詞
flag = 0
lines = file.readlines()
one_s = []
two_s = []
for line in lines:
line = line.replace("[圖片]", "")
line = line.replace("[表情]", "")
line = line.replace("\n", "")
if flag == "one":
one_s.append(line)
flag = 0
if flag == "two":
two_s.append(line)
flag = 0
if re.search(timepat, line):
for w in one_name:
if w in line:
flag = "one"
break
for w in two_name:
if w in line:
flag = "two"
break
print(len(one_s))
print(len(two_s))
##print(one_s[0:99])
remove_words = [u'的', u',',u'和', u'是', u'隨着', u'對於', u'對',u'等',u'能',u'都',u'。',u' ',u'、',u'中',u'在',u'了',
u'通常',u'如果',u'我們',u'需要',u'我',u'你',u'?',u"",u" ",u"就",u"不","啊",
u"吧",u"也",u"不是",u"就是",u"什麼",u"怎麼",u"這個",u"這麼",u"一個"]
k = 0
words = []
for s in two_s:
thelist = jieba.cut(s, cut_all = False)
for word in thelist:
if word not in remove_words:
if len(word) > 1:
words.append(word)
word_counts = collections.Counter(words)
words_top10 = word_counts.most_common(10)
print(words_top10) #打印前10詞頻
## 製作詞雲
backgroud_Image = plt.imread('面紗.jpg') #選擇背景圖片,圖片要與.py文件同一目錄
print('加載圖片成功!')
## 設置詞雲樣式
wc = WordCloud(
background_color='white', # 設置背景顏色
mask=backgroud_Image, # 設置背景圖片
font_path='C:\Windows\Fonts\msyhl.ttc', # 若是有中文的話,這句代碼必須添加,不然會出現方框,不出現漢字
max_words=2000, # 設置最大現實的字數
stopwords=STOPWORDS, # 設置停用詞
max_font_size=150, # 設置字體最大值
random_state=30 # 設置有多少種隨機生成狀態,即有多少種配色方案
)
wc.generate_from_frequencies(word_counts) #通過頻率生成詞雲
print('開始加載文本')
img_colors = ImageColorGenerator(backgroud_Image) #改變字體顏色
wc.recolor(color_func=img_colors) #字體顏色爲背景圖片的顏色
plt.imshow(wc) # 顯示詞雲圖
plt.axis('off') # 是否顯示x軸、y軸下標
plt.show()
print('生成詞雲成功!')
八、總結
- 沒事做的時候可以統計一下羣裏龍王發了多少條消息,哈哈哈,再做個詞雲
- python擁有強大的庫,庫與庫之間相互配合,相互協作,造就了豐富的可視化圖形
- 在進行代碼移植時,可能會出現不兼容現象,不同的開發工具的規則不同,按照規則來問題不會很大
【參考文獻】:
[1] https://blog.csdn.net/zhr1030635594/article/details/105348459
[2] https://blog.csdn.net/fly910905/article/details/77763086
本次的分享就到這裏
好書不厭百回讀,熟讀自知其中意。將學習成爲習慣,用知識改變命運,用博客見證成長,用行動證明努力。
如果我的博客對你有幫助、如果你喜歡我的博客內容,請 “點贊” “評論” “收藏”
一鍵三連哦!
聽說 👉 點贊 👈 的人運氣不會太差,每一天都會元氣滿滿呦!^ _ ^ ❤️ ❤️ ❤️
碼字不易,大家的支持就是我堅持下去的動力。點贊後不要忘了👉關注👈我哦!
更多精彩內容請前往 AXYZdong的博客
如果以上內容有任何錯誤或者不準確的地方,歡迎在下面👇留個言。或者你有更好的想法,歡迎一起交流學習~~~