2015-04-07 85 views
0

我需要为我的应用程序创建简单的搜索引擎。让我们简化为以下内容:我们有一些文本(很多),我需要搜索并显示相关结果。信息检索中的Porter stemmer算法

我基于这个伟大的article扩展了一些东西,它适用于我。

但我有词干术语的问题。举例言之“注释”,“注释”等将被梗为“ANNOT”,但是想象一下,你尝试搜索一些东西,你会看到意想不到的结果:

  • “阿鲁” - 没有什么
  • “annota “ - 无 等

只有单词”annot“会给出相关结果。那么,我应该如何改进搜索以提供预期的结果?因为“annot”包含“anno”,“annota”比“annot”略多。使用包含所有的时间显然不是解决方案

如果在第一种情况下,我可以使用一些Ternary search tree,在第二种情况下,我不知道该怎么办。

任何想法都会非常有帮助。

UPDATE

oleksii指出我的n-gram here,这可能对我的作品,但我不知道如何正确地指数正克。

所以问题

  • 哪些数据结构是最适合我的需要
  • 如何正确索引我正克

回答

1

词干也许并不多与此有关。词干会将复数转换为单数形式。

鉴于你有一个记号器,一个词干分析器和一个清理器(可以删除停用词,也许标点符号和数字,简短的单词等),你正在看的是一个全文搜索。我会建议你得到一个现成的解决方案(如Elasticsearch,Lucene,Solr),但是如果你喜欢DIY方法,我可以推荐以下简单的实现。

第1步
创建一个搜索导向的记号。一个例子是n-gram记号器。这将需要你的话,并分为以下顺序:

 
annotation 
1 - [a, n, o, t, a, i] 
2 - [an, nn, no, ot, ...] 
3 - [ann, nno, not, ota, ...] 
4 - [anno, nnot, nota, otat, ...] 
.... 

步骤2
排序正克更有效的查找

步骤3
搜索正克精确匹配使用二进制搜索

+0

这使得sence,谢谢。也许你可以指出如何执行n-gram的索引? – nrudnyk