โซลูชันของงาน Named Entity Recognition ที่ซับซ้อน (และงานย่อย Nested NER) โดยอิงตาม Large Language Models (LLM) สมัยใหม่
คุณควรสร้างพจนานุกรมหลามสำหรับทุกข้อความและป้ายกำกับ ลองดูตัวอย่างง่ายๆ จาก Russian Drug Reaction Corpus (RuDReC)
Это старый-добрый Римантадин, только в сиропе.
Римантадин - Drugname, сиропе - Drugform
Instruction
- คำอธิบายงานสำหรับ LLMภาษาอังกฤษ:
คุณกำลังแก้ไขปัญหา NER แยกจากคำข้อความที่เกี่ยวข้องกับแต่ละเอนทิตีต่อไปนี้: ชื่อยา, ประเภทยา, DI, ADR, การค้นหา
ภาษาอังกฤษ:
คุณกำลังแก้ไขปัญหา NER แยกจากคำข้อความที่เกี่ยวข้องกับแต่ละเอนทิตีต่อไปนี้: ชื่อยา, ประเภทยา, DI, ADR, การค้นหา
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
instructions
ในการสร้าง 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
คุณสามารถใช้ฟังก์ชันที่ปรับใช้กับเอาต์พุตของเมตริกการคำนวณ 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 )
รหัส | สกัดแล้ว | เป้า | |
---|---|---|---|
0 | 8_1443820.tsv | {'ชื่อยา': [], 'ประเภทยา': [], 'รูปแบบยา': ['แท็บเล็ต'], 'DI': [], 'ADR': [], 'การค้นหา': []} | {'ชื่อยา': [], 'ประเภทยา': [], 'รูปแบบยา': ['แท็บเล็ต'], 'DI': [], 'ADR': [], 'การค้นหา': []} |
1 | 1_2555494.tsv | {'ชื่อยา': ['Rimantadine'], 'ประเภทยา': [], 'รูปแบบยา': ['น้ำเชื่อม'], 'DI': [], 'ADR': [], 'การค้นหา': []} | {'ชื่อยา': ['Rimantadine'], 'ประเภทยา': [], 'รูปแบบยา': ['น้ำเชื่อม'], '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 ประเภท:
มีเมทริกซ์ความสับสนสำหรับการรับรู้ที่ผิดพลาด
Instruction LLM สำหรับ NER ทำงานได้ดีกับเอนทิตีแบบเรียบ แต่ทำงานได้ไม่ดีในชุดข้อมูลที่มีแท็กเซ็ตขนาดใหญ่และเอนทิตีที่ซ้อนกัน
ดังนั้น LLM และโมเดลตัวเข้ารหัสจึงให้ผลลัพธ์ที่เทียบเคียงได้กับชุดข้อมูลแบบแฟลตเนอร์ที่มีเวลาในการฝึกฝนและการอนุมานที่แตกต่างกันอย่างไม่น่าเชื่อ
และรุ่นอื่นๆ บน HF เช่น T5, Llama, Mistral: poteminr