機械学習を用いたテキスト正規化の今

朴炳宣氏(以下、朴):ただいま紹介いただきました、LINE株式会社の朴でございます。大勢の方の前でしゃべることはなかなかないので緊張していますが、よろしくお願いします。

まず自己紹介からですが、私、名前から察していただけるように、韓国の出身です。

表記はいっぱいありますが、親しみを込めて「ぱっくん」とお呼びいただければうれしいです。旅行やゲームが趣味でして、最近は去年生まれましたハルちゃんを愛でることが日課となっています。

仕事の話に戻ります。私は去年LINEのClova Teamにインターンシップで参加しまして、そのまま正社員として入社しました。最初は音声認識のチームに入っていたのですが、最近では音声合成チームに所属が変わっています。

LINEにおける音声合成(Text-to-Speech)が実際のサービスにどう関わっているかについて、軽くご紹介できればと思います。

この中で、今年行われましたLINEの事業発表会「LINE CONFERENCE 2019」をご覧いただいた方、もしくは会場に行かれた方、いらっしゃいますか?

(挙手なし)

おお、いらっしゃらない(笑)。ではせっかくですので、LINE CONFERENCEで発表した実際音声合成をお聞きいただければと思います。

(デモが流れる)

Bot:はい。いつのご予約でしょうか?

男性:土曜日の夕方18時からでお願いします。

Bot:はい。人数をおうかがいしてもよろしいでしょうか?

男性:4人です。

Bot:はい。お席を確認いたします。6月29日土曜日4名様で確認させていただきます。

男性:あっ、その日はダメ。

Bot:お日にちの変更ですね。

男性:はい。来週でお願いします。

Bot:かしこまりました。

(デモ終わり)

:男性の声は会場で発表している登壇者で、女性の声は我々のチームで作ったモデルによって生成された音声です。いかがでしたでしょうか? 「よかったですよね?」と言ったら、会場の雰囲気的には「よかったです」としかお返しできないと思うんですけれども。

(会場笑)

このように抑揚のある、人っぽいしゃべり方ができるようになっております。

なおかつ、音声合成の技術を使ってこういったサービスもやっております。「Gatebox」と呼ばれるサービスです。

(映像が流れる)

逢妻ヒカリ:おかえりなさい。みなさん、こんにちは。逢妻ヒカリです。私、Clovaちゃんとコラボをさせてもらいました。

:こちら、YouTubeなどでご覧になられた方いらっしゃいますでしょうか。はじめしゃちょーさんが実際使ってたという動画を上げていたりします。

男性:ねえ、ヒカリ?

逢妻ヒカリ:はーい。

男性:天気教えて。

逢妻ヒカリ:うーんと、それじゃあ、お天気見てみるね。どんなお天気かなぁ。

Bot:今日は晴れのち雨でしょう。降水確率は60パーセントです。最高気温は21度の予想です。

逢妻ヒカリ:雨みたいだね。おでかけするなら傘を忘れずにね。

(映像終わり)

:はい。先ほどの「DUET」という飲食店の予約サービスと打って変わって、「はーい」だったり、いわゆるアニメやゲームに出てくるキャラクターのような、抑揚の幅の大きいボイスを聞いていただきました。

このようにさまざまなドメインにボイスチームの音声合成技術がどんどん取り入れられておりまして、いろんなサービスにジョインしていってるという背景がございます。

音声合成技術の仕組み

この音声合成技術の仕組みをざっくり紹介すると、こういった構造になります。

まず、「入力されたテキストに対してどんな音声の波形を与えるべきなのか」を解く問題をモデル化して、Deep Learningなどで学習したものを生成して、あるテキストに対して音声を出力するモデルを配布するかたちになっています。

私はそのなかでも、入力されるテキストに関する処理に関わっております。

ではTTS(Text-to-Speech)において、自然言語処理にどういったタスクが存在するのかを説明します。

例えばこういったテキストが与えられたときに、ここにどういった特徴量があるのかを洗い出します。

まず形態素解析の技術を用いて、各形態素がどういった品詞なのか、また辞書においてどういった読みが与えられているかを推定します。

また、波形と組み合わせるためにはかなり細い音の構造の下の下まで掘り下げなければいけないので、音素を抽出します。ですが、例えば「フウフ」と「ケンカ」という言葉が連なったときに、「ケンカ」の1文字目は「ゲ」と読むべきですよね、といった処理などを行い、その結果に対して、音素を抽出します。

