地平線まで行ってくる。

記録あるいは忘備録。時には検討事項。

ModernBERTで固有表現抽出を日本語とColabで試してみる。

シーケンス長が最大8192トークンとし、さらにFlash Attentionに対応した改良BERTモデルであるModernBERTが発表されました。このModernBERTを日本語と英語で学習させたモデルをSoftbank Intuitionsさんが公開しました。そこで日本語で固有表現抽出(NER)を実施してみます。

 

モデルはこちら:

huggingface.co

 

英語での固有抽出の例はこちら:

zenn.dev

すばらしい記事ありがとうございます。

 

stockmarkさんのWikipediaデータセットを使います。

github.com

 

日本語になったので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ノートです。

gist.github.com