【问题标题】:Readlines causing error after many lines?Readlines 在多行之后导致错误?
【发布时间】:2020-10-21 09:14:37
【问题描述】:

我目前正在处理 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)之后,我得到了一个错误。

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

【问题讨论】:

    标签: python nlp named-entity-recognition readlines


    【解决方案1】:

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

    由于这个 l.split() 将给出一个 IndexError: list index out of range。为了处理这个问题,我们可以检查长度是否为 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' 模式不同,但我一定在某处犯了错误。再次感谢您!
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2016-08-31
    • 2013-04-21
    相关资源
    最近更新 更多