景区评论作为游客体验的直接反馈,包含大量景点名称、特色项目、服务类词汇等专属内容,默认配置的jieba分词在处理这类文本时,常出现专有名词拆分、无效语气词干扰等问题,导致关键词提取结果不符合实际需求。通过针对性的优化调整,可以显著提升分词和关键词提取的效果。

优化方向一:构建景区专属自定义词典
默认jieba词典缺少景区特有的景点名、特色项目名、地方俗称等词汇,会导致这类词汇被错误拆分。我们可以整理景区相关的专有名词,构建自定义词典加载到jieba中。
自定义词典的格式为每行一个词,包含词语、词频、词性三个部分,词频和词性可以省略,建议补充词性方便后续筛选。示例如下:
# 自定义词典示例,保存为scenic_dict.txt # 格式:词语 词频 词性 故宫 100 n 八达岭长城 100 n 网红打卡点 50 n 缆车 30 n 排队两小时 20 l
加载自定义词典的代码很简单,在分词前调用对应方法即可:
import jieba
import jieba.analyse
# 加载自定义词典
jieba.load_userdict("scenic_dict.txt")
# 测试分词效果
text = "今天去故宫玩,排队两小时才坐上缆车,太累了"
seg_list = jieba.lcut(text)
print(seg_list)
# 输出:['今天', '去', '故宫', '玩', ',', '排队两小时', '才', '坐上', '缆车', ',', '太', '累', '了']优化方向二:完善停用词过滤规则
景区评论中包含大量无实际意义的语气词、连接词、标点等,这些词会干扰关键词提取结果,需要提前过滤。除了通用的中文停用词表,还可以补充景区场景下的专属停用词,比如“啊”“呀”“然后”“的话”等口语化词汇。
可以准备一个停用词文件,每行一个停用词,分词后过滤掉出现在停用词表中的词汇:
# 加载停用词表
def load_stopwords(file_path):
with open(file_path, "r", encoding="utf-8") as f:
return set([line.strip() for line in f])
stopwords = load_stopwords("scenic_stopwords.txt")
# 过滤停用词的分词方法
def seg_with_filter(text):
seg_list = jieba.lcut(text)
return [word for word in seg_list if word not in stopwords and word.strip() != ""]
test_text = "啊,这个景点真的太好玩了呀,然后我还买了纪念品"
filtered_seg = seg_with_filter(test_text)
print(filtered_seg)
# 输出:['景点', '真的', '太', '好玩', '纪念品']优化方向三:结合词性筛选提升关键词质量
关键词提取通常更关注名词、动词等有实际意义的词汇,可以通过jieba的词性标注功能,筛选出指定词性的词汇后再做关键词提取。jieba的posseg模块可以实现带词性的分词。
比如我们只保留名词(n)、动词(v)、形容词(a)类的词汇,过滤掉其他无意义词性:
import jieba.posseg as pseg
def seg_by_pos(text, target_pos=("n", "v", "a")):
words = pseg.lcut(text)
return [word.word for word in words if word.flag.startswith(target_pos)]
test_text = "景区的风景很美,工作人员服务态度也很好"
pos_seg = seg_by_pos(test_text)
print(pos_seg)
# 输出:['景区', '风景', '美', '工作人员', '服务', '态度', '好']优化方向四:调整TF-IDF权重适配景区场景
jieba默认的关键词提取基于TF-IDF算法,使用的是通用语料库的IDF值,和景区评论的场景匹配度不高。我们可以收集大量景区评论语料,重新计算IDF值,替换默认的IDF文件,让权重计算更贴合场景。
也可以使用TextRank算法做关键词提取,它对语料库的依赖更低,更适合垂直领域的文本处理:
import jieba.analyse
text = "故宫的文创产品很有特色,角楼咖啡的蛋糕也很好吃,就是门票有点难抢"
# 使用TF-IDF提取关键词,默认提取前5个
tfidf_keywords = jieba.analyse.extract_tags(text, topK=5)
print("TF-IDF关键词:", tfidf_keywords)
# 使用TextRank提取关键词
textrank_keywords = jieba.analyse.textrank(text, topK=5)
print("TextRank关键词:", textrank_keywords)完整优化流程示例
将以上几个优化步骤整合,就可以得到适配景区评论的关键词提取流程:
import jieba
import jieba.analyse
import jieba.posseg as pseg
# 1. 初始化配置:加载自定义词典和停用词
jieba.load_userdict("scenic_dict.txt")
def load_stopwords(file_path):
with open(file_path, "r", encoding="utf-8") as f:
return set([line.strip() for line in f])
stopwords = load_stopwords("scenic_stopwords.txt")
# 2. 带过滤和词性筛选的分词方法
def optimized_seg(text):
words = pseg.lcut(text)
result = []
for word, flag in words:
# 过滤停用词、空字符,只保留名词、动词、形容词
if word not in stopwords and word.strip() != "" and flag.startswith(("n", "v", "a")):
result.append(word)
return result
# 3. 提取关键词
def extract_scenic_keywords(text, topK=5):
seg_list = optimized_seg(text)
# 将分词结果拼接为字符串,再用TextRank提取关键词
seg_text = " ".join(seg_list)
return jieba.analyse.textrank(seg_text, topK=topK)
# 测试完整流程
test_comment = "这次去八达岭长城真的太值了,虽然爬的时候有点累,但是风景超级好,还看到了好几个外国游客,推荐大家来"
keywords = extract_scenic_keywords(test_comment, topK=5)
print("提取的关键词:", keywords)
# 输出示例:['八达岭长城', '风景', '游客', '推荐', '超级']注意事项
优化过程中需要注意几个问题:自定义词典需要定期更新,补充新出现的景点名称、网络热词;停用词表要根据实际评论内容调整,避免出现误过滤;如果景区评论包含方言内容,还需要补充对应方言词汇到自定义词典中。经过以上优化后,景区评论的关键词提取准确率通常可以提升30%以上,能够更精准地反映游客的核心关注点。