1
votes

Extraction de mots-clés à partir de documents sur la base d'une liste fixe de mots-clés / expressions

J'ai une liste d'environ 100 mots-clés et je dois les rechercher dans un énorme corpus de plus de 0,1 million de documents.

Je ne veux pas de correspondance exacte, par exemple si le mot clé est Growth Fund, j'attends toutes les correspondances telles que les fonds de croissance, les fonds de croissance d'Amérique, etc.

Des suggestions à ce sujet?

J'ai essayé d'utiliser le PhraseMatcher de spacy mais cela donne une ValueError: [T001] Longueur maximale actuellement de 10 pour la correspondance de phrase.

import spacy
from spacy.matcher import PhraseMatcher

full_funds_list_flat = "<list of 100+ Keywords>"


nlp = spacy.load('en_core_web_sm')
keyword_patterns = [nlp(text) for text in full_funds_list_flat]
matcher = PhraseMatcher(nlp.vocab)
matcher.add('KEYWORD', None, *keyword_patterns)


4 commentaires

considérez peut-être que lakh n'est pas un mot de mesure communément connu dans la plupart des pays du monde.


@ChristianSloper my bad, édité


@KeshavKumar Bienvenue. Question interessante. Pouvez-vous montrer ce que vous avez essayé? En outre - il y a quelques concepts qui viennent à l'esprit qui peuvent aider - la lemmatisation, la segmentation des entités nommées et la parallélisation. Les deux premiers sont abordés dans toute bonne introduction à la PNL. Ce dernier n'est que du bon sens pour un corpus volumineux.


@fiacre Merci :) A édité la question avec le code que j'ai essayé. Je lemmatise les jetons avant de les passer à la correspondance des phrases. En ce qui concerne la segmentation des entités nommées, puisque la liste de mots que je dois trouver n'appartient à aucune entité nommée prédéfinie et même il n'est pas possible pour moi de marquer manuellement les données, donc il semble difficile de former un modèle NER personnalisé. Merci beaucoup, veuillez suggérer si quelque chose d'autre vous frappe.


3 Réponses :


1
votes

Je travaille actuellement sur quelque chose d'assez similaire. Nous avons plusieurs options, voici une sélection rapide:

  • Itérer en utilisant "a in b". Bien que très simple, c'est extrêmement puissant, et même si ce n'est pas idéal, s'il s'agit d'une vérification unique pour ces mots-clés, vous pouvez trouver la correspondance la plus partielle (si le pluriel est seulement 's', "match" dans "matches" == Vrai)

  • Stockez votre corpus dans Postgresql et utilisez l'option intégrée de recherche en texte intégral, qui est assez puissante. C'est plus lourd, mais cela vous aidera si vous devez itérer plusieurs fois sur le mot-clé, car vous ne faites la transformation qu'une seule fois. voir: https: // www .compose.com / articles / mastering-postgresql-tools-full-text-search-and-phrase-search /

Comme je ne suis pas un expert, je suis ouvert à toute idée et je sais que ce n'est peut-être pas la meilleure réponse. Mais au moins, vous avez quelque chose à faire.


2 commentaires

Merci. Je vais sûrement essayer la deuxième option et mettre à jour. Dès le premier, ce que j'ai compris, c'est que vous vouliez tokeniser les documents et rechercher chaque token dans la liste? Comme jeton dans la liste. Comme vous l'avez correctement dit, ce sera bien s'il s'agit d'une vérification unique, mais dans mon cas, son processus continu et la vérification de l'itération sur la liste pour chaque jeton coûteront trop cher, je suppose, veuillez me faire part de vos pensées.


Au lieu d'utiliser une base de données à part entière, vous pouvez utiliser le moteur Lucene (qui est disponible en Python via pylucene Il est conçu précisément pour le problème que vous avez sous la main.



0
votes

Je vous recommande d'utiliser la bibliothèque fuzzywuzzy de Python car vous n'avez pas besoin de correspondance exacte, elle utilise l'algorithme de distance de Levenshtein. Ce qui sera plus précis pour trouver des phrases.

lien de référence - https://github.com/seatgeek/fuzzywuzzy


2 commentaires

Je ne recommanderais pas levenshtein - il vous indique combien de lettres à part deux mots sont en termes de caractères remplacés / supprimés / ajoutés - cela ne vous dira pas que deux mots sont des synonymes. Je ne peux pas faire de commentaires sur la bibliothèque Fuzzywuzzy, mais levenshtien n'aide pas avec les synonymes.


La distance de Levenshtein (LD) est une mesure de la similitude entre deux chaînes, comme nous n'avons pas besoin de correspondance exacte des chaînes, nous pouvons trouver le rapport de fuzz en utilisant la bibliothèque fuzzywuzzy.



0
votes

Il existe plusieurs options, je recommanderais d'abord d'utiliser la lemmatisation sur votre corpus. Je ne sais pas avec combien d'entités nommées vous devrez travailler, vous voudrez peut-être envisager une approche spécifique pour elles (la lemmatisation n'y aidera pas - mais comme quelqu'un d'autre l'a mentionné, A dans B pourrait aider, ou vous pourriez ajoutez-les en tant que cas individuels dans SpaCy). Une autre recommandation consiste à utiliser des tuples dans un modèle word2vec (ou autre intégration de texte) et à rechercher les k mots les plus similaires à certains des mots dont vous souhaitez éviter les répétitions, et à les utiliser pour informer les cas que vous souhaitez spécifiquement. enregistrement. Une autre option rapide pour trouver des phrases possibles à considérer en premier lieu est d'importer un modèle (gensim en a) et d'extraire simplement toutes les phrases / mots qui ne figurent pas dans le modèle - cela vous permettra probablement d'obtenir beaucoup d'entités nommées afin que vous sachiez quoi cas que vous devrez considérer.


0 commentaires