シーケンス長が最大8192トークンとし、さらにFlash Attentionに対応した改良BERTモデルであるModernBERTが発表されました。このModernBERTを日本語と英語で学習させたモデルをSoftbank Intuitionsさんが公開しました。そこで日本語で固有表現抽出(NER)を実施してみます。
モデルはこちら:
英語での固有抽出の例はこちら:
すばらしい記事ありがとうございます。
stockmarkさんのWikipediaデータセットを使います。
日本語になったのでTokenizerを考慮すれば出来るはずです。また、データセットに応じたラベルへの配慮が必要になります。
# モデルとトークナイザーの準備
model_name = "sbintuitions/modernbert-ja-130m"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForTokenClassification.from_pretrained(model_name, num_labels=17) # エンティティの数に応じて調整# データセットの準備
dataset = load_dataset("stockmark/ner-wikipedia-dataset")# ラベルのマッピング
label_list = ["O", "B-人名", "I-人名", "B-法人名", "I-法人名", "B-政治的組織名", "I-政治的組織名",
"B-その他の組織名", "I-その他の組織名", "B-地名", "I-地名", "B-施設名", "I-施設名",
"B-製品名", "I-製品名", "B-イベント名", "I-イベント名"]label2id = {l: i for i, l in enumerate(label_list)}
id2label = {i: l for l, i in label2id.items()}
その他のコードは、ノートを参照ください。
10 epochsまで学習させました。Training Lossが0になったりしていて、learning rateあたりの調整が必要かもしれませんが、学習は進んでいるようです。スコアはもうちょっとは稼ぎたいところ。
Epoch Training Loss Validation Loss Precision Recall F1 Accuracy
1 No log 0.153537 0.778229 0.777597 0.777913 0.957512
2 0.274700 0.148813 0.810386 0.836039 0.823012 0.961741
3 0.274700 0.226496 0.820978 0.844968 0.832800 0.964084
4 0.037000 0.197885 0.806279 0.854708 0.829787 0.963823
5 0.011200 0.238382 0.822034 0.866071 0.843478 0.966556
6 0.011200 0.254458 0.825886 0.870130 0.847431 0.966166
7 0.002800 0.299141 0.848773 0.870130 0.859319 0.968053
8 0.002800 0.290060 0.850829 0.875000 0.862745 0.968443
9 0.000400 0.298825 0.851266 0.873377 0.862179 0.968053
10 0.000000 0.299220 0.847792 0.872565 0.860000 0.967988
とりあえず、
2020年に安倍晋三が日本の首相を辞任した。
という文章を予測させると、
[{'end': 4, 'entity': 'LABEL_1', 'index': 1, 'score': 1.0, 'start': 0, 'word': '安倍晋三'},
{'end': 5, 'entity': 'LABEL_0', 'index': 2, 'score': 1.0, 'start': 4, 'word': 'が'},
{'end': 8, 'entity': 'LABEL_0', 'index': 3, 'score': 1.0, 'start': 5, 'word': '日本の'},
{'end': 10, 'entity': 'LABEL_0', 'index': 4, 'score': 1.0, 'start': 8, 'word': '首相'},(以下略)
と返ってきてて出来ているようです。あとは、ラベルを合わせこめばよさそうです。
そこで、参考にさせていただいたサイトのコードを利用して予測結果と正解ラベルを比較します。
元の文章: 1 9 9 6 年 4 月 、 関東 学院大学 軽 音楽 部 内で 結成された 。
予測結果: ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-法人名', 'I-法人名', 'B-その他の組織名', 'I-その他の組織名', 'I-その他の組織名', 'O', 'O', 'O']
正解ラベル: O O O O O O O O B-法人名 I-法人名 B-その他の組織名 I-その他の組織名 I-その他の組織名 O O O
正誤: ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○
---
元の文章: 同年 4 月 、 THE ▁RAM PAGE の 候補 メンバー に選出され る 。
予測結果: ['O', 'O', 'O', 'O', 'B-その他の組織名', 'I-その他の組織名', 'I-その他の組織名', 'O', 'O', 'O', 'O', 'O', 'O']
正解ラベル: O O O O B-その他の組織名 I-その他の組織名 I-その他の組織名 O O O O O O
正誤: ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○
いい感じですね。誤りとなったケースも確認しましたが、判断難しいパターンでした。
ModernBERTの日本語モデル有難い。
今回使ったColabノートです。