Solución de tareas complejas de reconocimiento de entidades con nombre (y subtareas NER anidadas) basadas en modelos de lenguaje grande (LLM) modernos.
Debes formar diccionarios de Python para cada texto y etiquetas. Veamos un ejemplo simplificado del Russian Drug Reaction Corpus (RuDReC).
Это старый-добрый Римантадин, только в сиропе.
Римантадин - Drugname, сиропе - Drugform
Instruction
: descripción de la tarea para LLMInglés:
Estás resolviendo el problema NER. Extracto del texto palabras relacionadas con cada una de las siguientes entidades: Nombre del medicamento, Clase del medicamento, DI, ADR, Hallazgo.
Inglés:
Estás resolviendo el problema NER. Extracto del texto palabras relacionadas con cada una de las siguientes entidades: Nombre del medicamento, Clase del medicamento, DI, ADR, Hallazgo.
dictionary with labels
.Puede utilizar una de las dos versiones compatibles.
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' : "Ответ: "
}
O versión en inglés
MODEL_INPUT_TEMPLATE = {
'prompts_input' : "### Task: {instruction} n ### Input: {inp} n ### Answer: " ,
'output_separator' : "Answer: "
}
Instruction
automáticamente 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 generar 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
Puede utilizar las funciones implementadas con la salida de inference_instruct para calcular métricas.
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 )
identificación | extraído | objetivo | |
---|---|---|---|
0 | 8_1443820.tsv | {'Nombre del fármaco': [], 'Clase del fármaco': [], 'Forma del fármaco': ['tabletas'], 'DI': [], 'ADR': [], 'Hallazgo': []} | {'Nombre del fármaco': [], 'Clase del fármaco': [], 'Forma del fármaco': ['tabletas'], 'DI': [], 'ADR': [], 'Hallazgo': []} |
1 | 1_2555494.tsv | {'Nombre del fármaco': ['Rimantadina'], 'Clase del fármaco': [], 'Forma del fármaco': ['jarabe'], 'DI': [], 'ADR': [], 'Hallazgo': []} | {'Nombre del fármaco': ['Rimantadina'], 'Clase del fármaco': [], 'Forma del fármaco': ['jarabe'], 'DI': [], 'ADR': [], 'Hallazgo': []} |
2 | 1_618967.tsv | {'Nombre del fármaco': [], 'Clase del fármaco': [], 'Forma del fármaco': [], 'DI': [], 'ADR': [], 'Hallazgo': []} | {'Nombre del fármaco': [], 'Clase del fármaco': [], 'Forma del fármaco': [], 'DI': [], 'ADR': [], 'Hallazgo': []} |
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 }, ...}
Puede explorar 5 tipos de errores de modelo:
Está disponible una matriz de confusión para reconocimientos erróneos.
La instrucción LLM para NER funciona bien en entidades planas, pero tiene un rendimiento deficiente en conjuntos de datos con conjuntos de etiquetas grandes y entidades anidadas.
Por lo tanto, LLM y el modelo codificador producen resultados comparables en conjuntos de datos planos con tiempos de entrenamiento e inferencia increíblemente diferentes.
y otros modelos en HF como T5, Llama, Mistral: poteminr