29

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

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

String stemTerm(String term){
   ...
}

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

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

編集:私は実際にステミング+レンマ化が必要です。Luceneはこれを実行できますか?

4

7 に答える 7

27

SnowballAnalyzerは非推奨になりました。代わりに、LucenePorterStemmerを使用できます。

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

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

于 2012-11-04T12:26:49.360 に答える
23
import org.apache.lucene.analysis.PorterStemmer;
...
String stemTerm (String term) {
    PorterStemmer stemmer = new PorterStemmer();
    return stemmer.stem(term);
}

詳細については、こちらをご覧ください。ステミングだけが必要な場合は、Luceneの代わりにこれを使用する必要があります。

編集:termに渡す前に小文字にする必要がありstem()ます。

于 2011-03-22T16:44:04.263 に答える
6

「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

お役に立てば幸いです。

于 2011-11-24T06:47:18.580 に答える
5

前の例は検索クエリにステミングを適用するため、全文をステミングすることに興味がある場合は、次のことを試すことができます。

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はクラス(非表示)として使用できないため、直接使用することはできません。

お役に立てれば。

于 2011-12-30T16:37:30.907 に答える
3

以下は、JAVAでSnowballStemmerを使用する方法です。

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());
}
于 2014-08-13T18:53:12.713 に答える
0

リンパイプは、多数のトークナイザーを提供します。これらは、ステミングおよびストップワードの削除に使用できます。そのシンプルで効果的なステミングの手段。

于 2012-02-28T11:12:34.557 に答える
0

PorterStemmerは公開されていないため、PorterStemmerの語幹関数を呼び出すことはできません。

代わりに、KStemmer / KStemFilterを使用して、単語をそのルート単語にステミングすることができます。

以下は、文字列を受け入れて語幹文字列に変換するscalaコードスニペットです

import org.apache.lucene.analysis.core.WhitespaceTokenizer import org.apache.lucene.analysis.en.KStemFilter

java.io.StringReaderをインポートします

オブジェクトStemmer{defstem(input:String):String = {

val stemmed_string = new StringBuilder()

val inputReader = new StringReader(input.toLowerCase)

val whitespaceTokenizer = new WhitespaceTokenizer()
whitespaceTokenizer.setReader(inputReader)

val kStemmedTokenStream = new KStemFilter(whitespaceTokenizer)
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute

val charTermAttribute = kStemmedTokenStream.addAttribute(classOf[CharTermAttribute])

kStemmedTokenStream.reset
while (kStemmedTokenStream.incrementToken) {
  val term = charTermAttribute.toString
  stemmed_string.append(term+" ")
}
stemmed_string.toString().trim.toUpperCase

}

}

于 2021-05-26T05:03:32.607 に答える