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"
.)