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

#python #nlp #pickle #spacy

Вопрос:

У меня есть данные для точной настройки в этом формате:

 [[(('Kaweah', 'NNP'), 'O'),
  (('Delta', 'NNP'), 'O'),
  (('Mental', 'NNP'), 'O'),
  (('Health', 'NNP'), 'O'),
  (('Hospital', 'NNP'), 'O'),
  (('D/p', 'NNP'), 'O'),
  (('Aph', 'NNP'), 'O'),
  (('is', 'VBZ'), 'O'),
  (('located', 'VBN'), 'O'),
  (('at', 'IN'), 'O'),
  (('1100', 'CD'), 'B-GPE'),
  (('SO', 'NNP'), 'I-GPE'),
  (('.', '.'), 'I-GPE'),
  (('AKERS', 'NNP'), 'I-GPE'),
  (('STREET', 'NNP'), 'I-GPE')],
 [(('CHARLTON', 'NNP'), 'O'),
  (('MEMORIAL', 'NNP'), 'O'),
  (('HOSPITAL', 'NNP'), 'O'),
  (('is', 'VBZ'), 'O'),
  (('located', 'VBN'), 'O'),
  (('at', 'IN'), 'O'),
  (('2449', 'CD'), 'B-GPE'),
  (('THIRD', 'NNP'), 'I-GPE'),
  (('STREET', 'NNP'), 'I-GPE'),
  ((',', ','), 'I-GPE'),
  (('GA', 'NNP'), 'I-GPE')]]
 

Но формат обучения spacy выглядит так:

 TRAIN_DATA =[ ("Pizza is a common fast food.", {"entities": [(0, 5, "FOOD")]}),
              ("Pasta is an italian recipe", {"entities": [(0, 5, "FOOD")]}) ]
 

Что мне нужно сделать, чтобы конвертировать мой файл pickle в формат spacy?

Ответ №1:

Вы можете просто взять каждый маркер и объединить пробелы на них, чтобы получить ввод текста, а затем рассчитать начало и остановку для промежутков каждой метки сущности.

но вы будете создавать искусственные обучающие данные, так как не знаете, какие пробелы использовались вокруг каждого токена. Эта информация теряется в формате CoNLL.

Таким образом, модель NER, которую вы тренируете, не будет надежной, поскольку она не знает, как маркировать токены, поскольку она научится всегда ожидать объединения пробелов по вашему выбору.

В принципе, это невозможно сделать, вы потеряли информацию в формате CoNLL, которую невозможно восстановить.