web-dev-qa-db-ja.com

Luceneを使用した英単語のステミング

Javaアプリケーションでいくつかの英語のテキストを処理しています。たとえば、「amenities/amenity」というテキストから「amenit」を取得する必要があります。

関数は次のようになります。

String stemTerm(String term){
   ...
}

Lucene Analyzerを見つけましたが、必要なものには複雑すぎるように見えます。 http://lucene.Apache.org/Java/2_2_0/api/org/Apache/lucene/analysis/PorterStemFilter.html

アナライザーを構築せずに単語をステミングする方法はありますか?アナライザーのすべてのビジネスを理解していません...

[〜#〜] edit [〜#〜]:私は実際にステミング+見出し語化が必要です。 Luceneはこれを実行できますか?

28
Mulone
_import org.Apache.lucene.analysis.PorterStemmer;
...
String stemTerm (String term) {
    PorterStemmer stemmer = new PorterStemmer();
    return stemmer.stem(term);
}
_

詳細については、 here を参照してください。ステミングが必要な場合は、Luceneの代わりに this を使用する必要があります。

編集:termを小文字にしてからstem()に渡す必要があります。

20
nikhil500

SnowballAnalyzerは非推奨です。代わりにLucene Porter Stemmerを使用できます。

 PorterStemmer stem = new PorterStemmer();
 stem.setCurrent(Word);
 stem.stem();
 String result = stem.getCurrent();

このヘルプを願っています!

23
arbc

「EnglishAnalyzer」を使用しないのはなぜですか?それを使用するのは簡単で、あなたの問題を解決すると思います:

EnglishAnalyzer en_an = new EnglishAnalyzer(Version.LUCENE_34);
QueryParser parser = new QueryParser(Version.LUCENE_34, "your_field", en_an);
String str = "amenities";
System.out.println("result: " + parser.parse(str)); //amenit

それがあなたを助けることを願っています!

6
Max

前の例では、検索クエリにステミングが適用されます。したがって、全文をステミングすることに関心がある場合は、次を試してください。

import Java.io.*;
import org.Apache.lucene.analysis.*;
import org.Apache.lucene.analysis.tokenattributes.*;
import org.Apache.lucene.analysis.Snowball.*;
import org.Apache.lucene.util.*;
...
public class Stemmer{
    public static String Stem(String text, String language){
        StringBuffer result = new StringBuffer();
        if (text!=null && text.trim().length()>0){
            StringReader tReader = new StringReader(text);
            Analyzer analyzer = new SnowballAnalyzer(Version.LUCENE_35,language);
            TokenStream tStream = analyzer.tokenStream("contents", tReader);
            TermAttribute term = tStream.addAttribute(TermAttribute.class);

            try {
                while (tStream.incrementToken()){
                    result.append(term.term());
                    result.append(" ");
                }
            } catch (IOException ioe){
                System.out.println("Error: "+ioe.getMessage());
            }
        }

        // If, for some reason, the stemming did not happen, return the original text
        if (result.length()==0)
            result.append(text);
        return result.toString().trim();
    }

    public static void main (String[] args){
        Stemmer.Stem("Michele Bachmann amenities pressed her allegations that the former head of her Iowa presidential bid was bribed by the campaign of rival Ron Paul to endorse him, even as one of her own aides denied the charge.", "English");
    }
}

TermAttributeクラスは非推奨になり、Lucene 4ではサポートされなくなりますが、ドキュメントはその場所で何を使用するか明確ではありません。

また、最初の例では、PorterStemmerはクラス(非表示)として使用できないため、直接使用することはできません。

お役に立てれば。

5

JavaでSnowball Stemmerを使用する方法は次のとおりです。

import org.tartarus.Snowball.ext.EnglishStemmer;

EnglishStemmer english = new EnglishStemmer();
String[] words = tokenizer("bank banker banking");
for(int i = 0; i < words.length; i++){
        english.setCurrent(words[i]);
        english.stem();
        System.out.println(english.getCurrent());
}
3
UserNeD

Ling pipe は、多数のトークナイザーを提供します。それらは、ステミングに使用でき、Wordの削除を停止できます。そのシンプルで効果的なステミングの手段。

0
CTsiddharth