Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

dajarep

Go言語でダジャレをgrepするdajarepと言うコマンドをつくってみました。

Untitled3.gif

ダジャレを含んだ文書ファイルを・・・

人民の人民による人民のための政治
アルミ缶の上にあるミカン
トンネルを抜けるとそこは雪国であった
智代子のチョコ
布団が吹っ飛んだ
我輩は猫である
猫が寝転んだ
その意見にはついていけん
靴を靴箱に入れる
傘を貸さない
イカは如何なものか
親譲りの無鉄砲で子供の時から損ばかりしている

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

参考記事

kurehajime
こころの中のゴロリに「ワクワクさん、プログラミングって面白いね」と喜んでもらうために頑張ります。
http://xiidec.appspot.com/colamone/colamone.html
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした