理解sklearn中CountVectorizer的`ngram_range`参数

43

我有些困惑如何在Python的scikit-learn库中使用ngrams,特别是在CountVectorizer中ngram_range参数的工作方式。

运行以下代码:

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有严重的误解。也许参数没有起作用,或者我对实际的bigram有一些概念上的问题!我被卡住了。如果有人能给我建议,我会非常感激。

更新:
我已经意识到我的错误。我曾以为ngram_range将影响词汇表,而不是语料库。

1个回答

45

明确设置 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-gram提取之前,会对停用词进行过滤,因此会出现"apple day"。)

(请注意:在进行n-gram提取之前,会先应用停用词过滤,这意味着会出现"apple day"。)


所以根据你的回答,你适应了数据,因此你获得了在CountVectorizer中指定的ngram_range。我的解决方案是事先手动将我的词汇向量化,包括2-gram...除非你有其他推荐的方法? - tumultous_rooster
@MattO'Brien 你到底想要实现什么? - Fred Foo
1
我的目标是简单地使用CountVectorizer来计算语料库中令牌出现的次数。我有一个自定义词汇表,包括许多不同长度的n元语法(1、2、3、4)。我一直在使用unigrams,但我也想探索其他长度令牌的计数。 - tumultous_rooster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接