我可以控制scikit learn中CountVectorizer如何向量化语料库吗?
我正在使用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 的评论。