tfidfvectorizer tfidftransformer spanish scikit learn idf countvectorizer bigrams python scikit-learn n-gram feature-selection

python - tfidftransformer - tfidfvectorizer bigrams



Entendiendo el argumento `ngram_range` en un CountVectorizer en sklearn (1)

Estoy un poco confundido acerca de cómo usar ngrams en la biblioteca scikit-learn en Python, específicamente, cómo funciona el argumento ngram_range en un CountVectorizer.

Ejecutando este código:

from sklearn.feature_extraction.text import CountVectorizer vocabulary = [''hi '', ''bye'', ''run away''] cv = CountVectorizer(vocabulary=vocabulary, ngram_range=(1, 2)) print cv.vocabulary_

me da

{''hi '': 0, ''bye'': 1, ''run away'': 2}

Donde estaba bajo la impresión (obviamente equivocada) de que obtendría unigramas y bigramas, como esto:

{''hi '': 0, ''bye'': 1, ''run away'': 2, ''run'': 3, ''away'': 4}

Estoy trabajando con la documentación aquí: http://scikit-learn.org/stable/modules/feature_extraction.html

Claramente, hay algo terriblemente mal en mi comprensión de cómo usar ngrams. ¡Quizás el argumento no tenga efecto o tengo algún problema conceptual con lo que es un bigrama real! Estoy perplejo. Si alguien tiene un consejo para lanzarme, estaría agradecido.

ACTUALIZAR:
Me he dado cuenta de la locura de mis caminos. Tenía la impresión de que ngram_range afectaría el vocabulario, no el corpus.


Establecer el vocabulary explícitamente significa que no se aprende vocabulario de los datos. Si no lo configuras, obtienes:

>>> v = CountVectorizer(ngram_range=(1, 2)) >>> pprint(v.fit(["an apple a day keeps the doctor away"]).vocabulary_) {u''an'': 0, u''an apple'': 1, u''apple'': 2, u''apple day'': 3, u''away'': 4, u''day'': 5, u''day keeps'': 6, u''doctor'': 7, u''doctor away'': 8, u''keeps'': 9, u''keeps the'': 10, u''the'': 11, u''the doctor'': 12}

Un vocabulario explícito restringe los términos que se extraerán del texto; el vocabulario no se cambia

>>> v = CountVectorizer(ngram_range=(1, 2), vocabulary={"keeps", "keeps the"}) >>> v.fit_transform(["an apple a day keeps the doctor away"]).toarray() array([[1, 1]]) # unigram and bigram found

(Tenga en cuenta que el filtrado de palabras de parada se aplica antes de la extracción de n-gramas, por lo tanto, "apple day" .)