読者です 読者をやめる 読者になる 読者になる

にほんごのれんしゅう

日本語として伝えるための訓練を兼ねたテクログ

RNNで「てにをは」を校正する

RNNで「てにをは」を校正する

余談

2017/3/19に、どの深層学習フレームワークがこれから深層学習を始める人におすすめなのかというアンケートをtwitterで取らせていただきました。

f:id:catindog:20170320174157p:plain
五位 Theano(個別カウント)

はじめに

 RNNによる文章校正がリクルートによって提案されて以来、調査タスクとして私のものとに来たりして、「できるんでしょう?」とか軽く言われるけど、実際には簡単にはできません。
 RNNによる文章生成ができるから、校正もできるというのが人間の自然な発想なのかもしれませんが、英語と日本語の違いに着目した場合、英語がアルファベットのみで構築されるのに比べて日本語は、漢字・ひらがな・カタカナと非常に多く、同じように問題を適応すると、すごい高次元の問題を解くこととなり、理想的なパフォーマンスになかなかなりません。
 まぁ、あんまり完成してるわけでない技術を完成したようにプレスリリースを出す企業様の印象操作もあり、正直どうかと思うんですけどね...まぁそれはいいです。

 さて、リクルートは文章生成プログラムとビームサーチで「てにをは」を修正するディープラーニングがあるということですが、RNNとビームサーチで実装したとのことです[1]
 いささか、どのように実装したのか不明瞭であったので、まとめ直しました。多分こういうことでしょう。
f:id:catindog:20170320172153p:plain

図1. 多分ビタビアルゴリズムのようにしているんだと思う
 
 さて、問題となるのが、計算量です。幅3で一文を探索した場合でも、修正する助詞が3つあれば、9回の評価が必要になります。しかも、GRUやLSTMは状態を保存するので、モデルの状態を固定して9つ別個に走らせる必要があるので、9倍のメモリも必要になります。(実はわたしは、このアプローチはだいぶ前に試して、お蔵入りにしました)

 これを別のアプローチで解決していきます。

問題

 文章校正ではコンテンツを持つ企業であれば、どこでも直面する問題であるので、RNNでの文章校正に意欲を燃やす企業が多い。
 このモチベーションは素人ライターや文章をあまり書いたことのない人などが、内容はおいておき、「てにをは」がおかしかったり、単語チョイスがおかしかったりすることに起因していて、直すのは人手が現在はほとんどであり、大変工数がかかるので簡易化したいという思惑があったりする。
 とくにキュレーションサービスを抱えている業者は、素人の日本語が変だったりして、修正することが多い。キュレーションサイト自体は、現在では、盗用であったり、健康に害を及ぼすニセの情報の発信も問題とされている。DeNAでは大炎上して40億近くも溶かしたらしい、人の命に関わる問題で適当やらかしたら、しょうがない気もする[2]
 問題のスコープを限定して、コンテンツの真偽性の検証ではなくて、「てにをは」の修正に焦点を当てる。
 また、キュレーションサイトに素人文章が多いということを利用して、修正箇所が多いほうが、キュレーションサイトであるという仮説を検証する。

提案

 RNNで助詞を予想させるタスクを行う。ただし、ビームサーチが必要になるのは次の文脈が確定されていなからであって、予想する文字の次の文脈を入力素性として利用する。
 これは、以前教師なし文章の復元の投稿でも用いた類似したアプローチであるが、単語粒度に拡張し、fastTextを適応してベクトル化して、「てにをは」を修正する問題である。
 通常、RNNを文章生成のタスクで利用するには、活性化関数にsoftmaxと損失関数categorical cross entropyを利用することが多い。しかし、鋭利すぎる出力が出ることが多いので、なだらかな出力が欲しかったので、活性化関数にsigmoid、損失関数にbinary cross entropyを用いたモデルで行う。
f:id:catindog:20170320172507p:plain

図2. 今回利用したモデル

モデル

Keras2を使ってみました。
github.com

ネットワークのみ記す。

def build_model(maxlen=None, out_dim=None, in_dim=256):
 print('Build model...')
 model = Sequential()
 model.add(GRU(128*20, return_sequences=False, input_shape=(maxlen, in_dim)))
 model.add(BN())
 model.add(Dense(out_dim))
 model.add(Activation('linear'))
 model.add(Activation('sigmoid'))
 optimizer = Adam()
 model.compile(loss='binary_crossentropy', optimizer=optimizer)
 return model

