Je traite des textes en anglais dans une application Java, et je dois les dériver. Par exemple, à partir du texte "commodités/aménité", je dois obtenir "amenit".
La fonction ressemble à:
String stemTerm(String term){
...
}
J'ai trouvé l'analyseur Lucene, mais il semble bien trop compliqué pour ce dont j'ai besoin. http://lucene.Apache.org/Java/2_2_0/api/org/Apache/lucene/analysis/PorterStemFilter.html
Existe-t-il un moyen de l'utiliser pour endiguer des mots sans construire un analyseur? Je ne comprends pas toute l'activité Analyzer ...
[~ # ~] edit [~ # ~] : J'ai en fait besoin d'un stemming + lemmatization. Lucene peut-elle faire ça?
import org.Apache.lucene.analysis.PorterStemmer;
...
String stemTerm (String term) {
PorterStemmer stemmer = new PorterStemmer();
return stemmer.stem(term);
}
Voir ici pour plus de détails. Si le stemming est tout ce que vous voulez faire, vous devez utiliser this au lieu de Lucene.
Edit: Vous devez minuscule term
avant de le passer à stem()
.
SnowballAnalyzer est obsolète, vous pouvez utiliser Lucene Porter Stemmer à la place:
PorterStemmer stem = new PorterStemmer();
stem.setCurrent(Word);
stem.stem();
String result = stem.getCurrent();
J'espère que cette aide!
Pourquoi n'utilisez-vous pas le "EnglishAnalyzer"? C'est simple à utiliser et je pense que cela résoudrait votre problème:
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
J'espère que cela vous aide!
L'exemple précédent s'applique à la racine d'une requête de recherche, donc si vous êtes intéressé par la racine d'un texte intégral, vous pouvez essayer ce qui suit:
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 classe TermAttribute est obsolète et ne sera plus prise en charge dans Lucene 4, mais la documentation n'est pas claire sur ce qu'il faut utiliser à sa place.
Dans le premier exemple également, PorterStemmer n'est pas disponible en tant que classe (masqué), vous ne pouvez donc pas l'utiliser directement.
J'espère que cela t'aides.
Voici comment vous pouvez utiliser 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());
}
Ling pipe fournit un certain nombre de tokenizers. Ils peuvent être utilisés pour arrêter et supprimer la suppression de Word. C'est un moyen simple et efficace d'endiguer.