0

我真的需要一些帮助来为 spacy 创建训练数据。我尝试了很多方法来为 spacy 创建训练数据。我从单词和实体的 csv 开始,将它们转换为单词和实体列表,将单词放在一起成为句子列表,将标签放在每个句子的标签列表中。然后我将它们转换为 json 格式。我现在有多个版本的 json 文件,我想将它们转换为新的 .spacy 格式。但是,使用 --converter ner 后似乎没有任何训练数据有效,因为它找不到 NER 格式。

我首先尝试将示例转换为 json 文件

next_sentence = ""
word_index_in_sentence = 0
start_index = list()
end_index = list()
sent_tags = list()
TRAIN_DATA = []
with open("/content/drive/MyDrive/train_file.json", "w+", encoding="utf-8") as f:
    for word_index, word in enumerate(word_list):
        if word_index_in_sentence is 0:
            start_index.append(0)
        else:
            start_index.append((end_index[word_index_in_sentence-1])+1)

        sent_tags.append(tag_list[word_index])

        if word == "." or word == "?" or word == "!" or word_index == len(word_list)-1:
            next_sentence += word
            end_index.append(start_index[word_index_in_sentence]+1)
            entities = "";
            for i in range(word_index_in_sentence):
                if (i != 0):
                    entities += ","
                entities += "(" + str(start_index[i]) + "," + str(end_index[i]) + "," + "'" + sent_tags[i] + "'" + ")"

            f.write('("' + next_sentence + '",{"entities": [' + entities + ']}),')
            next_sentence = ""
            word_index_in_sentence = 0
            start_index = list()
            end_index = list()
            sent_tags = list()
        else:
            if word_list[word_index + 1] == "," or word_list[word_index + 1] == "." or word_list[word_index + 1] == "!" or word_list[word_index + 1] == "?":
                next_sentence += word
                end_index.append(start_index[word_index_in_sentence]+len(word)-1)
            else:
                next_sentence += word + " "
                end_index.append(start_index[word_index_in_sentence]+len(word))
            word_index_in_sentence += 1

由于这没有按预期工作。然后我尝试写一个字典列表。所以而不是

f.write('("' + next_sentence + '",{"entities": [' + entities + ']}),')

我创建了一个列表 TRAIN_DATA,将值添加为 dict,如下所示:

TRAIN_DATA.append({next_sentence: {"entities":entities}})

将 TRAIN_DATA 再次保存到 json 文件中。

但是,当使用python -m spacy convert --converter ner /path/to/file /path/to/save它时,它会将其转换为 .spacy,但是,它指出:

⚠ 无法自动检测 NER 格式。转换可能不会成功。请参阅https://spacy.io/api/cli#convert ⚠ 没有找到与 option 一起使用的句子边界-n 1。用于-s自动分段句子或 -n 0禁用。⚠ 没有找到句子边界。用于-s自动分句。⚠ 未找到文档分隔符。用于 -n自动将句子分组到文档中。✔ 生成的输出文件(1 个文件):/content/drive/MyDrive/TRAIN_DATA/hope.spacy

转换为 json 后,我的训练数据看起来像这样:

[{"Schartau sagte dem Tagesspiegel vom Freitag, Fischer sei in einer Weise aufgetreten, die alles andere als überzeugend war.": {"entities": "(0,8,'B-PER'),(9,14,' O'),(15,18,'O'),(19,31,'B-ORG'),(32,35,'O'),(36,42,'O'),(43,44 ,'O'),(45,52,'B-PER'),(53,56,'O'),(57,59,'O'),(60,65,'O'),(66 ,71,'O'),(72,82,'O'),(83,84,'O'),(85,88,'O'),(89,94,'O'),(95,101 ,'O'),(102,105,'O'),(106,117,'O'),(118,120,'O')"}}, {"welt.de vom 29.10.2005 Firmengründer Wolf Peter Bree arbeitete Anfang der siebziger Jahre als Möbelvertreter, als er einen fliegenden Händler aus dem Libanon traf.": {"entities": "(0,22,'[2005-10-29]'),...

或像这样:

[("Schartau sagte dem Tagesspiegel vom Freitag, Fischer sei in einer Weise aufgetreten, die alles andere als überzeugend war.", {"entities": (0,8,'B-PER'),(9,14,'O '),(15,18,'O'),(19,31,'B-ORG'),(32,35,'O'),(36,42,'O'),(43,44, 'O'),(45,52,'B-PER'),(53,56,'O'),(57,59,'O'),(60,65,'O'),(66, 71,'O'),(72,82,'O'),(83,84,'O'),(85,88,'O'),(89,94,'O'),(95,101, 'O'),(102,105,'O'),(106,117,'O'),(118,120,'O')}),....

python -m spacy debug data /path/to/config

给我输出:

⚠ debug-data 命令现在可通过“debug data”子命令(不带连字符)使用。您可以运行 python -m spacy debug --help 以了解其他可用调试命令的概述。

============================ 数据文件验证=================== ========= ✔ 语料库是可加载的 ✔ 管道可以用数据初始化

================================ 训练统计 ================= ============== 语言:de 训练管道:transformer,ner 1 个训练文档 1 个评估文档 ✔ 训练和评估数据之间没有重叠 ✘ 训练新管道的示例数量少 (1)

=============================== 词汇和向量================= ============= ℹ 数据中共有 1 个单词(1 个唯一)ℹ 包中不存在单词向量

========================== 命名实体识别==================== ===== ℹ 1 个标签 0 个缺失值(带有 '-' 标签的标记)⚠ 标签 'stamt",{"entities":[(0,51,"O" ),(52,67,"B' (1) ⚠ 没有新标签 'stamt",{"entities":[(0,51,"O"),(52,67,"B' ✔没有由空格组成或以空格开头/结尾的实体✔ 没有由标点符号组成或以标点符号开头/结尾的实体

===================================总结=============== =================== ✔ 5 次检查通过 ⚠ 2 次警告 ✘ 1 次错误

有人可以帮我将我的单词和实体列表转换为 spacys NER 格式来训练 NER 吗?我会很感激。谢谢!

4

1 回答 1

1

这在讨论中得到了回答,但您的数据不是 NER 格式,也不是json转换器使用的格式。它采用用于训练数据的格式,保存为 json。

在这种情况下,最简单的做法可能是将您的数据转换为列式 IOB 数据并在其上运行转换器。

于 2021-05-04T06:25:06.023 回答