2008-10-20 17 views
21

Je travaille sur un projet où j'ai besoin d'analyser une page de texte et des collections de pages de texte pour déterminer les mots dominants. J'aimerais savoir s'il y a une bibliothèque (je préfère C# ou java) qui s'occupera de la lourde tâche pour moi. Sinon, existe-t-il un algorithme ou un multiple qui permettrait d'atteindre mes objectifs ci-dessous? Ce que je veux faire est similaire aux nuages ​​de mots construits à partir d'un flux url ou rss que vous trouvez sur le web, sauf que je ne veux pas de visualisation. Ils sont utilisés tout le temps pour analyser les discours des candidats à la présidence pour voir quel est le thème ou les mots les plus utilisés. La complication, c'est que je dois faire cela sur des milliers de documents courts, puis des collections ou des catégories de ces documents. Mon plan initial était d'analyser le document, puis de filtrer les mots communs - de, le, il, elle, etc. Ensuite compter le nombre de fois que les mots restants apparaissent dans le texte (et la collection/catégorie globale).Algorithmes ou bibliothèques pour l'analyse textuelle, en particulier: mots dominants, phrases à travers le texte et collection de texte

Le problème est que dans l'avenir, je voudrais gérer souches, formes plurielles, etc. Je voudrais aussi voir s'il existe un moyen d'identifier les phrases importantes. (Au lieu d'un compte d'un mot, le compte d'une phrase étant de 2 ou 3 mots ensemble)

Tout conseil sur une stratégie, des bibliothèques ou des algorithmes qui seraient utiles est apprécié.

Répondre

17

Une option pour ce que vous faites est la fréquence de terme pour inverser la fréquence du document, ou tf-idf. Les termes les plus forts auront la pondération la plus élevée dans ce calcul. Vérifiez si dehors ici: http://en.wikipedia.org/wiki/Tf-idf

Une autre option est d'utiliser quelque chose comme un classifieur Bayes naïf en utilisant des mots comme caractéristiques et de trouver quelles sont les caractéristiques les plus fortes dans le texte pour déterminer la classe du document. Cela fonctionnerait de manière similaire avec un classificateur entropique maximum.

En ce qui concerne les outils pour ce faire, le meilleur outil pour commencer serait NLTK, une bibliothèque Python avec une documentation complète et tutoriels: http://nltk.sourceforge.net/

Pour Java, essayez OpenNLP: http://opennlp.sourceforge.net/

Pour l'expression Quoi qu'il en soit, considérez la deuxième option que j'ai proposée en utilisant bigrams et trigrams en tant que caractéristiques, ou même en tant que termes dans tf-idf.

Bonne chance!

5

Pour ajouter à la réponse de Robert Elwell:

  • éraflage et l'effondrement des formes de mots. Une méthode simple en anglais est d'utiliser Porter Stemming sur les formes de mot de la partie inférieure. Un terme pour les «mots communs» est «mot d'arrêt» ou «liste d'arrêt»
  • La lecture du livre de NLTK comme suggéré expliquera bien beaucoup de ces problèmes d'introduction. Certains des problèmes que vous avez à résoudre sont l'analyse des phrases (de sorte que vos bigrammes et phrases n-gramme ne franchissent pas les limites de la phrase), la division des phrases en jetons, et décider quoi faire sur les formes possessives par exemple.

Aucune de ces choses n'est coupée à blanc, et aucune n'a de "bonnes réponses". Voir aussi les balises SO "nlp" et "natural-language".

Bonne chance! C'est un projet non trivial.

+0

J'ai ajouté l'étiquette «langue naturelle» à la publication. –

1

Vous pouvez utiliser le service d'indexation Windows fourni avec le kit de développement Windows Platform SDK. Ou, lisez simplement l'introduction suivante pour avoir un aperçu de la PNL.

http://msdn.microsoft.com/en-us/library/ms693179(VS.85).aspx http://i.msdn.microsoft.com/ms693179.wbr-index-create(en-us,VS.85).gif

http://i.msdn.microsoft.com/ms693179.wbr-query-process(en-us,VS.85).gif

+0

Cela ressemble à un très bon paquet. Nice of MS à le donner. –

1

Alrighty. Vous avez donc un document contenant du texte et une collection de documents (un corpus). Il y a un certain nombre de façons de le faire.

Je suggère d'utiliser le moteur Lucene (Java) pour indexer vos documents. Lucene supporte une structure de données (Index) qui contient un certain nombre de documents. Un document lui-même est une structure de données qui peut contenir des «champs» - disons, auteur, titre, texte, etc. Vous pouvez choisir quels champs sont indexés et lesquels ne le sont pas.

L'ajout de documents à un index est trivial. Lucene est également construit pour la vitesse, et peut évoluer superbement.

Ensuite, vous voulez comprendre les termes et les fréquences. Puisque Lucene a déjà calculé cela pour vous pendant le processus d'indexation, vous pouvez utiliser la fonction docFreq et créer votre propre fonction de fréquence terminale, ou utiliser la fonction getTermFreqVectors de la classe IndexReader pour obtenir les termes (et leurs fréquences).

Maintenant, c'est à vous de décider comment le trier et quels critères vous voulez utiliser pour filtrer les mots que vous voulez. Pour comprendre les relations, vous pouvez utiliser une API Java dans la bibliothèque open source wordnet. Pour étouffer les mots, utilisez la classe PorterStemFilter de Lucene. La partie importance de la phrase est plus compliquée, mais une fois que vous avez atteint ce stade, vous pouvez rechercher des astuces pour intégrer la recherche n-gramme dans Lucene (hint).

Bonne chance!

0

Vérifier le modèle MapReduce pour obtenir le nombre de mots, puis déduire la fréquence comme décrit dans tf-idf

Hadoop est un framework MapReduce apache qui peut être utilisé pour la tâche de soulever des charges lourdes de mot compter sur de nombreux documents. http://hadoop.apache.org/common/docs/current/mapred_tutorial.html

Vous ne pouvez pas obtenir un seul framework qui résoudrait tout ce que vous voulez. Vous devez choisir une bonne combinaison de concepts et de cadre pour obtenir ce que vous voulez.

0

Je voudrais également voir s'il y a un moyen d'identifier les phrases importantes. (Au lieu d'un compte d'un mot, le compte d'une phrase étant de 2-3 mots ensemble)

Cette partie de votre problème s'appelle collocation extraction. (Au moins si vous prenez des «phrases importantes» pour être des phrases qui apparaissent significativement plus souvent que par hasard.) I gave an answer sur another SO question sur ce sous-problème spécifique.

0

Il semble que ce que vous cherchez est ce qu'on appelle un regroupement de documents par sac-de-mots. Vous trouverez des conseils pour cette recherche.