2010-04-18 11 views
40

tengo curiosidad si hay existe un algoritmo/método para generar palabras clave/tags de un texto dado, mediante el uso de algunos cálculos de peso, proporción de aparición o de otras herramientas.generación de etiquetas de un contenido de texto

Además, estaré agradecido si apunta cualquier solución/biblioteca basada en Python para esto.

Gracias

+0

¿Tiene datos de entrenamiento? – bayer

Respuesta

50

Una forma de hacer esto sería para extraer palabras que ocurren con mayor frecuencia en un documento de lo que cabría esperar que por casualidad. Por ejemplo, digamos que en una colección más grande de documentos, el término "Markov" casi nunca se ve. Sin embargo, en un documento particular de la misma colección, Markov aparece con mucha frecuencia. Esto sugeriría que Markov podría ser una buena palabra clave o etiqueta para asociar con el documento.

para identificar palabras clave de esta manera, se podría utilizar el point-wise mutual information de la palabra clave y el documento. Esto está dado por PMI(term, doc) = log [ P(term, doc)/(P(term)*P(doc)) ]. Esto le indicará aproximadamente cuánto menos (o más) le sorprenderá que encuentre el término en el documento específico que se le ocurrió encontrar en la colección más grande.

Para identificar los 5 mejores palabras clave para asociar a un documento, que acaba de ordenar los términos de su puntuación de PMI con el documento y escoger el 5 con la puntuación más alta.

Si desea extraer etiquetas de varias palabras, consulte la pregunta StackOverflow How to extract common/significant phrases from a series of text entries.

Préstamos de mi respuesta a esa pregunta, la NLTK collocations how-to cubre cómo hacer extracto de expresiones de varias palabras interesantes utilizando n-gram PMI en un cerca de 7 líneas de código, por ejemplo .:

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) 
+0

esto es genial, muchas gracias por tomarse su tiempo! – Hellnar

+0

He hecho una pregunta similar aquí: http://stackoverflow.com/questions/2764116/tag-generation-from-a-small-text-content-such-as-tweets Me pregunto si este algoritmo es exitoso en tan pequeño trozo de texto. – Hellnar

+0

+1: ¡Guau! Exactamente lo que estaba buscando y sin siquiera preguntarlo :-) – tmow

0

Una solución muy simple para el problema sería:

  • contar las apariciones de cada palabra en el texto
  • consideran los términos más frecuentes como las frases clave
  • tienen una lista negra de 'detener palabras' para eliminar palabras comunes como, y, es, etc.

Sin embargo, estoy seguro de que hay soluciones basadas en estadísticas más inteligentes.

Si necesita una solución para utilizar en un proyecto más amplio en lugar de los intereses por el bien, el jefe de Yahoo tiene un método clave para la extracción de términos.

9

En primer lugar, la biblioteca clave de python para la lingüística computacional es NLTK ("Natural Language Toolkit"). Esta es una biblioteca madura y estable creada y mantenida por lingüistas computacionales profesionales. También tiene un extenso collection de tutoriales, preguntas frecuentes, etc. Lo recomiendo altamente.

A continuación se muestra una simple plantilla, en código Python, para el problema planteado en la pregunta; aunque es una plantilla que se ejecuta - suministrar cualquier texto como una cadena (como lo he hecho) y devolverá una lista de frecuencias de palabras, así como una lista clasificada de esas palabras con el fin de 'importancia' (o idoneidad como palabras clave) de acuerdo con una heurística muy simple.

Palabra clave de un determinado documento son (obviamente) elegidos entre palabras importantes en un documento - es decir, aquellas palabras que puedan distinguirlo de otro documento. Si no tuvo un conocimiento previo del conocimiento del tema del texto, una técnica común es inferir la importancia o el peso de una palabra/término dado a partir de su frecuencia o importancia = 1/frecuencia.

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()) 
4

http://en.wikipedia.org/wiki/Latent_Dirichlet_allocation trata de representar a cada documento en un corpus de entrenamiento como una mezcla de temas, que a su vez son distribuciones palabras de mapeo a las probabilidades.

Lo había usado una vez para diseccionar un corpus de reseñas de productos en las ideas latentes de las que se hablaba en todos los documentos, como 'servicio al cliente', 'usabilidad del producto', etc. El modelo básico no aboga una forma de convertir los modelos de temas en una sola palabra que describa de qué trata un tema ... pero las personas han creado todo tipo de heurísticas para hacer eso una vez que su modelo está capacitado.

le recomiendo que pruebe a jugar con http://mallet.cs.umass.edu/ y ver si este modelo se adapte a sus necesidades ..

LDA es un algoritmo no supervisado por completo lo que significa que no requiere que anotar a mano todo lo que es grande, pero en la tapa lado, puede que no te brinde los temas que esperabas que brindara.

Cuestiones relacionadas