`
youngerblue
  • 浏览: 43456 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

sphinx分词,同义词

阅读更多

      下载CORESEEK软件包后,里面自带了中文分词软件包LibMMSeg。首先需要安装LibMMSeg 。下面所有操作都是在linux平台下。在LibMMSeg根目录下执行 ./configure && make && make install完成安装。默认安装目录在/usr/local/mmseg3。在/usr/local/mmseg/bin下可以之执行mmseg命令,有相应的参数查看分词效果。

      Sphinx搜索一个比较变态的地方就是按最大匹配度搜索的。比如分词中有江都,江都市,我搜江都市,是搜索不出江都的,同样如果搜索江都,也搜索不出江都市。刚开始还以为自己分词库有问题,就修改分词。

      Mmseg的分词库文档是unigam.txt,在/usr/local/mmseg/etc/下,按照格式修改相应的分词。

     最后/usr/local/mmseg3/bin/mmseg –u unigram.txt

生成unigram.uni文件,重命名为uni.lib复制到sphinx安装目录下的dict文件下,并重建索引。

忙完了发现搜索还是没起作用,详细的看了coreseek的文档才知道需要建立同义词库。

同义词库不需要自己填写,可以根据分词库生成。

1. 处理unigram.txt生成同义词库文件

    mmseg-3.2.13源代码/script/build_thesaurus.py unigram.txt > thesaurus.txt

    thesaurus.txt文件的格式如下:

南京西路

-南京,西路,

张三丰

-太极宗师,武当祖师,

2. 生成同义词词典

    mmseg -t thesaurus.txt

3. 将thesaurus.lib放到uni.lib同一目录

4. coreseek索引和搜索时,会自动进行复合分词处理

Ok,最后成功解决问题。不过感觉sphinx分词还是不成熟。

--------------------------------------------------------------------

      如果用同义词方式解决的话,同义词库就会很大。今天试了另外一种方法,就是配置中级索引。

      在配置文件也就是sphinx.conf中配置min_infix_len = 1。中缀索引是实现“start*”, “*end”, and “*middle*”等形式的通配符成为可能(通配符语法的细节请参考 enable_star 选项)。当最小中缀长度设置为正值,indexer除了对关键字本身还会对所有可能的中缀(即子字符串)做索引。太短的中缀(短于允许的最小长度)不会被索引。 例如,在min_infix_len=2设置下索引关键字“test”会导致产生6个索引项 "te", "es", "st", "tes", "est"等中缀和词本身。对此索引搜索“es”会得到包含“test”的文档,即使它并不包含“es”本身。然而,中缀索引会使索引体积急剧增大(因为待索引关键字增多了很多),而且索引和搜索的时间皆会恶化。 在中缀索引中没有自动的办法可以提高精确匹配(整个词完全匹配)的评分,但可以使用与 prefix indexes 选项中相同的技巧。

      这样配置好后,输入江都能搜江都市的,反之却不能。查看了文档以及coreseek社区的讨论帖,发现要对搜索词进行预处理,也就是搜索词输入后在java程序中队搜索词进行相应的切分处理。比如搜索江都市,java程序中,@name (江都)|(江都市)。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics