Readlines 在多行后导致错误?

Readlines causing error after many lines?

我目前正在处理一项 NRE 任务,数据来自 wnut17train.conll (https://github.com/leondz/emerging_entities_17)。它基本上是推文的集合,其中每一行都是推文中的一个单词,并附有 IOB 标签(由 \t 分隔)。不同的推文由一个空行分隔(实际上,如果你问我,很奇怪,一个 '\t\n' 行)。

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

@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_))

对于一定数量的推文(或线条,还不确定),一切都运行顺利,但在那之后我得到了

IndexError: list index out of range

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

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

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

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

因此 l.split() 会给出一个 IndexError:list index out of 运行ge。为了处理这个问题,我们可以检查长度是否为 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]))

希望您的问题得到解决。