Соединение английских слов с Lucene

Я обрабатываю некоторые тексты на английском языке в приложении Java, и мне нужно остановить их. Например, из текста "удобства / удобства" мне нужно получить "аменит".

Функция выглядит так:

String stemTerm(String term){
   ...
}

Я нашел Lucene Analyzer, но он выглядит слишком сложным для того, что мне нужно. http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/analysis/PorterStemFilter.html

Есть ли способ использовать его для определения слов без создания анализатора? Я не понимаю все дело анализатора...

РЕДАКТИРОВАТЬ: мне на самом деле нужно stemming + лемматизация. Может ли Lucene сделать это?

7 ответов

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

Смотрите здесь для более подробной информации. Если все, что вы хотите сделать, это остановить, то вам следует использовать это вместо Lucene.

Изменить: Вы должны в нижнем регистре term прежде чем передать его stem(),

SnowballAnalyzer устарел, вместо этого вы можете использовать Lucene Porter Stemmer:

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

Надеюсь, это поможет!

Почему вы не используете "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

Надеюсь, это поможет вам!

Предыдущий пример применяется к основному поисковому запросу, поэтому, если вам интересно использовать полный текст, попробуйте следующее:

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 недоступен как класс (скрытый), поэтому вы не можете использовать его напрямую.

Надеюсь это поможет.

Вот как вы можете использовать Snowball Stemmer в JAVA:

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

Ling pipe предоставляет ряд токенизаторов. Они могут быть использованы для остановки и удаления слов. Это простое и эффективное средство противодействия.

Поскольку PorterStemmer не является общедоступным, мы не можем вызывать основную функцию PorterStemmer.

Вместо этого мы можем использовать KStemmer / KStemFilter, чтобы связать слова с их корневым словом.

Ниже приведен фрагмент кода scala, который принимает строку и преобразуется в основную строку.

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

импортировать java.io.StringReader

объект Stemmer {def stem(ввод: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

}

}

Другие вопросы по тегам