dajarep
Go言語でダジャレをgrepするdajarepと言うコマンドをつくってみました。
ダジャレを含んだ文書ファイルを・・・
人民の人民による人民のための政治
アルミ缶の上にあるミカン
トンネルを抜けるとそこは雪国であった
智代子のチョコ
布団が吹っ飛んだ
我輩は猫である
猫が寝転んだ
その意見にはついていけん
靴を靴箱に入れる
傘を貸さない
イカは如何なものか
親譲りの無鉄砲で子供の時から損ばかりしている
dajarepに渡すと・・・
$ dajarep test.txt
ダジャレのみを抜き出します!
アルミ缶の上にあるミカン
智代子のチョコ
布団が吹っ飛んだ
猫が寝転んだ
その意見にはついていけん
傘を貸さない
イカは如何なものか
ふしぎ!
ここから落とせます。
https://github.com/kurehajime/dajarep/releases
しくみ
dajarepは、ざっくりこんな仕組みで動いています。
①文章を分解する
まずは文章を分解します。
kagomeという形態素解析エンジンを利用しています。(Qiita解説記事)。
第68代横綱朝青龍
第 接頭詞,数接続,*,*,*,*,第,ダイ,ダイ
68 名詞,数,*,*,*,*,*
代 名詞,接尾,助数詞,*,*,*,代,ダイ,ダイ
横綱 名詞,一般,*,*,*,*,横綱,ヨコヅナ,ヨコズナ
朝青龍 カスタム人名,朝青龍,アサショウリュウ
EOS
kagomeを使うと、こんな感じで文章が分解され、「読み」や「品詞」が分かります。
②文中に名詞と同じ「読み」が登場する回数を調べる
kagomeで「読み」や「品詞」が分かったので、文章の中にある名詞と同じ「読み」が何回登場するか数えます。
例えば、
猫が寝転んだ
という文章は
ネコガネコロンダ
という読みになります。
そして「猫が寝転んだ」という文の中には「猫」という名詞が含まれていますので、「ネコガネコロンダ」の中に「ネコ」が2回登場することが分かります。
③文中に名詞と同じ「単語」が登場する回数を調べる
もう②だけでダジャレ検出ができるようになった気になっていませんか?
実はこのままでは欠陥があります。
人民の人民による人民のための政治
や
靴を靴箱に入れる
がダジャレ扱いされてしまいます。
こんなものダジャレとは言えません。ダジャレをなめてます。
この程度の重複で「今ダジャレ言ったでしょ?ねぇ、今ダジャレ言ったでしょ?」とドヤ顔で指摘してくる友人がいたらうんざりしますよね。
という訳で、文中に名詞と同じ「単語」が登場する回数も調べます。
④単語の重複数 < 読みの重複数 → ダジャレ
②と③の結果を比較して
単語の重複数 < 読みの重複数
の関係が成り立つ場合はダジャレです。
猫が寝転んだ
イカは如何なものか
はダジャレです。
人民の人民による人民のための政治
靴を靴箱に入れる
はダジャレではありません。
ダジャレではありません。
⑤補足
ここまでで、ダジャレの検出方法が分かりました。
しかしこれだけでは補足できないパターンがあります。
智代子のチョコ
布団が吹っ飛んだ
これです。
厳密に比較すれば「チヨコ」と「チョコ」は違いますし、「フトン」と「フットン」も違います。
そこで、「ヨ」と「ョ」を同一視したり「フットン」を「フトン」として読めるようにするために「読み」での比較の際に正規表現で事前置き換えを行っています。
このへんの工夫でダジャレの質が変わってきます。
まとめ
プログラムの本体とソースはここから落とせます。
プログラムの本体
https://github.com/kurehajime/dajarep/releases
プログラムのソース(Go言語)
https://github.com/kurehajime/dajarep
slackなどのチャットと組み合わせて、誰かがダジャレを言うたびに「今ダジャレ言ったでしょ?ねぇ、今ダジャレ言ったでしょ?」とドヤ顔で指摘してくるbotを作ってみると面白いかもしれませんね。