Как преобразовать данные простого стиля обучения в формат JSON командной строки spaCy?

У меня есть данные обучения для нового типа NER в «Обучение дополнительного типа сущности» в документации по spaCy.

TRAIN_DATA = [
    ("Horses are too tall and they pretend to care about your feelings", {
        'entities': [(0, 6, 'ANIMAL')]
    }),

    ("Do they bite?", {
        'entities': []
    }),

    ("horses are too tall and they pretend to care about your feelings", {
        'entities': [(0, 6, 'ANIMAL')]
    }),

    ("horses pretend to care about your feelings", {
        'entities': [(0, 6, 'ANIMAL')]
    }),

    ("they pretend to care about your feelings, those horses", {
        'entities': [(48, 54, 'ANIMAL')]
    }),

    ("horses?", {
        'entities': [(0, 6, 'ANIMAL')]
    })
]

Я хочу обучить модель NER на этих данных с помощью spacy приложения командной строки. Для этого требуются данные в формате JSON spaCy. Как мне записать приведенные выше данные (т.е. текст с обозначенными интервалами смещения символов) в этом формате JSON?

Посмотрев документацию по этому формату, мне непонятно, как вручную записывать данные в этом формате. (Например, можно ли разбить все на абзацы?) Также есть утилита командной строки convert который преобразует форматы данных, отличные от spaCy, в формат spaCy, но не принимает в качестве входных данных формат spaCy, подобный приведенному выше.

Я понимаю примеры кода обучения NER, в котором используется «Простой стиль обучения», но я хотел бы иметь возможность использовать служебную программу командной строки для обучения. (Хотя, как видно из моего предыдущего вопроса по spaCy , Я не понимаю, когда вы должны использовать этот стиль, а когда вы должны использовать командную строку.)

Может ли кто-нибудь показать мне пример приведенных выше данных в «формате JSON spaCy» или указать на документацию, в которой объясняется, как выполнить это преобразование.


person W.P. McNeill    schedule 21.02.2018    source источник


Ответы (1)


В spaCy есть встроенная функция, которая поможет вам почти все:

from spacy.gold import biluo_tags_from_offsets

Это принимает аннотации типа "смещение", которые у вас есть, и преобразует их в токен за токеном Формат BILOU.

Чтобы поместить аннотации NER в окончательный обучающий формат JSON, вам просто нужно немного обернуть их вокруг, чтобы заполнить другие слоты, которые требуются для данных:

sentences = []
for t in TRAIN_DATA:
    doc = nlp(t[0])
    tags = biluo_tags_from_offsets(doc, t[1]['entities'])
    ner_info = list(zip(doc, tags))
    tokens = []
    for n, i in enumerate(ner_info):
        token = {"head" : 0,
        "dep" : "",
        "tag" : "",
        "orth" : i[0].string,
        "ner" : i[1],
        "id" : n}
        tokens.append(token)
    sentences.append(tokens)

Перед обучением с этими данными убедитесь, что вы отключили конвейеры, отличные от NER. Я столкнулся с некоторыми проблемами при использовании spacy train только для данных NER. См. # 1907, а также это обсуждение на форуме Prodigy для некоторых возможных обходных путей.

person ahalt    schedule 25.02.2018