web-dev-qa-db-fra.com

Algorithmes pour détecter des phrases et des mots clés à partir du texte

J'ai environ 100 mégaoctets de texte, sans aucun balisage, divisé en environ 10 000 entrées. Je voudrais générer automatiquement une liste de "balises". Le problème est qu'il existe des groupes de mots (c'est-à-dire des phrases) qui n'ont de sens que lorsqu'ils sont regroupés.

Si je compte juste les mots, j'obtiens un grand nombre de mots vraiment communs (est, le, pour, dans, suis, etc.). J'ai compté les mots et le nombre d'autres mots avant et après, mais maintenant je ne peux vraiment pas savoir quoi faire ensuite Les informations relatives aux phrases de 2 et 3 mots sont présentes, mais comment puis-je extraire ces données?

43
Kimvais

Avant tout, essayez de conserver les informations sur les "limites" qui se trouvent dans le texte d'entrée.
(si de telles informations n'ont pas été facilement perdues, votre question implique que la tokenisation a peut-être été facilement effectuée)
Pendant le processus de tokenisation (analyse de mots, dans ce cas), recherchez les modèles qui peuvent définir les limites d'expression (comme la ponctuation, en particulier des périodes, ainsi que de multiples séparations LF/CR, les utilisent. Des mots comme "le", peuvent souvent être utilisés comme frontières. De telles frontières d'expression sont généralement "négatives", dans le sens où elles séparent deux instances de jeton qui sont sûres de = pas être inclus dans la même expression. Quelques limites positives sont les guillemets, en particulier les guillemets doubles. Ce type d'informations peut être utile pour filtrer certains des n-grammes (voir le paragraphe suivant). Les séquences de mots telles que "par exemple" ou "à la place de" ou "besoin de" peuvent également être utilisées comme limites d'expression (mais l'utilisation de ces informations revient à utiliser des "priors" dont je parlerai plus tard).

Sans utiliser de données externes (autre que le texte d'entrée), vous pouvez avoir un succès relatif avec cela en exécutant 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/de phrases" que vous recherchez.
Cette méthode quelque peu grossière donnera quelques faux positifs, mais dans l'ensemble peut être réalisable. Après avoir filtré les n-grammes connus pour traverser les "frontières" comme indiqué dans le premier paragraphe, cela peut aider considérablement car dans les langues naturelles, la fin et le début de la phrase ont tendance à puiser dans un sous-ensemble limité de l'espace de message et donc à produire des combinaisons de jetons qui peuvent semblent être statistiquement bien représentés, mais qui ne sont généralement pas liés sémantiquement.

De meilleures méthodes (éventuellement plus coûteuses, en termes de traitement et de conception/investissement), rendront l'utilisation de "priors" supplémentaires pertinents pour le domaine et/ou les langues nationales du texte saisi.

  • Balisage POS (Part-Of-Speech) est très utile, de plusieurs manières (fournit des limites d'expression supplémentaires et plus objectives, et aussi les classes de mots "bruit", par exemple tous les articles, même lorsqu'ils sont utilisés dans le contexte d'entités sont généralement de peu dans les nuages ​​d'étiquettes que l'OP veut produire.
  • Les dictionnaires, les lexiques et similaires peuvent également être très utiles. En particulier, ceux qui identifient les "entités" (alias instances dans WordNet jargon) et leurs formes alternatives. Les entités sont très importantes pour les nuages ​​de tags (bien qu'elles ne soient pas la seule classe de mots qu'on y trouve), et en les identifiant, il est également possible de les normaliser (les nombreuses expressions différentes qui peuvent être utilisées pour dire, par exemple: "le sénateur T. Kennedy "), donc éliminer les doublons, mais aussi 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 (Term Frequency) et à l'IDF (Inverse Document Frequency)

[Désolé, je dois y aller, pour le moment (et j'aimerais plus de détails sur vos objectifs spécifiques, etc.). Je vais essayer de fournir plus de détails et de pointes plus tard]

[BTW, je veux brancher ici les réponses de Jonathan Feinberg et Dervin Thunk de ce post, car elles fournissent d'excellents pointeurs, en termes de méthodes et d'outils pour la genre de tâche à accomplir. En particulier, [~ # ~] ntlk [~ # ~] et Python en général fournit un excellent cadre pour l'expérimentation]

34
mjv

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

11
Jonathan Feinberg

Il semble que vous recherchiez extraction de collocation . Manning et Schütze consacrer un chapitre au sujet, expliquant et évaluant les "formules proposées" mentionnées dans l'article Wikipedia auquel j'ai lié.

Je ne peux pas intégrer tout le chapitre dans cette réponse; j'espère que certains leurs liens vous aideront. ( NSP semble particulièrement pertinent.) nltk a aussi module de collocations , non mentionné par Manning et Schütze puisque leur livre le précède.

Les autres réponses publiées jusqu'à présent concernent le traitement statistique du langage et les n-grammes plus généralement; les collocations sont un sous-thème spécifique.

8
Darius Bacon

Faites une matrice de 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 également faire ce mot avec trois mots. 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
Egon

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

Un autre moyen plus simple serait de créer un fichier qui contient les mots et/ou groupes de mots que vous souhaitez ignorer, rechercher, comparer, etc. et les stocker en mémoire au démarrage du programme, puis vous pouvez comparer le fichier que vous êtes analyse avec les mots/groupes de mots contenus dans le fichier.

0
ChadNC