我有一个文本分类问题,我有两种类型的功能:
这两种类型的特征都是从文本的标记中提取的。我只想运行一次标记化,然后将这些标记传递给CountVectorizer和其他存在特征提取器。所以,我想将一个令牌列表传递给CountVectorizer,但只接受一个字符串作为某个样本的表示。有没有办法传递一系列令牌?
总结@ user126350和@miroli以及这个link的答案:
from sklearn.feature_extraction.text import CountVectorizer
def dummy(doc):
return doc
cv = CountVectorizer(
tokenizer=dummy,
preprocessor=dummy,
)
docs = [
['hello', 'world', '.'],
['hello', 'world'],
['again', 'hello', 'world']
]
cv.fit(docs)
cv.get_feature_names()
# ['.', 'again', 'hello', 'world']
要记住的一件事是在调用transform()函数之前将新的标记化文档包装到列表中,以便将其作为单个文档处理,而不是将每个标记解释为文档:
new_doc = ['again', 'hello', 'world', '.']
v_1 = cv.transform(new_doc)
v_2 = cv.transform([new_doc])
v_1.shape
# (4, 4)
v_2.shape
# (1, 4)
通常,您可以将自定义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())
与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