web-dev-qa-db-fra.com

Génération de balises à partir d'un contenu texte

Je suis curieux s'il existe un algorithme/méthode existant pour générer des mots-clés/des balises à partir d'un texte donné, en utilisant des calculs de poids, un ratio d'occurrence ou d'autres outils.

De plus, je vous serai reconnaissant si vous le mettez en poing Python Solution/Bibliothèque à base de ceci.

Merci

45
Hellnar

Une façon de faire cela serait d'extraire des mots qui se produisent plus fréquemment dans un document que vous ne l'attendez que par hasard. Par exemple, disons dans une plus grande collection de documents que le terme "markov" n'est presque jamais vu. Cependant, dans un document particulier de la même collection, Markov apparaît très fréquemment. Cela suggérerait que Markov pourrait être un bon mot clé ou une bonne étiquette à associer au document.

Pour identifier des mots-clés comme celui-ci, vous pouvez utiliser les informations informations mutuelles points du mot clé et du document. Ceci est donné par PMI(term, doc) = log [ P(term, doc) / (P(term)*P(doc)) ]. Cela vous indiquera à peu près à quel point (ou plus) surpris de vous surprendre le terme dans le document spécifique que vous avez appelé à la découverte de la plus grande collection.

Pour identifier les 5 meilleurs mots-clés à associer à un document, vous seriez simplement trier les termes par son score PMI avec le document et choisir le 5 avec le score le plus élevé.

Si vous souhaitez extraire MultiWord Tags , voir la question Stackoverflow Comment extraire des phrases communes/significatives d'une série d'entrées de texte .

Emprunter de ma réponse à cette question, le Collocations NLTK HOW-TO Couvre comment extraire des expressions multi-mots intéressantes à l'aide de N-GRAM PMI dans une version de code d'environ 7 lignes de code, E.G.:

import nltk
from nltk.collocations import *
bigram_measures = nltk.collocations.BigramAssocMeasures()

# change this to read in your data
Finder = BigramCollocationFinder.from_words(
   nltk.corpus.genesis.words('english-web.txt'))

# only bigrams that appear 3+ times
Finder.apply_freq_filter(3) 

# return the 5 n-grams with the highest PMI
Finder.nbest(bigram_measures.pmi, 5)  
58
dmcer

Tout d'abord, la clé python Bibliothèque pour la linguistique informatique est [~ # ~] NLTK [~ # ~ ~] (" langage naturel Toolkit ")" Ceci est une bibliothèque stable et mature créée et maintenue par des linguistes informatiques professionnels. Il a également une vaste collection de tutoriels, FAQ, etc. Je recommande ça hautement.

Ci-dessous est un simple modèle, dans python code, pour le problème soulevé dans votre question; bien que ce soit un modèle il exécute - fournit n'importe quel texte sous forme de chaîne (comme je l'ai fait) et Retournera une liste des fréquences de mots ainsi qu'une liste classée de ces mots par ordre de "importance" (ou de pertinence en tant que mots-clés) en fonction d'une heuristique très simple.

Les mots-clés pour un document donné sont (évidemment) choisis parmi des mots importants dans un document - c.-à-d. Ces mots susceptibles de le distinguer d'un autre document. Si vous n'aviez pas de priori connaissance du sujet du texte, une technique commune consiste à déduire l'importance ou le poids d'un mot/durée donné de sa fréquence, ou de son importance = 1/fréquence.

text = """ The intensity of the feeling makes up for the disproportion of the objects.  Things are equal to the imagination, which have the power of affecting the mind with an equal degree of terror, admiration, delight, or love.  When Lear calls upon the heavens to avenge his cause, "for they are old like him," there is nothing extravagant or impious in this sublime identification of his age with theirs; for there is no other image which could do justice to the agonising sense of his wrongs and his despair! """

BAD_CHARS = ".!?,\'\""

# transform text into a list words--removing punctuation and filtering small words
words = [ Word.strip(BAD_CHARS) for Word in text.strip().split() if len(Word) > 4 ]

Word_freq = {}

# generate a 'Word histogram' for the text--ie, a list of the frequencies of each Word
for Word in words :
  Word_freq[Word] = Word_freq.get(Word, 0) + 1

# sort the Word list by frequency 
# (just a DSU sort, there's a python built-in for this, but i can't remember it)
tx = [ (v, k) for (k, v) in Word_freq.items()]
tx.sort(reverse=True)
Word_freq_sorted = [ (k, v) for (v, k) in tx ]

# eg, what are the most common words in that text?
print(Word_freq_sorted)
# returns: [('which', 4), ('other', 4), ('like', 4), ('what', 3), ('upon', 3)]
# obviously using a text larger than 50 or so words will give you more meaningful results

term_importance = lambda Word : 1.0/Word_freq[Word]

# select document keywords from the words at/near the top of this list:
map(term_importance, Word_freq.keys())
10
doug

http://fr.wikipedia.org/wiki/latent_dirichlet_allocation Ça tente de représenter chaque document dans un corpus de formation en tant que mélange de sujets, ce qui, à son tour, les distributions sont des mots de cartographie des probabilités.

Je l'avais utilisé une fois pour disséquer un corpus d'examens de produit dans les idées latentes qui ont été prononcées sur tous les documents tels que "Service à la clientèle", "Utilisation du produit", etc. Le modèle de base ne préconise pas un moyen de convertir Les modèles de sujet en un seul mot décrivant ce qu'est un sujet. Mais les gens ont été proposés avec toutes sortes d'heuristiques pour le faire une fois que leur modèle est formé.

Je vous recommande d'essayer de jouer avec http://mallets.cs.umass.edu/ et voir si ce modèle correspond à vos besoins ..

LDA est un algorithme totalement non supervisé qui signifie qu'il ne vous oblige pas à annoter quoi que ce soit, ce qui est génial, mais sur le côté bascule, pourrait ne pas vous livrer les sujets que vous attendiez.

4
Aditya Mukherji

Une solution très simple au problème serait la suivante:

  • compter les occurrences de chaque mot dans le texte
  • considérez les termes les plus fréquents que les phrases clés
  • avoir une liste noire de "mots d'arrêt" pour éliminer les mots communs comme le, et, c'est, etc.

Je suis sûr qu'il y a des solutions de statistiques intelligentes.

Si vous avez besoin d'une solution à utiliser dans un projet plus vaste plutôt que pour les intérêts, Yahoo Boss a une méthode d'extraction de termes clés.

0
Adam Pope