51 votes

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

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

De plus, je serai reconnaissant si vous pointez n'importe quelle solution / bibliothèque basée sur Python pour cela.

Merci

59voto

dmcer Points 5561

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, dire que dans un plus vaste collection de documents, le terme 'Markov' est presque du jamais vu. Cependant, dans un document 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 des mots-clés comme cela, vous pouvez utiliser le point-sage de l'information mutuelle du mot-clé et le document. Ceci est donné par PMI(term, doc) = log [ P(term, doc) / (P(term)*P(doc)) ]. Ce sera à peu près de vous dire comment beaucoup moins (ou plus) qui vous a surpris à venir à travers ce terme dans le document spécifique comme apposer à venir à travers elle dans la plus grande collection de.

Pour identifier les 5 meilleurs mots clés à associer à un document, vous venez de trier les termes par leur PMI score avec le document et choisissez le 5 avec le score le plus élevé.

Si vous voulez extraire groupe de mots de balises, voir la StackOverflow question Comment faire pour extraire des communes ou des phrases significatives à partir d'une série d'entrées de texte.

L'emprunt de ma réponse à cette question, le NLTK collocations comment traite de la façon de faire extrait intéressant groupe de mots expressions à l'aide des n-grammes de PMI dans près de 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)  

10voto

doug Points 29567

Tout d'abord, la clé de la bibliothèque python for computational linguistics est NLTK ("Natural Language Toolkit"). C'est un stable, mature bibliothèque créées et entretenues par des professionnels de linguistes informaticiens. Il possède également une vaste collection de tutoriels, Faq, etc. Je le recommande fortement.

Ci-dessous un modèle simple, dans le code python, pour le problème évoqué dans votre Question, même si c'est un modèle qu'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'avez pas eu un à priori de la connaissance du texte de l'objet, une technique courante consiste à déduire l'importance ou le poids d'un mot/terme à partir 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())

5voto

adi92 Points 4589

http://en.wikipedia.org/wiki/Latent_Dirichlet_allocation essaye de représenter chaque document dans une formation corpus que le mélange des sujets, qui sont des distributions de cartographie termes de probabilités.

Je l'avais utilisé une fois pour disséquer un corpus de critiques de produits dans les idées latentes qui ont parlé à travers tous les documents tels que le service à la clientèle', 'convivialité du produit", etc.. Le modèle de base n'est pas en faveur d'un moyen de convertir la rubrique modèles en un seul mot décrivant ce qu'un sujet est sur.. mais des gens sont venus avec tous les types d'heuristiques pour le faire qu'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 s'adapte à vos besoins..

LDA est complètement sans surveillance algorithme de sens, il ne nécessite pas de main d'annoter tout ce qui est grand, mais sur le revers de la médaille, pourrait ne pas vous offrir les sujets que vous attendiez pour donner.

2voto

Adam Pope Points 2454

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

  • compter les occurrences de chaque mot dans le texte
  • considérer les termes les plus fréquents comme les phrases clés
  • avoir une liste noire de «mots vides» pour supprimer les mots courants comme le, et, c'est, etc.

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X