#machine-learning #nlp #spacy #named-entity-recognition
#машинное обучение #nlp #spacy #распознавание именованных сущностей
Вопрос:
Когда я использую SpaCy NER, SpaCy распознает «TodoA» как PERSON. Это явно неразумно. Есть ли какой-либо способ проверить, является ли объект, извлеченный SpaCy, разумным? Спасибо!
Большая часть этих необоснованных сущностей извлекается с помощью поиска spacy beam. Код поиска луча:
import spacy
import sys
from collections import defaultdict
nlp = spacy.load('en')
text = u'Will Japan join the European Union? If yes, we should
move to United States. Fasten your belts, America we are coming'
with nlp.disable_pipes('ner'):
doc = nlp(text)
threshold = 0.2
(beams, somethingelse) = nlp.entity.beam_parse([ doc ], beam_width = 16, beam_density = 0.0001)
entity_scores = defaultdict(float)
for beam in beams:
for score, ents in nlp.entity.moves.get_beam_parses(beam):
for start, end, label in ents:
entity_scores[(start, end, label)] = score
print ('Entities and scores (detected with beam search)')
for key in entity_scores:
start, end, label = key
score = entity_scores[key]
if ( score > threshold):
print ('Label: {}, Text: {}, Score: {}'.format(label, doc[start:end], score))
Комментарии:
1. В SpaCy есть нейронная сеть, которая обрабатывает атрибуты объектов для контролируемого обучения. Если вас интересует, какие функции используются, определенность назначения или многоклассовые вероятности, из вашего вопроса неясно. Пожалуйста, уточните.
2. Привет @SergeyBushmanov Это не имеет ничего общего с базовой нейронной сетью. Я просто использовал предварительно обученную модель en_core_web_lg в spacy для извлечения сущностей и использовал beam_search. Когда предложение содержит ‘TodoA’, spacy en_core_web_lg распознает ‘TodoA’ как person, а ‘TodoA’, очевидно, не является именем человека, поэтому ошибка идентификации spacy en_core_web_lg, что я хочу сделать сейчас, это оценить рациональность сущности, извлеченной spacy en_core_web_lg
Ответ №1:
«Необоснованная» аннотация, которую вы видите, напрямую связана с характером модели, которая используется для выполнения аннотации, и процессом ее получения.
Короче говоря, модель представляет собой приближение очень сложной функции (в математических терминах) от некоторых характеристик последовательностей слов (например, наличие определенных букв, прописных букв, использование определенных терминов и т. Д.) К замкнутому набору тегов (например PERSON
,). Это приближение, близкое к наилучшему для большого объема текста (например, нескольких гигабайт ASCII-текста), но, конечно, это не сопоставление отдельных фраз с тегами. Поэтому, даже если данные, используемые для обучения, точны, результат применения модели может быть не идеальным в некоторых обстоятельствах.
В вашем случае вполне вероятно, что модель цепляется за верхний регистр слова, и, возможно, в обучении использовалось большое количество слов с общим префиксом, которые были отмечены тегом PERSON
) — например, Toddy, toddler и т. Д. И Очень небольшое количество слов с таким префиксомэто были не PERSON
s.
Это явление, которое мы наблюдаем, не было выбрано явно человеком, готовящим модель, это всего лишь побочный продукт сочетания процесса его подготовки (обучения) и используемых данных.
Комментарии:
1. Таким образом, spacy сам по себе не может решить эту проблему. После того, как spacy извлекает объект, есть ли какой-либо способ проверить, является ли объект, извлеченный spacy, разумным?
2. Как указал @sophros, машина изучает то, что она изучает. Конечно, в ближайшие годы это станет лучше, но пока модель делает то, что делает, и в целом работает хорошо . Это цель машинного обучения. Если вы чувствуете, что можете добавить эвристику для улучшения результатов, то это нужно будет сделать после того, как ML применит свое обучение.