with tutorial tfidfvectorizer scikit multiclass learn español countvectorizer python nlp scikit-learn

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.