我可以控制CountVectorizer在scikit中学习语料库的方式吗?

Mat*_*ien 5 python nlp corpus text-parsing scikit-learn

我正在与scikit学习的CountVectorizer一起工作,我可能正在尝试做一些不是为对象制作的东西......但我不确定.

在获取发生次数方面:

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

得到:

[[0 0 0 0]]
Run Code Online (Sandbox Code Playgroud)

我所意识到的是,CountVectorizer会将语料库分解为我认为是unigrams:

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

这使:

[[0 0 1]]
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉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]]
Run Code Online (Sandbox Code Playgroud)

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

mba*_*rov 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]]
Run Code Online (Sandbox Code Playgroud)

请注意,默认的tokeniser会删除末尾的感叹号,因此最后一个标记是away.如果您想要更好地控制字符串如何分解为标记,请关注@ BrenBarn的评论.

  • 词汇表是"映射(例如,字典),其中键是术语,值是特征矩阵中的索引,**或可迭代的术语.**"(来自文档) (2认同)