读线在多行之后导致错误?

2024-04-16 14:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在正在做一项NRE任务,数据来自wnut17train.conllhttps://github.com/leondz/emerging_entities_17)。它基本上是一个tweet的集合,其中每一行都是tweet中的一个单词,附加了一个IOB标签(由\t分隔)。不同的tweet之间用一个空行隔开(事实上,如果你问我,这很奇怪,是一个'\t\n'行)

因此,作为参考,一条tweet将如下所示:

@paulwalk    IOBtag
...          ...
foo          IOBtag
[\t\n]
@jerrybeam   IOBtag
...          ...
bar          IOBtag

第一步的目标是实现这样一种情况,即我将此数据集转换为如下所示的培训文件:

train[0] = [(first_word_of_first_tweet, POStag, IOBtag),
(second_word_of_first_tweet, POStag, IOBtag),
...,
last_word_of_first_tweet, POStag, IOBtag)]

这就是我到目前为止的想法:

tmp = []
train = []
nlp = spacy.load("en_core_web_sm")
with open("wnut17train.conll") as f:
    for l in f.readlines():
        if l == '\t\n':
            train.append(tmp)
            tmp = []
        else:
            doc = nlp(l.split()[0])
            for token in doc:
                tmp.append((token.text, token.pos_, token.ent_iob_))

对于一定数量的tweet(或行,还不确定),一切都很顺利,但在那之后,我得到了一个

IndexError: list index out of range

抚养

doc = nlp(l.split()[0])

我第一次在第20'000行(准确地说是20'533行)左右得到它,然后在检查这不是由于文件引起的(可能是分离tweet的另一种方式,或者类似的东西可能会欺骗解析器)之后,我删除了前20'000行,然后重试。再一次,我在大约第20'000行(准确地说是原始文件中的20'260或40'779)后出错

我做了一些关于readlines()的研究,看看这是否是一个已知的问题,但看起来不是。我错过什么了吗


Tags: 文件of数据tokendocnlptraintmp
1条回答
网友
1楼 · 发布于 2024-04-16 14:28:07

我使用了来自https://github.com/leondz/emerging_entities_17的wnut17train.conll文件,并运行了类似的代码来生成所需的输出。我发现,在某些行中,而不是“\\n”作为空白行,我们只有“\n”。

因此,l.split()将给出索引器:列表索引超出范围。为了处理这个问题,我们可以检查长度是否为1,在这种情况下,我们还将tmp添加到训练中

import spacy
nlp = spacy.load("en_core_web_sm")
train = []
tmp = []
with open("wnut17train.conll") as fp:
    for l in fp.readlines():
        if l == "\t\n" or len(l) == 1:
            train.append(tmp)
            tmp = []
        else:
            doc = nlp(l.split("\t")[0])
            for token in doc:
                tmp.append((l.split("\t")[0], token.pos_, l.split("\t")[1]))

希望你的问题得到解决

相关问题 更多 >