在使用 jieba 的词性标注模块 jieba.posseg(简称 pseg)时,如果我们自定义的词汇中包含符号(如连字符、空格等),pseg 可能无法正确识别并标注这些词汇的词性,导致标注结果不符合预期。
pseg.cut(text: str) 接收文本,返回形如 [ (词1, 词性1), (词2, 词性2) ] 的词性标注列表。问题在于:
jieba 在处理文本时,对英文及带符号字符串的分词优先按字符类型(如字母、数字、标点)进行拆分,而不是严格依赖词典。
因此,即使我们通过 jieba.add_word() 添加了带符号的自定义词汇(例如 "LLM-RAG"),jieba.cut() 可以正确分词,但 pseg.cut() 会无视扩展词表,仍按字符拆解逻辑处理,导致词性标注错误。
示例如下
# 文本
text = "我们的LLM-RAG框架试验后证明是负优化"
#进行词性标注的分词
words = list(pseg.cut(text))
print(words)
#直接分词
words = list(jieba.cut(text))
print(words)
jieba.add_word("LLM-RAG", freq=1000, tag="n")
#进行词性标注的分词
words = list(pseg.cut(text))
print(words)
#直接分词
words = list(jieba.cut(text))
print(words)
"""
输出:
[pair('我们', 'r'), pair('的', 'uj'), pair('LLM', 'eng'), pair('-', 'x'), pair('RAG', 'eng'), pair('框架', 'n'), pair('试验', 'vn'), pair('后', 'f'), pair('证明', 'n'), pair('是', 'v'), pair('负', 'v'), pair('优化', 'vn')]
['我们', '的', 'LLM', '-', 'RAG', '框架', '试验', '后', '证明', '是', '负', '优化']
[pair('我们', 'r'), pair('的', 'uj'), pair('LLM', 'eng'), pair('-', 'x'), pair('RAG', 'eng'), pair('框架', 'n'), pair('试验', 'vn'), pair('后', 'f'), pair('证明', 'n'), pair('是', 'v'), pair('负', 'v'), pair('优化', 'vn')]
['我们', '的', 'LLM-RAG', '框架', '试验', '后', '证明', '是', '负', '优化']
"""
可以看到,虽然 jieba.cut 成功识别了 LLM-RAG,但 pseg.cut 却还是将其拆成了 LLM、- 和 RAG,并分别标注词性。
这种情况在我们的自定义词中含有连接符、空格等特殊字符时尤其常见。
解决方案:
使用哈希表\字典等数据结构制作特殊词表,先用jieba对文本进行分词,然后一个个识别分词在不在特殊词表内,是则按照特殊词表进行标注,否则按照pseg划分。
# 手动词性标注(可以简单用pseg去标普通分词)
custom_tags = {'LLM-RAG': 'n'}
for w in words:
if w in custom_tags:
#特殊分词
print(w, custom_tags[w])
else:
# 普通词再让pseg单独标一下
pseg_result = list(pseg.cut(w))
if len(pseg_result) == 1:
print(pseg_result[0].word, pseg_result[0].flag)
else:
for item in pseg_result:
print(item.word, item.flag)

6206

被折叠的 条评论
为什么被折叠?



