2010-01-07 19 views
6

Lo siento, si mi pregunta suena estúpida :) ¿Me puede recomendar cualquier pseudocódigo o buen algoritmo para la implementación de LSI en Java? No soy experto en matemáticas. Traté de leer algunos artículos en wikipedia y otros sitios web sobre LSI (indexación semántica latente) que estaban llenos de matemáticas. Sé que LSI está lleno de matemáticas. Pero si veo algún código fuente o algo. Entiendo las cosas más fácilmente. Es por eso que pregunté aquí, ¡porque hay tantos GURU aquí! Gracias de antemanoNecesita ayuda en la indexación semántica latente

+2

Duplicado: http://stackoverflow.com/questions/1746568/latent-semantic-indexing-in-java –

+0

Gracias Amit, pero si lees mi pregunta. Entonces es diferente. Incluso si crees que es lo mismo, entonces no puedes encontrar una buena respuesta allí :) – user238384

+0

¿Siempre tenemos que reducir la dimensión en lsa? ¿Podemos simplemente usar la matriz v para encontrar la similitud entre los documentos y la matriz u para encontrar la similitud entre los términos? – CTsiddharth

Respuesta

1

Esto tal vez un poco tarde, pero siempre me ha gustado el blog de Sujit Pal http://sujitpal.blogspot.com/2008/09/ir-math-with-java-tf-idf-and-lsi.html y he escrito un poco en mi sitio si está interesado.

El proceso es mucho menos complicado de lo que suele escribirse. Y realmente todo lo que necesita es una biblioteca que pueda hacer una descomposición de valor único de una matriz.

Si usted está interesado puedo explicar en un par de los cortos quitar los trozos:

1) se crea una matriz/base de datos/etc con el número de palabras de varios documentos - los diferentes documentos serán sus columnas y las filas las distintas palabras.

2) Una vez que haya creado la matriz, utilice una biblioteca como Jama (para Java) o SmartMathLibrary (para C#) y ejecute la descomposición del valor único. Todo lo que hace es tomar su matriz original y dividirla en tres partes/matriz diferentes que esencialmente representan sus documentos, sus palabras y un tipo de multiplicador (sigma). Estos se llaman vectores.

3) Una vez que tenga su palabra, documento, sigma vectores, los encogerá por igual (k) simplemente copiando partes más pequeñas del vector/matriz y luego multiplíquelos nuevamente. Al reducirlos, normaliza sus datos y esto es LSI.

aquí están algunos recursos bastante claras:

http://puffinwarellc.com/index.php/news-and-articles/articles/30-singular-value-decomposition-tutorial.html

http://lsa.colorado.edu/papers/JASIS.lsi.90.pdf http://www.soe.ucsc.edu/classes/cmps290c/Spring07/proj/Flynn_talk.pdf

Esperanza ayuda esto un poco.

Eric

+0

Hola, aprendí mucho mientras tanto. Pero aún así tu respuesta es muy útil +1. Vi sujit pall blog también. Está bien, pero no estoy de acuerdo con sus resultados. Le pregunté cuándo no hay similitud de contexto entre dos documentos por qué dice 100% mismo. Él no pudo responderlo. Ahora estoy buscando cómo puedo usar LDA que no sea LSI. ¿Es posible usar LDA para este propósito ??? – user238384

13

Una idea de la LSA se basa en una suposición: los más de dos palabras aparecen en los documentos mismos, más similares son. De hecho, podemos esperar que las palabras "programación" y "algoritmo" ocurran en los mismos documentos mucho más a menudo que, por ejemplo, "programación" y "crianza de perros".

Lo mismo para los documentos: las palabras más comunes/similares que tienen dos documentos, los más similares son. Entonces, puede expresar similitud de documentos por frecuencias de palabras y viceversa.

Sabiendo esto, podemos construir una matriz de co-ocurrencia , donde los nombres de columna representan documentos, nombres de fila - palabras y cada cells[i][j] representa la frecuencia de la palabra en el documento words[i]documents[j]. La frecuencia se puede calcular de muchas maneras, IIRC, LSA original usa el índice tf-idf.

Al tener dicha matriz, puede encontrar la similitud de dos documentos comparando las columnas correspondientes.¿Cómo compararlos? Nuevamente, hay varias formas. El más popular es coseno distancia. Debe recordar de las matemáticas de la escuela, que la matriz puede tratarse como un conjunto de vectores, por lo que cada columna es solo un vector en un espacio multidimensional. Es por eso que este modelo se llama "Vector Space Model". Más sobre VSM y la distancia del coseno here.

Pero tenemos un problema con dicha matriz: es grande. Muy muy grande. Trabajar con él es demasiado costoso desde el punto de vista computacional, por lo que tenemos que reducirlo de alguna manera. LSA usa la técnica SVD para mantener los vectores más "importantes". Después de la reducción, la matriz está lista para usar.

Por lo tanto, el algoritmo de LSA se verá algo como esto:

  1. Collect todos los documentos ytodas las palabras únicas de ellos.
  2. extracto información de frecuencia y compilación co-ocurrencia matriz.
  3. Reduce matriz con SVD.

Si vas a escribir biblioteca LSA por sí mismo, el buen punto de partida es Lucene motor de búsqueda, lo que hará mucho más fácil los pasos 1 y 2, y algunos aplicación de las matrices de alta dimensión con capacidad de SVD como Parallel Colt o UJMP.

También preste atención a otras tecnologías, que crecieron de LSA, como Random Indexing. RI usa la misma idea y muestra aproximadamente los mismos resultados, pero no usa la etapa de matriz completa y es completamente incremental, lo que lo hace mucho más eficiente desde el punto de vista informático.

+0

Hola, he estado trabajando en lsa últimamente. Siempre tenemos que reducir las dimensiones de la matriz diagonal. Mi necesidad es encontrar la similitud entre dos documentos. ¿Está bien si tomo la matriz v sola y la uso para encontrar la similitud? Leí este enfoque en este documento: http://www.miislita.com/information-retrieval-tutorial/svd-lsi-tutorial-4-lsi-how-to-calculations.html – CTsiddharth

+0

@CTsiddharth: si no quiere reducir su dimensionalidad, no es necesario en absoluto SVD y, por lo tanto, la matriz 'V': puede usar la matriz original de documento de términos tal como está. Sin embargo, la reducción de dimensionalidad le brinda 2 grandes ventajas: 1) reduce el ruido; 2) hace que el cálculo de similitud de documentos sea mucho más rápido (menos elementos para comparar). Entonces, tiene sentido usar una matriz completa para corpora relativamente pequeños (digamos, <5000 documentos), para documentos más grandes se necesita una reducción de dimensionalidad completa (SVD + selección de k primeros vectores). – ffriend

+0

En mi caso, tengo 35 documentos y alrededor de 1500 palabras. Si hago un svd, la matriz v se convierte en 35 * 35. Entonces, ¿puedo usar esta matriz de 35 * 35 para encontrar la similitud en lugar de un 1500 * 35? esta ha sido una pregunta en la que he estado pensando desde hace un tiempo – CTsiddharth

1

Sé que es demasiado tarde :) Pero recientemente encontré this link bastante útil para comprender los principios. Solo anótelo para que las personas que lo busquen lo encuentren útil.

Actualmente, estoy buscando una introducción similar al análisis/indexación semántica probabilística latente. Menos matemáticas y más ejemplos que explican los principios que lo respaldan. Si alguien conoce dicha presentación, házmelo saber.

Cuestiones relacionadas