2009-06-23 19 views
16

Quiero implementar algunas aplicaciones con n-grams (preferiblemente en PHP).N-grams: Explicación + 2 aplicaciones


¿Qué tipo de n-grams es más adecuado para la mayoría de los propósitos? ¿Un nivel de palabra o un nivel de personaje n-gramo? ¿Cómo podría implementar un n-gram-tokenizer en PHP?


En primer lugar, me gustaría saber qué son exactamente los N-grams. ¿Es esto correcto? Es la forma en que entiendo n-grams:

Frase: "Vivo en Nueva York".

Bigramas nivel de la palabra (2 para N): "# I', "Vivo", "vivir", "en NY", 'NY #'

Bigramas nivel de personaje (2 para n): "#I", "I #", "#l", "li", "iv", "ve", "e #", "#i", "in", "n #", "#N", "NY", "y #"

Cuando se tiene este conjunto de n-gram-partes, que deje caer los duplicados y agregar un contador para cada parte dando la frecuencia: bigramas nivel

palabras: [1 , 1, 1, 1, 1]

nivel de personaje bigrams: [2, 1, 1, ...]

¿Es esto correcto?


Por otra parte, me gustaría aprender más acerca de lo que puede hacer con n-gramas:

  • ¿Cómo puedo identificar el lenguaje de un texto usando n-gramas?
  • ¿Es posible hacer la traducción automática utilizando n-grams, incluso si no tiene un corpus bilingüe?
  • ¿Cómo puedo crear un filtro de correo no deseado (spam, ham)? ¿Combina n-grams con un filtro bayesiano?
  • ¿Cómo puedo hacer detección de temas? Por ejemplo: ¿hay un texto sobre baloncesto o perros? Mi enfoque (haga lo siguiente con un artículo de Wikipedia para "perros" y "baloncesto"): construya los vectores n-gram para ambos documentos, normalícelos, calcule la distancia Manhattan/Euclidian, cuanto más cerca esté el resultado de 1, mayor será el similitud

¿Qué opinas sobre mis enfoques de aplicación, especialmente el último?


Espero que me puedas ayudar. ¡Gracias por adelantado!

+0

Hay una biblioteca PHP que hace eso por usted: https://packagist.org/packages/drupol/phpngrams –

Respuesta

23

Word n-grams generalmente será más útil para la mayoría de las aplicaciones de análisis de texto que mencione con la posible excepción de la detección de idioma, donde algo como los trigramas de caracteres podrían dar mejores resultados. Efectivamente, crearía un vector n-gramo para un corpus de texto en cada idioma que le interesa detectar y luego compararía las frecuencias de los trigramas en cada corpus con los trigramas del documento que está clasificando. Por ejemplo, el trigram the probablemente aparece mucho más frecuentemente en inglés que en alemán y proporcionaría algún nivel de correlación estadística. Una vez que tenga sus documentos en formato n-gram, tiene la opción de elegir entre muchos algoritmos para análisis posteriores, Baysian Filters, N-Neighbor Nearest, Support Vector Machines, etc.

De las aplicaciones que menciona, la traducción automática es probablemente el más inverosímil, ya que n-gramas por sí solo no te llevará muy lejos en el camino. La conversión de un archivo de entrada a una representación de n-gramas es solo una forma de poner los datos en un formato para análisis de características adicionales, pero como se pierde mucha información contextual, puede que no sea útil para la traducción.

Una cosa a tener en cuenta, es que no es suficiente crear un vector [1,1,1,2,1] para un documento y un vector [2,1,2,4] para otro documento, si las dimensiones no coinciden. Es decir, la primera entrada en el vector no puede ser the en un documento y is en otro o los algoritmos no funcionarán. Terminará con vectores como [0,0,0,0,1,1,0,0,2,0,0,1], ya que la mayoría de los documentos no contendrán la mayoría de los n-grams que le interesen. Este 'revestimiento 'arriba' de características es esencial, y requiere que usted decida 'por adelantado' qué ngrams incluirá en su análisis. A menudo, esto se implementa como un algoritmo de dos pasos, para decidir primero la significación estadística de varios n-grams para decidir qué conservar. Google 'selección de funciones' para más información.

Basado en Word n-grams plus Soporta Vector Machines de forma excelente para realizar detección de temas, pero necesita un gran corpus de texto precategorizado en 'sobre el tema' y 'fuera del tema' para entrenar al clasificador. Encontrará una gran cantidad de artículos de investigación que explican varios enfoques de este problema en un sitio como citeseerx. No recomendaría el enfoque de distancia euclidiana para este problema, ya que no pesa n-grams individuales según la significación estadística, por lo que dos documentos que incluyen the, a, is y of se considerarían una mejor coincidencia que dos documentos que ambos incluidos Baysian. Eliminar las palabras de parada de tus n-grams de interés mejoraría esto de alguna manera.

+0

¡Muchas gracias por esta respuesta detallada! Todavía tengo una última pregunta: ¿Cuál es la ventaja de los n-grams para los vectores sobre las palabras simples para los vectores? Quiero decir: ¿Por qué debería dividir "Vivo en NY" en "Vivo, vivo en NY" en lugar de simplemente "Yo, vivo, en NY"? – caw

+4

Usar palabras como características equivale a n-gramas basados ​​en palabras con n = 1. La ventaja de aumentar n es aumentar el contexto en sus funciones. por ejemplo, saber que dos documentos incluyen el n-gram "The Who" podría ser más útil que saber que ambos incluyen "The" y "Who" por separado. – bdk

+0

Gracias! :) Ahora está claro ... – caw

2

Usted está en lo correcto acerca de la definición de n-grams.

Puede usar n-gramas de nivel de palabra para aplicaciones de tipo de búsqueda. Los n-grams de nivel de personaje se pueden usar más para analizar el texto en sí. Por ejemplo, para identificar el idioma de un texto, usaría las frecuencias de las letras en comparación con las frecuencias establecidas del idioma. Es decir, el texto debe coincidir aproximadamente con la frecuencia de aparición de letras en ese idioma.

Una n-gram tokenizer de palabras en PHP se puede hacer usando strtok:

http://us2.php.net/manual/en/function.strtok.php

Para los caracteres utilizan dividida:

http://us2.php.net/manual/en/function.str-split.php

a continuación, puedes dividir la matriz como le gustaría tener cualquier cantidad de n-grams.

Los filtros Bayesianos deben estar capacitados para su uso como filtros de correo no deseado, que se pueden usar en combinación con n-grams. Sin embargo, necesita darle suficiente información para que aprenda.

Su último enfoque suena decente en cuanto al aprendizaje del contexto de una página ... sin embargo, esto todavía es bastante difícil de hacer, pero n-grams suena como un buen punto de partida para hacerlo.

+0

Gracias.Creo que strtok es demasiado simple para una buena tokenización ya que tendrías que agregar muchos tokens como: espacio, coma, punto, guión bajo, corchetes, etc. Pero el primer párrafo, los casos de uso, es realmente útil. ¡Gracias! :) – caw