2011-07-06 13 views
17

He estado mirando la etiqueta nlp en SO durante las últimas horas y estoy seguro de que no me perdí nada, pero si lo hiciera, por favor síganme a la pregunta.¿Cuáles son algunas buenas formas de estimar la similitud semántica "aproximada" entre oraciones?

Mientras tanto, describiré lo que estoy tratando de hacer. Una noción común que observé en muchos mensajes es que la similitud semántica es difícil. Por ejemplo, a partir de this posterior, la solución aceptada sugiere lo siguiente:

First of all, neither from the perspective of computational 
linguistics nor of theoretical linguistics is it clear what 
the term 'semantic similarity' means exactly. .... 
Consider these examples: 

Pete and Rob have found a dog near the station. 
Pete and Rob have never found a dog near the station. 
Pete and Rob both like programming a lot. 
Patricia found a dog near the station. 
It was a dog who found Pete and Rob under the snow. 

Which of the sentences 2-4 are similar to 1? 2 is the exact 
opposite of 1, still it is about Pete and Rob (not) finding a 
dog. 

Mi requisito de alto nivel es el de utilizar k-means clustering y categorizar el texto basándose en la similitud semántica así que todo lo que necesito saber es si son una coincidencia aproximada. Por ejemplo, en el ejemplo anterior, estoy de acuerdo con clasificar 1,2,4,5 en una categoría y 3 en otra (por supuesto, 3 se respaldarán con algunas oraciones más similares). Algo así como, encontrar artículos relacionados, pero no tienen que estar 100% relacionados.

Creo que necesito construir finalmente representaciones vectoriales de cada oración, algo así como su huella digital, pero exactamente lo que este vector debería contener sigue siendo una pregunta abierta para mí. ¿Son n-grams, o algo de wordnet o simplemente palabras derivadas individuales o algo completamente diferente?

This Hilo hizo un trabajo fantástico al enumerar todas las técnicas relacionadas, pero lamentablemente se detuvo justo cuando la publicación llegó a lo que quería. ¿Alguna sugerencia sobre cuál es el último estado de la técnica en esta área?

Respuesta

5

Latent Semantic Modeling podría ser útil. Básicamente es una aplicación más del Singular Value Decomposition. El SVDLIBC es una implementación de C muy bonita de este enfoque, que es un anticipo pero un regalo, e incluso hay un enlace de pitón en forma de sparsesvd.

+0

También se proporciona una implementación de Python de SVD para matrices dispersas en [scikit-learn] (http://scikit-learn.sourceforge.net/) como 'scikits.learn.utils.extmath.fast_svd'. –

2

Le sugiero que pruebe un marco de modelado de temas como Latent Dirichlet Allocation (LDA). La idea es que los documentos (en las oraciones de tu caso, que podrían ser un problema) se generan a partir de un conjunto de temas latentes (ocultos); LDA recupera esos temas y los representa mediante clústeres de palabras.

Un implementation of LDA in Python está disponible como parte del paquete gratuito de Gensim. Puede intentar aplicarlo a sus oraciones, luego ejecutar k -mediante su salida.

+0

Sí, creo que LDA está de moda ahora. –

Cuestiones relacionadas