漢数字を洋数字に変換したいだけなのに
はじめに
はじめまして、メディア研究開発センターの河﨑です。
大学は農学系の学部で、大学4回から修士2回までの3年間は、ソメイヨシノの満開日についてずっと考えていました。
M研に入れてもらえてラッキー、ハッピーって感じだったのですが、右も左も(もはや前も後ろも)わからない状態でてんやわんやの毎日です。
(強強の先輩方に助けられながらなんとか生きています。内定者、就活生の皆様期待して大丈夫です。)
今回は、私が配属されて最初のタスク「音声書き起こし文の最適化」の一部分「漢数字洋数字変換」について書きたいと思います。
目の肥えた皆様、やさしい気持ちで読んでください。
書き起こし文の受難
文中の数字が全部漢数字だと読みにくいですよね?
メディア研究開発センターで開発している音声書き起こしモデルでは、書き起こされた文章中の数字は全て漢数字で出力される仕様になっています。
その書き起こしモデルを使って鋭意開発中なのが、文字起こしサービス YOLOです。(詳細は下記のページで!)
例を出すと、「二千十三年の大阪公演には、九百人ものファンが駆けつけました。」って感じです。
読めないことはないです。が、「2013年の大阪公演には、900人ものファンが駆けつけました。」の方がぱっと見で情報が入ってきやすい気がします。
YOLOの社内ユーザーインタビューを行なった際も、「漢数字をいちいち洋数字に直すのが大変」との意見は見受けられました。これはなんとかしなければ!
ということで、YOLOが抱えるこの問題を解決するべく、今回は文章の中から、漢数字を見つけ出して、漢数字→洋数字に変換するまでの、地味で案外長いプロセスをご紹介します。
漢数字変換の厄介
漢数字で表記するものと、洋数字で表記するものの区別ってややこしいですよね。
地名や慣用句・諺に出てくる数字はもちろん漢数字ですが、二酸化炭素や一切といった言葉にもしれっと漢数字が出てきます。
「1個」、「2人」、「3匹」のように単位がつくものは全部洋数字に直せばいいのかというと、そういうわけではなく「一つ」は漢数字にすることが多いそうです。本当に日本語って奥が深い。
ややこしい変換のルールに関して、今回は弊社が出版している「朝日新聞の用語の手引」という本の192ページ〜209ページに載っている「数字・助数詞」という項目を参照することにしました。
漢数字はどこだ
まずは、文章の中から変換するべき漢数字を見つけ出す段階です。
文中の漢数字を全部洋数字に直すのであれば簡単(いきなり、「漢数字を洋数字に変換」の項まで飛べる)なのですが、前項で述べたように全部の漢数字を変換してしまうと、「2酸化炭素」、「1切」という単語が爆誕してしまいます。それは避けたい。
ということで、BERTで系列ラベリングをして、漢数字を認識するというプロセスを踏むことにします。
(全部の数字を洋数字に変換して、漢数字のままにしたいものだけを辞書に登録して変換する方法も考えられるのですが、作業量がエグそうなので今回は廃案となりました。)
今回は、独自に収集した60000文の文章データを使用しました。
タグ付け
音声が書き起こされた文章というのは、句読点もない以下のような文章です。
このデータに、学習のためのタグを以下のようにつけました。
今回の記事の主題と外れてしまうんですが、可読性向上のために他の要素にもタグ付けを行っています。
それぞれ、S(漢数字)、F(フィラー)、P(人名)を検出しようとしています。
漢数字タグは、洋数字に変換するべき漢数字にしかついていません。
このデータをBERTで学習することによって、文脈から「漢数字が使われているが洋数字に変換しないもの」を認識してくれることを期待します。
モデルの学習
今回の実験では漢数字に加え、以下のタグを一つのモデルで予測するようなモデル構築を目指します。
句点
読点
フィラー
人名
相槌
言い直し
実験の条件は以下の通りです。
○モデル
東北大BERT v1 (cl-tohoku/bert-base-japanese-whole-word-masking)
東北大BERT v3 (cl-tohoku/bert-base-japanese-v3)
レトリバの話し言葉BERT
1-6 layer-wise (japanese-spoken-language-bert/1-6_layer-wise)(以下レトリバ①)
TAPT512 60k (japanese-spoken-language-bert/tapt512_60K)(以下レトリバ②)
DAPT128-TAPT512 (japanese-spoken-language-bert/dapt128-tapt512)(以下レトリバ③)
○パラメーター
"train_batch_size":16,
"valid_batch_size":16
"train_epochs":3
"learning_rate":3e-5
"max_len":512
"warmup_ratio":0.08
"scheduler":linear"
"seed":42
あとは、BERTに頑張って学んでもらうだけです。お願いします、BERTさん。
実験結果
定量評価
500件の評価データを用意し、モデルがしっかり漢数字を認識してくれるか、どのモデルの精度が高いか、を見てみました。次の表では、3epoch目の結果を表示しています。
全体で見た結果も、漢数字だけ見た結果も、似たり寄ったりの結果になりました。
レトリバの話し言葉BERTは、東北大BERT v1を基に話し言葉のデータを追加学習させて作成されています。
独自で構築した評価データセットに対しては、東北大v3 > レトリバ > 東北大v1というような結果となりました。
これから先の行程では、わずかながら全体のf1-scoreが高かった東北大BERT v3の結果を前提に話を進めます。
定性評価
今回のモデルで推論して、漢数字を探し出した結果から数文を取り出し、実際に見てみます。まずはうまくいっている例から見てみます。
漢数字の部分はSタグがつき、一昨日という漢字のままでいいものにはSタグがついていません。一文に複数の漢数字があっても対応してくれています。BERT、すごい。十八番をちゃんと漢数字のままだと認識しているあたりが、感動ポイントです。
しかし、うまくいっていないところももちろんありました。
漢数字が入った単語、四字熟語、漢数字でも洋数字でも使う場面がある単語(1級、一番等)は本当は直して欲しくないのに、洋数字に直す対象として選ばれてしまっています。悲しい。
ちなみに、P(人名)、B(相槌)、D(言い直し)などもきれいにとれていました。この喜びは何事にも変え難いですね。
漢数字を洋数字に変換
ここが一番の見せ場のはずなんですが、実は簡単です。
以下のサイトを参考にして実装しました。Kanjizeというライブラリもあるのですが、「一万は10000ではなく、1万としたい」といったようなこちら側の細かい都合を叶えるために、今回は関数を作って対応しています。
漢数字を洋数字に直すと、先述した文章たちが以下のようにして出力されます。
文章が垢抜けたなーって感じがしますね。
最終手段の辞書機能
地名や四字熟語は文章中に大量に出てくるものではありません。
そのため、漢数字のままにしておきたいものをBERTに判断してもらうために、学習を重ねるにも限度がある(かもしれない)。
ということで、漢数字が入った諺や四字熟語を集め辞書を作りました。漢数字として認識しても、辞書の中にあれば、漢数字としての認識をとりやめます。
今回は、漢数字が含まれている諺と四字熟語を集めました。
その数、880個。日本語って大変だ。
この辞書による漢数字変換有無の調整をしたら、Sタグが244から234と10個減り、F1値が0.66から0.68に微増しました。
以下のような謎の文字列を生み出すことにならず、安心しています。
今後も地道な努力を続けていきたいと思います。
まとめ
今回はBERTを使った系列ラベリングを用いて、文章中の漢数字を洋数字に直すまでのプロセスをご紹介しました。
それなりの精度で見つけ出すことができるため、少しはYOLO開発の役に立つはずだと、自己肯定感を上げていこうと思います。
次回予告
実は実は、まだまだ書き起こし最適化王への道は遠いのです。
次回は
ONNXってなんじゃらほい
感動のデプロイ
の2本立てでお送りしたいと思います。(いつになることやら〜〜〜)
(メディア研究開発センター・河﨑真琴)