Как использовать spaCy для создания новой сущности и обучения только из списка ключевых слов - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь использовать 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, пожалуйста, дайте мне знать, правильно я это сделал или нет.И почему моя попытка провалила обучение (когда я его запустил, выдает ошибку).


[ОБНОВЛЕНИЕ]

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

НаНа первый взгляд, это больше похоже на выражение регулярных выражений.Но с увеличением количества поступающих данных модель будет постоянно учиться и, наконец, сможет выявлять новые названия видов, которых ранее не было в исходном учебном наборе.


Спасибо, Кэти

1 Ответ

0 голосов
/ 30 мая 2018

Преимущество обучения распознавателя именованных сущностей обнаружению SPECIES в вашем тексте заключается в том, что модель не только сможет распознавать ваши примеры, но также обобщать и распознавать другие виды в контексте.Если вы хотите найти только фиксированный набор терминов, но не более, вам может подойти более простой подход на основе правил.Вы можете найти примеры и подробности этого здесь .

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

Хотя существуют другие подходы к моделям обучения без или с меньшим количеством помеченных примеровСамая простая стратегия сбора данных об обучении для обучения вашей модели spaCy заключается в ... маркировке данных об обучении.Тем не менее, есть некоторые приемы, которые вы можете использовать, чтобы сделать это менее болезненным:

  • Начните со списка видов и используйте Matcher или PhraseMatcher, чтобынайдите их в своих документах.Для каждого совпадения вы получите объект Span, чтобы вы могли извлечь начальную и конечную позиции диапазона в тексте.Это легко позволяет вам автоматически создавать кучу примеров.Вы можете найти более подробную информацию по этому здесь .

  • Используйте векторы слов , чтобы найти более похожие термины для искомых объектовТаким образом, вы получите больше примеров, которые вы можете найти в своем тексте, используя вышеуказанный подход.Я не уверен, как векторных моделей spaCy подойдет для вашего вида, так как термины довольно специфичны.Поэтому, если у вас большой набор необработанного текста, содержащего виды, вам, возможно, придется обучать свои собственные векторы.

  • Используйте инструмент маркировки или аннотации данных.Существуют решения с открытым исходным кодом, такие как Brat , или, когда вы станете более серьезно относиться к аннотациям и обучению, вы также можете попробовать наш инструмент для аннотаций Prodigy , который являетсясовременное коммерческое решение, которое легко интегрируется с spaCy (Отказ от ответственности: я один из сопровождающих spaCy).

...