Awk のTips...
(疑似)ハナモゲラ和歌生成プログラム
(2002.03.08)

概要

 ソースリストのコメントにあるとおり、ハナモゲラ和歌(へらはり和 歌)もどきを生成するプログラムです。

 「疑似」とか「もどき」とつけるのは、後で補 足しますが、プログラムが生成するのはまともな(つまり、人間が 詠む)ヘラハリ和歌とはやはり違い、「ちゃんとしたハナモゲラ」にな らないことがあるからです。

解説

 書いてしばらく遊んでからすっかり忘れていたのを、このたびRubyの 勉強をするのに引っ張り出しました。

 いや実は、去年(2001年)のある日 「俳句の自動生成」と いうのを見つけて、そういえば自分はハナモゲラ和歌生成ルーチンを持っ ている(笑) ではないか、自分のページでCGIにしようっと、と思いつい たくせに忙しさを口実にまたほったらかしていたんですが。

 日本語処理関数を使っています。日本語対応パッチの当たったgawkで ないと実行できないと思います。第一行ではEUCを指定しているくせに、 コメントではSJISだといっている。真意は判りません。

 プログラム中、次の一文字を選ぶ手続きを「anagram」と名づけてい ますが、これ、ヘンですね。

コード

  1: #! /usr/local/bin/gawk --ctype=EUC -f 
  2: #
  3: # in *sjis-dos*japan
  4: # 
  5: #	1998.10.08
  6: #	ハナモゲラ和歌(へらはり和歌)をでっち上げるプログラム。
  7: #	山下洋輔『ピアニストに手を出すな!』を読み返していると
  8: #	コンピュータに和歌を作らせる話が出ていて、
  9: #	「そういえば、できるよな」と思って即興で書いた。
 10: 
 11: BEGIN{
 12: 	cand = "あいうえおかきくけこさしすせそたちつてとなにぬねの"
 13: 	cand = cand "はひふへほまみむめもやゆよらりるれろわをん"
 14: 	cand = cand "がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽゐゑ"
 15: ###	cand = cand "ぁぃぅぇぉゃょゎっ"
 16: 
 17: 	N = jlength(cand)
 18: 	#print N
 19: 
 20: 	#srand()
 21: 	# とりあえず5個生成する
 22: 	for(i = 0; i < 5; i++){
 23: 		waka = wakagen(cand, N)
 24: 		print waka
 25: 		print ""
 26: 	}
 27: }
 28: 
 29: # ハナモゲラ和歌を生成する
 30: function wakagen(s, n,     i, waka)
 31: {
 32: 	waka = ""
 33: 	for(i = 0; i < 31; i++){
 34: 		waka = waka anagram(s, n)
 35: 		if(i == 4 || i == 11 || i == 16 ||
 36: 		   i == 23){
 37: 			waka = waka " "
 38: 		}
 39: 	}
 40: 	return waka
 41: }
 42: 
 43: function anagram(s, n,    c)
 44: {
 45: 	# 長さnの文字列sから任意の一文字を選び出し、返却する
 46: 
 47: 	if(n <= 0){
 48: 		return ""
 49: 	}
 50: 
 51: 	nth = int(rand() * n) + 1
 52: 
 53: 	# 一文字を選ぶ
 54: 	c = jsubstr(s, nth, 1)
 55: 
 56: 	return c
 57: }
 58: 
 59: #end of file

サンプル

やかあどぞ わこべかのぶま ちほぐらば じろもれらぼぱ ぷゐるぜんでぬ
よろけぢび ひばしぺけにま ゑねわきぴ ぴがみねうずえ ゑぺむれべあご
じたななけ べやをゆれぱぢ そみどやい びれしんそじん りやめいぞへた
ようをじよ ふずれずげぢき ゆやでほや まはゐほずぞゆ るりやぷゆへへ
きづあにれ ごれえぐすずぎ みがおぼふ ほてどゐをづら しごせがぐみで

 ハナモゲラというか、懐かしのド○○ンク○ストの「ふっかつのじゅ もん」みたいですね。

なぜ、これでは「疑似」どまりなのか

 上のソースコードで、生成される文字の候補candのところ、拗音と促 音の部分がコメントアウトされています。ここが疑似と称する所以で、 これらを候補文字に入れておくと、現在のアルゴリズム(笑)では「っか りませば」とか「ぁやくれねほし」とかいう「語」ができてしまいます。 このような音韻規則は日本語にはありません。つまり、拗音や促音は語 頭に現れません。

 即興で書いたこともあり、話を単純にするために拗音と促音をばさっ と切ってしまったのですが、一方では「かなけっさ」とか「これみてまぁ に」というのは、日本語の音韻規則でも充分可能な形です。それから見 ると、このプログラムでは少少物足りない。という反省を込めて「疑似」 と言っておるわけです。

 さらに言うならば、このプログラムが生成するような「ランダムな音 (文字)の羅列」は、たとえそれが日本語で使われるもののみから成り立っ ていてもハナモゲラとは呼ばれず、どちらかといえば白痴扱いされるの であって、真のハナモゲラとはそんなに安易なものではないことが文献 から明らかであります。日本人が発話するからには、日本語の音韻規則 に則っていることが要請され、またそれだけでは不充分で、「どことな く日本語っぽい感じがする」、日本語の残り香がそこはかとなく漂う、 そうした佇まいすら要求されるのであります。まこと、ハナモゲラとは きびしい自己鍛練の連続であると痛感する次第であります。

 ま、これでもじゅうぶん楽しめると思いますよ。

補足

 これのPerl版はこちらに、 Ruby版はこちらにあります。 見比べてみるのも一興でしょう。

(2002.03.08)

AwkのTipsへ
参考図書へ
コンピューター言語研究所へ
トップページへ
(C) ©Copyright Noboru HIWAMATA (nulpleno). All rights reserved.