论坛首页 Java企业应用论坛

冤家路窄:QueryParser对中文分词的要求

浏览 4392 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-10-19  
vincent 写道
用庖丁把这句话分词"北京精神文明建设",可分成"北京 精神 精神文明 精神文明建设 文明 建设"(用lukeall打开看,确实有)。ok,问题来了,我查询"精神文明"结果为零。真的不明白为什么???如果按照实际用途,"精神文明建"这个词也应该能搜索出结果。我是用lucene2.2和
paoding结合的,


其实vincent提的这个问题是很棘手的。罪魁祸首是庖丁作者(也就是本人)没能很好了解QueryParser的对短语查询的要求。


比如:对"中华人民共和国"进行分词,如果分为"中华/中华人民/中华人民共和国/华人/人民/人民共和国/共和/共和国/"或"中华/华人/人民/中
华人民/共和/共和国/人民共和国/中华人民共和国/"等,这些分词结果看似完美,但对lucene的QueryParser来说却是有重大缺陷的。


这2种分词结果导致使用"人民共和"通过QueryParser构造Query对象查询不到"中华人民共和国"的文章。


why?


QueryParser把"人民共和"当成一个短语查询,此时我们的分词结果及其顺序必须是 "人民/共和"才能符合它的要求被检索出来。而如果在"人民" 和 "共和"中间出现其他的分词,就如上面的"人民/人民共和国/共和"被"共和国"这个词隔开,这就不符合要求。所以查询不到。


而这是CJKAnalyzer、ChineseAnalyzer以及StandardAnalyzer之类简单做法的中文分词不会出现的。


那么现在应该如何解决这个问题:


“如果1个词能够被其他词语覆盖组成,那么它不应该再被建立索引”。只要满足这个条件QueryParser就很好用了,同时索引库更小,搜索精确度也不会有任何损失(应该说是提高了)。


这样的结果便是:
对"中华人民共和国"的分词结果应该是:"中华/华人/人民/共和/共和国"。虽然"中华人民共和国"在词典中存在。
对"北京精神文明建设"的分词结果是"北京/精神/文明/建设/",虽然"精神文明""精神文明建设"本身在词典也存在。


我已经修改paoding来支持上面的做法,但还没马上提交代码,还需要几天。
(这个修改不涉及CJKKnife的变更。而是1、通过加载字典,判断并把“中华人民共和国”之类的可由其他词语组合的词语从词典中去掉,从而使Knife不认识这些组合词  2、通过增强DefaultTokenCollector.java:由DefaultTokenCollector负责根据词语位置关系按照合理的顺序将CJKKnife分词的结果最终呈现给Lucene)


至于“‘精神文明建’这个词也应该能搜索出‘北京精神文明建设’结果”,则是不可能的。
   发表时间:2007-10-19  
应当把条件也作为长句进行分词,
0 请登录后投票
   发表时间:2007-10-19  
抛出异常的爱 写道
应当把条件也作为长句进行分词,
楼上说的很对,要从根本上解决这个问题,要从对查询条件分词,而不是从TokenCollector入手(那样解决混乱得多也不能从根上解决问题)。
希望对qieqie能有所启发。
0 请登录后投票
   发表时间:2007-10-19  
建议提供2种策略,即最大匹配分词和匹配最多分词。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics