Python 读线在多行之后导致错误?
目前我正在进行一项NRE任务,数据来自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 ...
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”模式不同,但这样做肯定是有错误的地方。再次感谢你!