Question

J'utilise un analyseur de boules de neige Lucene pour effectuer le stemming.Les résultats ne sont pas des mots significatifs.J'ai fait référence à ceci question .

L'une des solutions consiste à utiliser une base de données contenant une carte entre la version radicale du mot et une version stable du mot.(Exemple de communauté en communauté, quelle que soit la base de communauté (communautés / ou un autre mot))

Je veux savoir s'il existe une base de données qui remplit une telle fonction.

Était-ce utile?

La solution

Il est théoriquement impossible de récupérer un mot spécifique d'une tige, car une tige peut être courante à de nombreux mots. Une possibilité, selon votre application, consisterait à créer une base de données des tiges chacune mappée sur un éventail de plusieurs mots. Mais vous devriez alors prédire lequel de ces mots appropriés donnait une tige à reconvertir.

Une solution très naïve à ce problème, si vous connaissez les balises de mots, vous pouvez essayer de stocker des mots avec les balises de votre base de données:

run:
   NN:  runner
   VBG: running
   VBZ: runs

Puis, étant donné la tige "RUN" et le tag "NN", vous pouvez déterminer que "le coureur" est le mot le plus probable dans ce contexte. Bien sûr, cette solution est loin d'être parfaite. Vous devez notamment gérer le fait que le même formulaire de mot peut être étiqueté différemment dans différents contextes. Mais rappelez-vous que toute tentative de résolution de ce problème sera au mieux une approximation.

Edit: à partir des commentaires ci-dessous, il semble que vous souhaitiez probablement utiliser la lemmatisation au lieu de stemming. Voici comment obtenir les lemmas des mots à l'aide du Outils NLP de Stanford Core :

import java.util.*;

import edu.stanford.nlp.pipeline.*;
import edu.stanford.nlp.ling.*;
import edu.stanford.nlp.ling.CoreAnnotations.*;

Properties props = new Properties();

props.put("annotators", "tokenize, ssplit, pos, lemma");
pipeline = new StanfordCoreNLP(props, false);
String text = "Hello, world!";
Annotation document = pipeline.process(text);

for(CoreMap sentence: document.get(SentencesAnnotation.class)) {
    for(CoreLabel token: sentence.get(TokensAnnotation.class)) {
        String word = token.get(TextAnnotation.class);
        String lemma = token.get(LemmaAnnotation.class);
    }
}

Autres conseils

La question que vous référencez contient une information importante qui est souvent négligée.Ce que vous avez besoin est appelé "Lemmatisation" - la réduction des mots infléchis à leur forme canonique.Il est lié mais différent de la timeur et reste une question de recherche ouverte.Il est particulièrement difficile pour les langues avec une morphologie plus complexe (l'anglais n'est pas si difficile). Wikipedia possède une liste de logiciels que vous pouvez essayer.Un autre outil que j'ai utilisé est TreeCagger - c'est vraiment rapide et raisonnableUne précision, bien que le but principal est une partie du marquage de la parole et une lemmatisation est juste un bonus.Essayez Googling pour "Lemmatisation statistique" (oui, j'ai des sentiments forts sur la PNL statistique basée sur la règle des règles)

Vous pouvez regarder le NCI MetaTesaurus - Bien que surtout biomédical dans la nature, ils offrentDes exemples de traitement de la langue naturelle et de certains outils d'outils open source pour Java, vous pourriez trouver utile en parcourant leur code.

Si vous souhaitez le faire en Python :

Vous aimerez peut-être ce projet open source qui utilise Stemming et contient un algorithme pour faire du Stemming inverse :

Sur cette page du projet, il y a des explications sur la façon de faire l'Inverse Stemming.Pour résumer, cela fonctionne comme suit.

Tout d'abord, vous commencerez certains documents, ici des chaînes courtes (en langue française) dont les mots vides ont été supprimés par exemple : ['sup chat march trottoir', 'sup chat aiment ronron', 'chat ronron', 'sup chien aboi', 'deux sup chien', 'combien chien train aboi']

Ensuite, l'astuce consiste à conserver le décompte des mots originaux les plus populaires avec le décompte pour chaque mot radical : {'aboi': {'aboie': 1, 'aboyer': 1}, 'aiment': {'aiment': 1}, 'chat': {'chat': 1, 'chats': 2}, 'chien': {'chien': 1, 'chiens': 2}, 'combien': {'Combien': 1}, 'deux': {'Deux': 1}, 'march': {'marche': 1}, 'ronron': {'ronronner': 1, 'ronrons': 1}, 'sup': {'super': 4}, 'train': {'train': 1}, 'trottoir': {'trottoir': 1}}

Enfin, vous pouvez maintenant deviner comment mettre cela en œuvre par vous-même.Prenez simplement les mots originaux pour lesquels il y a eu le plus de comptes étant donné un mot radical.Vous pouvez vous référer à l'implémentation suivante, disponible sous la licence MIT dans le cadre du Allocation-LDA-Latent-Dirichlet-multilingue projet:

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