コード全体はgithubを参照にしてください。
データセットを集めるプログラムは付属していないので、適宜各人、適宜、集めてください。
ubuntu用のfastTextバイナリが含まれます。Python3のみ動作検証しています。

実験

  • Yahoo! Newsの記事2月1日からのデータを1000MByteの学習データセットをもちいて学習させた
  • LSTMではなくGRUを用いた。2560unitも使う巨大なモデルである
  • 活性化関数はsigmoid
  • 損失関数はbinary cross entropy
  • 入力は助詞の周辺の単語19語、出力は助詞の種類
  • 単語の分散表現はFacebook社のfastTextを利用して256次元にエンベッディング
  • 修正する助詞は「が,の,を,に,へ,と,で,や,の,は,も,ば,と,し,て,か,な,ぞ,わ,よ」に限定した

評価

1. 訂正能力を確認するため、実際にいくつかのキュレーションサイトで試してみることで、定性的に評価する
 評価に4meeeというサイトの記事を用いた
2. キュレーションサイトと、Yahooヘッドラインの記事では訂正箇所の大小により差があることを定量的に評価する
 評価を4meeeの1000文, 日経新聞の1000文を調べることで、差があるかどうか定量的に評価する

結果

1. 訂正能力を確認. 実際にいくつかのキュレーションサイトで試してみることで、定性的に評価
(4mee.comさまのサイトを参照させていただきました)
(赤い文字が修正ポイントです)
間違いを指摘する例 1.
...いい,の,だろ,う,か,?,」,と,悩む,こと,,ある,かも,しれ,ませ,ん,ね,。,アラサー女子,が

0.435673713684082030.22929041087627410.126160755753517150.074866257607936860.051154583692550660.0237842295318841930.014887742698192596
… 以下略

間違いを指摘する例 2.
...理由,で,、,結婚,を,考え,られ,ない,という,方,,多い,かも,しれ,ませ,ん,。,ですが,、,それ

0.98368060588836670.4184749424457550.16642177104949950.0062757581472396850.0043656616471707820.0009334951755590737
...以下略

間違いを指摘する例 3.
...れ,て,いる,こと,は,あり,ませ,ん,。,理由,,ない,のに,定職,に,つか,ず,に,ふらふら,し

0.93805074691772460.114897608757019040.073563553392887120.053266808390617370.0262335799634456630.01495771761983633
...以下略

接続詞でだいぶ、異なった出力が得られるようです。人間も意識しないとわからない部分です。

2. キュレーションサイトと、Yahooヘッドラインの記事では訂正箇所の大小により差があることを定量的に評価

これは、日本語としてちょっと標準と離れることがキュレーションサイトでは多い、つまり、権威あるニュースサイトに比べると、訂正箇所がおおいという仮説を証明する。
評価を4meeeの1000文, 日経新聞の1000文を調べることで、差があるかどうか定量的に評価する

|実測値   | 日経 | 4meee |
|修正なし |  746 |   491 |
|修正あり |  254 |   509 |

カイ二乗検定などを試した結果、別の分布と言えるようだ。別のものであれば、キュレーションサイトと日経のサイトを判別する機械学習モデルの素性に組み入れても良いだろう。

結論

 ビームサーチを行わないモデルなので、探索が楽で高速に動作するというメリットがあり、softmax + categorial cross entropyと違って確率表現のように出力するので、しきい値等で、機械学習の結果を採用したり、却下したりすることができる。
 また、日本語の「てにをは」は厄介なので、日本語の勉強をしている非ネイティブの人や、研究者の方、日本人だが簡易的な校正が必要な方などの利用ケースが考えられる。
(なにか間違いがありましたら、twitterでこっそり教えてください)

参考文献

[1] LSTMとResidual Learningでも難しい「助詞の検出」精度を改善した探索アルゴリズムとは http://www.atmarkit.co.jp/ait/articles/1611/11/news016_2.html
[2] 第三者委員会調査報告書 http://v3.eir-parts.net/EIRNavi/DocumentNavigator/ENavigatorBody.aspx?cat=tdnet&sid=1450400&code=2432