Lösung komplexer Named Entity Recognition-Aufgaben (und Unteraufgabe Nested NER) auf Basis moderner Large Language Models (LLMs).
Sie sollten Python-Wörterbücher für jeden Text und jede Beschriftung erstellen. Schauen wir uns ein vereinfachtes Beispiel aus dem Russian Drug Reaction Corpus (RuDReC) an.
Это старый-добрый Римантадин, только в сиропе.
Римантадин - Drugname, сиропе - Drugform
Instruction
erstellen – Aufgabenbeschreibung für LLMEnglisch:
Sie lösen das NER-Problem. Auszug aus den Textwörtern, die sich auf jede der folgenden Entitäten beziehen: Arzneimittelname, Arzneimittelklasse, DI, ADR, Befund.
Englisch:
Sie lösen das NER-Problem. Auszug aus den Textwörtern, die sich auf jede der folgenden Entitäten beziehen: Arzneimittelname, Arzneimittelklasse, DI, ADR, Befund.
dictionary with labels
.Sie können eine von zwei unterstützten Versionen verwenden.
raw_entities = {
'Drugname' : [ 'Римантадин' ],
'Drugclass' : [],
'Drugform' : [ 'сиропе' ],
'DI' : [],
'ADR' : [],
'Finding' : []
}
short_form_output = True ( available with Nerel - BIO and MultiCoNER )
raw_entities = {
'Drugname' : [ 'Римантадин' ],
'Drugform' : [ 'сиропе' ]
}
MODEL_INPUT_TEMPLATE
. MODEL_INPUT_TEMPLATE = {
'prompts_input' : "### Задание: {instruction} n ### Вход: {inp} n ### Ответ: " ,
'output_separator' : "Ответ: "
}
Oder englische Version
MODEL_INPUT_TEMPLATE = {
'prompts_input' : "### Task: {instruction} n ### Input: {inp} n ### Answer: " ,
'output_separator' : "Answer: "
}
Instruction
automatisch generieren instruction_ner/utils/instruct_dataset.py
class Instruction ( TypedDict ):
instruction : str
input : str
output : str
source : str
raw_entities : dict [ str , list [ str ]]
id : str
{ 'instruction' : 'Ты решаешь задачу NER. Извлеки из текста слова, относящиеся к каждой из следующих сущностей: Drugname, Drugclass, DI, ADR, Finding.' ,
'input' : 'Это старый-добрый Римантадин, только в сиропе. n ' ,
'output' : 'Drugname: Римантадин n Drugclass: n Drugform: сиропе n DI: n ADR: n Finding: n ' ,
'source' : '### Задание: Ты решаешь задачу NER. Извлеки из текста слова, относящиеся к каждой из следующих сущностей: Drugname, Drugclass, DI, ADR, Finding. n ### Вход: Это старый-добрый Римантадин, только в сиропе. n ### Ответ: ' ,
'raw_entities' : { 'Drugname' : [ 'Римантадин' ],
'Drugclass' : [],
'Drugform' : [ 'сиропе' ],
'DI' : [],
'ADR' : [],
'Finding' : []},
'id' : '1_2555494.tsv' }
instruction_ner/utils/
instructions
python medner / instruction_ner / train_instruct . py
- - config_file medner / instruction_ner / configs / mistral_7b . json
- - model_type mistral
- - dataset_name conll2003
- - max_instances - 1
- - push_to_hub True
- - hf_name_postfix _extended_instruction
instructions
zum Generieren von prediction.json
ab python medner / instruction_ner / inference_instruct . py
- - batch_size 16
- - dataset_name conll2003
- - model_type mistral
- - model_name poteminr / mistral - conll2003_extended_instruction
- - max_instances - 1
instruction_ner/metric.py
Sie können die implementierten Funktionen mit der Ausgabe von inference_instruct verwenden, um Metriken zu berechnen.
import pandas as pd
from utils . rudrec . rudrec_utis import ENTITY_TYPES
from metric import calculate_metrics_from_dataframe
prediction = pd . read_json ( 'prediction.json' )
prediction . head ( 3 )
Ausweis | extrahiert | Ziel | |
---|---|---|---|
0 | 8_1443820.tsv | {'Drugname': [], 'Drugclass': [], 'Drugform': ['tablets'], 'DI': [], 'ADR': [], 'Finding': []} | {'Drugname': [], 'Drugclass': [], 'Drugform': ['tablets'], 'DI': [], 'ADR': [], 'Finding': []} |
1 | 1_2555494.tsv | {'Arzneimittelname': ['Rimantadin'], 'Arzneimittelklasse': [], 'Arzneimittelform': ['Sirup'], 'DI': [], 'ADR': [], 'Befund': []} | {'Arzneimittelname': ['Rimantadin'], 'Arzneimittelklasse': [], 'Arzneimittelform': ['Sirup'], 'DI': [], 'ADR': [], 'Befund': []} |
2 | 1_618967.tsv | {'Drugname': [], 'Drugclass': [], 'Drugform': [], 'DI': [], 'ADR': [], 'Finding': []} | {'Drugname': [], 'Drugclass': [], 'Drugform': [], 'DI': [], 'ADR': [], 'Finding': []} |
from metric import calculate_metrics_from_dataframe
metrics = calculate_metrics_from_dataframe ( prediction , ENTITY_TYPES )
{ 'Drugname' : { 'precision' : 0.9670250896057347 ,
'recall' : 0.9195637355146558 ,
'f1' : 0.9426974143955277 }, ...}
Sie können 5 Arten von Modellfehlern untersuchen:
Eine Verwirrungsmatrix für Fehlerkennungen ist verfügbar.
Die Anweisung LLM für NER ist bei flachen Entitäten gut, bei Datensätzen mit großen Tagsets und verschachtelten Entitäten jedoch schlecht.
Somit liefern LLM und Encoder-Modell vergleichbare Ergebnisse bei flacheren Datensätzen mit unglaublich unterschiedlichen Trainings- und Inferenzzeiten.
und andere Modelle auf HF wie T5, Llama, Mistral: Poteminr