génération d'étiquettes à partir d'un contenu texte

je suis curieux de savoir s'il existe un algorithme/une méthode pour générer des mots-clés/Étiquettes à partir d'un texte donné, en utilisant certains calculs de poids, le rapport d'occurrence ou d'autres outils.

de plus, je vous serais reconnaissant si vous pointez une solution / bibliothèque basée sur Python pour cela.

Merci

43
demandé sur dmcer 2010-04-18 13:39:23

4 réponses

Une façon de le faire serait d'extraire des mots qui se produisent plus fréquemment dans un document que vous attendez d'eux par hasard. Par exemple, dans une collection plus vaste de documents, 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ère que Markov pourrait être un bon mot-clé ou étiquette à associer avec le document.

Pour identifier des mots-clés comme cela, vous pouvez utiliser le point-sage d'information mutuelle du mot-clé et le document. Ceci est donné par PMI(term, doc) = log [ P(term, doc) / (P(term)*P(doc)) ] . Cela vous indiquera à peu près combien moins (ou plus) surpris vous êtes de tomber sur le terme dans le document spécifique comme s'apparente à venir à travers elle dans la collection plus grande.

pour identifier les 5 meilleurs mots-clés à associer à un document, vous voulez juste trier les Termes par leur score PMI avec le document et de choisir les 5 avec le score le plus élevé.

si vous voulez extraire étiquettes multi mots , voir la question comment extraire des phrases communes / significatives d'une série d'entrées de texte .

empruntant à ma réponse à cette question, le NLTK collocations how-to couvre comment faire extraire des expressions multi mots intéressantes en utilisant n-gram PMI dans environ 7 lignes de code, par exemple:

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)  
53
répondu dmcer 2017-05-23 10:30:47

tout d'abord, la clé de la bibliothèque python pour la linguistique computationnelle est NLTK (" Natural Language Toolkit "). Il s'agit d'une bibliothèque stable et mature créée et gérée par des linguistes computationnels professionnels. Il dispose également d'une vaste collection de tutoriels, FAQ, etc. Je le recommande fortement.

ci-dessous est un modèle simple, en code python, pour le problème soulevé dans votre Question; bien que ce soit un modèle, il s'exécute--fournir tout le texte comme une chaîne de caractères (comme je l'ai fait) et il sera de retour une liste de fréquence des mots ainsi que d'une liste de classement de ces mots dans l'ordre de "l'importance" (ou l'adéquation des mots-clés) selon l'une très simple heuristique.

mots-clés pour un document donné sont (évidemment), choisis parmi les mots importants d'un document, c'est à dire, ces mots qui sont susceptibles de le distinguer d'un autre document. Si vous n'aviez pas une a priori connaissance de le sujet du texte, une technique courante est de déduire l'importance ou le poids d'un mot/terme donné de sa fréquence, ou l'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())
9
répondu doug 2012-01-31 21:56:27

http://en.wikipedia.org/wiki/Latent_Dirichlet_allocation tente de représenter chaque document dans un corpus de formation comme un mélange de sujets, qui à leur tour sont des distributions de mappage des mots aux probabilités.

Je l'avais utilisé une fois pour disséquer un corpus de revues de produits dans les idées latentes qui étaient parlées dans tous les documents tels que le "service à la clientèle", "la convivialité du produit", etc.. Le modèle de base ne préconise pas une façon de convertir le sujet modèles en un seul mot décrivant ce qu'est un sujet.. mais les gens ont inventé toutes sortes d'heuristiques pour le faire une fois que leur modèle est formé.

je vous recommande d'essayer de jouer avec http://mallet.cs.umass.edu / et voir si ce modèle répond à vos besoins..

LDA est un algorithme complètement sans supervision, ce qui signifie qu'il ne vous oblige pas à annoter à la main tout ce qui est génial, mais de l'autre côté, peut pas vous offrir les sujets que vous attendiez pour donner.

4
répondu Aditya Mukherji 2010-04-18 22:31:56

une solution très simple au problème serait:

  • compter les occurences de chaque mot dans le texte
  • considérer la plus fréquente des termes que les phrases clés
  • ont une liste noire des "mots vides" pour supprimer des mots communs comme l', et, elle, est etc

je suis sûr qu'il existe des solutions basées sur des statistiques plus intelligentes.

si vous avez besoin d'une solution à utiliser dans un plus grand projet plutôt que par intérêt, Yahoo BOSS a une méthode d'extraction par terme clé.

0
répondu Adam Pope 2010-04-18 09:44:57