さらに、人の言葉には、僕が今しゃべっているように抑揚が存在します。どの箇所にアクセントをつけるべきなのかという処理を行い、こういった一連の処理で得られた特徴量などを用いて、音声データと組わせて学習を行うことが一般的になっています。

さらにこの中でも、今紹介したタスクのさらにその前の前処理に関わっている仕事をやっております。

この前処理の中でも、今日のタイトルにもあります「テキストの正規化」について最近取り組んでおります。

テキスト正規化の仕組み

ディープラーニングを用いるにあたって大量のコーパスが必要になることは、みなさんご存じのことかと思います。では、大量のテキストデータをどこから入手しようかと考えた時、インターネットが存在していると思います。

例えばみなさんがこういうコーパスを扱うとしましょう。

意味はとくに考えないでください。「もぅマヂ無理。。。」の定型文を使った、あの一連のブームがありましたよね。

こういったさまざまな文字種が混在していたり、間違った、あまり辞書にやさしくない表記に対して、より今後のタスクに適したかたちにしてあげましょう、という処理をテキスト正規化と呼びます。

例えば、絵文字はそもそも意味を持ちません。もちろん人間にとっては印象をやわらげるような効果はありますが、実際のテキスト処理には使われないことが多いです。

そういったものや、「ってゅうのゎ。。」という部分の一般的な表記としては、まだこちらのほうが標準といえます。どんどんデータをきれいにしていく処理を指します。

TTSにおいては、こういった処理がかなり重要です。

例えばこういったテキスト(「午後12:30です」)が与えられたときに、我々としてはこちらをありのまま「午後12コロン30です」と読んでほしくはないわけです。できれば「午後12時30分です」と音声を合成したいので、こちらの記号に対して適切な処理を与えることが求められます。

こういったタスクがあったとしたら、正規表現を用いれば、「24までの数字と60までの数字の間にコロンがある状態で与えられたら、こういうふうに変えてあげましょう」といったスクリプトはすぐに書くことができます。

では、次のコーパスではこういったパターン(「今日の試合は1:2でした」)が与えられたとしたら、最悪ですよね。

このままこのスクリプトが通ってしまうと、「今日の試合は1時2分でした」という結果が返ってきてしまいます。これでは本来の意図を損なって、あまり適さない結果となるわけです。

なので、テキストの正規化は、人によって書かれたルールによって正規化を行うことはもちろんできるのですが、このように解に対して、コーパスの範囲が広がれば広がるほど重くなってしまうという問題が存在します。なので、統計モデルに基づいて、つまり機械学習を用いてこれらを解決しようという試みが存在するわけです。

テキストの正規化とひと言でいっても、そこにはどこまでどの部分について正規化を行うのか、研究のタスクによっては定義が異なったりします。

例えば、このように数字と絵文字が一緒に入って混在しているときに、すべて英文字にするという文字種の統一だったり、誤字脱字の修正、もしくは不要な文字の削除などのタスクについて、それぞれ研究が行われています。

ここからは、各タスクについてどのような研究が行われているのか、実際の研究の事例についてみなさんにご紹介できればと思います。

機械学習に基づくマイクロブログ上のテキストの正規化

あっ、お聞きするのが遅くなったのですが、この中で自然言語処理に携わっている方はどれぐらいいらっしゃるのでしょうか?

(挙手なし)

1人もいらっしゃらないということなので、細かいところは省いて説明させていただきます。

こちらは、最近の研究に比べると昔のものになってしまうのですが、正規化タスクに対してCRFですね。系列ラベリングなどにもよく用いられます。例えば言語処理であればMeCab。他にも時系列の予測などによく使われるモデルです。

こちらのCRFを用いてこのような文字列が与えられたときに、各文字にラベルをつけてこれを予測して解決するという方法を提案しておりまして、このタスクでは比較的広範囲なテキストの正規化になっています。例えばこのように、小文字の「ぃ」を大文字に変えるとか、いらない部分を削除したりといったことができるようになります。

ただ、見ていただきたいのは、使われたデータの数です。たった1,000件で、彼らはけっこうすばらしい成果を出しています。

これは編集距離といいまして、ある文字列AとBがどれぐらい離れているかを表している数字なので、高ければ高いほど悪い結果だと言えます。

