web-dev-qa-db-fra.com

Stemming algorithme qui produit des mots réels

Je dois prendre un paragraphe de texte et extraire une liste des "balises". La plupart de cela est assez simple. Cependant, j'ai besoin d'aide d'aide désormais la liste des mots qui en résulte pour éviter les doublons. Exemple: communauté/communautés

J'ai utilisé une implémentation d'algorithme de Porter Stemmer (j'écris dans PHP à la manière):

http://tartarus.org/~martin/porterterter/php.txt

Cela fonctionne, jusqu'à un point, mais ne retourne pas "de vrais" mots. L'exemple ci-dessus est tiint sur "commun".

J'ai essayé "Boule de neige" (suggéré dans un autre fil de débordement de pile).

http://snowbball.tartarus.org/demo.php

Pour mon exemple (communauté/communautés), bouches de neige à "Communiti".

Question

Y a-t-il d'autres algorithmes stemming qui feront cela? Quelqu'un d'autre a-t-il résolu ce problème?

Ma pensée actuelle est que je pourrais utiliser un algorithme stemming pour éviter les doublons, puis choisir le mot le plus court que je rencontre pour être le mot réel à afficher.

36
Dave

Le problème de base ici est que les algorithmes stemming fonctionnent sur une base phonétique Purement basé sur les règles d'orthographe de la langue sans compréhension réelle de la langue avec laquelle ils travaillent. Pour produire des mots réels, vous devrez probablement fusionner la sortie de STEMMER avec une forme de fonction de recherche pour convertir les tiges à des mots réels. Je peux fondamentalement voir deux moyens potentiels de faire ceci:

  1. Localisez ou créez un grand dictionnaire qui mappe chaque tige possible à un mot réel. (E.G., Communiti -> Communauté)
  2. Créer une fonction qui compare chaque tige sur une liste des mots qui ont été réduits à cette tige et tente de déterminer qui est le plus similaire. (par exemple, comparer "Communiti" contre "communauté" et "communautés" de manière à ce que "communauté" soit reconnue comme une option la plus similaire)

Personnellement, je pense que la façon dont je le ferais serait une forme dynamique de n ° 1, construisant une base de données de dictionnaire personnalisée en enregistrant chaque mot examiné avec ce qu'il a décollé et en supposant que le mot le plus courant soit celui qui devrait être celui qui devrait être utilisé. (par exemple, si mon corps de texte source utilise des "communautés" plus souvent que "communauté", puis map communiti -> communautés.) Une approche fondée sur le dictionnaire sera plus précise en général et la construction basée sur l'entrée Stemmer fournira des résultats Personnalisé à vos textes, l'inconvénient principal étant l'espace requis, ce qui n'est généralement pas un problème de nos jours.

16
Dave Sherohman

Si je comprends bien, alors ce dont vous avez besoin n'est pas un timmer mais un lemmatiser. Lemmatiser est un outil avec des connaissances sur les fins telles que - ies , - Ed , etc., et des formes de mots exceptionnelles telles que écrites , etc. Lemmatiser mapper le formal Word d'entrée à son lemme, garantissant être un mot "réel".

Il y a beaucoup de Lemmatimiseurs pour l'anglais, je n'ai utilisé que morpha cependant. Morpha est juste un gros fichier lex que vous pouvez compiler dans un exécutable. Exemple d'utilisation:

$ cat test.txt 
Community
Communities
$ cat test.txt | ./morpha -uc
Community
Community

Vous pouvez obtenir Morpha de http://www.informatique.sussex.ac.uk/research/groups/nlp/carroll/morph.html

50
Kaarel

Hey, je ne sais pas si c'est peut-être trop tard, mais il n'y a qu'un seul PHP timming script qui produit des mots réels: http://phpmorphy.sourceforge.net/ - Il m'a pris des âges pour le trouver. Tous les autres stemmers doivent être compilés et même après qu'ils ne fonctionnent que selon l'algorithme de porter, qui produit des tiges, pas des lemmas (c'est-à-dire communauté = communiti). Phpmorphy One fonctionne parfaitement, il est facile d'installer et d'initialiser, et dispose de dictionnaires anglais, russe, allemand, ukrainien et estonien. Il est également livré avec un script que vous pouvez utiliser pour compiler d'autres dictionnaires. La documentation est en russe, mais mettez-la via Google Translate et elle devrait être facile.

14