Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 用于文本分类的朴素贝叶斯-Python 2.7数据结构问题_Python 2.7_Data Structures_Scikit Learn_Nltk_Naivebayes - Fatal编程技术网

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,谢谢你的帮助。如果您愿意,您可以编辑您的帖子,以包含使其正确运行的代码(作为下面的答案发布)。感谢所有的帮助!