Python 2.7 用于文本分类的朴素贝叶斯-Python 2.7数据结构问题
我在训练我的朴素贝叶斯分类器时遇到了一个问题。我有一个功能集和目标,我想使用,但我不断得到错误。我看过其他有类似问题的人,但我似乎无法找出问题所在。我相信有一个简单的解决办法,但我还没有找到 下面是一个我试图用来训练分类器的数据结构示例Python 2.7 用于文本分类的朴素贝叶斯-Python 2.7数据结构问题,python-2.7,data-structures,scikit-learn,nltk,naivebayes,Python 2.7,Data Structures,Scikit Learn,Nltk,Naivebayes,我在训练我的朴素贝叶斯分类器时遇到了一个问题。我有一个功能集和目标,我想使用,但我不断得到错误。我看过其他有类似问题的人,但我似乎无法找出问题所在。我相信有一个简单的解决办法,但我还没有找到 下面是一个我试图用来训练分类器的数据结构示例 In [1] >> train[0] Out[1] ({ u'profici': [False], u'saver': [False], u'four': [True], u'p
In [1] >> train[0]
Out[1] ({
u'profici': [False],
u'saver': [False],
u'four': [True],
u'protest': [False],
u'asian': [True],
u'upsid': [False],
.
.
.
u'captain': [False],
u'payoff': [False],
u'whose': [False]
},
0)
其中,列[0]是列表中的第一个元组,包含:
- 特征和布尔值的字典,用于指示文档[0]中是否存在单词
- 文档[0]的二进制分类的目标标签
from nltk.classify.scikitlearn import SklearnClassifier
from sklearn.naive_bayes import MultinomialNB
MNB_clf = SklearnClassifier(MultinomialNB())
MNB_clf.train(train)
我收到错误消息:
TypeError: float() argument must be a string or a number
编辑:
功能在这里创建。从数据帧post_发送,其中包含第1列中的帖子和第2列中的情感分类
stopwords = set(stopwords.words('english'))
tokenized = []
filtered_posts = []
punc_tokenizer = RegexpTokenizer(r'\w+')
# tokenizing and removing stopwords
for post in post_sent.post:
tokenized = [word.lower() for word in.
punc_tokenizer.tokenize(post)]
filtered = ([w for w in tokenized if not w in stopwords])
filtered_posts.append(filtered)
# stemming
tokened_stemmed = []
for post in filtered_posts:
stemmed = []
for w in post:
stemmed.append(PorterStemmer().stem_word(w))
tokened_stemmed.append(stemmed)
#frequency dist
all_words =.
list(itertools.chain.from_iterable(tokened_stemmed))
frequency = FreqDist(all_words)
# Feature selection
word_features = list(frequency.keys())[:3000]
# IMPORTANT PART
#######################
#------ featuresets creation ---------
def find_features(list_of_posts):
features = {}
wrds = set(post)
for w in word_features:
features[w] = [w in wrds]
return features
# zipping inputs with targets
words_and_sent = zip(tokened_stemmed,
post_sent.sentiment)
# IMPORTANT PART
##########################
# feature sets created here
featuresets = [(find_features(words), sentiment) for
words, sentiment in
words_and_sent]
你把火车开错了。正如@lenz在评论中所说的,去掉特征dict值中的括号,只使用单个值 如下表所示: 标记的\u功能集–每个 featureset是将字符串映射到数字、布尔值或 字符串 但是您正在将映射(dict中key的值)设置为列表 正确的火车应该是这样的:
[({u'profici':False,
u'saver':False,
u'four':True,
u'protest':False,
u'asian':True,
u'upsid':False,
.
.
}, 0),
..
..
({u'profici':True,
u'saver':False,
u'four':False,
u'protest':False,
u'asian':True,
u'upsid':False,
.
.
}, 1)]
您可以在此处查看更多示例:
-多亏了维韦克和伦茨的帮助,他们向我解释了这个问题,我才得以重新组织我的训练集,幸好它现在起作用了。谢谢大家 维韦克的帖子很好地解释了这个问题。这是将列车数据重新组织为正确格式的代码
features_targ = []
for feature in range(0,len(featuresets)):
dict_test = featuresets[feature]
values = list(itertools.chain.from_iterable(dict_test[0].values()))
keys = dict_test[0].keys()
target = dict_test[1]
dict_ion = {}
for key in range(x,len(keys)):
dict_ion[keys[key]] = values[key]
features_targ.append((dict_ion,target))
功能字典的值都是具有单个值的列表:
[False]
。相反,它们可能应该直接是布尔值True
/False
,而不必包装在列表中。好了,现在我有一个不同的问题在[1]>>中将[0]训练出[1]>>([False,False,True,…False,],0)`这给了我一个错误AttributeError:'list'对象没有属性'iteritems'
谢谢Vivek,这就清楚多了。我对字典数据类型不是特别在行。关于如何将它从现在的状态转换为我需要的状态,你有什么建议吗??Cheers@DiarmaidFinnerty首先,您是如何创建要素集的?更新你的答案(或发布一个新答案)以包含生成标记的featureset的代码,然后它将直接向你展示如何修复它。嗨,lenz,我已经添加了创建featureset的代码Hi Vivek,谢谢你的帮助。如果您愿意,您可以编辑您的帖子,以包含使其正确运行的代码(作为下面的答案发布)。感谢所有的帮助!