Algorithmes pour détecter les phrases et les mots-clés du texte
-
10-07-2019 - |
Question
J'ai environ 100 mégaoctets de texte, sans aucune majoration, répartis en environ 10 000 entrées. Je souhaite 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 s’ils sont regroupés.
Si je ne compte que les mots, j’obtiens un grand nombre de mots très communs (c'est, le, pour, dans, je suis, etc.). J'ai compté les mots et le nombre d'autres mots qui sont avant et après, mais maintenant je ne peux vraiment pas savoir quoi faire ensuite. Les informations relatives aux expressions de 2 et 3 mots sont présentes, mais comment puis-je extraire ces données?
La solution
Avant tout, essayez de conserver les informations sur les "limites". qui vient dans le texte de saisie.
(Si ces informations ne sont pas facilement perdues, votre question implique que peut-être la création de jetons a-t-elle été facilement faite)
Au cours du processus de création de jetons (analyse de mots, dans ce cas), recherchez des modèles susceptibles de définir des limites d’expression (tels que la ponctuation, en particulier les points, ainsi que la séparation multiple LF / CR, utilisez-les également. "le", peut souvent être utilisé en tant que frontières. De telles frontières d'expression sont typiquement "négatives", dans le sens où elles séparent deux instances de jeton qui ne manqueront pas d'être dans la même expression. Quelques limites positives sont des guillemets, en particulier des 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 "au lieu de" ; ou "besoin de" peuvent également être utilisés comme limites d’expression (mais utiliser de telles informations revient à utiliser "priors" dont je parlerai plus tard).
Sans utiliser de données externes (autres que le texte saisi), vous pouvez obtenir un succès relatif en exécutant des statistiques sur les digrammes et les trigrammes du texte (séquence de 2 et 3 mots consécutifs). Ensuite, la plupart des séquences avec un nombre significatif (*) d'instances seront probablement du type "expression / phrases". vous recherchez.
Cette méthode quelque peu grossière donnera quelques faux positifs, mais dans l’ensemble, elle peut être exploitable. Après avoir filtré les n-grammes connus pour franchir les "limites" comme indiqué dans le premier paragraphe, peut aider de manière significative, car dans les langues naturelles, les fins de phrase et les débuts de phrase ont tendance à s’inspirer d’un sous-ensemble limité de l’espace de message et produisent ainsi des combinaisons de jetons pouvant sembler statistiquement bien représentés, mais qui en général ne le sont pas. sémantiquement lié.
De meilleures méthodes (éventuellement plus onéreuses en termes de traitement et de conception / investissement) rendront l'utilisation de "priors" supplémentaires. correspondant au domaine et / ou aux langues nationales du texte saisi.
- Marquage de la partie de la parole a> est très utile, à plusieurs égards (fournit des limites d’expression supplémentaires, plus objectives, ainsi que des classes de mots "bruit", par exemple tous les articles, même s’ils sont utilisés dans le contexte des entités OP veut produire. Les
- dictionnaires, lexiques , etc., peuvent également être très utiles. En particulier, ceux qui identifient des "entités". (alias instances dans le jargon WordNet ) et leurs formulaires alternatifs. Les entités sont très importantes pour les nuages ??de balises (bien qu’elles ne constituent pas la seule classe de mots qu’elles contiennent) et, en les identifiant, il est également possible de les normaliser (les nombreuses expressions différentes pouvant être utilisées, par exemple, "Senator T . Kennedy "), éliminent donc les doublons, mais augmentent également 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 (fréquence du terme) et à la FID (fréquence de document inverse)
[Désolé, je dois y aller pour le moment (vous voudriez plus de détails sur vos objectifs spécifiques, etc.). Je vais essayer de fournir plus de détails et de points plus tard]
[BTW, je souhaite brancher ici les réponses de Jonathan Feinberg et Dervin Thunk de ce message, car elles fournissent d'excellents indicateurs, en termes de méthodes et d'outils pour le type de tâches à accomplir. En particulier, NTLK et Python-at-large constituent un excellent cadre d'expérimentation]
Autres conseils
Je commencerais par un chapitre merveilleux, par Peter Norvig , dans le livre O'Reilly Beautiful Data . Il fournit les données ngram dont vous avez besoin, ainsi que du beau code Python (qui peut résoudre vos problèmes tels quels, ou avec quelques modifications) sur son site Web personnel .
Il semble que vous recherchiez la extraction de la collocation . Manning et Scheme # 252; tze consacrent un chapitre , expliquant et évaluant les" formules proposées "mentionnées dans l'article de Wikipédia auquel je me suis associé.
Je ne peux pas insérer tout le chapitre dans cette réponse; Espérons que certains de leurs liens pourront vous aider. ( NSP semble particulièrement approprié.) nltk a un module de collocations également, non mentionné par Manning et Sch & # 252; depuis leur livre est antérieur à cela.
Les autres réponses publiées à ce jour concernent le traitement statistique du langage et les n-grammes en général; les collocations sont une sous-rubrique spécifique.
Faites 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 O (n ^ 3) mémoire.
Vous pouvez également utiliser un segment de mémoire pour stocker les données telles que:
heap['for example']++;
heap['example you']++;
Une solution serait de vous construire un automate. très probablement un automate fini non déterministe (NFA). NFA
Une autre méthode plus simple consiste à créer un fichier contenant les mots et / ou groupes de mots que vous souhaitez ignorer, rechercher, comparer, etc., puis les stocker en mémoire au démarrage du programme. Vous pourrez ensuite comparer fichier que vous analysez avec le mot / les groupes de mots contenus dans le fichier.