Lucene Porter Stemmer-获取原始的未经编辑的单词



我已经学会了如何使用Lucene的Porter-Stemmer,但也想检索原始的无词干单词。因此,为此,在创建PorterStemFilter之前,我向TokenStream添加了一个CharTermAttribute,如下所示:

Analyzer analyzer = new StandardAnalyzer();
TokenStream original = analyzer.tokenStream("StandardTokenStream", new StringReader(inputText));
TokenStream stemmed = new PorterStemFilter(original);
CharTermAttribute originalWordAttribute = original.addAttribute(CharTermAttribute.class);
CharTermAttribute stemmedWordAttribute = stemmed.addAttribute(CharTermAttribute.class);
stemmed.reset();
while (stemmed.incrementToken()) {
System.out.println(stemmedWordAttribute+" "+originalWordAttribute);
}

不幸的是,这两个属性都返回词干。有没有办法也得到原来的单词?

Lucene的PorterStemFilter可以与Lucene的KeywordRepeatFilter组合使用。Porter Stemmer使用这个来提供有梗代币和无梗代币。

修改您的方法:

Analyzer analyzer = new StandardAnalyzer();
TokenStream original = analyzer.tokenStream("StandardTokenStream", new StringReader(inputText));
TokenStream repeated = new KeywordRepeatFilter(original);
TokenStream stemmed = new PorterStemFilter(repeated);
CharTermAttribute stemmedWordAttribute = stemmed.addAttribute(CharTermAttribute.class);
stemmed.reset();
while (stemmed.incrementToken()) {
String originalWord = stemmedWordAttribute.toString();
stemmed.incrementToken();
String stemmedWord = stemmedWordAttribute.toString();
System.out.println(originalWord + " " + stemmedWord);
}

这是相当粗糙的,但显示了方法。

示例输入:

testing giraffe book passing

结果输出:

testing test
giraffe giraff
book book
passing pass

对于每对标记,如果第二个标记与第一个标记(book book(匹配,则不存在词干。


通常,您会将其与RemoveDuplicatesTokenFilter一起使用以删除重复的book项,但如果您这样做,我认为跟踪有茎/无茎对会变得更加困难,因此对于您的特定场景,我没有使用重复数据消除过滤器。

最新更新