instruct ner
1.0.0
基于现代大型语言模型 (LLM) 的复杂命名实体识别任务(和子任务嵌套 NER)的解决方案。
你应该为每个文本和标签构建Python字典。让我们看一下俄罗斯药物反应语料库 (RuDReC) 中的一个简化示例。
Это старый-добрый Римантадин, только в сиропе.
Римантадин - Drugname, сиропе - Drugform
Instruction
-LLM的任务描述英语:
您正在解决 NER 问题。从与以下每个实体相关的文本单词中摘录:药物名称、药物类别、DI、ADR、Finding。
英语:
您正在解决 NER 问题。从与以下每个实体相关的文本单词中摘录:药物名称、药物类别、DI、ADR、Finding。
dictionary with labels
。您可以使用两个受支持的版本之一。
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' : "Ответ: "
}
或者英文版
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
prediction.json
的instructions
推断您的 LLM 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
您可以将实现的函数与 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 )
ID | 提取的 | 目标 | |
---|---|---|---|
0 | 8_1443820.tsv | {'药物名称': [], '药物类别': [], '药物形式': ['片剂'], 'DI': [], 'ADR': [], '发现': []} | {'药物名称': [], '药物类别': [], '药物形式': ['片剂'], 'DI': [], 'ADR': [], '发现': []} |
1 | 1_2555494.tsv | {'药物名称': ['金刚乙胺'], '药物类别': [], '药物形式': ['糖浆'], 'DI': [], 'ADR': [], '发现': []} | {'药物名称': ['金刚乙胺'], '药物类别': [], '药物形式': ['糖浆'], 'DI': [], 'ADR': [], '发现': []} |
2 | 1_618967.tsv | {'药物名称': [], '药物类别': [], '药物形式': [], 'DI': [], 'ADR': [], '发现': []} | {'药物名称': [], '药物类别': [], '药物形式': [], 'DI': [], 'ADR': [], '发现': []} |
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 }, ...}
您可以探索 5 种类型的模型错误:
错误识别的混淆矩阵是可用的。
NER 的指令 LLM 在平面实体上表现良好,但在具有大型标记集和嵌套实体的数据集上表现不佳。
因此,LLM 和编码器模型在训练和推理时间极其不同的扁平数据集上产生了可比较的结果。
以及 HF 上的其他型号,例如 T5、Llama、Mistral:poteminr