idf algorithm nlp word-frequency

algorithm - tf idf



Algoritmo de frecuencia de palabras para el procesamiento del lenguaje natural (9)

Aquí hay un ejemplo de cómo puede hacer eso en Python, los conceptos son similares en cualquier idioma.

>>> import urllib2, string >>> devilsdict = urllib2.urlopen(''http://www.gutenberg.org/files/972/972.txt'').read() >>> workinglist = devilsdict.split() >>> cleanlist = [item.strip(string.punctuation) for item in workinglist] >>> results = {} >>> skip = {''a'':'''', ''the'':'''', ''an'':''''} >>> for item in cleanlist: if item not in skip: try: results[item] += 1 except KeyError: results[item] = 1 >>> results {'''': 17, ''writings'': 3, ''foul'': 1, ''Sugar'': 1, ''four'': 8, ''Does'': 1, "friend''s": 1, ''hanging'': 4, ''Until'': 1, ''marching'': 2 ...

La primera línea solo obtiene bibliotecas que ayudan con partes del problema, como en la segunda línea, donde urllib2 descarga una copia del "Diccionario del Diablo" de Ambrose Bierce. Las siguientes líneas hacen una lista de todas las palabras en el texto, sin signos de puntuación. Luego, crea una tabla hash, que en este caso es como una lista de palabras únicas asociadas con un número. El bucle for repasa cada palabra en el libro de Bierce, si ya hay un registro de esa palabra en la tabla, cada aparición nueva agrega una al valor asociado con esa palabra en la tabla; si la palabra aún no ha aparecido, se agrega a la tabla, con un valor de 1 (lo que significa una ocurrencia). Para los casos de los que está hablando, le gustaría prestar mucha más atención a los detalles, por ejemplo, utilizando mayúsculas y minúsculas. para ayudar a identificar los nombres propios solo en el medio de las oraciones, etc., esto es muy difícil pero expresa el concepto.

Para entrar en la materia de derivación y pluralización, experimentar, luego buscar trabajo de terceros, he disfrutado partes del NLTK, que es un proyecto académico de código abierto, también en python.

Sin obtener un título en recuperación de información, me gustaría saber si existe algún algoritmo para contar la frecuencia con que ocurren las palabras en un cuerpo de texto determinado. El objetivo es obtener una "sensación general" de lo que dice la gente sobre un conjunto de comentarios textuales. A lo largo de las líneas de Wordle .

Lo que me gustaría:

  • ignorar artículos, pronombres, etc. (''a'', ''an'', ''the'', ''him'', ''them'', etc.)
  • preservar nombres propios
  • ignorar la separación silábica, excepto por el tipo suave

Alcanzando las estrellas, estas serían color de rosa:

  • manejo de tallos y plurales (por ejemplo, me gusta, me gusta, me gusta, me gusta el mismo resultado)
  • agrupación de adjetivos (adverbios, etc.) con sus sujetos ("gran servicio" en lugar de "grande", "servicio")

Intenté algunas cosas básicas usando Wordnet, pero estoy retocando cosas a ciegas y esperando que funcione para mis datos específicos. Algo más genérico sería genial.


Bienvenido al mundo de NLP ^ _ ^

Todo lo que necesitas es un poco de conocimiento básico y algunas herramientas.

Ya hay herramientas que le dirán si una palabra en una oración es un sustantivo, adjetivo o verbo. Se llaman etiquetadoras de voz parcial . Por lo general, toman texto sin formato en inglés como entrada y emiten la palabra, su forma base y la parte del discurso. Aquí está el resultado de un popular etiquetador de parte de discurso de UNIX en la primera frase de su publicación:

$ echo "Without getting a degree in information retrieval, I''d like to know if there exists any algorithms for counting the frequency that words occur in a given body of text." | tree-tagger-english # Word POS surface form Without IN without getting VVG get a DT a degree NN degree in IN in information NN information retrieval NN retrieval , , , I PP I ''d MD will like VV like to TO to know VV know if IN if there EX there exists VVZ exist any DT any algorithms NNS algorithm for IN for counting VVG count the DT the frequency NN frequency that IN/that that words NNS word occur VVP occur in IN in a DT a given VVN give body NN body of IN of text NN text . SENT .

Como puede ver, identificó los "algoritmos" como la forma plural (NNS) de "algoritmo" y "existe" como una conjugación (VBZ) de "existir". También identificó "a" y "the" como "determinantes (DT)", otra palabra para el artículo. Como puede ver, el etiquetador POS también tokenizó la puntuación.

Para hacer todo menos el último punto de su lista, solo necesita ejecutar el texto a través de un etiquetador POS, filtrar las categorías que no le interesan (determinantes, pronombres, etc.) y contar las frecuencias de las formas básicas de las palabras.

Estos son algunos de los taggers POS más populares:

TreeTagger (solo binario: Linux, Solaris, OS-X)
GENIA Tagger (C ++: compila tu auto)
Stanford POS Tagger (Java)

Para hacer lo último en su lista, necesita más que solo información a nivel de palabra. Una manera fácil de comenzar es contar secuencias de palabras en lugar de solo palabras. Estos se llaman n-grams . Un buen lugar para comenzar es UNIX for Poets . Si está dispuesto a invertir en un libro sobre PNL, le recomendaría Fundamentos del procesamiento estadístico del lenguaje natural .


El algoritmo que acabas de describir. Un programa que lo hace fuera de la caja con un gran botón que dice "Hazlo" ... No sé.

Pero déjame ser constructivo. Te recomiendo este libro Programming Collective Intelligence . Los capítulos 3 y 4 contienen ejemplos muy pragmáticos (en realidad, no hay teorías complejas, solo ejemplos).




La primera parte de tu pregunta no suena tan mal. Todo lo que necesitas hacer es leer cada palabra del archivo (o transmitir w / e) y colocarla en un árbol de prefijo y cada vez que te encuentres con una palabra que ya existe, incrementarás el valor asociado a ella. Por supuesto, también tendrías una lista de ignorar todo lo que te gustaría que quedara fuera de tus cálculos.

Si usa un árbol de prefijos, asegúrese de que para encontrar cualquier palabra va a O (N), donde N es la longitud máxima de una palabra en su conjunto de datos. La ventaja de un árbol de prefijos en esta situación es que si desea buscar plurales y derivar puede verificar O (M + 1) si eso es posible para la palabra, donde M es la longitud de la palabra sin raíz o pluralidad. (es esa una palabra? hehe). Una vez que haya construido su árbol de prefijos, lo volvería a analizar para los tallos y demás y lo condensaría de manera que la palabra raíz sea la que contenga los resultados.

Después de buscar, puede tener algunas reglas simples para que la coincidencia sea positiva en el caso de la raíz o raíz o lo que sea.

La segunda parte parece extremadamente desafiante. Mi inclinación ingenua sería tener resultados separados para las agrupaciones adjetivo-sujeto. Usa los mismos principios que arriba, pero solo mantenlo separado.

Otra opción para el análisis semántico podría ser modelar cada oración como un árbol de relaciones entre sujeto, verbo, etc. (la oración tiene un sujeto y un verbo, el sujeto tiene un sustantivo y un adjetivo, etc.). Una vez que haya roto todo el texto de esta manera, parece que podría ser bastante fácil de ejecutar y obtener un recuento rápido de los diferentes emparejamientos apropiados que se produjeron.

Solo algunas divagaciones, estoy seguro de que hay mejores ideas, pero me encanta pensar en estas cosas.



No necesitará uno, sino varios algoritmos agradables, en la línea de lo siguiente.

  • ignorar los pronombres se hace mediante un stoplist .
  • preservando nombres propios? ¿Quiere decir, detectar entidades con nombre, como Hoover Dam y decir "es una palabra" o nombres compuestos, como el lenguaje de programación ? Te daré una pista: es difícil, pero existen bibliotecas para ambos. Busque NER (reconocimiento de entidad con nombre) y fragmentación léxica. OpenNLP es un Java-Toolkit que hace ambas cosas.
  • ¿ignorando la separación silábica? ¿Quieres decir, como en los saltos de línea? Use expresiones regulares y verifique la palabra resultante a través de la búsqueda del diccionario.
  • manejando plurales / tallos: puedes ver el tallo de bola de nieve . Hace el truco muy bien.
  • "agrupar" adjetivos con sus sustantivos es generalmente una tarea de análisis superficial . Pero si buscas específicamente adjetivos cualitativos (bueno, malo, de mierda, increíble ...) es posible que te interese el análisis de sentimientos . LingPipe hace esto, y mucho más.

Lo siento, sé que dijiste que querías BESAR, pero desafortunadamente tus demandas no son tan fáciles de cumplir. Sin embargo, existen herramientas para todo esto, y usted debería ser capaz de unirlas y no tener que realizar ninguna tarea usted mismo, si no lo desea. Si quiere realizar una tarea usted mismo, le sugiero que mire la derivación, es la más fácil de todas.

Si usa Java, combine Lucene con el kit de herramientas OpenNLP . Obtendrás muy buenos resultados, ya que Lucene ya tiene una lectora incorporada y mucho tutorial. El kit de herramientas de OpenNLP, por otro lado, está poco documentado, pero no necesitará mucho de él. También podría estar interesado en NLTK , escrito en Python.

Diría que abandonas tu último requisito, ya que implica un análisis superficial y definitivamente no mejorará tus resultados.

Ah, por cierto. el término exacto de ese documento-término-frecuencia-cosa que estabas buscando se llama tf-idf . Es más o menos la mejor manera de buscar la frecuencia de los documentos para los términos. Para hacerlo correctamente, no te moverás usando matrices multidimensionales de vectores.

... Sí, lo sé. Después de tomar un seminario sobre IR, mi respeto por Google fue aún mayor. Después de hacer algunas cosas en IR, mi respeto por ellos cayó igual de rápido, sin embargo.


U puede usar el diccionario worldnet para obtener la información básica de la palabra clave de la pregunta, como su pasado de voz, extracto de sinónimos, u puede hacer lo mismo para que su documento cree el índice para ello. luego puede hacer coincidir fácilmente la palabra clave con el archivo de índice y clasificar el documento. luego summerize it.