tutorial español ejemplo python tags machine-learning nlp nltk

español - nltk python tutorial



generación de etiquetas a partir de un contenido de texto (4)

Primero, la biblioteca clave de Python para 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 una extensa collection de tutoriales, preguntas frecuentes, etc. Lo recomiendo mucho.

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

Las palabras clave para un documento dado se eligen (obviamente) de entre las palabras importantes de un documento, es decir, aquellas palabras que puedan distinguirlo de otro documento. Si no tenía conocimiento a priori 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())

Tengo curiosidad por saber si existe un algoritmo / método para generar palabras clave / etiquetas de un texto dado, usando algunos cálculos de peso, proporción de ocurrencia u otras herramientas.

Además, le agradeceré que señale cualquier solución / biblioteca basada en Python para esto.

Gracias


Una forma de hacerlo sería extraer las palabras que ocurren con más frecuencia en un documento de lo que cabría esperar 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 como esta, puede usar la información mutua puntual de la palabra clave y el documento. Esto viene 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 las 5 mejores palabras clave para asociar con un documento, simplemente clasifique los términos por su puntaje PMI con el documento y elija el 5 con el puntaje más alto.

Si desea extraer etiquetas de palabras múltiples , consulte la pregunta de Cómo extraer frases comunes / significativas de una serie de entradas de texto .

Tomando prestado de mi respuesta a esa pregunta, las instrucciones de colocación de NLTK cubren cómo extraer interesantes expresiones multipalabra utilizando n-gram PMI en aproximadamente 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)


Una solución muy simple al problema sería:

  • contar las ocurrencias de cada palabra en el texto
  • considera los términos más frecuentes como las frases clave
  • tener 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 usar en un proyecto más grande en lugar de por intereses, Yahoo BOSS tiene un método de extracción de términos clave.


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

Lo había usado una vez para diseccionar un corpus de revisiones 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 por una forma de convertir el tema se modela en una sola palabra que describe de qué trata un tema ... pero las personas han ideado todo tipo de heurísticas para hacer eso una vez que su modelo está capacitado.

Te recomiendo que intentes jugar con http://mallet.cs.umass.edu/ y ver si este modelo se ajusta a tus necesidades ...

LDA es un algoritmo completamente no supervisado, lo que significa que no requiere que anote a mano nada que sea excelente, pero por otro lado, puede que no le entregue los temas que esperaba que le diera.