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]))
希望您的问题得到解决。
我目前正在处理一项 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]))
希望您的问题得到解决。