Skip to content

{ Monthly Archives } 七月 2009

关于行业相关的站内搜索分词的一些想法

最近在给一个类似 京东 和 新蛋 的3C类电子商城提供站内搜索。基本功能都是现成的,但部署上去以后,发现搜索结果比论坛,cms的搜索结果差远了。仔细的看了几个搜索记录的 debug log,才弄明白为什么: 所有的中文分词组件(paoding,imdict, mmseg4j, ik 等等等等), 都是为了应付日常使用的语言而设计的,特别是 imdict “基于自然语言处理领域的隐马尔科夫模型”,当前的实现还不支持用户自定义词库。其他几个支持用户自定义词库,paoding 甚至起了一个线程来扫描词库的变化,以达到动态更新词库的目的。但词库的维护还是需要使用者来做。mmseg4j 自带了一个 sogou 细胞词库,也都是日常生活用词。不论是基于语料库训练概率还是基于精巧的词库匹配算法,当需要分词的文档中,大部分词都是“未登录词”(行业相关性较强的时候就是这样,比如搜公司名,品牌名,甚至产品型号,配置等等),机器都是无可奈何的。 行业相关的词库因为用的少,关注的人也少,能使用的资源也就少的多了。在没有现成可用的词库的前提下,怎么样以最小的代价得到一个可以接受的搜索精度呢?想了一下,暂时只想到这么几点,欢迎大家补充: 根据行业特点修改分词算法的一些细节处理:比如大部分分词器实现,都会把 “A1600” 这种字母数字混合出现分解成 “A” 和 “1600” 两个词。在日常生活中,这样处理是有道理的。但在 3C 类的电子商城网站中,用户输入 “A1600” 进行搜索,与输入 “A   1600” 的意图肯定是不一样的:前者是想搜摩托罗拉的明手机,后者嘛,就很难揣测了。 站内搜索,一般来说是在一个比较小的有限集合中进行搜索,所以搜索结果集合也是比较小的,甚至经常没有完全命中用户所有的关键词的情况出现。提供给用户一些可能相关的内容总要比显示“对不起,没有搜到任何结果”要好。所以文档中 “摩托罗拉” 除了要分出一个 “摩托罗拉” 以外,“摩托” 也是一个可以接受的索引词,以防用户输入一个莫名其妙的 “摩托” 的时候,搜不到任何结果(我们这里是卖3C类产品的,不卖摩托车,也不卖摩托艇,谢谢!)。—— mmseg4j 的 max-word 算法。 方便的用户添加新词功能:这里的用户,既可以是网站管理员,也可以是最终用户,甚至是写一个程序去baidu,google或其他的什么数据源抓取过来的跟行业相关的词汇。新词经过清理,排重,验证,确认等预处理环节后,添加到词库里面去。如何吸引用户来为网站做有价值的贡献,永远是一个值得探讨的问题。 方便的重建索引功能:在词库的量变快要引起质变的时候,应该重建一下索引。在敏捷开发如日中天的现在,搜索功能也是在不断完善的。索引源数据是不变的,但索引,应该跟着搜索功能的完善而完善,搜索结果,也应该随之得到提升。 未完,待续。。。

Lucene 2.9 上实现 GroupBy 功能

Lucene 2.9 上,终于在 Searchable 接口中支持 search(weight, filter, collector) 了,而不是像 2.4 中那样,只在 IndexSearcher 中支持,而在 MultiSearcher 中,需要自己手工的添加 Collector。 把原来的非常丑陋的 HitCollector 换成了一般丑陋的 Collector ,本来觉得还挺高兴的,但仔细一看代码前的注释:“This API is experimental and might change in incompatible ways in the next release.” 无语了。 虽然 API 还是实验性的,但看起来已经到达了可用的阶段,所以 IMobile Search 2.0 中,还是使用 Lucene 2.9 的 API ,将原来临时性质的 groupby 功能实现重构了一下,大致思路是这样的: 使用 Collector 实现 实现一个 抽象类 o.a.l.search.Collector  [...]

beta技术沙龙 邀请

http://club.blogbeta.com/82.html beta技术沙龙·大型网站的lucene搜索实战 时间:7月26日14点30分开始 地点:奇遇花园咖啡馆 http://storygarden.me/cafe/map 主题:大型网站的lucene搜索实战 演讲简介:本次活动介绍基于Lucene的站内搜索的实践,后台技术层面的一些想法与实践,包括缩短更新周期,简化重建索引流程,支持大数据量频繁更新的索引,以及在性能和可用性方面作的努力。 主讲人:唐福林 (http://blog.fulin.org https://twitter.com/tangfl) 主讲人简介:从高中的 NOIP 到大学的ACM,是编程竞赛的参与者,也是算法的爱好者,以追求程序或系统的性能的极致为乐。 目前就职于手机之家,负责基于lucene的站内搜索的开发及持续改进。 参与人员:最大的前提是技术出身,第二个要求是写blog。积极参加现场沙龙聊天;如有可能对话题通过blog保持跟进关注。http://club.blogbeta.com/ 网上报名或直接现身沙龙,参与免费,点单另付。 关于沙龙:blogbeta技术沙龙由一群技术人员发起并参与,旨在以技术的视角看待社会、互联网和未来,以务实精神深化交流,促进创新。 update: 讲稿的最终版本下载: http://files.getdropbox.com/u/648709/%E5%9F%BA%E4%BA%8Elucene%E7%9A%84%E7%AB%99%E5%86%85%E6%90%9C%E7%B4%A2-beta.pdf https://docs.google.com/fileview?id=0By5e0-mxw7O0NWM5MzhhZTctZGEwOS00NzkzLTliMGYtY2U0ZjBlMDJhZjcy&hl=zh_CN