К сожалению, на данный момент (версия 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-
.