基于网站搜索关键词“人民法院主管”的结果比“法院主管”结果多的问题,今天上午我详细阅读了网上的中英文文档。
发现最可能的原因,是分词库的问题。
举个例子,对于猕猴桃一词,如果词库中有猕猴、桃、猕猴桃三个词,那么索引的时候会索引成“猕猴桃”,换句话说,搜索“猕猴”、“桃”都不会找到“猕猴桃”这个词,只有搜索“猕猴桃”才能找到。
sphinx的逻辑是,“猕猴”、“桃”和“猕猴桃”指代的事物是不一样的。
然而,问题在于,中文是存在根词的。比如说“猕猴桃”,这个词确实和“猕猴”、“桃”不是一个事物,但是,“猕猴桃”也是“桃”。搜索“猕猴”的时候找不到“猕猴桃”是正确的,但是搜索“桃”,应该找到“猕猴桃”。
因为,“猕猴桃”这个词的根词,是“桃”。
推演到网站的bug:
由于我们的分词库中包括“人民”、“法院”、“人民法院”这三个词,所以搜索“法院主管”的时候,是找不到包含“人民法院主管”的词汇的,因为搜索“法院”一词,找不到“人民法院”。
解决方案:在分词库中删掉“人民法院”这种合成词。
测试:
1 [root@master bin]# cat test.txt 2 本案纠纷是否属于人民法院主管 3 4 用现有词典进行分词,结果如下: 5 /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc/ /usr/local/mmseg3/bin/test.txt 6 本案/x 纠纷/x 是否/x 属于/x 人民法院/x 主管/x 7 8 查看词典内容,发现有词条为:人民法院 9 vi /usr/local/mmseg3/etc/unigram.txt 10 人民法院 1 11 x:1 12 13 所以,对于该搜索,搜索“人民法院主管”时会显示,但是,搜索“法院主管”时,因为没有“法院”和“主管”词条, 14 所以,没有搜索结果。 15 16 解决方法: 17 删除“人民法院”词条,重建分词词典,测试结果如下: 18 [root@master etc]# /usr/local/mmseg3/bin/mmseg -u unigram.txt 19 [root@master etc]# ls 20 mmseg.ini unigram.txt unigram.txt.uni uni.lib uni.lib.20151130 21 [root@master etc]# mv unigram.txt.uni uni.lib 22 mv: overwrite `uni.lib‘? y 23 [root@master etc]# chmod 666 uni.lib 24 [root@master etc]# ll 25 total 9076 26 -rwxr-xr-x 1 root root 229 Nov 11 15:26 mmseg.ini 27 -rwxr-xr-x 1 root root 1826230 Nov 30 14:59 unigram.txt 28 -rw-rw-rw- 1 root root 3729224 Nov 30 15:00 uni.lib 29 -rwxr-xr-x 1 root root 3729280 Nov 11 15:26 uni.lib.20151130 30 [root@master etc]# 31 [root@master etc]# /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc/ /usr/local/mmseg3/bin/test.txt 32 本案/x 纠纷/x 是否/x 属于/x 人民/x 法院/x 主管/x 33 34 35 该测试,将“人民”,“法院”,“主管”分成了三个词,这样,搜索“人民法院主管”和“法院主管”均可命中。
总结:
对于该类问题,统一解决方法为,检查unigram.txt词典,将长关键词尽量缩短为短关键词,
但是,不能极端地将所有关键词缩短为1个字,否则词典索引会变大,损耗系统内存。
参考资料:
1、http://blog.atime.me/note/mmseg-custom-dict.html#2ea33d
2、http://www.coreseek.cn/opensource/mmseg/
3、http://www.coreseek.cn/products-install/ngram_len_cjk/
4、http://blog.csdn.net/websites/article/details/36626573
原文:http://www.cnblogs.com/toocooltohavefriends/p/5223786.html