Как восстановить текстовые объекты с помощью конвейеров трансформеров Hugging Face без тегов IOB? - PullRequest
3 голосов
/ 30 марта 2020

Я искал использование конвейеров Hugging Face для NER (распознавание именованных объектов). Тем не менее, он возвращает метки объекта в формате внутренне-внешнее начало (IOB), но без меток IOB . Поэтому я не могу отобразить результаты конвейера обратно в исходный текст. Кроме того, выходные данные маскируются в формате токена BERT (модель по умолчанию BERT-large).

Например:

from transformers import pipeline
nlp_bert_lg = pipeline('ner')
print(nlp_bert_lg('Hugging Face is a French company based in New York.'))

Выходные данные:

[{'word': 'Hu', 'score': 0.9968873858451843, 'entity': 'I-ORG'},
{'word': '##gging', 'score': 0.9329522848129272, 'entity': 'I-ORG'},
{'word': 'Face', 'score': 0.9781811237335205, 'entity': 'I-ORG'},
{'word': 'French', 'score': 0.9981815814971924, 'entity': 'I-MISC'},
{'word': 'New', 'score': 0.9987512826919556, 'entity': 'I-LOC'},
{'word': 'York', 'score': 0.9976728558540344, 'entity': 'I-LOC'}]

Как видите, Нью-Йорк разбит на два тега.

Как мне сопоставить конвейер NER Hugging Face с моим исходным текстом?

Версия для трансформаторов: 2.7

1 Ответ

3 голосов
/ 01 апреля 2020

К сожалению, на данный момент (версия 2.6, и я думаю, что даже с 2.7), вы не можете сделать это только с помощью функции pipeline. Поскольку функция __call__, вызываемая конвейером, просто возвращает список, см. код здесь . Это означает, что вам нужно будет выполнить второй шаг токенизации с помощью «внешнего» токенизатора, который полностью игнорирует назначение конвейеров.

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

from transformers import AutoModelForTokenClassification, AutoTokenizer
import torch

model = AutoModelForTokenClassification.from_pretrained("dbmdz/bert-large-cased-finetuned-conll03-english")
tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")

label_list = [
    "O",       # Outside of a named entity
    "B-MISC",  # Beginning of a miscellaneous entity right after another miscellaneous entity
    "I-MISC",  # Miscellaneous entity
    "B-PER",   # Beginning of a person's name right after another person's name
    "I-PER",   # Person's name
    "B-ORG",   # Beginning of an organisation right after another organisation
    "I-ORG",   # Organisation
    "B-LOC",   # Beginning of a location right after another location
    "I-LOC"    # Location
]

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

# Bit of a hack to get the tokens with the special tokens
tokens = tokenizer.tokenize(tokenizer.decode(tokenizer.encode(sequence)))
inputs = tokenizer.encode(sequence, return_tensors="pt")

outputs = model(inputs)[0]
predictions = torch.argmax(outputs, dim=2)

print([(token, label_list[prediction]) for token, prediction in zip(tokens, predictions[0].tolist())])

Это возвращает именно то, что вы ищете. Обратите внимание, что схема аннотации ConLL перечисляет следующее в оригинальной статье :

Каждая строка содержит четыре поля: слово, его тег части речи, его тег чанка и его именованный тег сущности. Слова, помеченные буквой O, находятся за пределами именованных объектов, а тег I-XXX используется для слов внутри именованного объекта типа XXX. Всякий раз, когда два объекта типа XXX находятся непосредственно рядом друг с другом, первое слово второго объекта будет помечено как B-XXX, чтобы показать, что оно запускает другой объект. Данные содержат объекты четырех типов: лица (PER), организации (ORG), местоположения (LO C) и разные имена (MIS C). Эта схема тегирования является схемой IOB, первоначально предложенной Ramshaw and Marcus (1995).

То есть, если вы недовольны (все еще разделенными) сущностями, вы можете объединить все последующие I- отмеченные объекты или B-, за которыми следуют I- теги. В этой схеме невозможно, чтобы два разных (непосредственно соседних) объекта были помечены только тегами I-.

...