文章からダジャレのみを抜き出すコマンドを作ってみた


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を作ってみると面白いかもしれませんね。

参考記事