見出し画像

【Python】ダジャレを言うプログラムを作ってみたよ


唯坂 優(たださか ゆう)です。



再考:ダジャレは誰のものか



「ダジャレを言うのは誰じゃ」
と問われ続けて幾星霜、ついに迎えたAI時代

人類の仕事の半分が人工知能に奪われつつあるというのに、

ダジャレを言うのはオジさんの役目

というスキームから我々は未だ脱却できずにいます。

このままでは、言葉遊びの定番であるダジャレ文化さえ現オジさん世代の滅びとともに歴史の闇に消えてしまいかねません。

由々しき事態です。

にもかかわらず、長年の間培われた『ダジャレは寒い』という強固なステレオタイプの壁に阻まれた若年層の新規参入今後数十年は見込めないでしょう


しかしながら。

私こと、唯坂優。

すでにダジャレを救う手立ては考えております。


これからのダジャレはアルゴリズムにアウトソーシングしてしまえ!!!

…というわけで、本題に入ってまいります。


コード概観


def dajare(word=False):
	word_dict=eval(func.txtfile("word.txt"))
	sent_txt=eval(func.txtfile("sent.txt"))
	sent_map=map(func.janome,sent_txt)
	if word:
		word=func.janome(word)[0]
	else:
		l=[]
		for k,v in word_dict.items():
			if "名詞" in k:
				l.extend(v)
		word=random.choice(l)
	l=[]
	for v in word_dict.values():
		l.extend([i for i in v if word[9] in i[9]]+[i for i in v if i[9] in word[9]])
	l2=[]
	for i in set(l):
		if "固有名詞" not in i and word!=i:
			l2.append(i)
	l2=sorted(l2,key=lambda x:len(x[9]),reverse=True)
	s="go"
	for i in l2:
		if s=="stop":
			break
		sentence_list=[]
		for m_i in sent_map:
			m_l=list(map(lambda x:x[1:7],[word,i]))
			for m_i_i in [ii[1:7] for ii in m_i]:
				if m_i_i in m_l:
					m_l.remove(m_i_i)
					if len(m_l)==0:
						sentence_list.append(m_i)
						break
			if len(sentence_list)==100:
				s="stop"
				word2=i
				break
	sentence_list=sorted(sentence_list,key=lambda x:len(x))
	word_list=[word,word2]
	return_list=[]
	for sli in sentence_list[0]:
		for wi in word_list:
			if sli[1:7]==wi[1:7]:
				sli=wi
				word_list.remove(wi)
				break
		return_list.append(sli)
	return_dict={"".join([i[0] for i in return_list]):"".join([i[9] for i in return_list])}
	print(return_dict)


ダジャレを言うだけでこの行数…?

しょうもないことをやり遂げるために大仰なシステムを作り上げるってあたり、ルーブゴールドバーグマシンに通ずるものを感じますね

とりあえず形にしただけの試作版なのでエラーが頻発するし処理がスマートではないところも多々あるんですが、そこは今後改良していくということで。

簡単に仕様を説明しますと、

引数にお題となる単語 (現状では1単語のみ対応しています。合成語を渡しても問題なく処理できるようにしたいな) を入力すると別ファイルに記録してある単語リスト(word_txt)から同じ読みを含む別の単語を引っ張ってきて最終的に一文に2つの単語を落とし込んだ『ダジャレ』を出力する

という流れになっています。

一応引数指定しなかったらしなかったでランダムに単語を選出して処理してくれますが、そこまで自動化する必要も現時点ではないのでこの記事では割愛しますね。


ちなみに出力の文法パターンは京都大学様が公開している常識推論データセット(KUCI)のデータを応用させていただいております。

…いや別に意味的なものは今回関係ないのですが、パッと見で扱ったことのあるjson形式だったので本当にただの文章集として使わせていただきました。コード中のsent_txtがそれに当たります。


今回はコイツで生成したダジャレをいくつかご紹介したいと思います。


実際にダジャレを生成してみた


出力例①:「亀」

{'亀も短めだ': 'カメモミジカメダ'}
dajare("亀")

いいね!

シンプルに纏まっていて素晴らしい。

満足なクオリティですが、ググってみたら「亀の手足は短め」というダジャレが既出でした。

ってかよく考えたら亀が短めってなんだよ。だいぶ具体性を欠いているな。

…ううむ、まだ全く新しいオリジナルを生み出せるほどではないか。



出力例②:「鮫」

{'鮫を挟める': 'サメヲハサメル'}
dajare("鮫")

何に?

またしても具体性を欠いている。

そういえば以前、サメバーガーなる食べ物の話を聞いたことがあります。

…バンズか。

バンズに挟めるのか、サメは。


調べてみたらサメバーガー専門店さんがnoteやってたのでリンク貼っておきます。(何故)


そして既出チェック…

検索ヒットなし!

なんとふたつめで早速、新しいダジャレを生み出すことができました。


国内最大のダジャレサイトなるものが見つかったのですが、


登録されているサメにまつわるダジャレ37件に該当なし類似のネタも無し!

よく37個も考えたな。という感じですが、

存在しなかった38個目を捻り出したのはかなりデカいぞ。

素晴らしい独創性。この調子でどんどんやっていきましょう!



出力例③:「虎」

{'虎が法らない': 'トラガノットラナイ'}
dajare("虎")

野生だな〜。

サバンナに法は無し。故に法るべくもなし。

猛獣たるもの、自由であれと。

凄みすら感じる格言的ダジャレが誕生しましたね。


既出チェックも当然ながらパス

先ほどのダジャレサイトでも、虎にまつわるダジャレ72件に類似のものはありませんでした。

これはスゴいものを生み出してしまったかもしれない。

ダジャレ業界に旋風を巻き起こすぞ…



出力例④:「炭」

{'炭が蔑みます': 'スミガサゲスミマス'}
dajare("炭")

自我炭じゃん。

しかも態度デカいし

炭に蔑まれたの初めてだなぁ…

人間には思いつかないような組み合わせの単語を引っかけられるのも大きな強みですね。



出力例⑤:「野菜」

{'野菜が恥い': 'ヤサイガヤサイ'}
dajare("野菜")

恥いって何!?

『恥』って漢字の読み方調べても『やさ』なんて用法全然出てこないんですよ。

唯一見つかったのは「漢字の読み方」なるサイトのみ。

しかもこのサイト、本当に漢字の読み方しか載ってないんです。

意味とか用例とか全くなく、ただただ「恥い」は「やさい」と読むことだけが表示されている

気になって詳しく見てみたんですが、検索機能とかもなくおそらくランダムに「他の漢字」の読み方が表示されるのみ。


誰が何のために立ち上げたサイトなんだ…?

いや怖い怖い怖い。

軽い気持ちで作ったダジャレシステムが僕を知らない世界へ導こうとしている

しかし怖さの反面、予想を超えた次世代のダジャレを繰り出してくるポテンシャルにワクワクすらしている自分もいる

コイツ、底が知れんぞ…!




…というわけで、初めてのダジャレシステム構築は大成功

以下にその他の出力例を載せておきますね。

また改良したら記事を書こうと思います!


それでは!


その他の出力例


{'笹も支えだ': 'ササモササエダ'}

{'コーラが滞らない': 'コーラガトドコーラナイ'}

{'ソーダ争奪する': 'ソーダソーダツスル'}

{'天ぷら添ぷする': 'テンプラテンプスル'}

{'熊まで匿う': 'クママデカクマウ'}





この記事が気に入ったらサポートをしてみませんか?