Red de conocimiento informático - Problemas con los teléfonos móviles - Cálculo de Tfidf y detalles del cálculo manual en sklearn

Cálculo de Tfidf y detalles del cálculo manual en sklearn

Introducción: El curso de minería de datos y almacenamiento de datos de esta semana asignó una tarea de curso de word2vec, que requiere que usted calcule manualmente el tfidf de cada palabra en el corpus y use sklearn para verificar los resultados de su cálculo. Sin embargo, los resultados del cálculo manual del blogger no pudieron corresponder con los resultados de sklearn en ningún caso. Después de consultar una gran cantidad de información sin éxito, tuvo que leer el código fuente y finalmente resolvió este problema con éxito.

Tarea:

(El cálculo de tf-idf está básicamente disponible en otros artículos en Internet, solo se proporciona la definición básica)

Introducción: TF - IDF (Term Frequency-InversDocument?Frequency) es una tecnología de ponderación comúnmente utilizada en el procesamiento de información y la extracción de datos. Esta técnica utiliza un método estadístico para calcular la importancia de una palabra en todo el corpus en función del número de veces que aparece la palabra en el texto y la frecuencia del documento en todo el corpus. Su ventaja es que puede filtrar palabras comunes pero irrelevantes y al mismo tiempo retener palabras importantes que afectan a todo el texto.

Pasos de cálculo:

1. Calcular TF

Introducción: TF es la abreviatura de Term Frequency, que es la frecuencia de aparición de palabras clave, es decir, cierta frecuencia con la que aparece la palabra en el artículo actual.

Fórmula de cálculo:

Frecuencia de palabras TF = número de veces que aparece una palabra en un artículo/número total de palabras en el artículo

Considerando que los artículos tienen diferentes longitudes, para facilitar la comparación de diferentes artículos, la "frecuencia de palabras" está normalizada.

Entre ellos, cuanto mayor es la frecuencia de una palabra en el texto, mayor es la frecuencia de la palabra.

2. Calcular IDF

Frecuencia inversa del documento (IDF). Calcular el IDF requiere un corpus que simule el contexto en el que se utiliza el idioma. La frecuencia del documento DF es la frecuencia con la que aparece una palabra en todo el diccionario del corpus. Por ejemplo, si hay 100 artículos en el conjunto de documentos y 10 de ellos contienen la palabra "aprendizaje automático", entonces su frecuencia de documentos es 10/100 = 0,1 y la frecuencia inversa de documentos IDF es el recíproco de este valor, que es 10.

Fórmula de cálculo:

IDF(N)=log (número total de documentos/número de documentos en los que aparece la palabra N)

Entre ellos, cuanto más común es la palabra, cuanto mayor es el denominador. Cuanto mayor es el valor, menor es la frecuencia del documento inverso y más cerca está de 0.

log significa realizar una operación logarítmica sobre el valor resultante.

3. Calcule TF-IDF = TF * IDF

(Los comentarios en el código fuente de sklearn se citan aquí, los lectores que no comprendan pueden usarlos directamente)

Creo que los resultados obtenidos por la mayoría de los amigos son los que se muestran en la figura anterior, que son muy diferentes de los resultados del cálculo manual. No sólo los resultados son diferentes, sino que incluso el recuento de palabras es inconsistente, lo cual es inaceptable. Entonces, ¿qué está pasando?

1. Cambie el parámetro de inicialización token_pattern=r"(?u)\b\w \b" de CountVectorizer

2. Cambie el parámetro de inicialización norm=None y smooth_idf=False para TfidfTransformer.

3. Cambie el cálculo manual de IDF: de lg (basado en 10) a ln (basado en e)

Después de los pasos anteriores, el tfidf calculado manualmente y el tfidf calculado por el programa son lo mismo.

Comencemos con el código fuente

Los comentarios en el código fuente explican token_pattern

Mi entendimiento personal es que el identificador de vocabulario predeterminado cuando se inicializa la clase CountVectorizer carácter en el formato r"(?u)\b\\\\/w\\b", que es una cadena de dos caracteres, lo que da como resultado que "(?u)\b\w\\" aparezca en el título original b". Esta es una cadena de más de dos caracteres, lo que da como resultado que "I", "él", "had" y "Ü" falten en el título original, ¡lo cual es el culpable de la falta de coincidencia en la cantidad de palabras que tenemos! Como todos son caracteres únicos, podemos cambiar la forma aceptada de esta clase a caracteres únicos (r"(?u)\b\w \b").

La parte explicativa de la especificación y la parte explicativa de smooth_idf en el código fuente

La especificación es fácil de entender y sklearn realizará automáticamente la regularización l2 por nosotros, por lo que nuestros resultados son diferentes a los suyos. . Entonces, siempre que no se utilice la regularización (norm=None)

Entonces, ¿qué sucede con smooth_idf a continuación? (La diversa información en Internet aquí es simplemente un gran premio por el comportamiento confuso. La copié una y otra vez y es toda ambigua)

En primer lugar, debemos recordar que la definición más básica ¡De idf es lo que está escrito en el artículo anterior!

Entonces, ¿son correctas las otras definiciones de IDF? Por ejemplo, idf = log(N 1/ N(x) 1) y varias transformaciones de esta ecuación.

Si estás usando smooth_idf, entonces la ecuación anterior es correcta.

Entonces, ¿qué es smooth_idf? Por ejemplo:

En realidad, coloca todas las apariciones de una palabra en un artículo recién generado, asegurando que la definición inicial de idf El denominador no sea 0.

En realidad, este es un problema bastante confuso. sklearn usa la función logarítmica en la biblioteca numpy, que es la función ln. En el código fuente, todos los cálculos usan numpy.log(), lo que nuevamente conduce a esto. llevarnos a resultados completamente diferentes a los del programa.

Aunque en retrospectiva, este no es un problema muy difícil, pero debido a la necesidad de cambiar múltiples parámetros, e incluso a la necesidad de cambiarse ellos mismos, junto con el hecho de que algunos blogueros basura simplemente lo copian sin información. No hice ninguna investigación profunda, lo que resultó en que no pude encontrar un blog que abordara este tema y terminé resolviéndolo yo mismo. Aunque es una pérdida de tiempo, vale la pena. Espero que sea útil para otros estudiantes que tienen problemas con este problema.