Stimolare le parole inglesi con Lucene

Sto elaborando alcuni testi in inglese in un’applicazione Java e ho bisogno di eliminarli. Ad esempio, dal testo “servizi / comodità” ho bisogno di ottenere “amenit”.

La funzione assomiglia a:

String stemTerm(String term){ ... } 

Ho trovato il Lucene Analyzer, ma sembra troppo complicato per quello di cui ho bisogno. http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/analysis/PorterStemFilter.html

C’è un modo per usarlo per arginare le parole senza build un analizzatore? Non capisco tutto il business dell’analizzatore …

EDIT : In realtà ho bisogno di una derivazione + lemmatizzazione. Lucene può farlo?

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

Vedi qui per maggiori dettagli. Se la derivazione è tutto ciò che vuoi fare, dovresti usare questo invece di Lucene.

Modifica: è necessario il term minuscolo prima di passarlo a stem() .

SnowballAnalyzer è obsoleto, puoi usare Lucene Porter Stemmer invece:

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

Spero che questo aiuto!

Perché non stai usando “EnglishAnalyzer”? È semplice da usare e penso che risolverebbe il tuo 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 

Spero che ti aiuti!

L’esempio precedente si applica a una query di ricerca, quindi se sei interessato a dedurre un intero testo puoi provare quanto segue:

 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 formsr 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 class TermAttribute è stata deprecata e non sarà più supportata in Lucene 4, ma la documentazione non è chiara su cosa utilizzare al suo posto.

Anche nel primo esempio PorterStemmer non è disponibile come class (nascosto), quindi non è ansible utilizzarlo direttamente.

Spero che questo ti aiuti.

Ecco come utilizzare Snowball Stemmer in 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()); } 

La pipe di Ling fornisce un numero di tokenizer. Possono essere utilizzati per arginare e fermare la rimozione di parole. È un mezzo semplice ed efficace per arginare.