Понимание аргумента " диапазон ngram` в CountVectorizer в sklearn
Я немного смущен тем, как использовать ngrams в библиотеке scikit-learn в Python, в частности, как ngram_range
аргумент работает в CountVectorizer.
запуск этого кода:
from sklearn.feature_extraction.text import CountVectorizer
vocabulary = ['hi ', 'bye', 'run away']
cv = CountVectorizer(vocabulary=vocabulary, ngram_range=(1, 2))
print cv.vocabulary_
дает мне:
{'hi ': 0, 'bye': 1, 'run away': 2}
где я находился под (очевидно ошибочным) впечатлением, что я получу юниграммы и биграммы, например:
{'hi ': 0, 'bye': 1, 'run away': 2, 'run': 3, 'away': 4}
Я работаю с документацией здесь: http://scikit-learn.org/stable/modules/feature_extraction.html
очевидно, что есть что-то ужасно неправильное в моем понимании того, как использовать ngrams. Возможно, аргумент не имеет никакого эффекта, или у меня есть концептуальная проблема с тем, что такое настоящий биграмм! Я в тупике. Если у кого-то есть совет, который я мог бы дать, я был бы благодарен.
обновление:
Я осознал всю глупость своих поступков. У меня сложилось впечатление, что ngram_range
повлияет на словарный запас, а не корпус.
1 ответов
задание vocabulary
явно означает, что из данных не извлекается словарный запас. Если вы не установите его, вы получите:
>>> 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}
явный словарь ограничивает термины, которые будут извлечены из текста; словарь не изменяется:
>>> 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
(обратите внимание, что фильтрация стоп-слов применяется до извлечения n-грамма, следовательно "apple day"
.)