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

Python 读线在多行之后导致错误?,python,nlp,ner,readlines,Python,Nlp,Ner,Readlines,目前我正在进行一项NRE任务,数据来自wnut17train.conll()。它基本上是一个tweet的集合,其中每一行都是tweet中的一个单词,附加了一个IOB标签(由\t分隔)。不同的tweet之间用一个空行隔开(事实上,如果你问我,这很奇怪,一个'\t\n'行) 因此,作为参考,一条tweet将如下所示: @paulwalk IOBtag ... ... foo IOBtag [\t\n] @jerrybeam IOBtag ...

目前我正在进行一项NRE任务,数据来自
wnut17train.conll
()。它基本上是一个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)]
第一步的目标是实现这样一种情况,即我将此数据集转换为如下所示的培训文件:

@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()
做了一些研究,看看这是否是一个已知的问题,但看起来不是。我遗漏了什么吗?

我使用了中的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]))

希望你的问题得到解决。

事实的确如此。我使用repr检查了是否有任何行与“\t\n”模式不同,但这样做肯定是有错误的地方。再次感谢你!