web-dev-qa-db-fra.com

Comprendre l'argument `ngram_range` dans un CountVectorizer dans sklearn

Je suis un peu confus quant à l'utilisation des ngrams dans la bibliothèque scikit-learn en Python, en particulier, comment fonctionne l'argument ngram_range Dans un CountVectorizer.

Exécution de ce code:

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

donne moi:

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

Où j'étais sous l'impression (manifestement erronée) que j'obtiendrais des unigrammes et des bigrammes, comme ceci:

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

Je travaille avec la documentation ici: http://scikit-learn.org/stable/modules/feature_extraction.html

De toute évidence, il y a quelque chose de terriblement mal dans ma compréhension de la façon d'utiliser les ngrammes. Peut-être que l'argument n'a aucun effet ou j'ai un problème conceptuel avec ce qu'est un véritable bigramme! Je suis perplexe. Si quelqu'un a un mot de conseil à me donner, je lui en serais reconnaissant.

MISE À JOUR:
J'ai réalisé la folie de mes voies. J'avais l'impression que le ngram_range Affecterait le vocabulaire, pas le corpus.

24
Matt O'Brien

La définition de vocabulary signifie explicitement qu'aucun vocabulaire n'est appris à partir des données. Si vous ne le définissez pas, vous obtenez:

>>> 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 vocabulaire explicite restreint les termes qui seront extraits du texte; le vocabulaire n'est pas modifié:

>>> 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

(Notez que le filtrage des mots vides est appliqué avant l'extraction de n grammes, donc "Apple day".)

27
Fred Foo