2009-10-29 25 views
39

Tengo alrededor de 100 megabytes de texto, sin ningún tipo de marcado, dividido en aproximadamente 10.000 entradas. Me gustaría generar automáticamente una lista de 'etiquetas'. El problema es que hay grupos de palabras (es decir, frases) que solo tienen sentido cuando se agrupan.Algoritmos para detectar frases y palabras clave del texto

Si solo cuento las palabras, obtengo una gran cantidad de palabras realmente comunes (es decir, el, para, en, soy, etc.). He contado las palabras y el número de otras palabras que están antes y después, pero ahora realmente no puedo entender qué hacer a continuación. La información relacionada con las frases de 2 y 3 palabras está presente, pero ¿cómo puedo extraer esta información?

+0

Es posible que desee limpiar primero sus datos de entrada eliminando las palabras comunes de "ruido" con una lista de palabras prohibidas. – teabot

+0

@teabot, sí, lidiar con las palabras irrelevantes es importante, pero no debería hacerse hasta que estas palabras hayan servido para otros propósitos. Por ejemplo, si tiene la intención de etiquetar POS el texto de entrada, se requerirán palabras irrelevantes. Incluso sin las técnicas POS-tagging, más simples pueden hacer uso de estas palabras ruidosas para inferir límites de expresión, etc. – mjv

+0

@Kimvais, proporcione más antecedentes sobre el propósito de la gran 'lista de etiquetas'. ¿Es solo para indexar el texto, es para proporcionar una forma de crear nubes de etiquetas, es un paso hacia la categorización de los documentos subyacentes, etc.? Con esta información adicional, los colaboradores de SO podrán responder mejor a esta búsqueda relativamente amplia.Podría ser que todo lo que necesita es Swish-e como lo insinúa la heferav, o podría ser que necesite más sugerencias e ideas sobre cómo adaptar diversas prácticas de PNL para atender una necesidad específica (sin necesariamente "reinventar la rueda"). – mjv

Respuesta

34

