natural language algorithm nlp

algorithm - natural language processing pdf



Dado un gran conjunto de nombres de calles, ¿cuál es la forma más eficaz de comprobar si un texto contiene uno de los nombres de las calles del conjunto? (4)

Entonces, ¿tiene un documento y desea buscar si contiene alguna de su lista de nombres de calles?

Turbo Boyer-Moore es un buen punto de partida para hacerlo.

Aquí hay más información sobre turbo boyer moore

Pero, creo firmemente, tendrá que hacer algo con respecto a la organización de su lista de nombres de calles. debería haber algún acceso de compartimento, es decir, puede filtrar fácilmente los nombres de las calles:

Aquí un ejemplo: Nombre de la calle: Asia-Pacific-street

Puede acceder a su lista por: A (obteniendo un punto de partida para todos los que comienzan con A) AS (obteniendo un punto de partida para todos los que comienzan con un AS).

y así...

Creo que deberías tener muchos cubos para eso, al menos 26 (primera letra) * 26 (segunda letra)

más información sobre el cucharón

Tengo un problema interesante con el que necesito ayuda. Actualmente estoy trabajando en una función de mi programa y tropecé con estos problemas

  1. Tengo una gran lista de nombres de calles en Indonesia (> 100k filas) almacenados en la base de datos, cada nombre de la calle puede tener más de 1 palabra. Por ejemplo: "Sudirman", "Gatot Subroto" o "Jalan Asia Afrika" son todos nombres legítimos de calles

  2. Tengo un montón de textos (> 1 millón de filas) en las bases de datos, que dividí en oraciones. Ahora, las características (funcionan para ser exactas) que necesito hacer, es probar si hay nombres de calles dentro de las oraciones, por lo que solo una prueba de verdadero / falso

    Intenté resolverlo siguiendo estos pasos:

a. Poniendo los nombres de las calles en una clave, valor hash

segundo. Divida cada oracion en palabras

do. Prueba si las palabras están en el hash

Esto es rápido, pero no funcionará con varias palabras

Otra alternativa que pensé es hacer estos pasos:

a. Divida cada oracion en palabras

segundo. Consulta la base de datos con la instrucción LIKE (i, e. SELECT #### FROM street_table WHERE name like ''% word%'')

do. Si la consulta devolvió una fila, significa que la oración contiene nombres de calles

Ahora, esta solución va a ser muy intensiva en IO.

Entonces mi pregunta es "¿Cuál es la forma más eficiente de hacer esta prueba"? independientemente del lenguaje de programación. Hago esto en Python principalmente, pero cualquier lenguaje funcionará siempre que pueda captar los conceptos

============ EDITAR 1 =================

¿Será esto periódico?

Sí, llamaré a esta función / función con un intervalo de 1 minuto. Cada llamada tomará 100 filas de textos como mínimo y las comparará con la base de datos de nombres de calles


Una solución simple sería crear un diccionario / multimap con first-word-of-street-name => full-street-name (s). Cuando repites cada palabra en tu oración, buscarás los posibles nombres de las calles y verificaras si tienes una coincidencia (mirando las siguientes palabras).

Este algoritmo debería ser bastante fácil de implementar y debería funcionar bastante bien también.


Usando nlp, puedes determinar el nombre propio en una oración. Por favor, consulte el siguiente enlace.

http://nlp.stanford.edu/software/lex-parser.shtml

El analizador de Standford es preciso en su cálculo. Una vez que tienes el nombre propio, puedes decidir el enfoque a seguir.


El algoritmo de Aho-Corasick podría ser bastante útil. Una de sus ventajas es que su tiempo de ejecución es independiente de la cantidad de palabras que está buscando (solo por cuánto tiempo está buscando el texto). Será especialmente útil si su lista de nombres de calles no cambia con frecuencia.

http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm