2008-10-20 9 views
21

Estoy trabajando en un proyecto donde necesito analizar una página de texto y colecciones de páginas de texto para determinar palabras dominantes. Me gustaría saber si hay una biblioteca (prefiero C# o java) que manejará el trabajo pesado para mí. Si no, ¿hay algún algoritmo o múltiple que logre mis objetivos a continuación?Algoritmos o bibliotecas para análisis textual, específicamente: palabras dominantes, frases en texto y colección de texto

Lo que quiero hacer es similar a las nubes de palabras creadas a partir de una fuente de URL o RSS que encuentre en la web, excepto que no quiero la visualización. Se utilizan todo el tiempo para analizar los discursos de los candidatos presidenciales para ver cuál es el tema o las palabras más usadas.

La complicación es que tengo que hacer esto en miles de documentos cortos, y luego colecciones o categorías de estos documentos.

Mi plan inicial era analizar el documento, luego filtrar las palabras comunes - de, el, él, ella, etc. Luego contar el número de veces que aparecen las palabras restantes en el texto (y la colección/categoría general))

El problema es que en el futuro, me gustaría manejar formas derivadas, plurales, etc. También me gustaría ver si hay una manera de identificar frases importantes. (En lugar de contar una palabra, el recuento de una frase es de 2-3 palabras juntas)

Se agradece cualquier orientación sobre una estrategia, bibliotecas o algoritmos que ayuden.

Respuesta

17

Una opción para lo que está haciendo es la frecuencia de los términos a la frecuencia inversa del documento, o tf-idf. Los términos más fuertes tendrán la ponderación más alta según este cálculo. Compruebe si está aquí: http://en.wikipedia.org/wiki/Tf-idf

Otra opción es utilizar algo así como un clasificador de bayes ingenuo usando palabras como características y encontrar cuáles son las características más fuertes en el texto para determinar la clase del documento. Esto funcionaría de manera similar con un clasificador de entropía máximo.

cuanto a las herramientas para hacer esto, la mejor herramienta para empezar sería NLTK, una biblioteca de Python con una amplia documentación y tutoriales: http://nltk.sourceforge.net/

Para Java, intente OpenNLP: http://opennlp.sourceforge.net/

Para la frase cosas, considere la segunda opción que ofrecí usando bigrams y trigrams como características, o incluso como términos en tf-idf.

¡Buena suerte!

5

Para añadir a la respuesta de Robert Elwell:

  • despalillado y el colapso de formas de la palabra. Un método simple en inglés es usar Porter Stemming en las formas de palabras de caja inferior.
  • un término para las "palabras comunes" es "detener palabra" o "detener lista"
  • Leer el libro NLTK como se sugiere explicará bien muchos de estos temas introductorios.
  • algunos de los problemas que tiene que abordar son analizar oraciones (para que sus frases bigrams y n-gramas no crucen los límites de las oraciones), dividir oraciones en tokens y decidir qué hacer con las formas posesivas, por ejemplo.

Nada de esto está claro, ni tiene "respuestas correctas". Ver también las etiquetas SO "nlp" y "lenguaje natural".

¡Buena suerte! Este es un proyecto no trivial.

+0

Agregué la etiqueta "natural-language" a la publicación. –

1

Alrighty. Entonces, tienes un documento que contiene texto y una colección de documentos (un corpus). hay muchas maneras de hacer esto.

Sugeriría usar el motor Lucene (Java) para indexar sus documentos. Lucene admite una estructura de datos (índice) que contiene una cantidad de documentos. Un documento en sí mismo es una estructura de datos que puede contener "campos", por ejemplo, autor, título, texto, etc. Puede elegir qué campos están indexados y cuáles no.

Agregar documentos a un índice es trivial. Lucene también está diseñado para la velocidad y puede escalar magníficamente.

A continuación, desea averiguar los términos y las frecuencias. Como lucene ya lo ha calculado durante el proceso de indexación, puede usar la función docFreq y crear su propia función de frecuencia de términos, o usar la función getTermFreqVectors de la clase IndexReader para obtener los términos (y frecuencias de los mismos).

Ahora depende de usted cómo ordenarlo y qué criterios desea utilizar para filtrar las palabras que desea. Para averiguar las relaciones, puede usar una API de Java para la biblioteca de código abierto de wordnet. Para contener palabras, usa la clase PorterStemFilter de Lucene. La parte de la frase de la frase es más complicada, pero una vez que has llegado hasta aquí, puedes buscar consejos sobre cómo integrar la búsqueda de n-gramas en Lucene (hint).

¡Buena suerte!

0

Comprobar modelo MapReduce para obtener el número de palabras y luego derivar la frecuencia como se describe en la TF-IDF

Hadoop MapReduce es un marco de Apache que se puede utilizar para la tarea de levantar objetos pesados ​​de la palabra de contar con muchos documentos. http://hadoop.apache.org/common/docs/current/mapred_tutorial.html

No puede obtener un solo marco que resuelva todo lo que desee. Debe elegir una combinación correcta de conceptos y marco para obtener lo que desea.

0

También me gustaría ver si hay una manera de identificar frases importantes. (En lugar de contar una palabra, el recuento de una frase es de 2-3 palabras juntas)

Esta parte de su problema se llama collocation extraction. (Al menos si toma 'frases importantes' para que sean frases que aparecen mucho más a menudo que por casualidad) I gave an answer más al another SO question sobre ese subproblema específico.

0

Parece que lo que estás buscando se llama agrupamiento/clasificación de documentos bag-of-words. Encontrarás una guía con esta búsqueda.

Cuestiones relacionadas