【问题标题】:Lucene.NET PorterStemFilter Source Examples and is it Right for me?Lucene.NET PorterStemFilter 源示例,它适合我吗?
【发布时间】:2012-06-15 11:30:10
【问题描述】:

首先,我必须说我们使用的 Lucene.NET 版本不是最新的,因为它是与 Sitecore 6.4.1 打包在一起的,直到现在我们还没有深入研究分析器的使用和词干(大错误!)。

基本上,我们正在尝试在索引时或查询时实施某种形式的词干提取(寻找最佳方法的建议?)。我们遇到的主要问题是所有关于 Stemming 的文档都是用 Java 编写的,我真的很难把它带到 C# 中。我希望有人可以提供该领域的源示例或资源链接。

由于我们的 Lucene.NET 版本非常旧,我认为无法使用 Snowball Analyzer(甚至在我们的版本中也不可用),因此我们正在考虑使用 PorterStemFilter。

任何人都可以提供任何帮助/建议,让我无需升级 Lucene 就可以让 Stemming 工作吗?

亲切的问候

史蒂夫

【问题讨论】:

    标签: c# lucene.net stemming


    【解决方案1】:

    通常您编写自己的分析器来构建 TokenStream 链。您需要在索引和搜索时间停止。

    您只需像使用其他任何分析器一样使用您的分析器。

    示例分析器:

    public class MyAnalyzer : Analyzer
    {
        public override TokenStream TokenStream(string fieldName, TextReader reader)
        {
            return new PorterStemFilter(new StandardTokenizer(reader));
        }
    }
    

    【讨论】:

    • 感谢您的回复。我确实相信您的方法会实现我们想要实现的目标,但是由于我们对分析器并没有太多的经验,而且 Lucene.NET v2.3.1 在这方面似乎不是很友好,所以我们已经这样做了路线。相反,我们在 C# 中找到了 PorterStemmer 类的一个版本,并将其插入到我们的自定义索引器中,并在查询时向它添加了相同的调用,这似乎运行良好。从长远来看,我认为我们将升级到 Solr 以获得 Synonyms 的额外好处,并能够在应用程序代码之外调整搜索选项。
    【解决方案2】:

    Snowball 是最好的 afaik。在 C、Java、...中有实现。 只需在您的项目中构建您自己的 Analyzer/Tokenfilter。

    【讨论】:

      【解决方案3】:

      对于旧版本的 Lucene,您可能需要考虑复制 PorterStemmerAlgorithm 类的 C# 实现

      例如从这里: http://tartarus.org/~martin/PorterStemmer/csharp2.txt

      您可以在索引时使用它来阻止您的关键字段值,以将所有单词的词干版本存储在索引中的“词干字段”中。

      在查询时,您可以使用相同的类来对搜索词进行词干化,并使用词干化查询搜索“词干化字段”。

      这样,您绕过了在更高版本的 Lucene 中实现的所有特定分析器内容,您仍然可以搜索所有单词的完整版本...

      这比理想的手动操作要多一些 - 但它会完成工作:-)

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-08
        • 2011-07-13
        • 2010-10-06
        • 2020-10-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多