Solução de tarefas complexas de reconhecimento de entidade nomeada (e subtarefa Nested NER) com base em grandes modelos de linguagem (LLMs) modernos.
Você deve formar dicionários python para cada texto e rótulos. Vejamos um exemplo simplificado do Russian Drug Reaction Corpus (RuDReC).
Это старый-добрый Римантадин, только в сиропе.
Римантадин - Drugname, сиропе - Drugform
Instruction
- descrição da tarefa para LLMInglês:
Você está resolvendo o problema do NER. Extraia do texto palavras relacionadas a cada uma das seguintes entidades: Drugname, Drugclass, DI, ADR, Finding.
Inglês:
Você está resolvendo o problema do NER. Extraia do texto palavras relacionadas a cada uma das seguintes entidades: Drugname, Drugclass, DI, ADR, Finding.
dictionary with labels
.Você pode usar uma das duas versões suportadas.
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' : "Ответ: "
}
Ou versão em inglês
MODEL_INPUT_TEMPLATE = {
'prompts_input' : "### Task: {instruction} n ### Input: {inp} n ### Answer: " ,
'output_separator' : "Answer: "
}
Instruction
automaticamente 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
para gerar prediction.json
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
Você pode usar as funções implementadas com a saída de métricas de cálculo inference_instruct.
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 )
eu ia | extraído | alvo | |
---|---|---|---|
0 | 8_1443820.tsv | {'Nome do medicamento': [], 'Classe de medicamento': [], 'Forma de medicamento': ['comprimidos'], 'DI': [], 'ADR': [], 'Descoberta': []} | {'Nome do medicamento': [], 'Classe de medicamento': [], 'Forma de medicamento': ['comprimidos'], 'DI': [], 'ADR': [], 'Descoberta': []} |
1 | 1_2555494.tsv | {'Nome do medicamento': ['Rimantadina'], 'Classe do medicamento': [], 'Forma do medicamento': ['xarope'], 'DI': [], 'ADR': [], 'Descoberta': []} | {'Nome do medicamento': ['Rimantadina'], 'Classe do medicamento': [], 'Forma do medicamento': ['xarope'], 'DI': [], 'ADR': [], 'Descoberta': []} |
2 | 1_618967.tsv | {'Nome do medicamento': [], 'Classe do medicamento': [], 'Forma do medicamento': [], 'DI': [], 'ADR': [], 'Descoberta': []} | {'Nome do medicamento': [], 'Classe do medicamento': [], 'Forma do medicamento': [], 'DI': [], 'ADR': [], 'Descoberta': []} |
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 }, ...}
Você pode explorar 5 tipos de erros de modelo:
A matriz de confusão para reconhecimentos equivocados está disponível.
A instrução LLM para NER tem um bom desempenho em entidades planas, mas um desempenho ruim em conjuntos de dados com grandes conjuntos de tags e entidades aninhadas.
Assim, o LLM e o modelo do codificador produzem resultados comparáveis em conjuntos de dados mais planos com tempos de treinamento e inferência incrivelmente diferentes.
e outros modelos em HF como T5, Llama, Mistral: poteminr