如何查找加载.txt文件时发生的索引器错误的原因并加以解决?python

如何查找加载.txt文件时发生的索引器错误的原因并加以解决?python,python,pandas,machine-learning,export-to-csv,index-error,Python,Pandas,Machine Learning,Export To Csv,Index Error,我试图训练一个序列到序列的机器翻译模型。我使用了一个公共可用的.txt数据集,它有两列,分别为英语和德语阶段(每行一对,用一个选项卡分隔语言):这很好。然而,我在尝试使用自己的数据集时遇到了一个问题 我自己的DataFrame如下所示: Column 1 Column 2 0 English a German a 1 English b German b 2 English c German c 3 English d German d 4 ..

我试图训练一个序列到序列的机器翻译模型。我使用了一个公共可用的
.txt
数据集,它有两列,分别为英语和德语阶段(每行一对,用一个选项卡分隔语言):这很好。然而,我在尝试使用自己的数据集时遇到了一个问题

我自己的
DataFrame
如下所示:

    Column 1    Column 2
0   English a   German a
1   English b   German b
2   English c   German c
3   English d   German d
4   ...         ...
为了在同一脚本中使用它,我将此
数据帧
保存到
.txt
文件中,如下所示(目标是再次获得每行一对,用一个选项卡分隔语言):

df.to_csv(“dataset.txt”,index=False,sep='\t')

清理数据的代码中出现问题:

# load doc into memory
def load_doc(filename):
# open the file as read only
    file = open(filename, mode='rt', encoding='utf-8')
    # read all text
    text = file.read()
    # close the file
    file.close()
    return text

# split a loaded document into sentences
def to_pairs(doc):
    lines = doc.strip().split('\n')
    pairs = [line.split('\t') for line in lines]  

# clean a list of lines
 def clean_pairs(lines):
    cleaned = list()
    # prepare regex for char filtering
    re_print = re.compile('[^%s]' % re.escape(string.printable))
    # prepare translation table for removing punctuation
    table = str.maketrans('', '', string.punctuation)
    for pair in lines:
        clean_pair = list()
        for line in pair:
            # normalize unicode characters
            line = normalize('NFD', line).encode('ascii', 'ignore')
            line = line.decode('UTF-8')     
            # tokenize on white space
            line = line.split()
            # convert to lowercase
            line = [word.lower() for word in line]       
            # remove punctuation from each token
            line = [word.translate(table) for word in line]       
            # remove non-printable chars form each token
            line = [re_print.sub('', w) for w in line]                 
            # remove tokens with numbers in them
            line = [word for word in line if word.isalpha()]           
            # store as string
            clean_pair.append(' '.join(line))
#            print(clean_pair)
        cleaned.append(clean_pair)
#        print(cleaned)
    print(array(cleaned))
    return array(cleaned) # something goes wrong here

# save a list of clean sentences to file
def save_clean_data(sentences, filename):
    dump(sentences, open(filename, 'wb'))
    print('Saved: %s' % filename)

# load dataset
filename = 'data/dataset.txt'
doc = load_doc(filename)
# split into english-german pairs
pairs = to_pairs(doc)
# clean sentences
clean_pairs = clean_pairs(pairs)
# save clean pairs to file
save_clean_data(clean_pairs, 'english-german.pkl')
# spot check
 for i in range(100):
    print('[%s] => [%s]' % (clean_pairs[i,0], clean_pairs[i,1]))
最后一行抛出以下错误:

IndexError                          Traceback (most recent call last)
<ipython-input-2-052d883ebd4c> in <module>()
     72 # spot check
     73 for i in range(100):
---> 74     print('[%s] => [%s]' % (clean_pairs[i,0], clean_pairs[i,1]))
     75 
     76 # load a clean dataset

IndexError: too many indices for array

有人能解释一下问题是什么以及如何解决吗?

clean\u pairs
是一个
列表的
列表。核心Python语言没有正式的多维数组概念,因此您使用的
clean\u pairs[i,0]
语法不起作用。它应该是
干净的\u对[i][0]

您可能是从使用Pandas得到这个想法的,Pandas使用了更复杂的n-d数组数据结构,支持这种类型的索引

但是我对你的代码感到困惑。看起来您正在将数据帧保存到TSV文件(以制表符分隔),然后手动解析TSV并对其执行文本转换?这有多方面的问题:

  • 正如您使用库来编写TSV文件一样,您也应该使用库来读取TSV文件。CSV/TSV读取器将以预解析的数据结构将数据行直接返回给您
  • AFAICT可以对内存中的数据进行所有此类过滤,而无需首先写入中间文件

  • 至少在您发布的代码中,您还存在一些其他问题。例如,您的
    to_pairs
    函数(如果有的话,也应该留给库)没有返回任何内容。

    步骤1:发布完整的错误回溯!步骤2:告诉我们您尝试索引的数组的形状。如果您不知道如何从调试器中获取,只需在出现问题的行之前添加一个
    打印(clean_pairs.shape)
    。(如果形状不是您期望的形状,请解释您期望的形状以及原因,否则我们可能只能告诉您“是的,这是错误的”,而无法告诉您如何修复它……)我期望的
    数组(已清理)
    的形状是
    (n,2)
    (其中n是示例数)。但是我用自己的数据集得到的形状是
    (n,)
    可能不相关,但是
    clean\u pairs=clean\u pairs(pairs)
    覆盖了
    clean\u pairs()函数的定义。非常感谢,您的解决方案很有效!我必须承认我上面发布的代码不是我自己的。我更喜欢使用pandas和更精细的数据清理方法。但目前我只是在试验一个机器翻译模型(这段代码就是其中的一部分),看看它能做什么样的翻译。我也得到了一些结果,谢谢你的帮助。
    
    # Standard dataset:
    return array(cleaned)
    [['hi' 'hallo']
     ['hi' 'gru gott']
     ['run' ‘lauf’]]
    
    # My own dataset:
    return array(cleaned)
    [list(['hi' 'hallo'])
     list(['hi' 'gru gott'])
     list(['run' ‘lauf’])]