「アナグラムメーカー」な話のうち、実入りがなかった方の話、の(少し)続

「実入りがあった方」の予定は未定なままなのよ。

これをやってみたからといって、ほとんど入り口にさえ立ててはいないんだけれど:

MeCab の辞書から…
 1 # -*- coding: utf-8 -*-
 2 import io
 3 import os
 4 import csv
 5 from collections import defaultdict
 6 from itertools import permutations
 7 from glob import glob
 8 import json
 9 
10 
11 #_kt2kn = {
12 #    chr(c):
13 #    chr(c - (ord("ア") - ord("あ")))
14 #    for c in range(ord("ア"), ord("ン") + 1)
15 #}
16 
17 _origwords = defaultdict(set)
18 _origwords_kanji = defaultdict(list)
19 ipadicdir = "c:/Program Files (x86)/MeCab/dic/ipadic"
20 for mdicfn in glob(os.path.join(ipadicdir, "[NA]*.csv")):
21     reader = csv.reader(io.open(mdicfn, encoding="cp932"))
22     for line in reader:
23         #if "人名" in line or "地域" in line or "組織" in line:
24         if "人名" in line or "組織" in line:
25             continue
26         knj, yomi = line[0], line[11]
27         _origwords[len(yomi)].add(yomi)
28         _origwords_kanji[yomi].append(knj)
29 #
30 for yomilen in sorted(_origwords.keys()):
31     _anagrams = defaultdict(list)
32     for yomi in _origwords[yomilen]:
33         for p in permutations(yomi):
34             ca = "".join(p)
35             if ca != yomi and ca in _origwords[yomilen]:
36                 #_anagrams[yomi].append((ca, _origwords_kanji[ca]))
37                 print(yomi, _origwords_kanji[yomi], ca, _origwords_kanji[ca], flush=True)
38         #if yomi in _anagrams:
39         #    _anagrams[yomi].insert(0, (yomi, _origwords_kanji[yomi]))
40     #if _anagrams:
41     #    json.dump(
42     #        _anagrams,
43     #        io.open(
44     #            "anagrams.noun_noun_{}.json".format(yomilen), "w", encoding="utf-8"),
45     #        ensure_ascii=False, sort_keys=True, indent=4)

一番ヒドい状態だった頃よりマシにしてあるが、いわゆる「絶賛試行錯誤中」のコメントアウトまみれ状態、である。そして「完成に至る気配がない」。

「アナグラムメーカー」の大事な「部品」として、要は「アナグラム辞書」を作っておけば良い、ということにはなるんだけれど、まぁ要するに「組合せ爆発との闘い」でもあるわけね。ちょっと発想を誤ると、即座にスクリプトがハングアップ状態になる。実際挙げた状態のスクリプトだと、単語が8文字のあたりから凄まじくスピードダウンし始めて、10文字単語の処理では、一つの出力が出るのに何分もかかる。なんでそうなるかは、実際に permutations(yomi) の数がどれだけになるのか計算するなり実行してみればすぐに理解できるであろう。以下は Ctrl-C で止めたタイミングでの出力:

 1    ...
 2 キボウガオカヒガシ ['希望ケ丘東'] ヒガシキボウガオカ ['東希望が丘']
 3 キボウガオカヒガシ ['希望ケ丘東'] ヒガシキボウガオカ ['東希望が丘']
 4 キタイチジョウニシ ['北一条西'] ニシイチジョウキタ ['西一条北']
 5 タチバナドオリニシ ['橘通西'] ニシタチバナドオリ ['西橘通']
 6 ミナミアサヒガオカ ['南旭ケ丘', '南旭が丘'] アサヒガオカミナミ ['旭ケ丘南']
 7 ミナミアサヒガオカ ['南旭ケ丘', '南旭が丘'] アサヒガオカミナミ ['旭ケ丘南']
 8 ヒガシジュウジョウ ['東十条', '東十条'] ジュウジョウヒガシ ['十条東']
 9 ヒガシジュウジョウ ['東十条', '東十条'] ジュウジョウヒガシ ['十条東']
