我有以下代码段
classifier = NaiveBayesClassifier.train(train_data)
#classifier.show_most_informative_features(n=20)
results = classifier.classify(test_data)
,错误显示在以下行
中results = classifier.classify(test_data)
错误:
Traceback (most recent call last):
File "trial_trial.py", line 46, in <module>
results = classifier.classify(test_data)
File "c:\Users\Amr\Anaconda\lib\site-packages\nltk\classify\naivebayes.py", line 88, in classify
return self.prob_classify(featureset).max()
File "c:\Users\Amr\Anaconda\lib\site-packages\nltk\classify\naivebayes.py", line 94, in prob_classify
featureset = featureset.copy()
AttributeError: 'list' object has no attribute 'copy'
我想在python中扩展基类列表并添加复制功能 但我不是蟒蛇专家,我也不知道如何解决这个问题。
答案 0 :(得分:12)
list.copy方法在python 2.x和python 3.x中都不起作用,我想知道为什么它仍然在文档中。 要获得复制列表的结果,请使用list关键字:
fruits = ['banana', 'cucumber', 'apple', 'water mellon']
my_fruits = list(fruits)
或者,您可以通过切片来复制列表:
my_fruits_copy = fruits[:]
答案 1 :(得分:2)
NLTK分类器使用功能集;这些总是作为字典给出,其中功能名称映射到一个值。您正在传入列表,因此您不会根据NLTK文档生成功能。代码只需要Python字典,Python字典有.copy()
方法。
请参阅NLTK tutorial chapter on Learning to Classify Text:
返回的字典(称为要素集)会将要素名称映射到其值。功能名称是区分大小写的字符串,通常提供对该功能的简短的人类可读描述,如示例
'last_letter'
中所示。特征值是具有简单类型的值,例如布尔值,数字和字符串。
另见Featuresets section of the NLTK Classify API documentation:
描述令牌的功能使用“featureset”进行编码,“featureset”是一个从“功能名称”映射到“功能值”的字典。功能名称是唯一的字符串,用于指示功能对令牌的哪个方面进行编码。
您还没有分享train_data
列表包含的对象类型;如果这些是功能集词典,则您希望改为使用classify_many()
:
results = classifier.classify_many(test_data)
该方法 获取列表,但每个元素仍必须是有效的功能集。
答案 2 :(得分:0)
解决方案:classifier.classify接收一个python字典作为参数。
之后:
test_set1 = sentiment_analyzer.apply_features(test_sentence1)
您得到的是这样的:
[({'contains()': False, 'contains(im)': False,...
classifier.classify想要这个:
test_set1[0][0]
...
{'contains()': False, 'contains(im)': False, ...
答案 3 :(得分:-4)
为什么要这样做? 如果你想设置一个等于另一个的列表,你可以这样做:
a = ['a', 'b', 'c']
b = a
否则,如果要在第二个内插入一个列表,可以使用append():
a = ['a','b','c']
b = ['d','e','f']
for i in len(a):
b.append(i-1)