我可以控制 CountVectorizer 在 scikit learn 中对语料库进行矢量化的方式吗?
Posted
技术标签:
【中文标题】我可以控制 CountVectorizer 在 scikit learn 中对语料库进行矢量化的方式吗?【英文标题】:Can I control the way the CountVectorizer vectorizes the corpus in scikit learn? 【发布时间】:2014-07-23 08:30:49 【问题描述】:我正在使用来自 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 方法的文档中没有看到太多信息,它只接受一个参数。如果有人有任何想法,我将不胜感激。谢谢!
【问题讨论】:
你想要的是CountVectorizer
的tokenizer
参数,它应该是一个可调用的,它接受一个字符串并返回一个令牌列表。但是,从您的帖子中不清楚您想使用什么规则来标记输入。
【参考方案1】:
你想要的参数叫做ngram_range
。您将元组 (1,2)
传递给构造函数以获取一元组和二元组。但是,您传入的词汇表必须是 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 的评论。
【讨论】:
词汇表是“映射(例如,字典),其中键是术语,值是特征矩阵中的索引,或可迭代的术语。”(来自文档)以上是关于我可以控制 CountVectorizer 在 scikit learn 中对语料库进行矢量化的方式吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 scikit-learn 中使用 CountVectorizer 来计算未用于提取标记的文档的频率吗?
如何在 CountVectorizer 中对句子应用权重(计算每个句子标记数次)
使用 CountVectorizer 的无空格 unicode 句子的正则表达式