我在训练最大熵模型时,遇到错误
x["index"] = range(len(x))
xdic = x.set_index("index").T.to_dict("list")
train = []
for i in range(len(xdic)):
train.append((xdic[i], y[i]))
classifier = MaxentClassifier.train(train, 'IIS', trace=0, max_iter=1000)
Traceback (most recent call last):
File "
classifier = MaxentClassifier.train(train, 'IIS', trace=0, max_iter=1000)
File "C:\Users\sss\Anaconda3\lib\site-packages\nltk\classify\maxent.py", line 293, in train
train_toks, trace, encoding, labels, **cutoffs)
File "C:\Users\sss\Anaconda3\lib\site-packages\nltk\classify\maxent.py", line 1119, in train_maxent_classifier_with_iis
encoding = BinaryMaxentFeatureEncoding.train(train_toks, labels=labels)
File "C:\Users\sss\Anaconda3\lib\site-packages\nltk\classify\maxent.py", line 622, in train
for (fname, fval) in tok.items():
AttributeError: 'list' object has no attribute 'items'
网上找了半天也没有发现自己错在哪?好像只有我一个人犯了这个错误,我于是找MaxentClassifier.train()这个函数的各个参数的格式,发现train的格式必须是(list(tuple(dict, str))) 。我本以为自己看错啦,为什么有这么复杂的格式输入啊。不过我还是试试吧。
train=[] for i in range(len(x)): sss={} sss[x.iloc[1,400]]=tuple(x.iloc[1,:400].tolist()) #必须是数字,而不能是列表 train.append((sss,y[i]))
这次改了,这次报错:
classifier = MaxentClassifier.train(train, 'IIS', trace=0, max_iter=1000)
Traceback (most recent call last):
File "
classifier = MaxentClassifier.train(train, 'IIS', trace=0, max_iter=1000)
File "C:\Users\sss\Anaconda3\lib\site-packages\nltk\classify\maxent.py", line 293, in train
train_toks, trace, encoding, labels, **cutoffs)
File "C:\Users\sss\Anaconda3\lib\site-packages\nltk\classify\maxent.py", line 1119, in train_maxent_classifier_with_iis
encoding = BinaryMaxentFeatureEncoding.train(train_toks, labels=labels)
File "C:\Users\sss\Anaconda3\lib\site-packages\nltk\classify\maxent.py", line 627, in train
count[fname, fval] += 1
TypeError: unhashable type: 'list'
看来还是不行啊,列表不能哈希,所以我还是查一下,还是没有,只是找到所有python内置的不可变对象都是可哈希的,同时,可变容器 (比如:列表 (list) 或者字典 (dict) ) 都是不可哈希的。所以我将list变为tuple类型,没错。
train=[]
for i in range(len(x)):
sss={}
sss[x.iloc[1,400]]=tuple(x.iloc[1,:400].tolist())
#必须是数字,而不能是列表
train.append((sss,y[i]))
好啦,没报错啦。
如果还报错的话,可以吧“IIS”改成“GIS”试试。