Cunwang ZHANG

Results 13 comments of Cunwang ZHANG

这个应该暂时没办法解决。因为在cppjieba里对于人工干预的维护方法非常有限(几乎没有,只有一个添加词的功能)。python版本的jieba里倒是有多种维护工具(增加词,删除词,修改词频等)。 **错误原因:**“*是”这一类错误是由于HMM模型导致的,举个例子:“世界排名第一的围棋手是谁”,在关闭HMM模型时的切分结果为“世界排名/第一/的/围棋/手/是/谁”。开启HMM模型之后,HMM模型会进一步对分词结果中的连续单字进行未登录词识别处理,将连续单字部分“手/是/谁”重新切分为“手是/谁”。 **考虑的解决方案**: - 添加ForceSplit功能(python版本中有初版,但是好像没起作用),将“*是”添加到ForceSplit词典中 - 向词典中添加新词:将“围棋手”,“外文名”,“毒药水”等词添加到词典中,使得第一步切分结果为“世界排名/第一/的/围棋手/是/谁”,这样的话“手”字就不会被放在连续单字部分而交给HMM模型处理,就可以分对了。

在cppjieba里目前还做到这个功能,想要实现的话需要自己修改源代码。但是在python版本的jieba里面,把HMM设置为False的情况下,英文依旧是可以分对的。在对英文和数字的处理上,pyjieba是先进行英文数字的处理,再把余下的丢给HMM模型处理,cppjieba则是在HMM模型中进行英文数字的处理。

@chenrulongmaster 这里没有训练和更新hmm_model的代码。可以在网上找到,比如[https://www.cnblogs.com/chen8023miss/p/11977224.html](https://www.cnblogs.com/chen8023miss/p/11977224.html)。我自己有进行过尝试,尝试成功。 注意事项: - 首先是对参数的保存,需要先观察cppjieba中hmm_model.utf8的格式,然后自己写一个参数保存的方法。 - cppjieba的hmm模型中,不包含对标点符号的标签标注以及预测,所以要注意在发射矩阵中不要包含状态对标点符号字符的相关发射概率。否则cppjieba载入hmm_model.utf8时会报错。

@lezi1022 使用有问题?结果是可以分成“2018/年/4/月/25/日” 的吧。

@fanziwei @Shanboy5566 在当前的cppjieba中无法做到这一点,因为cppjieba中对于英文以及数字的处理是在HMM分词模块中进行的。但是python版本中对英文以及数字的处理是在HMM分词模块之前进行的。两者的区别请参考回答[https://github.com/yanyiwu/cppjieba/issues/138#issuecomment-688265879](https://github.com/yanyiwu/cppjieba/issues/138#issuecomment-688265879)。 所以,不开启HMM模式的情况下想要正确切分数字和英文的话,只能修改cppjieba的源码。

@WitLes 对于英文以及数字的处理,python版本的jieba和cppjieba的确是不一样的: - 顺序上:pyjieba是先进行英文以及数字的处理,然后再把余下的连续单字部分交给HMM模型进行处理;cppjieba里对英文以及数字的处理是在HMM分词模块里的。 - 具体处理措施上:pyjieba是将英文和数字放在一起用正则表达式匹配处理的;cppjieba中将英文和数字分开进行处理,逐个字符判断。这点差异会导致分词结果的不一致。 **但是**,对于你提出的问题,我觉得是使用不当导致的,“5000”是一个非常简单的数字模块,开启HMM分词(`hmm=true`)以后肯定可以分对的,像你说的那种情况,大概率是因为没打开HMM模型分词(`hmm=false`)

> 更多的政治人物的名词都是敏感的,甚至我搜周恩来都搜不出来。 照你说的这个例子的话,那应该用的不是jieba,至少用的不是jieba的词典,因为在结巴的词典中是有"周恩来"一词的。另外,据我对jieba的了解,这款分词工具不具备敏感词的处理功能,你给的训练语料中有什么词,他就会用什么词,不会考虑是不是敏感词。jieba的训练语料之一是人民日报语料,该语料中也有江泽民、毛泽东等主席的名字。

请问途家的问题解决了吗?最近也遇到了这个问题

首先,你要了解jieba分词的原理,从概率上作一个浅层次的解释,你想要将**“真棒”**一词分开,那么就要P(“真”,“棒”)>P("真棒")。在jieba的默认词典中,freq(“真”) = 19988,freq(“棒”) = 2439, freq("真棒") = 3,总词频为60101964 **为什么会分成“真棒”:因为此时P(“真”,“棒”)>P("真棒")** P(“真”,“棒”) = P(“真”)*P(“棒”) = (19988/60101964)*(2439/60101964) = 1.35e-08 P("真棒") = 3/60101964 = 4.99e-08 > P(“真”,“棒”)。所以这两个字当然会分在一起啦。 所以只看词频是没有用的,要看概率(词频/总词频)的情况。 **怎么修正使得"真棒"可以被分开? 以下方法测试有效** - 通过add_word()方法:```jieba.add_word("真棒",0)```,这样的话“真棒”的概率直接是0,不可能被分在一起。 - 通过suggest_freq()方法:```jieba.suggest_freq(("真","棒"),True)```。...

@bao21987 这是因为jieba会对句子进行预处理(正则分块)。对于符合正则表达式`re_han_default = re.compile("([\u4E00-\u9FD5a-zA-Z0-9+#&\._%\-]+)", re.U)`的部分才会调用基于词典的分词,字符串中的“[/白眼]“只有”白眼“部分是匹配上述正则表达式的。所以在调用字典之前这个字符串就已经被分开了,对于已经分开的结果再调用用户词典,就变得没有意义、不起作用了。