将令牌传递给CountVectorizer

时间:2016-03-08 12:32:14

标签: scikit-learn tokenize

我有一个文本分类问题,我有两种类型的功能:

  • n-gram的特征(由CountVectorizer提取)
  • 其他文字特征(例如来自给定词典的单词的存在)。这些特征与n-gram不同,因为它们应该是从文本中提取的任何n-gram的一部分。

这两种类型的功能都是从文本标记中提取的。我只想运行一次标记化,然后将这些标记传递给CountVectorizer和其他存在特征提取器。所以,我想将一个令牌列表传递给CountVectorizer,但只接受一个字符串作为某个样本的表示。有没有办法传递一系列令牌?

3 个答案:

答案 0 :(得分:4)

总结@ user126350和@miroli以及此link的答案:

stack()

要记住的一件事是在调用transform()函数之前将新的标记化文档包装到列表中,以便将其作为单个文档处理,而不是将每个标记解释为文档:

df = pd.DataFrame([[1,2,3], [3,4,5], [2,3,4], [8,5,2], [3,2,1]])
df.stack().plot.hist()

答案 1 :(得分:2)

通常,您可以将自定义tokenizer参数传递给CountVectorizer。标记生成器应该是一个接受字符串并返回其标记数组的函数。但是,如果您已经在数组中使用了令牌,则可以使用一些任意键简单地创建令牌数组的字典,并让令牌生成器从该字典返回。然后,当您运行CountVectorizer时,只需传递您的字典键。例如,

 # arbitrary token arrays and their keys
 custom_tokens = {"hello world": ["here", "is", "world"],
                  "it is possible": ["yes it", "is"]}

 CV = CountVectorizer(
      # so we can pass it strings
      input='content',
      # turn off preprocessing of strings to avoid corrupting our keys
      lowercase=False,
      preprocessor=lambda x: x,
      # use our token dictionary
      tokenizer=lambda key: custom_tokens[key])

 CV.fit(custom_tokens.keys())

答案 2 :(得分:0)

与user126350的答案类似,但更简单,这就是我所做的。

def do_nothing(tokens):
    return tokens

pipe = Pipeline([
    ('tokenizer', MyCustomTokenizer()),
    ('vect', CountVectorizer(tokenizer=do_nothing,
                             preprocessor=None,
                             lowercase=False))
])

doc_vects = pipe.transform(my_docs)  # pass list of documents as strings