我真的需要一些帮助来为 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 吗?我会很感激。谢谢!