地平線まで行ってくる。

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

ruri-v3-pt-310m/ruri-v3-310mでNERをやってみる

NER(固有名詞抽出)に再び挑戦します。ruri-v3-pt-310m/ruri-v3-310mをStockmark作WikipediaのNER向けdatasetを使って学習させてみます。このモデルでは分かち書きが不要です。しかしながら、学習済みSentencePieceのtokenizerによるトークンとNERの文字単位ラベルとずれると精度が少し落ちてしまいます。SentencePieceの利用は、NERのタスクに向かないのでしょうけれども、私ではこのサイズ感の事前学習モデルを構築するのは厳しい。それであきらめても面白くないので、拙い工夫をチャレンジしてみます。

 

まずは、NERの文字ラベルとSentencePieceによるトークナイズの不一致が精度を落としている原因だとすると、
A. NER文字ラベルと整合した文字単位に、SentencePieceを拡張するか再学習。
B. NERの文字ラベルをSentencePieceが学習した文字単位に整合させる。
のいずれかだと考えました。


A. NER文字ラベルと整合した文字単位にSentencePieceを拡張するか再学習

「日本の」のように「日本」と「の」と、ラベル付け語句が分離できてないケースへの対応として、強制的にひらがなを分割する方法では一定の効果がありました(過去記事参照)。ならばと、SentencePieceに注目して再事前(追加)学習のような手法を試みてみましたが改善しませんでした。再学習コストが大きいでしょうし、手法が正しいか道に迷いました。加えて、Colabのコンピューティングユニットもだいぶ消耗しましたので諦めます(笑)

B. NERの文字ラベルをSentencePieceが学習した文字単位に整合させる。

端的に言えば、「日本」という地名ラベルが、「日本の」という単位でもいいよと緩めても問題ない使い方をすればいい。ただし、BIOラベル付けでB-とI-がトークンでまたがったりする場合の取り扱い。トークンの先頭にB-が来ない場合やサブワードのI-の取り扱いの処理を丁寧にしておく必要があります。

 

F1 スコア(最大): 0.907063となり、処理しない場合に対して、0.1ポイント程度アップしました。これまで試した日本語ModernBERT系(lm-jp-modernbert-base, ModernBERT-ja-310m, ruri-v3-pt-310m)ではもっともよい結果となりました。学習のF1スコア最高値だけをみた、ざっくりとした比較です。

 

前処理あり(上記B)の最大F1スコア参考

ruri-v3-310m: 0.907063
ruri-v3-pt-310m: 0.902182

眺めてみてもptよりembeddingをベースにした方が微妙にスコアが良い気が・・・。

 

前処理なしの最大F1スコア参考(同じコードで比較):

lm-jp-modernbert-base: 0.867840
ModernBERT-ja-310m: 0.881713
ruri-v3-pt-310m: 0.885561

 

利用の仕方としては邪道ですが、そもそも処理単位に合わせるというのは至極当然ですね。でも、今どきNERって・・・と、言われそう。地名や人名を抜き取る以外にも応用できるので、まだまだ面白い分野だと思います。

 

Colabノート:

利用したColabノートです。Paddingの実装部分がこれでいいのか・・・不安ですけど、スコアが上がったから、区切りとします。

colab.research.google.com