時變資料視覺化
Echarts其實就是個js檔案,在開頭匯入一下就好了
其實這部分我沒有做太多時間,大部分程式碼都是gpt直接生成的(樂)
所以這裡只分享一下我覺得程式碼裡比較有意思的部分
先放效果圖
圖中漸變效果的程式碼(來源CSDN某個博主)
lineStyle: {
shadowColor: "#3D5DF4",
shadowOffsetX: 0,
shadowOffsetY: 9,
shadowBlur: 10,
color: new echarts.graphic.LinearGradient(0, 1, 1, 0, [
{ offset: 0, color: "#94C2FD00" },
{ offset: 0.4, color: "#3D5DF4" },
{ offset: 1, color: "#5B8FF900" },
]),
},
smooth: true,
symbolSize: 0.01,
emphasis: {
scale: 1000,
itemStyle: {
color: "#3D5DF4",
borderColor: "#FFFFFF",
borderWidth: 3,
borderType: "solid",
}
}
2024年瞭如何用QQ群聊記錄製作詞雲圖
其實跟之前大差不差,只不過現在的QQ加入了超級表情,然鵝超級表情在電腦端不顯示,所以需要再資料處理一下
我的程式碼是分成了資料預處理+生成詞雲圖兩部分
資料預處理
目前能搜到的聊天記錄詞雲圖大部分是用的私聊記錄,但是我想做群聊的
而且我和我的朋友們非常愛改群暱稱,壓根沒有固定的(樂
所以在預處理階段考慮把時間戳和群暱稱那一行直接替換成空
import re
# 開啟原始檔案並讀取內容
with open('./哈嘍大家早生蠔.txt', 'r', encoding='utf-8') as f:
file_content = f.read()
# 使用正規表示式替換匹配的內容
# 替換時間戳和群暱稱
file_content = re.sub(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (.*?)\n', "", file_content)
# QQ在早上十點前發的訊息,小時部分只會顯示一位數,所以特殊處理一下~
file_content = re.sub(r'(\d{4}-\d{2}-\d{2} \d{1}:\d{2}:\d{2}) (.*?)\n', "", file_content)
# 檢視聊天記錄的時候,發現我的朋友們經常會艾特其他人,所以把這個也處理下
file_content = re.sub(r'@[\S \S]+', "", file_content)
# 這裡處理的是訊息記錄裡不會顯示的[圖片][表情],還有超級表情。
# 由於超級表情會顯示成 [仔細分析]請使用最新版手機QQ體驗新功能,但是我們這裡只替換了帶框的部分,所以後續還會再次替換
file_content = re.sub(r'\[[\S \S]+\]', "", file_content)
# 把分享的連結也處理一下
file_content = re.sub(r'http\S+', "", file_content)
# 開啟新檔案並寫入處理後的內容
with open('output_file.txt', 'w', encoding='utf-8') as new_file:
new_file.write(file_content)
生成詞雲圖
生成詞雲圖部分也是改自CSDN上某位博主的,but博主寫的是提取某一位群友的聊天記錄製作詞雲,遂魔改
- 生成的詞雲圖裡有一些詞我不想看到!可以在這裡統統替換
lines = file.readlines()
datas = []
for line in lines:
line = line.replace("請使用最新版手機QQ體驗新功能", "")
line = line.replace("\n", "")
datas.append(line)
- 生成的詞雲圖有很多像“然後”這樣無意義的詞,可以匯入中文停用詞庫
庫在這裡下載中文常用停用詞表
stopwords = set()
content = [line.strip() for line in open('./cn_stopwords.txt','r', encoding='utf-8').readlines()]
stopwords.update(content)
……
words = []
for s in datas:
thelist = jieba.cut(s, cut_all=False)
for word in thelist:
if word not in stopwords:
if len(word) > 1:
words.append(word)
- 全程式碼
import jieba
import re
import collections
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
from PIL import Image
import matplotlib.pyplot as plt
file = open("./output_file.txt", "r", encoding="utf-8")
stopwords = set()
content = [line.strip() for line in open('./cn_stopwords.txt','r', encoding='utf-8').readlines()]
stopwords.update(content)
## 分析群聊天記錄,並透過jieba分詞
lines = file.readlines()
datas = []
for line in lines:
line = line.replace("請使用最新版手機QQ體驗新功能", "")
line = line.replace("\n", "")
datas.append(line)
words = []
for s in datas:
thelist = jieba.cut(s, cut_all=False)
for word in thelist:
if word not in stopwords:
if len(word) > 1:
words.append(word)
word_counts = collections.Counter(words)
words_top20 = word_counts.most_common(20)
print(words_top20) # 列印前20詞頻
## 製作詞雲
backgroud_Image = plt.imread('./true.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('生成詞雲成功!')
最後放張結果圖~