Antes que nada, intente conservar la información sobre "límites" que se encuentra en el texto de entrada.
(si dicha información no ha fácilmente ser perdido, su pregunta implica que tal vez la tokenización fácilmente se ha hecho)
Durante la tokenización (palabra de análisis, en este caso) de procesos, buscar patrones que pueden definir límites de expresión (como la puntuación, particularmente los períodos, y también la separación múltiple LF/CR, úselas. También palabras como "the", a menudo se pueden usar como límites. Tales límites de expresión son típicamente "negativos", en el sentido de que separan dos token las instancias que están seguras de no se incluyen en la misma expresión. Algunos límites positivos son comillas, particularmente comillas dobles. Este tipo de información puede ser útil para filtrar algunos de los n-grams (consulte el siguiente párrafo). Secuencias de palabras como "por ejemplo e "o" en lugar de "o" necesidad "también se pueden usar como límites de expresión (pero el uso de dicha información está disminuyendo el uso de" antecedentes ", que analizaré más adelante).

Sin utilizar datos externos (distintos del texto de entrada), puede tener un éxito relativo con esto ejecutando estadísticas sobre digramas del texto y trigramas (secuencia de 2 y 3 palabras consecutivas). Entonces [la mayoría] de las secuencias con un número significativo (*) de instancias probablemente será el tipo de "expresión/frases" que está buscando.
Este método algo crudo dará algunos falsos positivos, pero en general puede ser viable. Habiendo filtrado los n-grams conocidos para cruzar "límites" como se insinuaba en el primer párrafo, puede ayudar significativamente porque en los lenguajes naturales la oración finalizada y el comienzo de la oración tienden a dibujarse desde un subconjunto limitado del espacio del mensaje y por lo tanto producen combinaciones de token que pueden parecen estar estadísticamente bien representados, pero que típicamente no están semánticamente relacionados.

Mejores métodos (posiblemente más caros, procesamiento y diseño/inversión), harán que el uso de "priores" adicionales sea relevante para el dominio y/o los idiomas nacionales del texto de entrada.

  • POS (Part-Of-Speech) tagging es bastante útil, de varias maneras (proporciona adicionales, límites de expresión más objetivos, y también palabras de "ruido" clases, por ejemplo, todos los artículos, incluso cuando se utiliza en el contexto de las entidades suelen ser de poco en la etiqueta nubes de tal manera que el PO quiere producir.
  • Diccionarios, léxicos y similares pueden ser muy útiles también. en particular, éstos que identifican las "entidades" (también conocido casos en WordNet jerga) y sus formas alternativas. las entidades son muy importante para las nubes de etiquetas (aunque no son la única clase de palabras que se encuentran en ellas), y al identificarlas, también es posible normalizarlas (los muchos ex pressions que se pueden usar para decir, "Senador T. Kennedy"), por lo tanto eliminar duplicados, pero también aumentar la frecuencia de las entidades subyacentes.
  • si el corpus está estructurado como una colección de documentos, puede ser útil usar varios trucos relacionados con la TF (frecuencia de los términos) y la IDF (frecuencia inversa de documento)

[Lo siento, tengo que ir, por ahora (además, desea obtener más detalles de sus objetivos específicos, etc.). Voy a tratar de dar más detalles y posteriores pointes]

[Por cierto, quiero conectar aquí respuestas Jonathan Feinberg y Dervin THUNK de este post, ya que proporcionan excelentes punteros, en términos de métodos y herramientas para la tipo de tarea a mano. En particular, NTLK y Python-en-grande proporcionan un marco excelente para experimentar]

0

Haz una matriz de palabras. Luego, si hay dos palabras consecutivas, agregue una a esa celda apropiada.

For example you have this sentence. 

mat['for']['example'] ++; 
mat['example']['you'] ++; 
mat['you']['have'] ++; 
mat['have']['this'] ++; 
mat['this']['sentence'] ++; 

Esto le dará valores para dos palabras consecutivas. También puede hacer esta palabra tres palabras. Tenga cuidado con esto requiere O (n^3) memoria.

También puede utilizar una pila para almacenar los datos como:

heap['for example']++; 
heap['example you']++; 
11

me gustaría empezar con un capítulo maravilloso, por Peter Norvig, en el libro de O'Reilly Beautiful Data. Él proporciona los datos de ngram que necesitará, junto con el hermoso código de Python (que puede resolver sus problemas tal como están, o con alguna modificación) on his personal web site.

+1

Es un gran capítulo, vale la pena leerlo, lo sé desde que estoy en los agradecimientos. :-) Pero no aborda directamente la pregunta publicada. (Creo que mi respuesta sí). De qué se trata es el * tipo * de cosas que puede hacer con las estadísticas de n-gramas de un corpus de texto, y cómo, con ejemplos como la corrección ortográfica, la solución de criptogramas y la segmentación de palabras agrupadas sin espacios. –

+0

Sí, pero al usar los datos del ngrama enlazado, puede pasar rápidamente por su conjunto de datos y extraer ngrams significativos. –

+0

Parece que Kimvais ya ha computado los datos de n-gramas de su propio conjunto de datos y está preguntando cómo usar los datos para distinguir las secuencias de palabras que aparecen significativamente más a menudo que por casualidad. –

0

Una forma sería para construir usted mismo un autómata. muy probablemente un autómata finito no determinista (NFA). NFA

Otra forma más sencilla sería la creación de un archivo que tiene contiene las palabras y/o grupos de palabras que desea ignorar, buscar, comparar, etc., y almacenarlos en la memoria cuando se inicia el programa y luego se puede comparar el archivo que está analizando con los grupos de palabras/palabras que están contenidos en el archivo.

7

Parece que está buscando collocation extraction. Manning and Schütze dedicar un chapter al tema, explicando y evaluando las 'fórmulas propuestas' mencionadas en el artículo de Wikipedia al que me he vinculado.

No puedo incluir todo el capítulo en esta respuesta; con suerte, algunos de their links ayudarán. (NSP suena especialmente apropiado.) Nltk también tiene un collocations module, no mencionado por Manning y Schütze ya que su libro es anterior a él.

Las otras respuestas publicadas hasta ahora tratan con el procesamiento del lenguaje estadístico y n-grams de manera más general; las colocaciones son un subtema específico.

Cuestiones relacionadas