Pregunta

Estoy procesando algunos textos en inglés en una aplicación Java, y necesito detenerlos. Por ejemplo, del texto "Servicios/servicios" Necesito obtener "amenito".

La función parece:

String stemTerm(String term){
   ...
}

Encontré el analizador de Lucene, pero parece demasiado complicado para lo que necesito.http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/analysis/porterstemfilter.html

¿Hay alguna forma de usarlo para STEM PALABRAS sin construir un analizador? No entiendo todo el negocio del analizador ...

EDITAR: De hecho, necesito una derivación + lemmatización. ¿Puede Lucene hacer esto?

¿Fue útil?

Solución

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

Ver aquí para más detalles. Si la deriva es todo lo que quieres hacer, entonces debes usar este en lugar de Lucene.

Editar: Deberías minúsculas term antes de pasarlo a stem().

Otros consejos

Snowballanalyzer está en desuso, puedes usar Lucene Porter Stemmer:

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

¡Espero que esto ayude!

¿Por qué no estás usando el "Englishanalyzer"? Es simple usarlo y creo que resolvería tu problema:

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

¡Espero que te ayude!

El ejemplo anterior se aplica a una consulta de búsqueda, por lo que si le interesa detener un texto completo puede probar lo siguiente:

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

La clase Termattribute se ha desactivado y ya no será compatible en Lucene 4, pero la documentación no es clara sobre qué usar en su lugar.

También en el primer ejemplo, Porterstemmer no está disponible como clase (oculta), por lo que no puede usarla directamente.

Espero que esto ayude.

Así es como puedes usar Snowball Stemmer en 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());
}

Tubería Proporciona una serie de tokenizadores. Se pueden usar para la derivación y detener la eliminación de palabras. Es un medio simple y efectivo de derivación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top