10 ヒガシジュウジョウ ['東十条', '東十条'] ジュウジョウヒガシ ['十条東']
11 ヒガシジュウジョウ ['東十条', '東十条'] ジュウジョウヒガシ ['十条東']
12 ガイジュウナイゴウ ['外柔内剛'] ナイジュウガイゴウ ['内柔外剛']
13 ガイジュウナイゴウ ['外柔内剛'] ナイジュウガイゴウ ['内柔外剛']
14 ガイジュウナイゴウ ['外柔内剛'] ナイジュウガイゴウ ['内柔外剛']
15 ガイジュウナイゴウ ['外柔内剛'] ナイジュウガイゴウ ['内柔外剛']
16 ニシシチジョウキタ ['西七条北'] キタシチジョウニシ ['北七条西']
17 ニシシチジョウキタ ['西七条北'] キタシチジョウニシ ['北七条西']
18 ニシゴジョウミナミ ['西五条南'] ミナミゴジョウニシ ['南五条西']
19 ニシゴジョウミナミ ['西五条南'] ミナミゴジョウニシ ['南五条西']
20 ニシイチジョウキタ ['西一条北'] キタイチジョウニシ ['北一条西']
21 キタシジョウヒガシ ['北四条東'] ヒガシシジョウキタ ['東四条北']
22 キタシジョウヒガシ ['北四条東'] ヒガシシジョウキタ ['東四条北']
23 ミナミヨンジョウニシ ['南四条西'] ニシヨンジョウミナミ ['西四条南']
24 ミナミヨンジョウニシ ['南四条西'] ニシヨンジョウミナミ ['西四条南']
25 ニジョウドオリミナミ ['二条通南'] ミナミニジョウドオリ ['南二条通']
26 ニジョウドオリミナミ ['二条通南'] ミナミニジョウドオリ ['南二条通']
27 キタサンジョウヒガシ ['北三条東'] ヒガシサンジョウキタ ['東三条北']
28 ニシイチジョウミナミ ['西一条南'] ミナミイチジョウニシ ['南一条西']
29 ニシイチジョウミナミ ['西一条南'] ミナミイチジョウニシ ['南一条西']
30 サガミズオタキノタニ ['嵯峨水尾滝ノ谷'] サガミズオキタノタニ ['嵯峨水尾北ノ谷']
31 サガミズオタキノタニ ['嵯峨水尾滝ノ谷'] サガミズオキタノタニ ['嵯峨水尾北ノ谷']
32 ミナミサンジョウニシ ['南三条西'] ニシサンジョウミナミ ['西三条南']
33 ミナミサンジョウニシ ['南三条西'] ニシサンジョウミナミ ['西三条南']
34 ミナミロクジョウニシ ['南六条西'] ニシロクジョウミナミ ['西六条南']
35 ミナミロクジョウニシ ['南六条西'] ニシロクジョウミナミ ['西六条南']
36 ミナミシジョウヒガシ ['南四条東'] ヒガシシジョウミナミ ['東四条南']
37 ミナミシジョウヒガシ ['南四条東'] ヒガシシジョウミナミ ['東四条南']
38 ミナミシジョウヒガシ ['南四条東'] ヒガシシジョウミナミ ['東四条南']
39 ミナミシジョウヒガシ ['南四条東'] ヒガシシジョウミナミ ['東四条南']
40 ヒガシクジョウミナミ ['東九条南'] ミナミクジョウヒガシ ['南九条東']
41 ヒガシクジョウミナミ ['東九条南'] ミナミクジョウヒガシ ['南九条東']
42 ヒガシサンジョウキタ ['東三条北'] キタサンジョウヒガシ ['北三条東']
43 キタハチジョウヒガシ ['北八条東'] ヒガシハチジョウキタ ['東八条北']
44 ニシハチジョウミナミ ['西八条南'] ミナミハチジョウニシ ['南八条西']
45 ニシハチジョウミナミ ['西八条南'] ミナミハチジョウニシ ['南八条西']
46 ヒガシハチジョウキタ ['東八条北'] キタハチジョウヒガシ ['北八条東']
47 キタジュウジョウニシ ['北十条西'] ニシジュウジョウキタ ['西十条北']
48 キタジュウジョウニシ ['北十条西'] ニシジュウジョウキタ ['西十条北']
49 キタジュウジョウニシ ['北十条西'] ニシジュウジョウキタ ['西十条北']
50 キタジュウジョウニシ ['北十条西'] ニシジュウジョウキタ ['西十条北']
51 ヒガシニジョウミナミ ['東二条南'] ミナミニジョウヒガシ ['南二条東']
52 ヒガシニジョウミナミ ['東二条南'] ミナミニジョウヒガシ ['南二条東']
53 シカタチョウヤマナカ ['志方町山中'] タカヤチョウナカシマ ['高屋町中島']
54 シカタチョウヤマナカ ['志方町山中'] タカヤチョウナカシマ ['高屋町中島']
55 ミナミゴジョウヒガシ ['南五条東'] ヒガシゴジョウミナミ ['東五条南']
56 ミナミゴジョウヒガシ ['南五条東'] ヒガシゴジョウミナミ ['東五条南']
57 サガミズオキタノタニ ['嵯峨水尾北ノ谷'] サガミズオタキノタニ ['嵯峨水尾滝ノ谷']
58 サガミズオキタノタニ ['嵯峨水尾北ノ谷'] サガミズオタキノタニ ['嵯峨水尾滝ノ谷']
59 Traceback (most recent call last):
60   File "c:\hige\hoge.py", line 34, in <module>
61     ca = "".join(p)
62 KeyboardInterrupt
63 
64 [me@host: ~]$

どういうアナグラム辞書にしたいのかについてちゃんと考えないと、こういうあまり価値のなさそうなものになってしまうわけなのだが、とりあえず「サガミズオキタノタニ」がなんかオモロくてね。どこにある地名なのかわからんけれど、「紛らわしい地名」としてきっと地元で有名なんではないのかしら、と想像したらちょっと楽しい。

つーわけで、ほんとの最初の一歩だけは簡単なんだけれど、実際にちゃんと便利な道具に仕立て上げようとすると、実は難易度高いのよねこれ。うーん、せめて「アナグラム作成のためのヘルパーツール」くらいが出来るといいんだけどね。そこまでも簡単かどうか…。

結構やってて面白いネタではあるんだけどね、どーすっかなぁ、続けるか、それともやめるか。というか「誰か優秀な人が作ったもの」を探す? うん、まぁ今日はもう眠いから寝る。おやすみなさい…。



Related Posts