Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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 NLTK:TypeError:不可损坏的类型:';列表';_Python_List_Tuples_Nltk_Hashable - Fatal编程技术网

Python NLTK:TypeError:不可损坏的类型:';列表';

Python NLTK:TypeError:不可损坏的类型:';列表';,python,list,tuples,nltk,hashable,Python,List,Tuples,Nltk,Hashable,我遵循bleu评分的原始代码,如下所示: from nltk.translate.bleu_score import sentence_bleu reference = [['this', 'is', 'a', 'test'], ['this', 'is' 'test']] candidate = ['this', 'is', 'a', 'test'] score = sentence_bleu(reference, candidate) print(score) 代码运行良好。但我正试图通

我遵循bleu评分的原始代码,如下所示:

from nltk.translate.bleu_score import sentence_bleu

reference = [['this', 'is', 'a', 'test'], ['this', 'is' 'test']]
candidate = ['this', 'is', 'a', 'test']
score = sentence_bleu(reference, candidate)
print(score)
代码运行良好。但我正试图通过将csv文件导入为以下代码来更改
参考
候选

import nltk
import csv
import itertools
from nltk.translate.bleu_score import sentence_bleu

print("Opening references file...")
with open('bleu-ref.csv', newline='') as csvfile:
     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
     sentences = []
     for row in spamreader:
         # print(', '.join(row))
         sentences.append(' '.join(row))

sent = [[i] for i in sentences]

reference = []
for i in range(len(sent)):
    sent[i]
    chink = []
    for j in sent[i]:
        chink = chink + nltk.word_tokenize(j)

    reference.append(chink)

print("Opening candidates file...")
with open('bleu-can.csv', newline='') as csvfile:
     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
     sentences_can = []
     for row in spamreader:
         # print(', '.join(row))
         sentences_can.append(' '.join(row))

sent_can = [[i] for i in sentences_can]

candidate = []
for i in range(len(sent_can)):
    sent_can[i]
    chink_can = []
    for j in sent_can[i]:
        chink_can = chink_can + nltk.word_tokenize(j)

    candidate.append(chink_can)

score = sentence_bleu(reference, candidate)
但它遇到了一个错误:

    Traceback (most recent call last):
  File "nltk-bleu-score.py", line 56, in <module>
    score = sentence_bleu(reference, candidate)
  File "C:\Users\Fachri\Anaconda3\lib\site-packages\nltk\translate\bleu_score.py", line 89, in sentence_bleu
    emulate_multibleu)
  File "C:\Users\Fachri\Anaconda3\lib\site-packages\nltk\translate\bleu_score.py", line 162, in corpus_bleu
    p_i = modified_precision(references, hypothesis, i)
  File "C:\Users\Fachri\Anaconda3\lib\site-packages\nltk\translate\bleu_score.py", line 292, in modified_precision
    counts = Counter(ngrams(hypothesis, n)) if len(hypothesis) >= n else Counter()
  File "C:\Users\Fachri\Anaconda3\lib\collections\__init__.py", line 535, in __init__
    self.update(*args, **kwds)
  File "C:\Users\Fachri\Anaconda3\lib\collections\__init__.py", line 622, in update
    _count_elements(self, iterable)
TypeError: unhashable type: 'list'

假设的预期类型为
列表(str)
,来自:

:类型假设:列表(str)

candidate
是一个
列表(列表(str))
,您可以这样计算bleu评分:

from nltk.translate.bleu_score import sentence_bleu

references = [['two', 'passenger', 'planes', 'on', 'a', 'grassy', 'plain'],
              ['An', 'airplane', 'sitting', 'on', 'the', 'tarmac', 'at', 'an', 'airport', 'with', 'another', 'plane',
               'in', 'the', 'background', '.'],
              ['A', 'white', 'an', 'blue', 'airplane', 'parked', 'at', 'the', 'airport', 'near', 'another', 'small',
               'plane', '.'], ['Blue', 'and', 'white', 'airplane', 'parked', '.'],
              ['two', 'airplanes', 'are', 'waiting', 'on', 'the', 'tarmac'],
              ['Two', 'airplanes', 'parked', 'at', 'the', 'airport', '.'],
              ['A', 'passenger', 'aircraft', 'with', 'landing', 'gear', 'down', '.'],
              ['A', 'passenger', 'jet', 'flies', 'through', 'the', 'air', '.'],
              ['A', 'passenger', 'plane', 'fly', 'through', 'the', 'sky', '.'],
              ['The', 'Austrian', 'plane', 'soars', 'in', 'the', 'sky', '.']]

candidates = [
    ['An', 'airplane', 'sitting', 'on', 'the', 'tarmac', 'at', 'an', 'airport', 'with', 'another', 'plane', 'in', 'the',
     'background', '.'], ['A', 'passenger', 'jet', 'flies', 'through', 'the', 'air', '.']]

for candidate in candidates:
    print(sentence_bleu(references, candidate))
输出

1.0
1.0

与普遍看法相反,打印出来的错误回溯并非毫无意义的垃圾,因此请将其复制到您的问题中。请在调用
语句之前插入
print(reference,candidate)
。也许列表中的一个是“深”。我已经添加了<代码>打印(参考,候选)结果到后句级BLUU对于短句没有意义,如果我的答案有助于解决你的问题,请考虑。这是表示你的问题已“解决”并感谢帮助你的人的惯常方式
1.0
1.0