yanyiwu / nodejieba

"结巴"中文分词的Node.js版本
MIT License
3.07k stars 280 forks source link

个别非常简单的字符串无法被正确cut或者extract #56

Closed xuwenbin closed 8 years ago

xuwenbin commented 8 years ago

重现步骤:

输入“美国纽约”,然后调用nodejieba.cut() 或者 nodejieba.extract(),输出的结果是 array[1],它的内容是“美国纽约”。(截图见附件)。 error

期待的正确分词/抽取结果:array[2],它的内容应该是“美国”,“纽约”。

诡异地是,如果输入的字符串是“美国芝加哥”,那么可以正确输出“美国”,“芝加哥”;貌似系统对“纽约”不感冒啊。。。呵呵!

xuwenbin commented 8 years ago

刚试了一下cppjieba自己的在线演示页面,输入“美国纽约”,出来的分词结果只有一个“美国纽约”;输入“美国芝加哥”,则出来的分词结果是两个“美国”,“芝加哥”。看来cppjieba本身有问题呢。。。

yanyiwu commented 8 years ago

是这样的,可能你也有一些误会。 因为词典里面有【美国纽约】这个词,所以美国纽约这个词会被当成一个词分出来。 而没有【美国芝加哥】,但是有【美国】和【芝加哥】

xuwenbin commented 8 years ago

是什么原因,“美国纽约”作为单独词条,而“美国芝加哥”却不是?

顺带问一个问题,nodejieba自带的词典的内容来源是哪里?如何更新?

yanyiwu commented 8 years ago

默认的词典文件在 https://github.com/yanyiwu/nodejieba/blob/master/index.js#L2

xuwenbin commented 8 years ago

谢谢!

我查看了一下字典内的内容,发现“美国纽约”和“纽约”同时存在。而且“纽约”的权重比“美国纽约”大;在这个情况下,jieba的分词算法最好能够比对两种可能性后,挑选权重的路径。

我没有通读jieba的代码,上面的观点有可能是错误的或者不全面的。请jieba的作者见谅!

yanyiwu commented 8 years ago

有两种分词选择,一种是【美国纽约】,一种是【美国】【纽约】, 因为【美国】【纽约】 的权重比【美国纽约】更小,所以才选择了【美国纽约】。 具体分词算法可以参考一下相关文档,比如: http://www.thinkface.cn/thread-1303-1-1.html

xuwenbin commented 8 years ago

权重是如何定的?

日常生活里,【纽约】比【美国纽约】更常用/常见。

yanyiwu commented 8 years ago

词组合越多,权重是会衰减越多的,这个原因导致长词会优先短词被切分出来。你如果要按常见来算的话,那【打】和【的】也比【打的】更常见。

xuwenbin commented 8 years ago

单个字的出现频率和常用词组的出现频率还是有应该有所区别才好。【打】和【的】出现频率是高,但是它们作为单独的字是没有意义的。而【纽约】和【美国纽约】本身都是有意义的词组,这个时候,光看词频来定貌似有点机械化处理了。当然,我知道这个是个难点。所以想了解一下,jieba是否有计划(或者已经有计划)根据网上常用词/词条的出现频率定期调整字典的内容呢?

PS,我现在的解决方案,只能是把【美国纽约】从字典里面删除掉。