Question

Je traite des textes anglais dans une application Java, et je dois les endiguer. Par exemple, à partir du texte "équipements / équipement", j'ai besoin d'obtenir "Amenit".

La fonction ressemble:

String stemTerm(String term){
   ...
}

J'ai trouvé l'analyseur Lucene, mais cela semble beaucoup 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 toutes les affaires de l'analyseur ...

ÉDITER: J'ai en fait besoin d'une lemmatisation en tige +. Lucene peut-il faire cela?

Était-ce utile?

La solution

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 la tige est tout ce que vous voulez faire, alors vous devriez utiliser cette au lieu de Lucene.

Éditer: Vous devez minuscules term Avant de le passer à stem().

Autres conseils

Snowballanalyzer est obsolète, vous pouvez plutôt utiliser Lucene Porter STEMMER:

 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"? Il est simple de l'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 à une requête de recherche, donc si vous êtes intéressant pour endiguer 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 a été 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.

Également dans le premier exemple, le PorterStremmer n'est pas disponible en classe (cachée), 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());
}

Tuyau Fournit un certain nombre de tokenzers. Ils peuvent être utilisés pour endiguer et arrêter l'élimination des mots. C'est un moyen simple et efficace de sceller.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top