Я пытаюсь использовать spaCy для создания новой категории объекта "Виды" со списком названий видов, например, он может найти здесь .
Я нашел учебник для обучения нового типа сущности из этого урока spaCy (код Github здесь ).Однако проблема в том, что я не хочу вручную создавать предложение для каждого названия вида, так как это будет очень много времени.
Я создал ниже обучающие данные, которые выглядят так:
TRAIN_DATA = [('Bombina',{'entities':[(0,6,'SPECIES')]}),
('Dermaptera',{'entities':[(0,9,'SPECIES')]}),
....
]
Способ, которым я создал обучающий набор, состоит в следующем: вместо предоставления полного предложения и местоположения соответствующей сущности, яукажите только название каждого вида, а начальный и конечный индексы генерируются программно:
[(0, 6, «SPECIES»)]
[(0, 9,«SPECIES»)]
Ниже тренировочный код - это то, что я использовал для обучения модели.(Код скопирован с гиперссылки выше)
nlp = spacy.blank('en') # create blank Language class
# Add entity recognizer to model if it's not in the pipeline
# nlp.create_pipe works for built-ins that are registered with spaCy
if 'ner' not in nlp.pipe_names:
ner = nlp.create_pipe('ner')
nlp.add_pipe(ner)
# otherwise, get it, so we can add labels to it
else:
ner = nlp.get_pipe('ner')
ner.add_label(LABEL) # add new entity label to entity recognizer
if model is None:
optimizer = nlp.begin_training()
else:
# Note that 'begin_training' initializes the models, so it'll zero out
# existing entity types.
optimizer = nlp.entity.create_optimizer()
# get names of other pipes to disable them during training
other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner']
with nlp.disable_pipes(*other_pipes): # only train NER
for itn in range(n_iter):
random.shuffle(TRAIN_DATA)
losses = {}
for text, annotations in TRAIN_DATA:
nlp.update([text], [annotations], sgd=optimizer, drop=0.35, losses=losses)
print(losses)
Я новичок в NLP и spaCy, пожалуйста, дайте мне знать, правильно я это сделал или нет.И почему моя попытка провалила обучение (когда я его запустил, выдает ошибку).
[ОБНОВЛЕНИЕ]
Причина, по которой я хочу указать ключевое слово только для модели обучения, заключается в том, чточто в идеале я хотел бы надеяться, что модель сначала изучит эти ключевые слова, и как только она определит контекст, содержащий ключевое слово, она изучит связанный контекст и, следовательно, улучшит текущую модель.
НаНа первый взгляд, это больше похоже на выражение регулярных выражений.Но с увеличением количества поступающих данных модель будет постоянно учиться и, наконец, сможет выявлять новые названия видов, которых ранее не было в исходном учебном наборе.
Спасибо, Кэти