Webサイトの日本語改行問題を機械学習(Budou)で解決できるか検証

API, Python, 機械学習

はじめに

この記事のオリジナルは 2017/02/28 にレコチョク社内向けに公開したものです。多少情報が古くなっているかもしれません。ご了承ください。

改行問題

改行問題、とは例えば以下のような状態のことです。

budou5.jpg

「リリース」の「リリ」で改行されています。
本当ならば、「リリース」という単語の途中で改行をしてほしくありません。

この、「改行させない」という処理はWeb のコード的には難しくありません。
例えば、以下のような span タグで単語ごとに区切ってあげれば、改行は span タグ単位になります。

全てのプロジェクトタイトル(及びそれに類するもの)に人力で区切り位置を入れれば解決するのですが、これは大変な作業です。

そこで、先輩よりこれを機械学習で解決する(かもしれない)ツール budou の検証を依頼されました。

ライブラリ budou とは?

budou とはGoogle から出ている「自動的に文章を良い感じの文節で区切ってくれるライブラリ」です。
例えば、上のような文章を引数で渡すと、文章をいい感じで区切って配列で渡してくれる…らしいです。
早速使ってみましょう。

作者のブログ に使い方が詳細に書かれているので、それに従って設定をしていきます。

Google クラウド自然言語処理API に登録

budou は Google クラウド自然言語処理API という有償の API を呼び出しています。
これは、住所やクレジットカードの情報を入れないと使うことが出来ません。

料金表ページ によると、5000回までは無料で使えるらしいです。

budou6.PNG

先ほどの作者ブログに図付きで詳細に説明してありますので、こちらの記事では登録については割愛します。

最終的に、認証情報が入った JSON ファイルをローカルに保存すれば OK です。

Budou をインストール

続いて、Budou のインストールを行います。
Python であれば pip コマンドで簡単にインストールができます。

Github を見ると、最新のバージョンは 0.2.1 のようです。

budou1.PNG

pip ではどのバージョンがインストールされるのでしょうか。

budou2.PNG

0.2.2 がインストールされました。…え?
…見なかったことにしましょう。

実際に使ってみる

サンプルコードで試す

簡単なコードを書いて試してみましょう。
ちなみに、サンプルコードは Python2 ですが、3 でも問題なく動きました
作者のブログにあったサンプルを 3 で書き直して動かしてみました。

実行してみます。

3秒ほどかけて、出力が出てきました。API と通信するので、その部分で結構時間がかかるみたいです。

span タグで分けられた状態で入力文が出てきました。
第二引数で span タグのクラスは変更できるみたいです。
試しに大草原にしてみます。

実行してみます。

変わってません。

そういえば、budou は自動で実行ディレクトリにキャッシュを生成するようになっています。
試しに、キャッシュを消して実行してみましょう

ちゃんと大草原になりました。いちいちキャッシュを消さないと行けないのは少し面倒ですね。

WIZY に組み込んでみる

実際に WIZY のタイトル表示部分にこの処理を組み込んでみました。
ソースコードは長くなるので割愛します。

このように、変な箇所で改行されることはなくなりました。
(このスクリーンショットだと効果が今ひとつ伝わらないですね 🙂

budou7.png

また、画面幅を変えるとちゃんとそれに合わせて適切な位置で改行してくれます。
Web サイトはPCやSPで色んな画面幅に対応しないといけないので、この確認はとても大事です。

budou8.png

単語の区切り位置を検証

簡単に使えそう、ということは分かりました。
次に、生成される区切りが人が見て自然かどうか見ます。

データ沢山入れて試してみる

WIZY 現行プロジェクトを一通り入れて試してみます。

ちなみに、SPAN になる前段階だと、品詞情報などを含んだ配列になっています。

budou3.PNG

考察

ざっと見た感じ、問題なさそうです。
単語ごとに区切ってありますし、記号(!, 、, ?, etc…) も前の単語にくっついているので違和感はありません。

しかしながら、明らかにおかしかったり、違和感を感じたものもありました。
以下に並べたものは読んでいて「あれ?」となりました。

  • 作ろう! -> 作 / ろう!
  • 日高里菜と -> 日 / 高 / 里菜と
  • 創りあげよう -> 創り / あげ よう
  • 最先端 -> 最 / 先端
  • もう一つの -> もう / 一 / つの
  • 秋田ひろむが -> 秋田 / ひろ / むが
  • 11/1(火)の -> 11/1( / 火)

とりわけ致命的なのは、人名を途中で切ってしまっていることです。
API の返り値の時点でこの変な区切りになっていました。
Google 日本語入力はとても人名に強いイメージだったのですが、
Google 自然言語処理API はそんなに強くないみたいです。
これは API の返り値の問題なので、すぐには改善されない可能性が高いです。

また、11/1(火) の括弧が変な区切りになっています。
ソースコードを読んだところ、「記号は直前の単語にくっつける」という Budou 側の処理が原因でした。
こちらについては、今後 Budou がバージョンアップする際に改善されていくのかもしれません。

また、キャッシュが問答無用で実行ディレクトリに作られる上に、
その場所を変更することは出来ません。
これも、今後の機能追加に期待です。

結論

まだ導入するには早い

API, Python, 機械学習