任意の文言を否定形に変換する「ねむいガチャ」を作った
ruby-jp という Slack ワークスペースに、#ねむい
というチャンネルがある。
ココで「ねむいガチャ」と投稿すると、Slack Bot が「ねむい」か「ねむくない」かをランダムに答えてくれるのだ。
コレに着想を得て、「任意の文言 + ガチャ」と入力したら、任意の文言をランダムに肯定形か否定形かに変換して出力するようなプログラムは作れないか、考えてみた。
例を出すなら、
- ねむいガチャ → ねむい or ねむくない
- 飲み会やるガチャ → 飲み会やる or 飲み会やらない
みたいな感じだ。
結果、物凄く不完全だが、一応それっぽいことは出来たので、公開しておく。
目次
ソースコードと使い方
ソースコードは上にある。Python3 (pipenv) と MeCab、それから mecab-ipadic-NEologd という追加のシステム辞書に依存しているので、ローカルで動かす場合はこれらを入れておく。
Dockerfile を同梱していて、コチラを使えば Docker 上にこれらを用意するので、すぐに動かせるだろう (ただし MeCab をまるごとインストールするので、Docker コンテナは 5GB 近くになる)。
Docker 経由でもそうでなくても、pipenv install --dev
で環境が準備できたら、
$ pipenv run cli 'ねむいガチャ'
という感じで実行すると、ランダムに「ねむい」とか「ねむくない」とか答えてくれる。「ねむい」部分を任意の形容詞なんかに変えて動きを試してみてほしい。
仕組み
MeCab で入力文言を形態素解析し、「ガチャ」の直前の文節をチェックしている。基本は形容詞「○○い」といった形になると思うので、コレを「○○くない」という風に文字列置換している。
品詞もチェックしていて、名詞や動詞と判断された時はまた別の処理をしている。だがこれらの品詞チェックと適切な否定形変換には限界があり、今のところ上手く変換できない文言もたくさんある。
今後やりたいこと
MeCab の練習としてちょっとやってみたのだが、入力文字列を否定形に変換するというのが相当に困難だった。条件を自力で見つけ、文字列変換で対応しようとするのは限界があった。
そもそも「肯定形を否定形に変換する」というライブラリがありそうな気がしてたのだが、調べても全然なかった。日本語の肯定表現と否定表現の扱いはとても難しいらしい。
今後は自力で条件を実装するのではなく、ベイジアンフィルタみたいな感じで、否定表現を機械学習させていけないかなと考えている。
また、今回は CLI で動くモノを作ったワケだが、Web API として提供できたり、Web アプリとしてお遊びに使えたらいいなーと思っている。
何の気無しに手を出したらなかなか難しい案件だった…。