Pregunta

Busco una clase Java simple que puede calcular cálculo TF-IDF. Quiero hacer prueba de similitud en 2 documentos. He encontrado tantos API BIG que utiliza la clase TF-IDF. No quiero usar un archivo frasco grande, sólo para hacer mi prueba sencilla. Por favor ayuda ! O atlest si alguien puede decirme cómo encontrar TF? y la FIL? Voy a calcular los resultados :) O Si usted me puede decir un buen tutorial de java para esto. Por favor, no me diga por mirar Google, ya que hice durante 3 días y no podía encontrar cualquier cosa :( Por favor no me referirse a Lucene: (

¿Fue útil?

Solución

frecuencia de los términos es la raíz cuadrada del número de veces que ocurre un término en un documento en particular.

Invertir Documento de frecuencia es (el logaritmo de (el número total de documentos dividido por el número de documentos que contienen el término)) más uno en caso de que el término aparece cero veces - si lo hace, obviamente, no tratar de dividir por cero.

Si no está claro a partir de esta respuesta, no es un TF por trimestre por cada documento, y un IDF por trimestre.

Y luego TF-IDF (plazo, documento) = TF (plazo, documento) * IDF (temporales)

Por último, se utiliza el modelo de espacio vectorial para comparar documentos, donde cada término es una nueva dimensión y la "longitud" de la parte del vector que apunta en esa dimensión es el cálculo TF-IDF. Cada documento es un vector, por lo que calcular los dos vectores y luego calcular la distancia entre ellos.

Así que para hacer esto en Java, lee el archivo en una línea a la vez con un FileReader o algo así, y se divide en espacios o cualesquiera otros delimitadores que desea utilizar - cada palabra es un término. Contar el número de veces que aparece cada término en cada archivo, y el número de archivos aparece en cada término. Luego de que tiene todo lo que necesita hacer los cálculos anteriores.

Y ya no tengo nada más que hacer, busqué la fórmula de la distancia del vector. Aquí van:

D=sqrt((x2-x1)^2+(y2-y1)^2+...+(n2-n1)^2)

Para este propósito, x1 es el TF-IDF para el término de x en el documento 1.

Edit: en respuesta a una pregunta sobre cómo contar las palabras en un documento:

  1. Leer el archivo en línea por línea con un lector, como new BufferedReader(new FileReader(filename)) -. Puede llamar BufferedReader.readLine() en un bucle while, la comprobación de cero cada vez
  2. Para cada línea, llame line.split("\\s") - que va a dividir la línea en el espacio en blanco y le dará una variedad de todas las palabras
  3. .
  4. Para cada palabra, añadir 1 a la cuenta de la palabra para el documento actual. Esto podría hacerse utilizando un HashMap.

Ahora, después de calcular D para cada documento, tendrá valores de X, donde X es el número de documentos. Para comparar todos los documentos uno contra el otro es hacer sólo X ^ 2 comparaciones - esto no debería tener particularmente largo de 10.000. Recuerde que los dos documentos son más similares si el valor absoluto de la diferencia entre sus valores D es menor. Así que entonces se podría calcular la diferencia entre la DS de cada par de documentos y almacenar que en una cola de prioridad o alguna otra estructura ordenada de tal manera que la burbuja de los documentos más similar a la cima. ¿Tener sentido?

Otros consejos

agazerboy, Sujit de Pal entrada de blog da una descripción detallada del cálculo del TF y la FIL. WRT verificar los resultados, sugieren que se inicia con un pequeño corpus (digamos 100 documentos) para que pueda ver fácilmente si estás en lo correcto. Por 10000 documentos, utilizando Lucene comienza a parecer una opción muy racional.

Mientras que pidió específicamente que no se refieren Lucene, por favor, permítanme señalar que a la clase exacta. La clase que busca es DefaultSimilarity . Tiene una API muy sencilla para calcular TF y FDI. Ver el código java aquí . O simplemente puede aplicar a sí mismo como se especifica en la documentación DefaultSimilarity.

          TF = sqrt(freq)

y

          IDF = log(numDocs/(docFreq+1)) + 1.

El registro y funciones sqrt se utilizan para amortiguar los valores reales. Usando los valores en bruto puede sesgar los resultados de manera espectacular.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top