Мне действительно может понадобиться помощь с созданием обучающих данных для Spacy. Я пробовал много способов создания обучающих данных для Spacy. Я начал с CSV слов и сущностей, преобразовал их в список слов и сущностей, объединив слова в списки предложений, а теги в списки тегов на предложение. Затем я преобразовал их в формат json. Теперь у меня есть несколько версий файлов json, которые я хотел преобразовать в новый формат .spacy. Однако, похоже, что после использования --converterner никакие обучающие данные не работают, поскольку он не находит формат 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 ⚠ Не найдено границ предложения для использовать с опцией
-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 .: {entity: (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 .: {entity: (0,22, '[2005-10-29]'), ...
или вот так:
[(Schartau sagte dem Tagesspiegel vom Freitag, Fischer sei in einer Weise aufgetreten, die alles andere als überzeugend war., {Объекты: (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 для обзора других доступных команд отладки.
============================ Проверка файла данных =================== ========= ✔ Корпус загружается ✔ Конвейер может быть инициализирован данными
=============================== Статистика тренировок ================= ========
============================== Словарь и векторные изображения ================= ============= ℹ Всего 1 слово (а) в данных (1 уникальное) ℹ В пакете нет векторов слов
========================== Распознавание именованных сущностей ===================== ===== ℹ 1 метка (метки) 0 пропущенных значений (токены с меткой '-') ⚠ Мало примеров для метки 'stamt, {сущности: [(0,51, O), (52, 67, B '(1) ⚠ Нет примеров для текстов БЕЗ новой метки' stamt, {сущности: [(0,51, O), (52,67, B '' ✔ Нет сущностей, состоящих из пробелов или начинающихся / заканчивающихся пробелом ✔ Нет объекты, состоящие из знаков препинания или начинающиеся / заканчивающиеся знаками препинания
================================== Резюме =============== =================== ✔ Пройдено 5 проверок ⚠ 2 предупреждения ✘ 1 ошибка
Может ли кто-нибудь, ПОЖАЛУЙСТА, помочь мне преобразовать мой список слов и сущностей в формат spacys NER для обучения NER? Буду премного благодарен. Спасибо!