Algorithmes pour détecter des phrases et des mots-clés à partir de textes

j'ai environ 100 mégaoctets de texte, sans aucun balisage, divisé à environ 10.000 entrées. Je voudrais générer automatiquement une liste de' tags'. Le problème est qu'il y a des groupes de mots (c.-à-d. des phrases) qui n'ont de sens que lorsqu'ils sont regroupés.

Si je compte le nombre de mots, je reçois un grand nombre de mots communs (est, les, pour, en, am, etc.). J'ai compté les mots et le nombre de mots qui sont avant et après elle, mais maintenant je Je ne sais vraiment pas quoi faire ensuite les informations relatives aux phrases de 2 et 3 mots sont présentes, mais comment puis-je extraire ces données?

41
demandé sur mjv 2009-10-29 16:11:07

5 réponses

avant toute chose, essayer de préserver l'information sur les" limites " qui vient dans le texte d'entrée.

(si une telle information n'a pas facilement été perdue, votre question implique que peut-être la tokenization a été facilement fait)

Au cours du processus de tokenisation( dans ce cas-ci l'analyse de mots), recherchez les motifs qui peuvent définir les limites d'expression (tels que la ponctuation, en particulier les périodes, et aussi séparation LF/CR multiple, utilisez ceux-ci. Aussi des mots comme "le", peuvent souvent être utilisées comme limites. De telles limites d'expression sont typiquement "négatives", en ce sens qu'elles séparent deux instances token qui sont sûres de et non être inclus dans la même expression. Quelques limites positives sont des citations, en particulier des doubles citations. Ce type d'information peut être utile de filtrer certains des n-grammes (voir le paragraphe suivant). Aussi des séquences de mots comme "par exemple" ou "au lieu de" de " ou "need to" peut aussi être utilisé comme limite d'expression (mais l'utilisation de telles informations est en passe d'utiliser des "prieurs" que je discute plus tard).

sans utiliser les données externes (autres que le texte d'entrée), vous pouvez avoir un succès relatif avec cela en lançant des statistiques sur les digrammes et trigrammes du texte (séquence de 2 et 3 mots consécutifs). Alors [la plupart] les séquences avec un nombre significatif ( * ) d'instances seront probablement le type d '"expression / phrases" que vous recherchez.

Cette méthode quelque peu grossière donnera quelques faux positifs, mais dans l'ensemble peut être réalisable. Ayant filtré les N-grammes connus pour franchir les "limites" comme indiqué dans le premier paragraphe, peut aider de manière significative parce que dans les langues naturelles fin de phrase et début de phrase ont tendance à tirer d'un sous-ensemble limité de l'espace de message et donc produire des combinaisons de jeton qui peuvent sembler être statistiquement bien représentée, mais qui ne sont généralement pas sémantiquement liées.

Better methods (peut-être plus coûteux, du point de vue du traitement et de la conception/de l'investissement), fera appel à des "prieurs" supplémentaires pertinents pour le domaine et/ou les langues nationales du texte d'entrée.

  • POS (Part-Of-Speech) le marquage est très utile, de plusieurs façons (fournit d'autres, plus les limites de l'expression objective, ainsi que les classes de mots "noise", par exemple tous les articles, même lorsqu'ils sont utilisés dans le contexte des entités sont généralement de petite taille dans les nuages d'étiquettes tels que L'OP veut produire.
  • dictionnaires, lexiques et similaires peuvent aussi être très utiles. En particulier, ceux qui identifient " entités "(alias instances dans WordNet lingo) et leurs formes alternatives. Les entités sont très importants pour la balise les nuages (bien qu'ils ne soient pas la seule classe de mots qu'ils contiennent), et en les identifiant, il est également possible de les normaliser (les nombreuses expressions différentes qui peuvent être utilisées pour dire,"sénateur T. Kennedy"), donc d'éliminer les doublons, mais aussi d'augmenter la fréquence des entités sous-jacentes.
  • si le corpus est structuré comme une collection de documents, il peut être utile d'utiliser diverses astuces liées au TF (terme fréquence) et IDF (inverse document Frequency).)

[Désolé, je dois y aller, pour le moment (en plus souhaite plus en détail de vos objectifs spécifiques, etc.). Je vais essayer de fournir plus de détails et de points plus tard]

[BTW, je veux brancher ici Jonathan Feinberg et Dervin Thunk réponses à partir de ce post, car ils fournissent d'excellents pointeurs, en termes de méthodes et d'outils pour la nature de la tâche à portée de main. En particulier, NTLK et Python-at-large fournissent un excellent cadre pour l'expérimentation]

34
répondu mjv 2009-10-29 17:25:20

je commencerais par un chapitre merveilleux, par Peter Norvig , dans le livre D'O'Reilly Beautiful Data . Il fournit les données ngram dont vous aurez besoin, ainsi que le beau code Python (qui peut résoudre vos problèmes tels quels, ou avec quelques modifications) sur son site web personnel .

11
répondu Jonathan Feinberg 2009-10-29 13:20:29

on dirait que vous cherchez collocation extraction . Manning et Schütze consacrer un chapitre au sujet, en expliquant et en évaluant les "formules proposées" mentionnées dans L'article Wikipédia auquel j'ai lié.

Je ne peux pas faire entrer tout le chapitre dans cette réponse; j'espère que certains de leurs liens vous aideront. ( NSP sonne particulièrement pertinent.) nltk dispose également d'un module de collocations , non mentionné par Manning et Schütze puisque leur livre est antérieur.

les autres réponses publiées à ce jour traitent du traitement du langage statistique et des N-grammes de façon plus générale; les collocations sont un sous-domaine spécifique.

8
répondu Darius Bacon 2009-10-29 18:00:53

Faire une matrice pour les mots. Ensuite, s'il y a deux mots consécutifs, ajoutez-en un à la cellule appropriée.

For example you have this sentence.

mat['for']['example'] ++;
mat['example']['you'] ++;
mat['you']['have'] ++;
mat['have']['this'] ++;
mat['this']['sentence'] ++;

cela vous donnera des valeurs pour deux mots consécutifs. Vous pouvez faire ce mot trois mots aussi. Attention, cela nécessite de la mémoire O(N^3).

vous pouvez également utiliser un tas pour stocker les données comme:

heap['for example']++;
heap['example you']++;
0
répondu Egon 2009-10-29 13:27:51

Une façon serait de construire vous-même un automate. très probablement un automate fini non déterministe (NFA). ADN

une autre façon plus simple serait de créer un fichier qui contient les mots et/ou les groupes de mots que vous voulez ignorer, trouver, comparer, etc. et les stocker dans la mémoire quand le programme commence et alors vous pouvez comparer le fichier que vous parsez avec les groupes mot/mot qui sont contenus dans le fichier.

0
répondu ChadNC 2009-10-29 15:56:03