我正在自学如何使用scikit-learn,我决定开始第二个任务,但要用我自己的语料库。我手工获得了一些双字母,比方说:
training_data = [[('this', 'is'), ('is', 'a'),('a', 'text'), 'POS'],
[('and', 'one'), ('one', 'more'), 'NEG']
[('and', 'other'), ('one', 'more'), 'NEU']]
我想以一种可以用scikit-learn提供的一些分类算法(svc,多重朴素贝叶斯等)很好地填充的格式对它们进行矢量化。这是我尝试过的:
from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer(analyzer='word')
X = count_vect.transform(((' '.join(x) for x in sample)
for sample in training_data))
print X.toarray()
这样做的问题是我不知道如何处理标签(即 'POS', 'NEG', 'NEU'
),我是否需要也"矢量化"标签才能将training_data
传递给分类算法,或者我可以让它像"POS"或任何其他类型的字符串一样?另一个问题是我得到这个:
raise ValueError("Vocabulary wasn't fitted or is empty!")
ValueError: Vocabulary wasn't fitted or is empty!
那么,我怎样才能像training_data
这样的双字母矢量化.我也在阅读有关dictvectorizer和Sklearn-pandas的信息,你们认为使用它们可以更好地完成这项任务吗?
它应该看起来像这样:
>>> training_data = [[('this', 'is'), ('is', 'a'),('a', 'text'), 'POS'],
[('and', 'one'), ('one', 'more'), 'NEG'],
[('and', 'other'), ('one', 'more'), 'NEU']]
>>> count_vect = CountVectorizer(preprocessor=lambda x:x,
tokenizer=lambda x:x)
>>> X = count_vect.fit_transform(doc[:-1] for doc in training_data)
>>> print count_vect.vocabulary_
{('and', 'one'): 1, ('a', 'text'): 0, ('is', 'a'): 3, ('and', 'other'): 2, ('this', 'is'): 5, ('one', 'more'): 4}
>>> print X.toarray()
[[1 0 0 1 0 1]
[0 1 0 0 1 0]
[0 0 1 0 1 0]]
然后将标签放入目标变量中:
y = [doc[-1] for doc in training_data] # ['POS', 'NEG', 'NEU']
现在,您可以训练模型:
model = SVC()
model.fit(X, y)