Lucene 2.9 上实现 GroupBy 功能 当前几个主要的Lucene中文分词器的比较
31

最近在给一个类似 京东新蛋 的3C类电子商城提供站内搜索。基本功能都是现成的,但部署上去以后,发现搜索结果比论坛,cms的搜索结果差远了。仔细的看了几个搜索记录的 debug log,才弄明白为什么:

所有的中文分词组件(paodingimdict, mmseg4j, ik 等等等等), 都是为了应付日常使用的语言而设计的,特别是 imdict “基于自然语言处理领域的隐马尔科夫模型”,当前的实现还不支持用户自定义词库。其他几个支持用户自定义词库,paoding 甚至起了一个线程来扫描词库的变化,以达到动态更新词库的目的。但词库的维护还是需要使用者来做。mmseg4j 自带了一个 sogou 细胞词库,也都是日常生活用词。不论是基于语料库训练概率还是基于精巧的词库匹配算法,当需要分词的文档中,大部分词都是“未登录词”(行业相关性较强的时候就是这样,比如搜公司名,品牌名,甚至产品型号,配置等等),机器都是无可奈何的。

行业相关的词库因为用的少,关注的人也少,能使用的资源也就少的多了。在没有现成可用的词库的前提下,怎么样以最小的代价得到一个可以接受的搜索精度呢?想了一下,暂时只想到这么几点,欢迎大家补充:

  • 根据行业特点修改分词算法的一些细节处理:比如大部分分词器实现,都会把 “A1600” 这种字母数字混合出现分解成 “A” 和 “1600” 两个词。在日常生活中,这样处理是有道理的。但在 3C 类的电子商城网站中,用户输入 “A1600” 进行搜索,与输入 “A   1600” 的意图肯定是不一样的:前者是想搜摩托罗拉的明手机,后者嘛,就很难揣测了。
  • 站内搜索,一般来说是在一个比较小的有限集合中进行搜索,所以搜索结果集合也是比较小的,甚至经常没有完全命中用户所有的关键词的情况出现。提供给用户一些可能相关的内容总要比显示“对不起,没有搜到任何结果”要好。所以文档中 “摩托罗拉” 除了要分出一个 “摩托罗拉” 以外,“摩托” 也是一个可以接受的索引词,以防用户输入一个莫名其妙的 “摩托” 的时候,搜不到任何结果(我们这里是卖3C类产品的,不卖摩托车,也不卖摩托艇,谢谢!)。—— mmseg4j 的 max-word 算法。
  • 方便的用户添加新词功能:这里的用户,既可以是网站管理员,也可以是最终用户,甚至是写一个程序去baidu,google或其他的什么数据源抓取过来的跟行业相关的词汇。新词经过清理,排重,验证,确认等预处理环节后,添加到词库里面去。如何吸引用户来为网站做有价值的贡献,永远是一个值得探讨的问题。
  • 方便的重建索引功能:在词库的量变快要引起质变的时候,应该重建一下索引。在敏捷开发如日中天的现在,搜索功能也是在不断完善的。索引源数据是不变的,但索引,应该跟着搜索功能的完善而完善,搜索结果,也应该随之得到提升。

未完,待续。。。


Posts From The Same Category

4 Responses to “关于行业相关的站内搜索分词的一些想法”

  1. Mc.Spring Says:

    直接从他们数据库相关字段生成字典不可以么?因为他们的商品入库时基本都有良好的录入规范,用空格分隔一下基本能做到细分的效果。

  2. fcicq Says:

    Suffix Array / Tree as Index.

  3. lemonhall Says:

    同样关注这个问题,让我很苦恼

  4. chenlb Says:

    有人写了收集行业词的程序:http://coderplay.javaeye.com/blog/249782

Leave a Reply