NER: определение данных поезда для Spacy v3

Мне действительно может понадобиться помощь с созданием обучающих данных для 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? Буду премного благодарен. Спасибо!


person darned7    schedule 03.05.2021    source источник


Ответы (1)


Ответы на него даны в обсуждениях, но ваши данные не в формате NER и не в формат json, используемый конвертером. Это формат, используемый для данных обучения, сохраненных в json.

В этом случае проще всего преобразовать ваши данные в столбчатые данные IOB и запустить на них конвертер.

person polm23    schedule 04.05.2021
comment
Как преобразовать данные в столбчатые данные IOB? Или как я могу преобразовать свои данные сверху в правильный формат json, используемый конвертером? - person darned7; 04.05.2021
comment
Теперь у меня есть это: Schartau B-PER sagte O dem O Tagesspiegel B-ORG O O vom O Freitag O, O Fischer B-PER sei OO O in O einer O Weise O aufgetreten O, O die O alles O andere O als O überzeugend О война OO O. O welt.de vom 29.10.2005 [2005-10-29] Firmengründer O Wolf B-PER Peter I-PER Bree I-PER arbeitete O Anfang O der O siebziger O Jahre O als O Möbelvertreter O, O als O er O einen O fliegenden O Händler O aus O dem O Libanon B-LOC traf O. Тем не менее, он все еще ошибочен, как говорится, искажен. - person darned7; 04.05.2021