tutorial - text classification python
¿Cómo se supone que el Veteador TFIDF en scikit-learn funciona? (3)
Creo que su problema radica en el uso de diferentes listas de palabras prohibidas. Scikit-learn y NLTK usan diferentes listas de palabras prohibidas por defecto. Para scikit-learn, generalmente es una buena idea tener una lista stop_words personalizada pasada a TfidfVectorizer, por ejemplo:
my_stopword_list = [''and'',''to'',''the'',''of'']
my_vectorizer = TfidfVectorizer(stop_words=my_stopword_list)
Página de documento para la clase TfidfVectorizer: [ http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html][1]
Estoy tratando de obtener palabras que son distintivas de ciertos documentos utilizando la clase TfIDFVectorizer en scikit-learn. Crea una matriz de tfidf con todas las palabras y sus puntajes en todos los documentos, pero también parece contar palabras comunes. Este es parte del código que estoy ejecutando:
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(contents)
feature_names = vectorizer.get_feature_names()
dense = tfidf_matrix.todense()
denselist = dense.tolist()
df = pd.DataFrame(denselist, columns=feature_names, index=characters)
s = pd.Series(df.loc[''Adam''])
s[s > 0].sort_values(ascending=False)[:10]
Esperé que esto devuelva una lista de palabras distintivas para el documento ''Adam'', pero lo que hace es devolver una lista de palabras comunes:
and 0.497077
to 0.387147
the 0.316648
of 0.298724
in 0.186404
with 0.144583
his 0.140998
Puede que no lo entienda perfectamente, pero según lo entiendo, tf-idf debe encontrar palabras que son distintivas de un documento en un corpus, encontrar palabras que aparecen con frecuencia en un documento, pero no en otros documentos. Aquí, and
aparece con frecuencia en otros documentos, así que no sé por qué está devolviendo un alto valor aquí.
El código completo que estoy usando para generar esto está en este cuaderno Jupyter .
Cuando calculo tf / idfs semi-manualmente, usando el NLTK y los puntajes de computación para cada palabra, obtengo los resultados apropiados. Para el documento ''Adam'':
fresh 0.000813
prime 0.000813
bone 0.000677
relate 0.000677
blame 0.000677
enough 0.000677
Eso parece correcto, ya que estas son palabras que aparecen en el documento ''Adam'', pero no tanto en otros documentos en el corpus. El código completo usado para generar esto está en este cuaderno Jupyter .
¿Estoy haciendo algo mal con el código scikit? ¿Hay alguna otra manera de inicializar esta clase donde devuelve los resultados correctos? Por supuesto, puedo ignorar las palabras vacías al pasar stop_words = ''english''
, pero eso realmente no resuelve el problema, ya que las palabras comunes de cualquier tipo no deberían tener puntajes altos aquí.
De la documentación de scikit-learn:
Como tf-idf se usa muy a menudo para funciones de texto, también hay otra clase llamada TfidfVectorizer que combina todas las opciones de CountVectorizer y TfidfTransformer en un único modelo.
Como puede ver, TfidfVectorizer es un CountVectorizer seguido de TfidfTransformer .
Lo que probablemente estés buscando es TfidfTransformer y no TfidfVectorizer
No estoy seguro de por qué no es el valor predeterminado, pero probablemente desee sublinear_tf=True
en la inicialización de TfidfVectorizer. Bifurqué su informe y le envié un mensaje de interés con un ejemplo que probablemente se parece más a lo que desea.