景区评论文本中往往包含大量特定景点名称、地方特色词汇,比如“夫子庙”“趵突泉”“玻璃栈道”这类专属名词,默认的jieba分词词典没有收录这些内容,很容易出现错误切分,比如把“玻璃栈道”拆成“玻璃”“栈道”,最终生成的词云图无法准确体现游客的关注重点。除了分词不准,默认的停用词表也可能过滤掉部分有实际意义的词汇,或者保留大量无价值的语气词、虚词,进一步影响词云效果。

一、构建景区专属自定义词库
自定义词库的核心作用是让jieba识别到景区特有的词汇,避免错误切分。首先需要整理景区相关的专属词汇,包括景点名称、特色项目、地方美食、常见评价术语等,比如“莫高窟”“文创雪糕”“排队时长”这类词汇。
1. 自定义词库格式规范
jieba支持的自定义词典为纯文本格式,每行对应一个词汇,格式为词语 词频 词性,其中词频和词性可选,词频越高分词时优先级越高,词性可以标注为n(名词)、v(动词)等。示例如下:
# 景区自定义词库示例 user_dict.txt 夫子庙 100 n 秦淮河游船 100 n 文创冰淇淋 50 n 排队两小时 30 n 体验感拉满 20 a
2. 加载自定义词库
在Python代码中通过jieba的load_userdict方法加载自定义词库,加载后分词时会优先匹配词库中的内容:
import jieba
# 加载自定义词库
jieba.load_userdict("user_dict.txt")
# 测试分词效果
text = "今天去夫子庙玩,坐了秦淮河游船,还吃了文创冰淇淋,就是排队两小时太久了"
seg_list = jieba.lcut(text)
print(seg_list)
# 输出: ['今天', '去', '夫子庙', '玩', ',', '坐', '了', '秦淮河游船', ',', '还', '吃', '了', '文创冰淇淋', ',', '就是', '排队两小时', '太', '久', '了']二、优化停用词处理规则
默认的停用词表通常包含通用虚词、标点,但景区评论中还有大量无意义的语气词、重复出现的无意义词汇,需要针对性优化停用词表,同时避免误删有实际价值的词汇。
1. 基础停用词表构建
先收集通用的中文停用词,再补充景区评论特有的无意义词汇,比如“啊”“哦”“哈哈”“那个”这类语气词,以及“景区”“地方”这类出现频率极高但无区分度的词汇:
# 基础停用词表,可保存为stopwords.txt
stopwords = [
"的", "了", "是", "在", "我", "有", "和", "就", "不", "人",
"啊", "哦", "哈哈", "那个", "这个", "景区", "地方", "感觉"
]
# 从文件加载停用词(如果保存为文件)
with open("stopwords.txt", "r", encoding="utf-8") as f:
stopwords = [line.strip() for line in f.readlines()]2. 动态迭代优化停用词
先对评论做一轮分词,统计高频词汇,把出现频率高但无实际分析价值的词汇加入停用词表,同时检查是否有被误判为停用词的有意义词汇,比如“贵”这类评价词不能加入停用词:
from collections import Counter
# 假设all_comments是所有景区评论的列表
all_comments = [
"夫子庙的灯会太好看了,就是人太多",
"秦淮河游船体验感拉满,推荐大家来",
"排队两小时游玩十分钟,太不值了"
]
# 第一轮分词统计词频
word_counter = Counter()
for comment in all_comments:
seg_list = jieba.lcut(comment)
# 先过滤基础停用词
filtered = [word for word in seg_list if word not in stopwords and len(word) > 1]
word_counter.update(filtered)
# 打印高频词,判断是否需要补充停用词
print(word_counter.most_common(10))
# 如果“太”这类词出现频率极高且无意义,可加入停用词表三、完整分词与词云生成流程
结合自定义词库和优化的停用词处理,完成从评论分词到词云图生成的完整流程:
import jieba
import numpy as np
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from collections import Counter
# 1. 加载自定义词库
jieba.load_userdict("user_dict.txt")
# 2. 加载优化后的停用词表
with open("stopwords.txt", "r", encoding="utf-8") as f:
stopwords = set([line.strip() for line in f.readlines()])
# 3. 分词并过滤停用词
all_comments = [
"今天去夫子庙玩,坐了秦淮河游船,还吃了文创冰淇淋,就是排队两小时太久了",
"夫子庙灯会太漂亮了,秦淮河游船也值得坐,就是文创冰淇淋有点贵",
"体验感拉满,下次还要来夫子庙看灯会"
]
word_counter = Counter()
for comment in all_comments:
seg_list = jieba.lcut(comment)
# 过滤:长度大于1、不在停用词表、不是纯数字/标点
filtered = [
word for word in seg_list
if len(word) > 1 and word not in stopwords and not word.isdigit() and not all(not c.isalnum() for c in word)
]
word_counter.update(filtered)
# 4. 生成词云图
wc = WordCloud(
font_path="SimHei.ttf", # 中文需要指定字体,避免乱码
background_color="white",
width=800,
height=400
)
wc.generate_from_frequencies(word_counter)
# 5. 展示词云
plt.figure(figsize=(10, 5))
plt.imshow(wc)
plt.axis("off")
plt.show()四、效果验证与调整
生成词云后需要验证效果,重点检查:是否存在专属词汇被拆分的情况,如果有就补充到自定义词库;是否存在无意义词汇出现在词云中,如果有就加入停用词表。经过2-3轮迭代调整后,分词准确率会明显提升,生成的词云图也能更精准地反映游客对景区的真实评价重点。