【问题标题】:English stemming or lemmatization in Lucene.NET without SnowBall Analyzer or a custom analyzer没有 SnowBall Analyzer 或自定义分析器的 Lucene.NET 中的英语词干提取或词形还原
【发布时间】:2019-08-10 03:17:37
【问题描述】:

是否有过时的 Lucene.NET 分析器可以进行英语语言词干提取或词形还原,或者我是否需要编写自定义分析器?

我似乎找不到源代码中包含PorterStemFilterEnglishMinimalStemFilter 的分析器。我可以编写自己的分析器,但感觉不应该这样做,而且我会重新发明错误的轮子。

我正在尝试在 Lucene.NET 中对英语单词进行词干提取。据我所知,这不是开箱即用的。我尝试像这样使用EnglishAnalizer:

[TestFixture]
public class TestAnalyzers
{
    private const string FieldName = "CustomFieldName"; 

    public Directory CreateDirectory(IEnumerable<string> documents, Analyzer analyzer)
    {
        var directory = new RAMDirectory();
        var iwc = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer)
        {
            OpenMode = OpenMode.CREATE_OR_APPEND,
        };
        var writer = new IndexWriter(directory, iwc);
        writer.Commit();
        foreach(var doc in documents) {
            var document = new Document();
            document.AddTextField(FieldName, doc, StoredField.Store.YES);
            writer.AddDocument(document);
        }

        writer.Flush(true, true);
        writer.Commit();
        return directory;
    }

    private QueryParser CreateQueryParser(Analyzer analyzer) 
        => new MultiFieldQueryParser(
        LuceneVersion.LUCENE_48,
        GetSearchFields(),
        analyzer);

    private string[] GetSearchFields() => new [] { FieldName };



    [TestCase("for", "for")]
    [TestCase("for", "forward")]
    [TestCase("forward", "for")]
    //[TestCase("retire", "retirement")]
    [TestCase("retirement", "retire")]
    [Test]
    public void TestPartialWordsStandard(string fieldValue, string query)
    {
        var analyzer = new EnglishAnalyzer(LuceneVersion.LUCENE_48);
        var directory = CreateDirectory(new [] { fieldValue }, analyzer);

        var indexReader = DirectoryReader.Open(directory);
        Assert.AreEqual(1, indexReader.NumDocs);
        var doc = indexReader.Document(0);
        Assert.NotNull(doc);
        Assert.AreEqual(fieldValue, doc.GetField(FieldName).GetStringValue());


        var searcher = new IndexSearcher(indexReader);

        var queryObj = CreateQueryParser(analyzer).Parse(query);

        var results = searcher.Search(queryObj, 2);

        Assert.AreEqual(1, results.TotalHits);
        doc = indexReader.Document(results.ScoreDocs.First().Doc);
        Assert.AreEqual(fieldValue, doc.GetField(FieldName).GetStringValue());

    }
}

它没有阻止。通过阅读代码,它使用所有格过滤器删除 's 和 s, but not the english stemming filter or thePorterStemFilter`。

我能够使用 var analyzer = new SnowballAnalyzer(LuceneVersion.LUCENE_48, "English");. 进行一些词干提取,它的词干提取量足够,但该类已过时。

【问题讨论】:

    标签: lucene.net stemming


    【解决方案1】:

    Lucene.Net EnglishAnalyzer 确实包括搬运工词干。在类的source code 的第 117 行是这一行:

    result = new PorterStemFilter(result);
    

    我还使用EnglishAnalyzer 在我的系统中运行了一个测试,并确认它实际上是词干。例如,我的索引文本包含单词“walking”,当我搜索“walked”时,我得到了记录。

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 2014-04-04
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多