Echarts製作時變資料視覺化+2024 QQ群聊記錄製作詞雲圖

yyiiing發表於2024-04-28

時變資料視覺化

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('生成詞雲成功!')

最後放張結果圖~

相關文章