如何在Counter上使用SklearnClassifier

时间:2017-04-05 19:38:20

标签: python scikit-learn nltk

我有一些由他们的双字母表示的列表,以及它们各自出现的次数。双胞胎来自于一个独特的双字母组合词汇。我想在此

上使用SklearnClassifier(SVC)

到目前为止我编写的代码:

 train_ngrams = [(train_filtered_tweets[i], train_filtered_tweets[i + 1]) for
 i in range(len(train_filtered_tweets) - 1)]
 print "Tweets from train set as bigrams", Counter(train_ngrams)

 classif = SklearnClassifier(BernoulliNB()).train(train_ngrams)
 classify = SklearnClassifier(SVC(), sparse=False).train(Counter(train_ngrams))
 print classify

但我收到错误:

 AttributeError: 'str' object has no attribute 'iteritems'

我认为这是因为我的train_ngrams不是特征向量,但我不知道如何制作它。

1 个答案:

答案 0 :(得分:1)

您的训练数据还需要特定的目标标签。考虑从nltk website

中提取的这个示例
>>> from nltk.classify import SklearnClassifier
>>> from sklearn.naive_bayes import BernoulliNB
>>> from sklearn.svm import SVC
>>> train_data = [({"a": 4, "b": 1, "c": 0}, "ham"),
...               ({"a": 5, "b": 2, "c": 1}, "ham"),
...               ({"a": 0, "b": 3, "c": 4}, "spam"),
...               ({"a": 5, "b": 1, "c": 1}, "ham"),
...               ({"a": 1, "b": 4, "c": 3}, "spam")]
>>> classif = SklearnClassifier(BernoulliNB()).train(train_data)
>>> test_data = [{"a": 3, "b": 2, "c": 1},
...              {"a": 0, "b": 3, "c": 7}]
>>> classif.classify_many(test_data)
['ham', 'spam']
>>> classif = SklearnClassifier(SVC(), sparse=False).train(train_data)
>>> classif.classify_many(test_data)
['ham', 'spam']

如您所见,目标标签为 ham 垃圾邮件。此外,您似乎正在使用Counter对象,而API正在查找元组列表,其中包含每个元组中字数的字典以及标签。我不知道你为你的推文集创建了什么目标标签,但我可以告诉你如何为你的语料库生成二元频率字典,假设你的语料库是一个可迭代的,其中每个元素都是推文

mybigramlist = []
for tweet in corpus:
    tokens = nltk.word_tokenize(tweet)
    bgs = nltk.bigrams(tokens)  # get the bigrams
    freqs = nltk.FreqDist(bgs)  # this is dictionary of the bigrams with their frequencies in the tweet
    mybigramlist.append(freqs)

现在你所要做的就是弄清楚你的标签是什么,然后制作最终的训练数据,使其符合给定文件中的结构。