年越しが思いの外ひまだったのでなんか作ったろってなってLINE bot 使って投げた文章に語尾をつけて返してくれるbotを作ってみた


経緯

発端

わい「年越し暇やな〜...せや語尾つけるapi作って何かしらでbotつくろ」

語尾とは

アイドルに大事なのはキャラづくりぷり!!

詳しくはプリパラを視聴してください

環境

  • Heroku
  • Ruby, sinatra
  • LINE bot

LINEにしたのは,Slackとかは色々やったことあったので,LINEでやってみようかなってくらいの理由です.

この記事を参考にさせていただきました:https://qiita.com/fullmated/items/81d1a49ed3d49eda2285

環境構築部分

LINE

LINEには開発者ツールが用意されており(初めて知った),今回は配信と返信が可能な「Messaging API」を使いました.
こんなアカウントって個人的に作れちゃうんですね.

基本的なやり方は先程の記事に沿って行ったので説明は割愛します.
ただ,APIを使うには2つの値のchannel_secretchannel_tokenを設定する必要があり,若干どれを指すのかわかりにくかったです.
channel_secretはそのままでChannel Secretの値を,channel_tokenアクセストークンを発行して設定します.

heroku

地味にmecabを動作に苦戦しました.
Heroku上でsinatora / rubyのアプリケーションを動かすのは簡単で,割と多くの記事が出てくるのですが.Mecabを動作させるのが苦戦しました.

herokuでsinatra+mecabで動作させる記事です.
https://qiita.com/hidao/items/104355b0a2b6f5ae29fb
こちらも参考にさせていただきました.
同じようなことをやろうとしてる人ってたくさんいるんですね.

ただ,一箇所つまってしまった箇所があり,libmecab.soというファイルを環境変数でパスを指定する必要があり,それがうまくいきませんでした.
私は,heroku上でfindコマンドを使ってlibmecab.soの位置を探しました.
結果的に↓の場所にありました.

MECAB_PATH /app/vendor/mecab/lib/libmecab.so

語尾生成部分

どう語尾を生成するか悩んだのですがMecabを使った形態素解析をして,品詞の並びをとってやればいいかなとなんとなく思いました.

Mecabとは

  • 日本語の文章の形態素解析を行い,単語ごとに分割してくれるすごいやつ

Mecabはrubyのgemから動かせるのでそれを使用しました.

Mecabによる解析例(例文「我々宇宙人はこの地球を侵略しにきました」)

我々  名詞,代名詞,一般,*,*,*,我々,ワレワレ,ワレワレ
宇宙  名詞,一般,*,*,*,*,宇宙,ウチュウ,ウチュー
 名詞,接尾,一般,*,*,*,,ジン,ジン
 助詞,係助詞,*,*,*,*,,,
この  連体詞,*,*,*,*,*,この,コノ,コノ
地球  名詞,一般,*,*,*,*,地球,チキュウ,チキュー
 助詞,格助詞,一般,*,*,*,,,
侵略  名詞,サ変接続,*,*,*,*,侵略,シンリャク,シンリャク
 動詞,自立,*,*,サ変・スル,連用形,する,,
 助詞,格助詞,一般,*,*,*,,,
 動詞,自立,*,*,カ変・クル,連用形,くる,,
まし  助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
 助動詞,*,*,*,特殊・タ,基本形,,,
EOS

ここから得られる情報を基に語尾を付与するということをしていきます.

語尾のつけかた

我々宇宙人は地球を侵略しにきました. → 我々宇宙人は地球を侵略しにきましたぷり.

この例であったら助動詞「た」の後ろに「ぷり」がつきそうなので,基本的には助動詞の後ろにつければよさそうな気がします.
ただし,助動詞「まし」の後ろには助動詞「た」があるため,後に助動詞が続く場合は除外する必要がありそうです.

また,「パラ宿からき(動詞)た(助動詞)ハシビロコウ(名詞)です」のように,助動詞のあとに名詞がくるパターン(助動詞前の動詞が副詞的な作用をする場合)も除外する必要がありそうです.

ということで助動詞に関する法則は

後ろに助動詞・名詞が続かない助動詞のあとに「ぷり」を付与する

というような感じになりそうです.
これに則ると,文末が,「きました」だけでなく「き(動詞)た(助動詞)」「き(動詞)ます(助動詞)」「き(動詞)まし(助動詞)た(助動詞)ね(助詞)」あたりの対応ができそうです.

この語尾をつける法則を見つけるのが難しく,これだけだと不十分なのですが,年越しの酔っ払った自分にはこれしか法則が見つけられませんでした.
この部分の改良が今後の課題になりそうです.
例えば文末が「くる(動詞)」や「き(動詞)まし(助動詞)た(助動詞)わ(助詞)ね(助詞)」あたりはこれだと語尾がつかなかったり不自然になったりしそうでし,「あれはデビルマン」のように名詞で終わるような場合にも対応できてなさそうで,探せばミスパターンは幾らでも出てきそうです.

ひとまずこの記事では年越しのタイミングでやった内容のみを書いていきます.
いつかは最新版を更新したいと思いますぷり.

語尾生成部分のコード

LINEで投稿された文章をこのメソッドにぶん投げて語尾をつけるような実装です.
コーディング力高めていきたい.

require 'mecab'
require 'natto'

class Gobi
  def self.add_gobi(str)
    nm = Natto::MeCab.new
    result = ""
    flag = false
    nm.parse(str) do |n|
      result += 'ぷり' if flag && n.feature.split(',')[0] != '名詞' && n.feature.split(',')[0] != '助動詞'
      flag = false
      flag = true if n.feature.split(',')[0] == '助動詞'
      result += "#{n.surface}"
    end
    result
  end
end

動かした感じ↓

ガバガバなのでもっと精度高めていきたいのでイゴ!よろしく!!!
あと,今後は夢川ゆいみたいに「ユメ○○」を自動生成できたらいいなって思います.