Распознавание именованных сущностей с помощью преобразователей Huggingface, отображение на полные сущности

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

Например, учитывая пример в документации:

>>> from transformers import pipeline

>>> nlp = pipeline("ner")

>>> sequence = "Hugging Face Inc. is a company based in New York City. Its headquarters are in DUMBO, therefore very"
...            "close to the Manhattan Bridge which is visible from the window."

This outputs a list of all words that have been identified as an entity from the 9 classes     defined above. Here is the expected results:

print(nlp(sequence))

[
{'word': 'Hu', 'score': 0.9995632767677307, 'entity': 'I-ORG'},
{'word': '##gging', 'score': 0.9915938973426819, 'entity': 'I-ORG'},
{'word': 'Face', 'score': 0.9982671737670898, 'entity': 'I-ORG'},
{'word': 'Inc', 'score': 0.9994403719902039, 'entity': 'I-ORG'},
{'word': 'New', 'score': 0.9994346499443054, 'entity': 'I-LOC'},
{'word': 'York', 'score': 0.9993270635604858, 'entity': 'I-LOC'},
{'word': 'City', 'score': 0.9993864893913269, 'entity': 'I-LOC'},
{'word': 'D', 'score': 0.9825621843338013, 'entity': 'I-LOC'},
{'word': '##UM', 'score': 0.936983048915863, 'entity': 'I-LOC'},
{'word': '##BO', 'score': 0.8987102508544922, 'entity': 'I-LOC'},
{'word': 'Manhattan', 'score': 0.9758241176605225, 'entity': 'I-LOC'},
{'word': 'Bridge', 'score': 0.990249514579773, 'entity': 'I-LOC'}
]

Хотя это само по себе впечатляет, мне неясно, как правильно получить ДУМБО:

{'word': 'D', 'score': 0.9825621843338013, 'entity': 'I-LOC'},
{'word': '##UM', 'score': 0.936983048915863, 'entity': 'I-LOC'},
{'word': '##BO', 'score': 0.8987102508544922, 'entity': 'I-LOC'},

--- или даже для более чистых совпадений нескольких токенов, например, отличия Нью-Йорка от простого города Йорка.

Хотя я могу представить себе эвристические методы, каков правильный предполагаемый способ объединить эти токены обратно в правильные метки с учетом ваших входных данных?


person Mittenchops    schedule 02.08.2020    source источник
comment


Ответы (1)


Объект конвейера может сделать это за вас, если вы установите для параметра grouped_entities значение True.

from transformers import pipeline

ner = pipeline("ner", grouped_entities=True)

sequence = "Hugging Face Inc. is a company based in New York City. Its headquarters are in DUMBO, therefore very close to the Manhattan Bridge which is visible from the window."

output = ner(sequence)

print(output)

Выход:

[{'entity_group': 'I-ORG', 'score': 0.9970663785934448, 'word': 'Hugging Face Inc'}
, {'entity_group': 'I-LOC', 'score': 0.9993778467178345, 'word': 'New York City'}
, {'entity_group': 'I-LOC', 'score': 0.9571147759755453, 'word': 'DUMBO'}
, {'entity_group': 'I-LOC', 'score': 0.9838141202926636, 'word': 'Manhattan Bridge'}
, {'entity_group': 'I-LOC', 'score': 0.9838141202926636, 'word': 'Manhattan Bridge'}]
person cronoik    schedule 03.08.2020
comment
Имейте в виду, что параметр grouped_entities входит в версию 3.0.2. Итак, если вы получите ошибку, вы решите проблему с обновлением библиотеки трансформеров! - person msklc; 10.09.2020
comment
Как ускорить ner = pipeline("ner", grouped_entities=True)? Это довольно медленно. - person red-devil; 23.12.2020
comment
@ red-devil Эта строка загружает модель. Если его нет в вашем кеше, загрузка его с серверов huggingface всегда занимает некоторое время. Когда развертывание и выполнение - это два разных процесса в вашем сценарии, вы можете предварительно загрузить его, чтобы ускорить процесс выполнения. Пожалуйста, откройте отдельный вопрос с некоторой информацией относительно объема данных, которые вы обрабатываете, и точного кода, который вы выполняете. - person cronoik; 23.12.2020
comment
справочник для NER с использованием конвейера. - person ; 30.12.2020