J'ai essayé PorterStemmer et Snowball, mais les deux ne fonctionnent pas sur tous les mots, il en manque certains très courants.
Mes mots de test sont: "les chats qui courent ont couru les communautés communautaires de cactus cactus cactus ", et les deux ont moins de la moitié raison.
Voir également:
nlp
stemming
lemmatization
manixrock
la source
la source
Réponses:
Si vous connaissez Python, The Natural Language Toolkit (NLTK) a un lemmatizer très puissant qui utilise WordNet .
Notez que si vous utilisez ce lemmatiseur pour la première fois, vous devez télécharger le corpus avant de l'utiliser. Cela peut être fait par:
Vous ne devez le faire qu'une seule fois. En supposant que vous avez maintenant téléchargé le corpus, cela fonctionne comme ceci:
Il existe d'autres lemmatiseurs dans le module nltk.stem , mais je ne les ai pas essayés moi-même.
la source
dies
, il vous donne à lady
place dedie
. N'existe-t-il pas une sorte de dictionnaire radical codé en dur?WordNetLemmatizer
lemmatisent à tort?J'utilise stanford nlp pour effectuer la lemmatisation. J'ai été confronté à un problème similaire ces derniers jours. Tout cela grâce à stackoverflow pour m'aider à résoudre le problème.
Il peut également être judicieux d'utiliser des mots vides pour minimiser les lemmes de sortie s'ils sont utilisés plus tard dans le classificator. Veuillez jeter un œil à l' extension coreNlp écrite par John Conwell.
la source
J'ai essayé votre liste de termes sur ce site de démonstration de boule de neige et les résultats semblent corrects ....
Un radical est censé transformer les formes fléchies des mots en une racine commune. Ce n'est pas vraiment un travail de radical de faire de cette racine un mot du dictionnaire «approprié». Pour cela, vous devez vous pencher sur des analyseurs morphologiques / orthographiques .
Je pense que cette question concerne plus ou moins la même chose, et la réponse de Kaarel à cette question est de savoir d'où j'ai pris le deuxième lien.
la source
Les débats entre le stemmer et le lemmatizer se poursuivent. Il s'agit de préférer la précision à l'efficacité. Vous devez lemmatiser pour obtenir des unités linguistiquement significatives et utiliser un minimum de jus de calcul tout en indexant un mot et ses variations sous la même clé.
Voir Stemmers vs Lemmatizers
Voici un exemple avec python NLTK:
la source
WordNetLemmatizer
leslemmatize()
peuvent prendre une étiquette POS. Donc à partir de votre exemple:" ".join([wnl.lemmatize(i, pos=VERB) for i in sent.split()])
donne'cat run run cactus cactuses cacti community communities'
.pos=NOUN
? BTW: Long time no see, j'espère que nous nous rencontrerons bientôt en conférence =)pos=VERB
vous ne faites de la lemmatisation que sur les verbes. Les noms restent les mêmes. Je devais juste écrire une partie de mon propre code pour pivoter autour des balises Penn Treebank POS pour appliquer la lemmatisation correcte à chaque jeton. En outre,WordNetLemmatizer
pue la lemmatisation du tokenizer par défaut de nltk. Donc, des exemples commedoes n't
ne lemmatisent pasdo not
.port.stem("this")
produitthi
etport.stem("was")
wa
, même lorsque la bonne position est fournie pour chacun.La page officielle de Martin Porter contient un Porter Stemmer en PHP ainsi que d' autres langues .
Si vous êtes vraiment sérieux au sujet d'un bon dérivation, bien que vous deviez commencer par quelque chose comme l'algorithme Porter, affinez-le en ajoutant des règles pour corriger les cas incorrects communs à votre ensemble de données, puis enfin ajouter de nombreuses exceptions aux règles. . Cela peut être facilement implémenté avec des paires clé / valeur (dbm / hash / dictionnaires) où la clé est le mot à rechercher et la valeur est le mot dérivé pour remplacer l'original. Un moteur de recherche commercial sur lequel j'ai travaillé une fois s'est retrouvé avec 800 exceptions à un algorithme de Porter modifié.
la source
http://wordnet.princeton.edu/man/morph.3WN
Pour beaucoup de mes projets, je préfère le lemmatiseur WordNet basé sur le lexique à la racine porteuse plus agressive.
http://wordnet.princeton.edu/links#PHP a un lien vers une interface PHP vers les API WN.
la source
Sur la base de diverses réponses sur Stack Overflow et des blogs que j'ai rencontrés, c'est la méthode que j'utilise, et elle semble assez bien renvoyer de vrais mots. L'idée est de diviser le texte entrant en un tableau de mots (utilisez la méthode de votre choix), puis de trouver les parties du discours (POS) pour ces mots et de l'utiliser pour aider à résumer et à lemmatiser les mots.
Votre échantillon ci-dessus ne fonctionne pas très bien, car le point de vente ne peut pas être déterminé. Cependant, si nous utilisons une vraie phrase, les choses fonctionnent beaucoup mieux.
la source
Regardez dans WordNet, une grande base de données lexicale pour la langue anglaise:
http://wordnet.princeton.edu/
Il existe des API pour y accéder en plusieurs langues.
la source
Cela semble intéressant: MIT Java WordnetStemmer: http://projects.csail.mit.edu/jwi/api/edu/mit/jwi/morph/WordnetStemmer.html
la source
Jetez un œil à LemmaGen - bibliothèque open source écrite en C # 3.0.
Résultats pour vos mots de test ( http://lemmatise.ijs.si/Services )
la source
Les paquets de python top (sans ordre spécifique) pour lemmatisation sont:
spacy
,nltk
,gensim
,pattern
,CoreNLP
etTextBlob
. Je préfère l'implémentation de spaCy et gensim (basée sur un modèle) car ils identifient la balise POS du mot et attribuent automatiquement le lemme approprié. Le donne des lemmes plus pertinents, en gardant le sens intact.Si vous prévoyez d'utiliser nltk ou TextBlob, vous devez prendre soin de trouver la bonne balise POS manuellement et de trouver le bon lemme.
Exemple de lemmatisation avec spaCy:
Exemple de lemmatisation avec Gensim:
Les exemples ci-dessus ont été empruntés à cette page de lemmatisation .
la source
Faites une recherche pour Lucene, je ne sais pas s'il y a un port PHP mais je sais que Lucene est disponible pour de nombreuses plates-formes. Lucene est une bibliothèque d'indexation et de recherche OSS (d'Apache). Naturellement, cela et les extras de la communauté peuvent avoir quelque chose d'intéressant à regarder. À tout le moins, vous pouvez apprendre comment cela se fait dans une langue afin de pouvoir traduire «l'idée» en PHP
la source
Si je peux citer ma réponse à la question mentionnée par StompChicken:
Comme ils n'ont aucune compréhension de la langue et ne fonctionnent pas à partir d'un dictionnaire de termes, ils n'ont aucun moyen de reconnaître et de répondre de manière appropriée aux cas irréguliers, tels que «courir» / «courir».
Si vous avez besoin de gérer des cas irréguliers, vous devrez soit choisir une approche différente, soit augmenter votre tige avec votre propre dictionnaire personnalisé de corrections à exécuter une fois que la tige a fait son travail.
la source
La version la plus récente du stemmer en NLTK est Snowball.
Vous pouvez trouver des exemples d'utilisation ici:
http://nltk.googlecode.com/svn/trunk/doc/api/nltk.stem.snowball2-pysrc.html#demo
la source
Vous pouvez utiliser la tige Morpha. UW a téléchargé morpha stemmer sur Maven central si vous prévoyez de l'utiliser à partir d'une application Java. Il y a un wrapper qui le rend beaucoup plus facile à utiliser. Il vous suffit de l'ajouter en tant que dépendance et d'utiliser la
edu.washington.cs.knowitall.morpha.MorphaStemmer
classe. Les instances sont threadsafe (le JFlex d'origine avait des champs de classe pour les variables locales inutilement). Instanciez une classe et exécutezmorpha
et le mot que vous voulez dériver.la source
.Net lucene a une tige de porteur intégrée. Vous pouvez essayer ça. Mais notez que la racine porteuse ne tient pas compte du contexte des mots lors de la dérivation du lemme. (Parcourez l'algorithme et sa mise en œuvre et vous verrez comment cela fonctionne)
la source
Martin Porter a écrit Snowball (un langage pour les algorithmes dérivés) et réécrit le "English Stemmer" dans Snowball. Il existe un Stemmer anglais pour C et Java.
Il déclare explicitement que le Porter Stemmer n'a été réimplémenté que pour des raisons historiques, donc tester l'exactitude des racines contre le Porter Stemmer vous donnera des résultats que vous (devriez) déjà savoir.
Le Dr Porter suggère d'utiliser les souches anglais ou Porter2 au lieu de la tige Porter. Le stemmer anglais est ce qui est réellement utilisé dans le site de démonstration, comme @StompChicken a répondu plus tôt.
la source
En Java, j'utilise tartargus-snowball pour dériver les mots
Maven:
Exemple de code:
la source
Essayez celui-ci ici: http://www.twinword.com/lemmatizer.php
J'ai entré votre requête dans la démo
"cats running ran cactus cactuses cacti community communities"
et j'ai obtenu["cat", "running", "run", "cactus", "cactus", "cactus", "community", "community"]
le drapeau facultatifALL_TOKENS
.Exemple de code
Il s'agit d'une API afin que vous puissiez vous y connecter à partir de n'importe quel environnement. Voici à quoi peut ressembler l'appel PHP REST.
la source
Je recommande vivement d'utiliser Spacy (analyse et marquage de texte de base) et Textacy (traitement de texte de plus haut niveau construit sur Spacy).
Les mots lemmatisés sont disponibles par défaut dans Spacy en tant que jetons
.lemma_
qu'attribut et le texte peut être lemmatisé tout en effectuant de nombreux autres prétraitements de texte avec textacy. Par exemple, lors de la création d'un sac de termes ou de mots ou généralement juste avant d'effectuer un traitement qui le nécessite.Je vous encourage à vérifier les deux avant d'écrire un code, car cela peut vous faire gagner beaucoup de temps!
la source
la source