Red de conocimiento del abogados - Preguntas y respuestas jurídicas - Explicación detallada del cálculo y cálculo manual de tfidf en sklearn

Explicación detallada del cálculo y cálculo manual de tfidf en sklearn

Introducción: el curso de minería de datos y almacén de datos de esta semana asignó el trabajo del curso de word2vec. El requisito es calcular manualmente el tfidf de cada palabra en el corpus y usar 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 en sklearn de todos modos. Después de consultar una gran cantidad de información sin éxito, tuve que leer el código fuente yo mismo y finalmente resolví el problema con éxito.

Tarea:

(Los cálculos de Tf-idf están básicamente disponibles en otros artículos en Internet, aquí solo se dan las definiciones básicas)

Introducción: TF- IDF (Término Frecuencia-InversDocumento? Frecuencia) es una tecnología de ponderación comúnmente utilizada en el procesamiento de información y la extracción de datos. Esta tecnología 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 de aparición del documento en todo el corpus. Su ventaja es que puede filtrar algunas palabras comunes pero irrelevantes y al mismo tiempo conservar 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 una determinada palabra clave, que es, el léxico Con qué frecuencia aparece una 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 de este artículo

Teniendo en cuenta la extensión del artículo Para facilitar la comparación de diferentes artículos, la "frecuencia de palabras" está estandarizada.

Cuanto más frecuentemente aparece una palabra en el texto, mayor será el TF de la palabra.

2. Calcular IDF

El nombre completo en inglés es: Inverse Document Frequency, que significa "frecuencia de documento inversa". Calcular IDF requiere un corpus para simular el entorno de uso del lenguaje. La frecuencia del documento DF es la frecuencia con la que aparece una palabra en todo el diccionario de la biblioteca. Por ejemplo, si hay 100 artículos en un conjunto de documentos y 10 de ellos contienen la palabra "aprendizaje automático", entonces su frecuencia del documento es 10/100 =. 0,1, la frecuencia inversa del documento 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)

Si una palabra es más común, entonces cuanto mayor es el denominador, menor es la frecuencia inversa del documento y más cerca está de 0.

Logaritmo significa tomar el logaritmo del valor obtenido.

3. Calcule TF-IDF=TF*IDF

(El siguiente es un comentario en el código fuente de sklearn, que puede ayudar a los lectores que no lo entienden a usarlo directamente)

Creo que la mayoría de mis amigos también obtendrán los resultados de la imagen de arriba, que es muy diferente de los resultados del cálculo manual. No sólo los resultados son diferentes, sino que el número de palabras ni siquiera es el mismo, lo cual es realmente inaceptable.

Entonces, ¿qué está pasando exactamente?

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, smooth_idf=False de TfidfTransformer

3. Cambie el método de cálculo manual del IDF: de lg (base 10) a ln (base e)

Después de los pasos anteriores, el tfidf calculado manualmente es el Igual que el tfidf calculado por el programa, entonces, ¿por qué ocurre tal problema?

Comencemos con el código fuente

La sección de comentarios en el código fuente explica token_pattern así

Comprensión personal: la clase CountVectorizer utilizará de forma predeterminada el reconocimiento de vocabulario forma r cuando se inicializa "(?u)\\b\\w\\w+\\b", esta es una cadena de más de dos caracteres, que da como resultado "I", "him", "Le", ". Yu" en la pregunta original "está perdido, ¡este es el culpable que causa el desajuste en la cantidad de nuestro vocabulario! Debido a que son caracteres únicos, podemos cambiar la forma de aceptación de esta clase a caracteres únicos ( r"(?u)\b\w+\b" ).

La parte de explicación de la norma en el código fuente y la parte de explicación de smooth_idf

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

¿Qué pasa con el smooth_idf a continuación? (La diversa información que hay en Internet aquí es simplemente una recompensa por un comportamiento confuso. La copio aquí y allá y no queda nada claro)

En primer lugar, debemos tener en cuenta que la definición más básica de ¡idf es la definición escrita en el artículo! ! !

¿Son correctas las otras definiciones de IDF? Por ejemplo, idf = log(N + 1/ N(x) + 1), ¿y varias variaciones de esta fórmula?

Si usas smooth_idf, entonces la fórmula anterior es correcta.

Entonces, ¿qué es smooth_idf, por ejemplo?

De hecho, todas las palabras que han aparecido se colocan en un artículo recién generado para garantizar que el denominador en la definición inicial de idf sea no es 0.

De hecho, este es un problema muy problemático. Sklearn usa la función de registro en la biblioteca numpy. Esta función es la función ln. Todos los cálculos en el código fuente usan numpy.log (). a que nuestros resultados sean completamente diferentes al procedimiento.

Aunque este problema no es muy difícil en retrospectiva, se debe a que este problema requiere cambiar varios parámetros e incluso cambiarse a sí mismo, y también porque algunos bloggers de spam solo plagian y no estudian en profundidad en absoluto. Como resultado, no pude encontrar un blog que resolviera este problema en absoluto y al final tuve que resolverlo yo mismo. Aunque se pierde mucho tiempo, vale la pena. Espero que sea útil para otros estudiantes que tienen problemas con este problema.