質問

私はJavaアプリケーションでいくつかの英語のテキストを処理していますが、それらをつなぐ必要があります。たとえば、テキスト「アメニティ/アメニティ」から「アメニット」を取得する必要があります。

関数は次のように見えます:

String stemTerm(String term){
   ...
}

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

アナライザーを構築せずに単語を飾るためにそれを使用する方法はありますか?私はすべてのアナライザービジネスを理解していません...

編集: :実際には、ステム + lemmatizationが必要です。ルーセンはこれを行うことができますか?

役に立ちましたか?

解決

import org.apache.lucene.analysis.PorterStemmer;
...
String stemTerm (String term) {
    PorterStemmer stemmer = new PorterStemmer();
    return stemmer.stem(term);
}

見る ここ 詳細については。ステムがやりたいことだけである場合は、使用する必要があります これ ルーセンの代わりに。

編集: あなたは小文字をする必要があります term それを渡す前に stem().

他のヒント

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

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

この助けを願っています!

「イングリッシュアナリザー」を使用しないのはなぜですか?それを使用するのは簡単で、あなたの問題を解決すると思います:

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

それがあなたに役立つことを願っています!

前の例では、検索クエリに幹を掲載するため、フルテキストを幹にすることが興味深い場合は、以下を試すことができます。

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ではもうサポートされていませんが、その場所で何を使用するかについてはドキュメントは明確ではありません。

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

お役に立てれば。

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());
}

リンパイプ 多くのトークンザーを提供します。それらは、茎の除去に使用し、単語の削除を停止できます。そのシンプルで効果的な手段である。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top