我自学了如何使用scikit-learn,我决定以自己的语料库开始second task。我手工获得了一些二重奏,让我们说:
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'
),我是否需要" vectorize"标签也是为了将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的内容,你们认为使用它们对于这项任务可能是更好的方法吗?
答案 0 :(得分:7)
它应该是这样的:
>>> 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)