【问题标题】:Porter stemmer algorithm in information-retrieval [closed]信息检索中的波特词干分析器算法[关闭]
【发布时间】:2015-04-07 11:25:09
【问题描述】:

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

我基于这个很棒的article 扩展了一些东西,它对我来说效果很好。

但是我在将词词干化为术语时遇到了问题。例如,“annotation”、“annotations”等词将被提取为“annot”,但假设您尝试搜索某些内容,您会看到意想不到的结果:

  • “anno” - 什么都没有
  • “注释” - 没有 等

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

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

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

更新

oleksii 已将我指向 n-gram here,这可能对我有用,但我不知道如何正确索引 n-gram。

所以问题

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

【问题讨论】:

    标签: c# algorithm information-retrieval stemming porter-stemmer


    【解决方案1】:

    词干在这里可能并不重要。词干会将复数形式转换为单数形式。

    假设您有一个分词器、一个词干分析器和一个清理器(用于删除停用词、标点符号和数字、短词等),您正在查看的是全文搜索。我建议您使用现成的解决方案(如 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 中搜索精确匹配

    【讨论】:

    • 这很有意义,谢谢。也许您可以指出如何为 n-gram 执行索引?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    相关资源
    最近更新 更多