こんにちは、アプリエンジニアのみっちーです。

今回はアプリ側の話ではないですが、最近マルコフ連鎖で自然言語処理を行う機会があったので、それについてちょっと紹介します。

簡単に背景をお話しますと、現在ブレイブソフトではHONNEという完全匿名でつぶやき投稿ができる自社サービスを開発、運用しています。
ここには日々15,000ほどの投稿がユーザの方から行われており、完全匿名という性質からか、良い意味でも悪い意味でも人間らしい投稿で溢れています。
そのデータを個人を特定できない範囲で(そもそも完全匿名なので特定できませんが)使って、何か面白いことができないか、と考え「人間の本音を学習して発言するbotがあったら面白いんじゃないか」という結論にたどり着きました。

今回行ったのは単純なマルコフ連鎖を用いた処理ではありますが、考え方としては最近良く聞くディープラーニングのベースになるようなものだと個人的には考えているので、ここで紹介させていただきたいと思います。

文章を学習

まず学習対象となる一つ一つの文章に対して、単語間のつながりリストを作成します。
と、これだけ書いても何のことかわからないと思うので、実際にやってみます。

今日はいい天気です

今日 / は / いい / 天気 / です

文章を単語に分割して…

基準 次の単語
今日
いい
いい 天気
天気 です
です (文章の終わり)

このようなリストを作成します。
各単語の次にどのような単語が来るか、ということを表しています。
この例だと、「今日」の次には「は」が来て、「は」の次には「いい」が来るという意味になります。

同じことを下記の3文に対して実行すると、次のようなリストが作成されます。

今日はいい天気です
明日は名古屋に仕事に行きます
私の出身地は名古屋です

基準 次の単語
今日
いい
いい 天気
天気 です
です (文章の終わり)
明日
名古屋
名古屋
仕事
仕事
行き
行き ます
ます (文章の終わり)
出身地
出身地
名古屋
名古屋 です
です (文章の終わり)

文章を作成

単語間のつながりリストを作成したら、次はそこから文章を作ってみます。

最初の単語としてここでは「今日」を選択します。
すると「今日」の次に来る単語は「は」であるため、この時点で『今日は』という文章ができます。

次に「は」の次に来る単語を見てみると「いい」と「名古屋」と「名古屋」の3種類あります(「名古屋」が重複してしまっていますが)。
ここではランダムに「名古屋」が選択されたとします。
すると、この時点で『今日は名古屋』という文章ができます。

同じ要領で単語を選択していくと、「今日」「は」「名古屋」「に」「行き」「ます」となり、『今日は名古屋に行きます』という文章が作成されました。
元々存在しない、新たな文章が作成されたということになります。

実際にはもう少し複雑

上記の方法で文章を学習し、作成すること自体はできるのですが、実際のHONNEで稼働中のbotはこれをもう少し改良したものになります。

まず第一に、文章を単語に分割する際に名詞かどうかも判断するようにし、文章作成時に選ばれる最初の単語は必ず名詞になるようにしています。

そして上記の例ではつながりリストとして次の単語のみ記憶するようにしていましたが、実際は次の次まで記憶するようにしています。
こうすることで、より自然な日本語に近い文章が作成されるようになります。

基準 次の単語 さらに次の単語
今日 いい
いい 天気
いい 天気 です
天気 です (文章の終わり)

こうして実際に作成された文章が以下になります。

  • 塩対応でわらた。みんなは?
  • 22万人のコブ付きバツ2でアイドルに会いたいよ
  • 大学通ってる大学の友達かっ!!

…なかなか意味不明な文章に仕上がっていますね(笑)

botは現在HONNEアプリ内で稼働中ですので、気になる方はインストールしてみて発言を見守ってあげてください。
1時間に1回わけのわからないことをつぶやいています(笑)

さて、今回はロジック的な部分のみになりますが、マルコフ連鎖を用いた自然言語処理についてお話しました。
意外と簡単にAIっぽいものを作ることができるので、『ディープラーニングをやってみたいけど、よくわからないしハードルが高すぎる』と考えている方にはおすすめです。

しかし、やはり技術的に難しいことに挑戦してこそのブレイブソフトであると思うので、現在ディープラーニングの方も勉強中です。
ユーザと本音で会話ができるAIの誕生を目指して。。。