Question

Je dois prendre un paragraphe de texte et en extraire une liste de "balises". La plupart de cela est assez simple. Cependant, j’ai besoin d’aide pour réduire la liste de mots obtenue afin d’éviter les doublons. Exemple: Communauté / Communautés

J'ai utilisé une implémentation de l'algorithme de Porter Stemmer (j'écris en PHP d'ailleurs):

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

Cela fonctionne, jusqu'à un certain point, mais ne renvoie pas "réel". mots. L'exemple ci-dessus est associé à "commun".

J'ai déjà essayé "Snowball". (suggéré dans un autre thread de débordement de pile).

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

Pour mon exemple (communauté / communautés), Snowball découle de "communiti".

Question

Existe-t-il d'autres algorithmes d'extraction qui le feront? Quelqu'un d'autre a-t-il résolu ce problème?

Je pense actuellement que je pourrais utiliser un algorithme d'extraction pour éviter les doublons, puis choisir le mot le plus court que je rencontre comme mot à afficher.

Était-ce utile?

La solution

Le problème fondamental ici est que les algorithmes d'extraction fonctionnent sur une base phonétique uniquement sur la base des 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 du stemmer avec une forme de fonction de recherche afin de reconvertir les tiges en mots réels. Je peux essentiellement voir deux façons possibles de le faire:

  1. Recherchez ou créez un grand dictionnaire qui mappe chaque racine possible en un mot réel. (par exemple, communauté - > communauté)
  2. Créez une fonction qui compare chaque tige à une liste de mots réduits à cette tige et tente de déterminer lequel est le plus similaire. (par exemple, comparer "communauté" avec "communauté" et "communautés" de manière à ce que "communauté" soit reconnu comme l'option plus similaire)

Personnellement, je pense que la façon dont je le ferais serait une forme dynamique de # 1, construisant une base de données de dictionnaires personnalisée en enregistrant chaque mot examiné, ainsi que ses conséquences, et en supposant que le mot le plus courant est celui cela devrait être utilisé. (Par exemple, si mon corps de texte source utilise "des communautés" plus souvent que "une communauté", alors mapper des communautés - > des communautés.) Une approche basée sur un dictionnaire sera en général plus précise et sera construite en fonction de la contribution de stemmer fournira des résultats personnalisés pour vos textes, le principal inconvénient étant l'espace requis, ce qui n'est généralement pas un problème de nos jours.

Autres conseils

Si je comprends bien, ce dont vous avez besoin n’est pas un stemmer, mais un lemmatiseur. Lemmatizer est un outil permettant de connaître les terminaisons telles que -ies , -ed , etc., et des formes de mots exceptionnelles telles que écrites , etc. Lemmatizer saisissez un mot dans son lemme, ce qui garantit un "réel" mot.

Il y a beaucoup de lemmatiseurs pour l'anglais, cependant, je n'ai utilisé que morpha . 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 le morpha à partir de http: // www. .informatics.sussex.ac.uk / research / groups / nlp / carroll / morph.html

Hé, je ne sais pas si c'est peut-être trop tard, mais il n'y a qu'un seul script PHP qui produit de vrais mots: http: // phpmorphy .sourceforge.net / & # 8211; & nbsp; cela m'a pris énormément de temps pour le trouver. Tous les autres stemmers doivent être compilés et même après cela, ils ne fonctionnent que selon l'algorithme de Porter, qui produit des tiges, et non des lemmes (c'est-à-dire communauté = communauté). PhpMorphy one fonctionne parfaitement bien, il est facile à installer et à initialiser et comprend des dictionnaires anglais, russes, allemands, ukrainiens et estoniens. Il vient également avec un script que vous pouvez utiliser pour compiler d'autres dictionnaires. La documentation est en russe, mais transmettez-la à Google translate et cela devrait être facile.

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