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?

Était-ce utile?

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.

[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.

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