Соединяя английские слова с Lucene - PullRequest
28 голосов
/ 22 марта 2011

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

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

String stemTerm(String term){
   ...
}

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

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

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

Ответы [ 6 ]

23 голосов
/ 04 ноября 2012

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

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

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

20 голосов
/ 22 марта 2011
import org.apache.lucene.analysis.PorterStemmer;
...
String stemTerm (String term) {
    PorterStemmer stemmer = new PorterStemmer();
    return stemmer.stem(term);
}

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

Edit: Вы должны прописать term перед передачей его на stem().

6 голосов
/ 24 ноября 2011

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

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

5 голосов
/ 30 декабря 2011

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

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

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

3 голосов
/ 13 августа 2014

Вот как вы можете использовать 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());
}
0 голосов
/ 28 февраля 2012

Ling pipe предоставляет несколько токенизаторов. Их можно использовать для остановки и удаления слов. Это простое и эффективное средство противодействия.

...