Question

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

De plus, je serai reconnaissant si vous pointez une solution Python / bibliothèque pour cela.

Merci

Était-ce utile?

La solution

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

Pour identifier les mots clés comme celui-ci, vous pouvez utiliser le information mutuelle point sage du mot-clé et le document. Ceci est donné par PMI(term, doc) = log [ P(term, doc) / (P(term)*P(doc)) ]. Cela à peu près vous dire combien moins (ou plus) surpris que vous êtes à venir à travers le terme dans le document spécifique à venir à travers appose dans la plus grande collection.

Pour identifier les 5 meilleurs mots-clés à associer à un document, vous quelque sorte les termes de leur PMI marquer des points avec le document et choisissez 5 avec le score le plus élevé.

Si vous voulez extraire multiword balises , voir la question StackOverflow Comment extraire des phrases communes / significatives d'une série d'entrées de texte .

L'emprunt de ma réponse à cette question, les NLTK collocations how-to comment couvre faire extraire intéressantes expressions de mots multiples en utilisant du n-gramme dans un PMI 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)  

Autres conseils

D'abord, la bibliothèque Python clé pour la linguistique computationnelle est NLTK ( " Boîte à outils du langage naturel "). Ceci est une écurie, une bibliothèque matures créée et entretenue par des linguistes informaticiens professionnels. Il a également une vaste collection des tutoriels, des FAQ, etc. Je le recommande fortement.

Ci-dessous un modèle simple, dans le code python, le problème soulevé dans votre question; bien que ce soit un modèle, il court - fournir tout une chaîne de texte (comme je l'ai fait) et il retournera une liste de fréquences de mots ainsi qu'une classé liste de ces mots dans l'ordre de « l'importance » (ou la pertinence en tant que mots-clés ) selon une heuristique très simple.

Mots-clés pour un document donné sont (évidemment) choisi parmi les mots importants dans un document - à savoir, les mots qui sont susceptibles de le distinguer d'un autre document. Si vous aviez pas a priori connaissance de la matière du texte, une technique courante consiste à déduire l'importance ou le poids d'un mot donné / terme de sa fréquence, ou de 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())

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

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

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

LDA est un algorithme sans aucune supervision qui signifie qu'il ne vous oblige pas à quoi que ce soit la main annoter qui est grande, mais sur le côté, pourrait ne pas vous livrer les sujets que vous attendiez à donner.

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

  • compter les occurences de chaque mot dans le texte
  • considérer les termes les plus fréquents que les phrases clés
  • ont une liste noire des « mots d'arrêt » pour supprimer des mots communs comme le, et, il est etc

Je suis sûr qu'il ya plus intelligent, basé solutions bien.

Si vous avez besoin d'une solution à utiliser dans un projet plus vaste, plutôt que pour l'amour d'intérêts, Yahoo BOSS a une méthode d'extraction clé terme.

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