我有一些由他们的双字母表示的列表,以及它们各自出现的次数。双胞胎来自于一个独特的双字母组合词汇。我想在此
上使用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不是特征向量,但我不知道如何制作它。
答案 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)
现在你所要做的就是弄清楚你的标签是什么,然后制作最终的训练数据,使其符合给定文件中的结构。