属性错误:'list'对象没有'copy'属性。

23

我有以下代码片段

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中扩展基类列表并添加复制函数,但我不是Python专家,也不知道如何解决这个问题。


请查阅您正在使用的函数文档,并确保传递正确的参数类型。 - user2357112
1
很可能,train_data 必须是一个 字典 而不是一个列表。 - Martijn Pieters
这是分类源代码的来源: http://www.nltk.org/_modules/nltk/classify/naivebayes.html - Amr Ragab
你是如何生成 test_data 的?它是一个列表对象,但 NaiveBayesClassifier.classify() 方法期望完全不同的类型。 - Martijn Pieters
4个回答

60

list.copy方法在Python 2.x和3.x中都无法使用,我不明白它为什么还会出现在文档中。 要复制一个列表,请使用list关键字:

fruits = ['banana', 'cucumber', 'apple', 'water mellon']
my_fruits = list(fruits)

你可以通过切片的方式复制一个列表:

my_fruits_copy = fruits[:]

4
如果您认为在Python 3上出现了AttributeError,但实际上几乎肯定不是在Python 3上发生的。有关详细信息,请参阅Python版本的文档,其中实际存在的版本是Python 3.3及更高版本。 - user2357112

4
NLTK分类器使用特征集(feature sets);它们总是作为具有特征名称映射到值的字典给出。您正在传递一个列表,因此未按照NLTK文档生成特征。代码只需Python字典,而Python字典具有.copy()方法。
请参见NLTK教程章节“学习分类文本”
返回的字典称为特征集,从特征名称映射到它们的值。特征名称是区分大小写的字符串,通常提供特征的简短人类可读描述,例如示例'last_letter'。特征值是具有简单类型的值,例如布尔值、数字和字符串。
还请参阅{{link2:NLTK Classify API文档中的Featuresets部分}}:
描述令牌的特征使用“特征集”进行编码,它是一个将“特征名称”映射到“特征值”的字典。特征名称是唯一的字符串,指示特征编码的令牌方面。
您没有分享train_data列表包含哪种对象;如果这些是“特征集”字典,则应改用classify_many()
results = classifier.classify_many(test_data)

该方法确实接受列表作为参数,但每个元素仍必须是有效的特征集。


一旦我提交了问题,我在阅读文档后尝试将一个元素分类为字典,并成功了。接下来我会尝试使用classify_many()进行多次分类。 - Amr Ragab

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, ...

请在您的答案后面添加一个原因或理由。 - Jatin Mehrotra

-7

你为什么想要这样做呢? 如果你想让一个列表等于另一个列表,你可以这样做:

a = ['a', 'b', 'c']
b = a 

如果你想在第二个列表中插入一个列表,可以使用append()函数:

a = ['a','b','c']
b = ['d','e','f']
for i in len(a):
    b.append(i-1)

2
参见如何在Python中克隆或复制列表?;在第一个示例中,你只是创建了一个额外的引用,而不是一个副本。在这个特定的情况下,原始问题提出者只是将错误的数据类型传递给了一个只处理字典的API。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接