豚辞書雑考

豚辞書とは

ぶたさんおひとりの手による名詞辞書。2文字から8文字の名詞がひたすら並ぶだけであるが、20万語オーバというサイズから、眺めているだけでも面白い。

もともとはナンクロというパズルのソルバーやメイカーを作成するための一助として作成された。そのため、表記上促音や拗音の区別はない。クロスワードの作成/回答など、他のワード系パズルにも利用されている。

それだけではなく、単純に名詞の分析をするだけでも十二分に面白い。このテキストではそちらの方向性を探る。

豚辞書のサブセット

一番シンプルなのはgrepで検索したもの。1、3字目指定のば○ら○○(正規表現ならぱ.ら..)のようなもの。これはその場で検索すれば済む話。こういう限定的に利用するサブセットではなくて、もっと汎用的に利用できるサブセット。ある条件を満たす単語(しかも、抽出に手間がかかる)もの。そういうものができれば、保存しておく価値があるだろう。公開するのもとても良いアイディアだ。翻訳的表現。

サンプルとしてこんなものを作った。開始文字と終了文字が同じ「しりとり逆襲ワード辞書」。

ほかにもこんなバリエーションが考えられる。

※このあたりのアイディアは全部ニコリ/ニコリストから拝借。

そういうことを考えていて、では上記の抽出が可能な言語使用はつくれないだろうか、と妄想。正規表現の表記方法を決めるようなノリですね。ああ、自分で実装する意思はありません。プログラムは弱いのです。

基本的にサブセットを得るための言語。それをさらにgrepでしぼればできる検索はここでは考えない。思いつくままに。

{あ2}……「あ」が2回登場する
{あ2+}……「あ」が3回登場する
{.2}……なにか一つの文字が2回登場する
{あ2.3}……「あ」が2回、その他のなにか一つの文字が3回登場する

表現できるべきこと

ある文字が何回か登場
任意の文字が何回か登場
ある文字が連続して登場
任意の文字が連続して登場
ある文字が何回か登場、うち何回かは連続して登場
y..xx.yを満たす言葉(x,yはそれぞれ同じ文字、.はx,yには一致しない
ア段の文字集合、ア行の文字集合

いまいち美しくない。

ぐっとシンプルにして、補助辞書を考える。単語に対して、重複する文字の数を対応させた数値表だけでも充分面白そう。2なら同じ文字が2回登場、32ならひとつの同じ文字が3回、もう一つの同じ文字が2回あらわれる。数字は登場順か、降順かな。こんな感じ。

かたたたき:3
いいんかいかいさいつうち:52
しようしよう:222

この数字に名称があっても良いかな。

これはコードを書いて作成してもよいかと思ったのだけれど、いいアルゴリズムが浮かばず保留。簡単な関数で書けそうなんだけれどなあ。地道に頭からひと文字ずつチェックしていくしかないのかなあ。

---以下覚え書き---

いい加減なアルゴリズム

関数1:重複数出力

単語→数列
数列意味は例から理解すること。

例:
ばららいか→12011
からんころん→122100
かたたき→13001

中身:
1が文字数だけ並んだ数列(関数2からもスコープあり)を用意。
FORループでこの数列順に関数2を実行していく。

:check[8] as int
:check[8]=1

function 重複数出力 (word as string)
	for i=0 to length(word)-1
		if (check[i]=1) {
			compare(i,word);}
	next
end function

関数2:
単語内の文字をひとつずつくらべて、一致していたら
出力を適宜いじる。

function compare
	for j=i to length(word)-1
		if (word[i]=word[j]) {
			check[i]++;
			check[j]=0;}
		end if	
	next
end function


見てのとおり私はコードは書けません。
テキストかサンプル見ないと何も書けない。

ま、こんな感じでn文字を渡すとn桁の数字が返ってくるので、
あとはソートするなり1を除外して出力するなりすればよい。
戻る
By けすてぃおん(wakaba@a1.mbn.or.jp)