# 核心依赖
pip install wordcloud jieba matplotlib pymysql
import mysql.connector
from wordcloud import WordCloud
import jieba
import matplotlib.pyplot as plt
from collections import Counter
# ========== 配置部分 ==========
DB_CONFIG = {
"host": "localhost",
"user": "your_username",
"password": "your_password",
"database": "wnacg"
}
FONT_PATH = 'SimHei.ttf' # 中文字体文件路径(需自行下载)
STOPWORDS_FILE = 'chinese_stopwords.txt' # 停用词表路径
OUTPUT_IMAGE = 'wordcloud.png' # 输出图片路径
# =============================
def fetch_text_data():
"""从数据库获取标题和标签数据"""
conn = mysql.connector.connect(**DB_CONFIG)
cursor = conn.cursor()
cursor.execute("SELECT title, tags FROM cartoon")
results = cursor.fetchall()
cursor.close()
conn.close()
# 合并标题和标签
return [' '.join([title, tags]) for title, tags in results]
def process_text(texts):
"""文本处理流程"""
# 加载停用词
with open(STOPWORDS_FILE, 'r', encoding='utf-8') as f:
stopwords = set(f.read().splitlines())
# 中文分词处理
words = []
for text in texts:
seg_list = jieba.cut(text)
words.extend([word.strip() for word in seg_list
if word.strip() and word not in stopwords
and len(word) > 1]) # 过滤单字
return words
def generate_wordcloud(words):
"""生成词云"""
word_freq = Counter(words)
wc = WordCloud(
font_path=FONT_PATH,
width=1600,
height=1200,
background_color='white',
max_words=200,
colormap='viridis'
).generate_from_frequencies(word_freq)
plt.figure(figsize=(20, 15))
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.savefig(OUTPUT_IMAGE, bbox_inches='tight')
plt.show()
if __name__ == "__main__":
# 执行流程
texts = fetch_text_data()
words = process_text(texts)
generate_wordcloud(words)
print(f"词云已生成至:{OUTPUT_IMAGE}")
中文字体文件:
C:/Windows/Fonts/msyh.ttc)停用词表:
创建 chinese_stopwords.txt 文件,内容示例:
的
是
在
了
和
...
或直接使用哈工大停用词表
| 参数 | 作用 | 推荐值 |
|---|---|---|
max_words |
显示最大词汇量 | 100-300 |
width/height |
图片分辨率 | 根据显示需求调整 |
colormap |
颜色主题 | viridis, plasma, tab20等 |
background_color |
背景颜色 | "white" 或 "#FFFFFF" |
collocations |
是否合并词组(中文建议关闭) | False(需修改代码) |
自定义形状:
from PIL import Image
mask = np.array(Image.open("shape.png")) # 使用图片形状模板
WordCloud(mask=mask, ...)
词频输出:
# 在 generate_wordcloud 函数后添加
with open('word_freq.csv', 'w') as f:
for word, freq in word_freq.most_common(100):
f.write(f"{word},{freq}\n")
交互式可视化:
pip install pyecharts
使用 pyecharts 生成可交互的词云网页
通过这个方案,可以快速实现基于数据库文本数据的可视化分析。如果需要处理超大文本量(>10万条),需要添加分页查询和进度显示功能。
以下是使用 pymysql 替代 mysql-connector-python 的完整改造方案:
# 卸载旧库(如果已安装)
pip uninstall mysql-connector-python
# 安装新库
pip install pymysql
| 原代码 (mysql-connector) | 新代码 (pymysql) |
|---|---|
import mysql.connector |
import pymysql |
conn = mysql.connector.connect(...) |
conn = pymysql.connect(...) |
import pymysql # 关键修改点
from wordcloud import WordCloud
import jieba
import matplotlib.pyplot as plt
from collections import Counter
# ========== 配置部分 ==========
DB_CONFIG = {
"host": "localhost",
"user": "your_username",
"password": "your_password",
"database": "wnacg",
"charset": "utf8mb4", # 新增推荐编码配置
"cursorclass": pymysql.cursors.DictCursor # 可选:返回字典格式数据
}
FONT_PATH = 'SimHei.ttf'
STOPWORDS_FILE = 'chinese_stopwords.txt'
OUTPUT_IMAGE = 'wordcloud_pymysql.png'
# =============================
def fetch_text_data():
"""从数据库获取数据(使用pymysql)"""
conn = pymysql.connect(**DB_CONFIG) # 修改连接方式
try:
with conn.cursor() as cursor: # 自动管理游标
cursor.execute("SELECT title, tags FROM cartoon")
results = cursor.fetchall()
# 字典模式处理(如果配置了cursorclass=DictCursor)
return [' '.join([row['title'], row['tags']]) for row in results]
# 元组模式(默认):
# return [' '.join([title, tags]) for title, tags in results]
finally:
conn.close() # 确保连接关闭
# 以下 processing_text 和 generate_wordcloud 函数保持不变
# ... (与之前代码完全相同)
if __name__ == "__main__":
texts = fetch_text_data()
words = process_text(texts)
generate_wordcloud(words)
连接参数增强:
charset="utf8mb4" 支持完整的Unicode字符cursorclass=pymysql.cursors.DictCursor 使查询结果返回字典格式连接关闭优化:
try/finally 确保数据库连接始终关闭with conn.cursor() 上下文管理器自动释放游标资源结果集处理:
row[0] 对应第一个字段row['title'] 按字段名访问| 问题现象 | 原因 | 解决方案 |
|---|---|---|
ImportError: No module named 'pymysql' |
未安装库 | pip install pymysql |
Can't connect to MySQL server |
权限/网络问题 | 检查MySQL用户远程连接权限 |
Incorrect string value |
编码问题 | 确保配置 charset="utf8mb4" |
SSLError |
SSL连接问题 | 添加 ssl={"ssl": {"fake_flag": True}} 参数 |
| 场景 | 推荐驱动 |
|---|---|
| 需要SSL加密连接 | mysql-connector |
| 高频短查询 | pymysql |
| 大量二进制数据处理 | mysqlclient (C扩展) |
如果后续需要更高性能,可以进一步改用 mysqlclient(只需修改为 import MySQLdb 其他语法与pymysql兼容)。