instruct ner
1.0.0
最新の大規模言語モデル (LLM) に基づく、複雑な固有表現認識タスク (およびサブタスクのネストされた NER) のソリューション。
すべてのテキストとラベルに対して Python 辞書を作成する必要があります。 Russian Drug Reaction Corpus (RuDReC) の簡略化された例を見てみましょう。
Это старый-добрый Римантадин, только в сиропе.
Римантадин - Drugname, сиропе - Drugform
Instruction
の作成 - LLM のタスクの説明英語:
あなたは NER 問題を解決しています。次の各エンティティに関連する単語をテキストから抽出します: 薬剤名、薬剤クラス、DI、ADR、所見。
英語:
あなたは NER 問題を解決しています。次の各エンティティに関連する単語をテキストから抽出します: 薬剤名、薬剤クラス、DI、ADR、所見。
dictionary with labels
作成します。サポートされている 2 つのバージョンのいずれかを使用できます。
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
に従って LLM をトレーニングする 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
に基づいて LLM を推論し、 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 )
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 とエンコーダー モデルは、信じられないほど異なるトレーニング時間と推論時間を使用して、よりフラットなデータセットで同等の結果を生成します。
T5、Llama、Mistral などの HF の他のモデル:poteminr