目前,我正在处理NRE任务,并使用wnut17train.conll
(https://github.com/leondz/emerging_entities_17)中的数据。它基本上是一条推文的集合,其中每一行都是推文中的一个单词,并带有IOB标签(由\t
分隔)。不同的tweet用空白行分隔(实际上,如果您问我,很奇怪,'\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_))
对于一定数量的tweet(或行,尚不确定),一切都可以顺利进行,但是之后我得到了
IndexError: list index out of range
由
提出doc = nlp(l.split()[0])
我第一次在20'000行(准确地说是20'533)得到它,然后在检查这不是由于文件引起的之后(也许是分离推文的另一种方式,或者像这样的东西可能被骗了)解析器),我删除了前20000行,然后重试。同样,在大约20'000行之后出现了错误(准确地说是20'260-或原始文件中的40'779)。
我对readlines()
进行了一些研究,以了解这是否是已知问题,但看起来并非如此。我想念什么吗?
答案 0 :(得分:0)
我使用了https://github.com/leondz/emerging_entities_17中的wnut17train.conll文件,并运行了类似的代码来生成所需的输出。我发现在某些行中,空行不是“ \ t \ n”,而只有“ \ n”。
由于此l.split()将给出IndexError:列表索引超出范围。为了解决这个问题,我们可以检查长度是否为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]))
希望您的问题得到解决。