信息检索中的Porter-stemmer算法



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

我在这篇伟大的文章的基础上扩展了一些东西,它对我来说效果很好

但我对把单词词缀成术语有问题。例如,单词"annotation"、"annotations"等会被词干为"annot",但想象一下你尝试搜索某个东西,你会看到意想不到的结果:

  • "anno"-什么都没有
  • "annota"-什么都没有等等

只有单词"annot"才会给出相关的结果。那么,我应该如何改进我的搜索以给出预期的结果呢?因为"annot"包含"anno",而"annota"略多于"annout"。一直使用包含显然不是的解决方案

如果在第一种情况下我可以使用一些三元搜索树,在第二种情况下,我不知道该怎么办

任何想法都会很有帮助。

更新

oleksi在这里给我指出了n-gram,这可能对我有用,但我不知道如何正确地索引n-gram。

因此问题

  • 哪种数据结构最适合我的需求
  • 如何正确索引n-gram

这里可能没有太大的相关性。填词将复数形式转换为单数形式

如果你有一个标记器、词干器和一个清洁器(可以删除停止词,可能是标点符号和数字、短词等),你要看的是全文搜索。我建议您获得现成的解决方案(如Elasticsearch、Lucene、Solr),但如果您喜欢DIY方法,我可以建议以下简单的实现方式。

步骤1
创建一个面向搜索的标记生成器。一个例子是一个n-gram标记器。它将接受你的话并分成以下序列:

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

步骤2
排序n-gram以获得更高效的查找

步骤3
使用二进制搜索搜索n-gram以获得精确匹配

最新更新