2012-03-15 8 views
8

Mi proyecto de aplicación Web actual exige un poco de la PNL:PNL básico en CoffeeScript o JavaScript: tokenización de Punkt, modelos de Bayes entrenados simples: ¿por dónde empezar?

  • texto Tokenización en oraciones, a través de Punkt y similares;
  • El desglose de las frases más largas de oración subordinada (a menudo está en comas, excepto cuando no lo es)
  • Un ajuste del modelo bayesiano para fragmentar los párrafos con un incluso sentir, no hay huérfanos o viudas y escisiones incómodas mínimas (quizás)

... que gran parte de eso es una tarea infantilmente fácil si tienes NLTK - lo que hago, más o menos: el backend de la aplicación es Django en Tornado; pensarías que hacer estas cosas no sería un problema.

Sin embargo, tengo que proporcionar de forma interactiva los comentarios del usuario para los que se necesitan los tokenizadores, así que tengo que hacer tokenizar los datos del lado del cliente.

Ahora mismo, en realidad soy usando NLTK, a través de una llamada REST API a un proceso Tornado que ajusta la función NLTK y poco más. Por el momento, cosas como latencia y concurrencia son obviamente subóptimas sin este servicio ad-hoc, por decirlo cortésmente. Creo que lo que debería hacer es ponerle manos a la obra en las versiones Coffee/Java de esta función, si no la voy a volver a implementar yo mismo.

Y entonces, por lo que he visto, JavaScript no se ha considerado genial el tiempo suficiente para haber acumulado la biblioteca de propósito general schmorgasbörd no específica de la web que se puede encontrar en C o Python (o incluso Erlang). NLTK por supuesto es un proyecto destacado por la medida de Anyones, pero solo necesito un pequeño porcentaje de lo que está empacando.

Pero lo que ahora estoy en una encrucijada - Tengo que doblar en cualquiera de los dos:

  • El “aprendizaje científico técnica de ajuste JavaScript para reimplementar algoritmos Soy amigos de Facebook con al mejor” plan, o:
  • Lo menos interesante pero más determinísticamente posible "conformarse con tokenizar por cable, pero sobrecompensar por la escasez de velocidad y programación interesante: asegurar un UX libre de beachball al elevar una llamada de función a un modelo robusto de arquitectura de servicio a escala web , haciendo que Facebook se vea como la opción de Google+.

O algo completamente distinto. ¿Que debería hacer? Me gusta comenzar las cosas. Esta es mi pregunta. Estoy abierto a soluciones que impliquen un enfoque atípico: siempre que su recomendación no sea desagradable (por ejemplo, "use Silverlight") y/o un vórtice de tiempo (por ejemplo, "obtenga un doctorado en lingüística computacional, troglodita"), soy un juego. Gracias de antemano.

+0

Otra cosa que olvidé mencionar que podría tener en cuenta una solución JavaScripty del cliente: NLTK, al igual que otros modelos estadísticos que he encontrado, a menudo necesita sentarse encima de una pila gigante de datos de entrenamiento para trabajar (el tokenizador Punkt I ' m using tiene tal requerimiento) ... Podría estar equivocado al respecto (de hecho, sería bueno), pero entonces obvi una solución en la que el cliente tiene que d/la corpus no es posible aquí. – fish2000

Respuesta

3

Creo que, como escribió en el comentario, la cantidad de datos necesarios para ejecutar algoritmos eficientes eventualmente le impedirá hacer las cosas del lado del cliente. Incluso el procesamiento básico requiere muchos datos, por ejemplo, frecuencias de bigram/trigram, etc. Por otro lado, los enfoques simbólicos también necesitan datos significativos (reglas gramaticales, diccionarios, etc.). Según mi experiencia, no se puede ejecutar un buen proceso de PNL sin al menos 3 MB a 5 MB de datos, lo que creo que es demasiado grande para los clientes actuales.

Así que haría las cosas por el cable. Para eso, recomendaría un enfoque asincrónico/push, tal vez use Faye o Socket.io?Estoy seguro de que puede lograr un UX perfecto y fluido siempre y cuando el usuario no esté atascado mientras el cliente espera que el servidor procese el texto.

+0

De hecho, parece que es el camino a seguir. Gracias especialmente por recomendar a Faye, es algo que no había visto, pero parece ser una buena combinación para esto. – fish2000

3

Hay un procesamiento de lenguaje natural bastante agradable para node.js llamado natural. Actualmente no está diseñado para ejecutarse en el navegador, pero los autores have stated que desean corregirlo. La mayoría de ellos podría incluso funcionar, usando algo como browserify o Require.JS.

+1

Gracias por los consejos: sobre natural, que se ve como un buen paquete para mirar; y también browserify, del cual tampoco estaba enterado. – fish2000

1

Creo que debe implementar un servicio independiente, independiente del resto de su aplicación, que hace la mayor parte del trabajo pero puede enviar múltiples opciones al cliente dependiendo de lo que crea que el cliente escriba a continuación. Cuando leo sobre sus preguntas, pienso en la función de autocompletar búsqueda de sitios como Google, Quora y Yelp. Es posible que haya escrito solo 3 o 4 caracteres en el cuadro de búsqueda, pero estos servicios habrán enviado varias sugerencias de consulta en función de lo que creen que va a escribir a continuación. Si tokenizing texto dinámicamente, puede tener algún tipo de modelo de ngram (u otro modelo de lenguaje más sofisticado) ser capaz de adivinar cuándo va a terminar la frase y decirle al frontend qué hacer para los k futuros resultados más probables. Básicamente tienen un servicio backend que puede precomputar/almacenar en caché muchos resultados y tener un frontend semi-inteligente que puede verificar si el estado actual de la entrada del usuario coincide con los estados pronosticados enviados por el back-end unos 100 milisegundos antes y aparentemente instantáneamente haga lo correcto frente al cliente sin colgar su navegador tratando de hacer algunas acciones intensivas de memoria/computación ahí dentro.

Las dos opciones que ha presentado son
1) hacer del lado del cliente todo lo que podría ser rápido, pero muy complicado de hacer debido a la falta de bibliotecas existentes PNL js

2) que hacen del lado del servidor todo lo cual podría más fácil, pero hacer que su aplicación parece lag al usuario

les pido hacer

3) hacer del lado del servidor todo, pero pensando en el futuro unos pasos, y el envío de múltiples opciones para el cliente para que el el trabajo se realiza en un lugar donde es más fácil f o que lo hagas, pero el cliente siente que está sucediendo instantáneamente.

+0

¿Puede aclarar qué quiere decir con "múltiples opciones para el cliente"? Usó la frase dos veces; mi pregunta es acerca de la estrategia w/r/t dónde colocar la (s) llamada (s) de función NLP, pero en lo que respecta a mi implementación actual, las opciones para esas llamadas no han estado en cuestión. – fish2000

Cuestiones relacionadas