Подтвердить что ты не робот

Исключительные английские слова с Lucene

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

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

String stemTerm(String term){
   ...
}

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

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

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

4b9b3361

Ответ 1

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

Подробнее см. здесь. Если вы хотите сделать все, что вы хотите сделать, тогда вместо Lucene вы должны использовать .

Изменить: Перед тем, как передать его в stem(), введите term.

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Вот как вы можете использовать Stormmer Snowball в 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());
}

Ответ 6

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