我可以控制scikit learn中CountVectorizer如何向量化语料库吗?

6 投票
1 回答
2277 浏览
提问于 2025-04-18 08:22

我正在使用scikit-learn中的CountVectorizer,可能在尝试一些这个工具本来不太适合的事情……但我不太确定。

关于获取出现次数的部分:

vocabulary = ['hi', 'bye', 'run away!']
corpus = ['run away!']
cv = CountVectorizer(vocabulary=vocabulary)
X = cv.fit_transform(corpus)
print X.toarray()

结果是:

[[0 0 0 0]]

我意识到CountVectorizer会把文本分解成我认为是单个词(unigrams):

vocabulary = ['hi', 'bye', 'run']
corpus = ['run away!']
cv = CountVectorizer(vocabulary=vocabulary)
X = cv.fit_transform(corpus)
print X.toarray()

结果是:

[[0 0 1]]

有没有办法告诉CountVectorizer你希望如何处理这些文本?理想情况下,我希望得到类似第一个例子的结果。

不过说实话,我在想是否有可能得到这样的结果:

vocabulary = ['hi', 'bye', 'run away!']
corpus = ['I want to run away!']
cv = CountVectorizer(vocabulary=vocabulary)
X = cv.fit_transform(corpus)
print X.toarray()

[[0 0 1]]

我在fit_transform方法的文档中没有看到太多信息,它目前只接受一个参数。如果有人有任何想法,我会很感激。谢谢!

1 个回答

7

你需要的参数叫做 ngram_range。你可以在创建对象的时候传入一个元组 (1,2),这样就能得到单个词(unigrams)和两个词组合(bigrams)。不过,你传入的词汇表需要是一个 dict,里面的键是 ngrams,值是整数。

In [20]: print CountVectorizer(vocabulary={'hi': 0, u'bye': 1, u'run away': 2}, ngram_range=(1,2)).fit_transform(['I want to run away!']).A
[[0 0 1]]

注意,默认的分词器会把结尾的感叹号去掉,所以最后一个词是 away。如果你想更好地控制字符串是如何被分割成词的,可以参考 @BrenBarn 的评论。

撰写回答