what que grama gram php nlp analysis n-gram

php - what - que es n grama



N-grams: Explicación+2 aplicaciones (2)

Quiero implementar algunas aplicaciones con n-grams (preferiblemente en PHP).

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

Primero, me gustaría saber qué son exactamente los N-gramas. ¿Es esto correcto? Así es como entiendo n-grams:

Oración: "Vivo en NY".

Bigramas de nivel de palabra (2 para n): "# I ''," Vivo "," vivo en "," en NY ",'' NY # ''

bigramas a nivel de caracteres (2 para n): "#I", "I #", "#l", "li", "iv", "ve", "e #", "#i", "in", " n # "," #N "," NY "," Y # "

Cuando tiene esta matriz de partes de n-gramas, suelta las duplicadas y agrega un contador para cada parte que da la frecuencia:

Bigramas de nivel de palabra: [1, 1, 1, 1, 1]

Bigramas a nivel de personaje: [2, 1, 1, ...]

¿Es esto correcto?

Además, me gustaría aprender más sobre lo que puedes hacer con n-grams:

  • ¿Cómo puedo identificar el idioma de un texto usando n-grams?
  • ¿Es posible hacer la traducción automática usando n-grams incluso si no tiene un corpus bilingüe?
  • ¿Cómo puedo construir un filtro de spam (spam, jamón)? ¿Combinar n-gramas con un filtro bayesiano?
  • ¿Cómo puedo hacer la localización de temas? Por ejemplo: ¿Es un texto sobre baloncesto o perros? Mi enfoque (haga lo siguiente con un artículo de Wikipedia para "perros" y "baloncesto"): cree los vectores n-gramo para ambos documentos, normalícelos, calcule la distancia de Manhattan / Euclidiana, cuanto más cerca esté el resultado de 1, mayor será el resultado. semejanza

¿Qué piensas sobre los enfoques de mi aplicación, especialmente el último?

Espero que puedas ayudarme. ¡Gracias por adelantado!


Usted es correcto acerca de la definición de n-grams.

Puede utilizar n-gramas de nivel de palabra para aplicaciones de tipo de búsqueda. Los n-gramas de nivel de caracteres se pueden utilizar más para el análisis del 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.

Se puede hacer un tokenizador de n-gramo para palabras en PHP usando strtok:

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

Para caracteres utiliza split:

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

Luego, simplemente puede dividir la matriz como desee en cualquier número de n-gramos.

Los filtros bayesianos deben capacitarse para su uso como filtros de correo no deseado, que pueden usarse en combinación con n-grams. Sin embargo, necesitas darle mucha información para que aprenda.

Su último enfoque parece decente en lo que respecta al aprendizaje del contexto de una página ... Sin embargo, esto todavía es bastante difícil de hacer, pero n-grams parece ser un buen punto de partida para hacerlo.


Las n-gramas de la palabra generalmente serán más útiles para la mayoría de las aplicaciones de análisis de texto que mencionas, con la posible excepción de la detección del idioma, donde algo así como los trigramas de caracteres pueden dar mejores resultados. Efectivamente, crearía un vector n-gramo para un corpus de texto en cada idioma que le interese detectar y luego comparará las frecuencias de los trigramas en cada corpus con los trigramas en el documento que está clasificando. Por ejemplo, el trigrama 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-gramo, puede elegir entre muchos algoritmos para análisis adicionales, filtros Baysian, N- Vecino más cercano, máquinas de vectores de soporte, etc.

De las aplicaciones que mencionas, la traducción automática es probablemente la más descabellada, ya que n-grams solo no te llevará muy lejos en el camino. Convertir un archivo de entrada en una representación de n-gramas es solo una forma de poner los datos en un formato para un análisis de características adicional, pero como pierde mucha información contextual, puede no ser ú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 el las dimensiones no coinciden. Es decir, la primera entrada en el vector no puede estar 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-gramas que le interesan. Este ''forro La actualización 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 importancia estadística de varios n-gramas para decidir qué conservar. Google ''selección de características'' para más información.

Los n-gramas basados ​​en palabras más las máquinas de vectores de soporte son una forma excelente de realizar la localización de temas, pero necesita un gran corpus de texto previamente clasificado en "sobre tema" y "fuera de tema" para entrenar al clasificador. Encontrará una gran cantidad de trabajos de investigación que explican varios enfoques de este problema en un sitio como citeseerx . No recomendaría el enfoque de la distancia euclidiana a este problema, ya que no pesa n-gramas individuales en función de la significación estadística, por lo que dos documentos que incluyen the , a , is y se consideran una mejor coincidencia que dos documentos que ambos incluidos Baysian . Eliminar algo de las palabras de parada de tus n-gramas de interés mejoraría esto.