クフでダローバルな日記

タフでもグローバルもない

偶然俳句ツイートbotの解説とルール説明してみます

久々のブログです。
先日、偶然俳句ツイートbotというものを作りました。

とは言っても、botでもツイートしたたように内容とアイディア自体はちょっと前に話題になった偶然短歌bot(@)やここで一句bot(@と一緒です。特にここで一句botについては、twitterリプする以外ほぼ同じなのでパクリと言われてもしたかないかもしれませんね。すみません。

今回はこちらのまとめていただいたtogetter↓がかなりbuzzったようで、かなりフォローしていただきました。
つぶやきから五七五を検出して報告してくる偶然俳句botとの戦い - Togetterまとめ
期待してフォローしていただいて嬉しいのですが、フォローしていただいただけでは俳句を探索しないので、botがフォロバするまで少々お待ちください。
また、フォローが増えすぎたため頻繁に規制されたり取得漏れが起きたりしているようなので、普通に俳句をツイートされても通知できないことが多いようです。ご了承ください。

どういう基準、仕組みで俳句を探索しているのか分からないとよく言われているようなので、ここでルールと仕組みを簡単に解説しておきます。

基本ルール

文章の解析はmecab+IPA辞書

形態素解析にはmecabIPA辞書を利用しています。と言っても何言ってるかわからない方も多いかと思いますが、端的に言うと文章を解析してくれるソフト的なものを使っているわけです。具体的には公式サイトを見ていただけると分かりやすいかと思います。
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
例えば、「柿食えば鐘が鳴るなり法隆寺」というものをmecabを用いて解析すると

柿	名詞,一般,*,*,*,*,柿,カキ,カキ
食え	動詞,自立,*,*,五段・ワ行促音便,仮定形,食う,クエ,クエ
ば	助詞,接続助詞,*,*,*,*,ば,バ,バ
鐘	名詞,一般,*,*,*,*,鐘,カネ,カネ
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
鳴る	動詞,自立,*,*,五段・ラ行,基本形,鳴る,ナル,ナル
なり	助詞,接続助詞,*,*,*,*,なり,ナリ,ナリ
法隆寺	名詞,固有名詞,組織,*,*,*,法隆寺,ホウリュウジ,ホーリュージ

というように解析してくれるわけです。それぞれの分解した要素の最後にその言葉の読みがあるので、これを利用すれば575のリズムになっているものを見つけるプログラムが作れるわけです。
ちなみに僕はmecabを使ってみたのはこれが初めてで、練習のために作ってみたのがこのbotだったりします。

音のルール
  • 「ぁぃぅぇぉゃゅょ」は全部0音換算(「しゃ」などは1音)
  • 「ー」「っ」は一音
  • 読み方がわからない言葉(英単語、記号など)が含まれるものは判定しない
  • 字余りはNG

字余りについては、許容してしまうとかなりの文章が俳句認定されてしまうため、残念ながらNGとしました。
今は割と致命的なバグがあるので、そのうち修正します。(小声)
また、僕は俳句について知識が全然無いのでなんかおかしい所があれば教えてください…

上/中/下の句の最初の単語のルール

俳句の最初の単語の品詞としてOKなのは、
[名詞,動詞,形容詞,形容動詞, 副詞, 連体詞, 接続詞, 感動詞, 接頭詞, フィラー]
のどれかです。
さらに、最初の単語の細かいルールとして、

  • 非自立動詞や接尾語はNG
  • 「ぁ」など小さい文字から始まるのはNG

というものもあります。
例えば「みかん食え/鐘が鳴るな/法隆寺」みたいなのは中の句が助詞から始まってるのでダメってことです。

上/中/下の句の最後の単語のルール
  • 接頭詞はNG

今のところこれだけです。
例えば「ちょっとまて/ちょっとまってよ/おにいさん」はOKですが「ちょっとまて/ちょっとまって/にいさーん」は接頭詞「お」が中の句の末尾に来ているのでNGということです。

下の句の最後の単語のルール
  • 活用語の場合、終止形のみ

要するに、連用止などを禁止するわけです。

全体的に割と厳しいルールを適用しているのですが、これはルールを緩くするとどう見ても575じゃないものまで575と認定してしまいがちで、さらにツイート数が増えると規制につながりやすくなるためです。最初はもっとザルだったんですが、リプによる指摘に対応していたら大分精度が上昇しました。ビッグデータって凄い(?)。

季語判定

どうにかしてここで一句botと差別化しようと思った苦肉の策がこちらの季語判定になります。
お気づきの方も多いと思いますが、季語は読みの音によって判定しています。これは掛詞に対応するためです。もちろん嘘です。
じゃあなぜ音で判定しているかというと、普通に単語で判定しようと思うと滅多に季語がなくなってしまい、つまらないからです。異論は認めません。
季語については現代俳句データベースなどからお借りしました。現在2529個の季語が登録されています。
ちなみにボジョレー・ヌーボー(冬)とかもあるようなので、これを含む俳句ができるのを楽しみにしてます。

即リプの仕組み

どうやら秒速リプが受けているようなのでちょっと解説しておきますが、実はこれ自体はそれほど難しいことをしていません。
というのも、TwitterにはStreaming APIというものがあり、例えばechofonなどのアプリでは、流れてきた情報(ツイート)からアイコン画像とユーザー名、ツイート内容だけ取り出して一つの「ツイート」として表示しているわけです。だから一々ロードする必要もないし、ツイートされてすぐ表示されているわけですね。

botではこのStreaming APIを利用し、流れてきたツイートからツイート内容を取り出し、俳句認定と季語探索をしてツイートしてます。
ちなみに現状ではツイート内容から俳句を探し、季語認定をするのに約0.5秒、ツイートするのに約0.3秒の計0.8秒もかかってしまっているので、暇があれば少し高速化しようかと思っています。

最後に

少し解説させていただきましたが、僕よりもここで一句botや偶然短歌botの作者さんの方が機能や精度が良いので、そちらも見ていただけると嬉しいです。
Ruby - Slackの会話を元に一句詠む - Qiita
形態素解析エンジンMeCabにて文章中から短歌を抽出 - inaniwa3's blog

新しい機能を追加しようと鋭意努力しているのですが、今月は若干忙しいので気ままにお待ち戴けると幸いです。

以下、参考文献です。
現代俳句データベース
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
『東京都版国語便覧』浜島書店