Solution de tâches complexes de reconnaissance d'entités nommées (et de sous-tâches Nested NER) basées sur des modèles de langage étendus (LLM) modernes.
Vous devez créer des dictionnaires Python pour chaque texte et étiquette. Regardons un exemple simplifié du Russian Drug Reaction Corpus (RuDReC).
Это старый-добрый Римантадин, только в сиропе.
Римантадин - Drugname, сиропе - Drugform
Instruction
- description de la tâche pour LLMAnglais:
Vous résolvez le problème NER. Extrayez du texte les mots liés à chacune des entités suivantes : Nom du médicament, Classe du médicament, DI, ADR, Finding.
Anglais:
Vous résolvez le problème NER. Extrayez du texte les mots liés à chacune des entités suivantes : Nom du médicament, Classe du médicament, DI, ADR, Finding.
dictionary with labels
.Vous pouvez utiliser l'une des deux versions prises en charge.
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 version anglaise
MODEL_INPUT_TEMPLATE = {
'prompts_input' : "### Task: {instruction} n ### Input: {inp} n ### Answer: " ,
'output_separator' : "Answer: "
}
Instruction
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
pour générer 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
Vous pouvez utiliser les fonctions implémentées avec la sortie de inference_instruct calculate metrics.
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 )
identifiant | extrait | cible | |
---|---|---|---|
0 | 8_1443820.tsv | {'Nom du médicament' : [], 'Classe de médicament' : [], 'Forme de médicament' : ['comprimés'], 'DI' : [], 'ADR' : [], 'Résultat' : []} | {'Nom du médicament' : [], 'Classe de médicament' : [], 'Forme de médicament' : ['comprimés'], 'DI' : [], 'ADR' : [], 'Résultat' : []} |
1 | 1_2555494.tsv | {'Nom du médicament' : ['Rimantadine'], 'Classe de médicament' : [], 'Forme du médicament' : ['sirop'], 'DI' : [], 'ADR' : [], 'Recherche' : []} | {'Nom du médicament' : ['Rimantadine'], 'Classe de médicament' : [], 'Forme du médicament' : ['sirop'], 'DI' : [], 'ADR' : [], 'Résultat' : []} |
2 | 1_618967.tsv | {'Nom du médicament' : [], 'Classe de médicament' : [], 'Forme de médicament' : [], 'DI' : [], 'ADR' : [], 'Résultat' : []} | {'Nom du médicament' : [], 'Classe de médicament' : [], 'Forme de médicament' : [], 'DI' : [], 'ADR' : [], 'Résultat' : []} |
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 }, ...}
Vous pouvez explorer 5 types d’erreurs de modèle :
Une matrice de confusion pour les reconnaissances erronées est disponible.
L'instruction LLM pour NER fonctionne bien sur les entités plates, mais fonctionne mal sur les ensembles de données avec de grands jeux de balises et des entités imbriquées.
Ainsi, le LLM et le modèle d'encodeur produisent des résultats comparables sur des ensembles de données plus plats avec des temps de formation et d'inférence incroyablement différents.
et d'autres modèles sur HF comme T5, Llama, Mistral : poteminr