java - Palabras en inglés con Lucene
stemming porter-stemmer (6)
Estoy procesando algunos textos en inglés en una aplicación Java, y necesito contenerlos. Por ejemplo, del texto "amenities / amenity" necesito obtener "amenit".
La función se ve como:
String stemTerm(String term){
...
}
He encontrado el analizador 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 contener palabras sin crear un analizador? No entiendo todo el negocio de Analyzer ...
EDITAR : En realidad necesito un stemming + lematización. ¿Lucene puede hacer esto?
¿Por qué no estás usando el analizador de inglés? Es fácil de usar y creo que solucionarí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!
Aquí es cómo 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());
}
El ejemplo anterior aplica la derivación a una consulta de búsqueda, por lo que si es interesante escribir un texto completo, puede intentar 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 ha quedado en desuso y ya no será compatible con Lucene 4, pero la documentación no es clara sobre qué usar en su lugar.
Además, en el primer ejemplo, PorterStemmer no está disponible como clase (oculto), por lo que no puede usarlo directamente.
Espero que esto ayude.
SnowballAnalyzer está en desuso, puede usar Lucene Porter Stemmer en su lugar:
PorterStemmer stem = new PorterStemmer();
stem.setCurrent(word);
stem.stem();
String result = stem.getCurrent();
¡Espero que esto ayude!
Ling pipe proporciona una serie de tokenizadores. Se pueden utilizar para eliminar y eliminar la eliminación de palabras. Es un medio simple y eficaz de detener.
import org.apache.lucene.analysis.PorterStemmer;
...
String stemTerm (String term) {
PorterStemmer stemmer = new PorterStemmer();
return stemmer.stem(term);
}
Vea here para más detalles. Si lo único que quieres hacer es derivar, entonces debes usar this lugar de Lucene.
Editar: Debes escribir un term
minúscula antes de pasarlo a stem()
.