正規化を行うまでは、本来正解とするきれいな状態のテキストとそうでないテキストの距離が0.8……ほぼ0.9だったものが、彼らの手法を用いることで約0.3まで近くなるという実績を残しています。

ただ、それでも0.3で、なおかつデータの規模が小さいということから、汎用性についてはまだまだ検討の余地があると語られていますが、その後佐々木さんの研究はほかの手法でも使われたり応用されています。

An RNN Model of Text Normalization

こちらは打って変わって英語に関するタスクです。

こちらは最近流行りのというかすでに定着した手法になっていますが、ニューラルネットワークです。その中でも再帰型のニューラルネットワークを用いてモデルを作成しています。

RNN(Recurrent Neural Network)でも、最近翻訳などによく用いられるEncoder-Decoderといった構造を用いています。彼らのタスクは先ほどのタスクとは異なり文字種の統一にフォーカスしており、「123」という数字が与えられたときにこれをどう読むのか、といった推論を行うモデルを提案しています。

先ほどと比べてデータ規模が違うのですが、11億ワードの英語のコーパスを用いています。

こちらが彼らの成果なのですが、かなりすごい数字ですよね。ほぼ90パーセント以上を出しています。

ただ、一部のタスクについてはまだかなり低い結果になっているので、彼らはそこからさらに出力された結果について、文法、語学知識を含めたモデルのフィードバックを加えることにより、一部の精度の低かった問題に対してさらに精度を上げるといった工夫を加えており、数字からの英文字、数字からの読みの推定に関してはかなり高い精度を出しております。

Encoder-Decoderモデルを用いた日本語崩れ表記の正規化

では、日本語ではニューラルネットワークを使っていないのかということなのですが、日本語でも活発的に使われております。こちらも先ほど紹介した論文と同じようにRNNに基づいたモデルを作成しております。

彼らのタスクは、最初の佐々木さんの研究と同様に、崩れた表記に対してできるだけ標準に近い表記に変換する、崩れた表記に対して正しい表記を生成するというタスクになっています。

彼らの注目するところとしては、実際に使われた正解データ、まともなデータは506文だったのですが、それをこちらのルールに従ってあえて表記揺れを起こして疑似コーパスを作ったところです。

実際、擬似コーパスなしで作った場合はエラーレートがあり得ないぐらい高かったのですが、擬似コーパスを加えることによって、先ほど紹介したCRFでの精度よりもかなり精度の高いモデルが作成できたと示しています。

これがこちらのモデルを使った変換の生成の例なのですが、このように「すげーな☆」という表記に対して、人によって作成されたルールやCRFなどの既存の手法に基づいた正規化よりも、かなり正確なデータを出しています。

Adapting Sequence to Sequence models for Text Normalization in Social Media

最後の論文なのですが、こちらは先ほど紹介した池田さんの論文と同じように、英語に対して表記揺れに関する正規化を行ったモデルです。

今まではCharacterベースといって、各文字に与えて、それを文字ごとに生成していくという手法が主でしたが、それでは文脈を考慮することが大変困難です。もちろん計算量を増やせば増やすほど可能ではありますが、それをもっと効率化しようということで、各単語レベルでの特徴量を生み出す方式とCharacterごとの特徴量を生み出す方式の両方を組み合わせたモデルを作成しています。

このようにかなり広範囲なタスクを抱えているモデルにもかかわらず、80パーセント以上の精度を出しているという結果になっています。

もともとのソースは、こちらにある「cmon」のように、置き換えされたりしているものや誤字をあえて出すようにしているようなんですが、それに対してあらためて正しい表記の生成に成功しています。

まとめてまいります。

今お伝えしたように、正規化に関しては泥臭いことが多く、本タスクの前処理ではありますが機械学習を取り込んだりして、実際はかなり大変な仕事となっています。画像処理でもみなさん一緒だと思うのですが、言語処理もかなり大変です。

ただ、一部の機械学習を用いた正規化に関しては、表記ゆれに関しても80パーセント以上の精度を出しているので、人によって書かれたルールによって起きるヒューマンエラーといいますか、そういったヒューリスティックなルールよりも、実はサービスに適用できるんじゃないかと思いました。

以上となります。ご清聴ありがとうございました。

(会場拍手)