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

「実入りがあった方の話」の予定は未定である。

アナグラムメーカーの話は前に一度してる。これね。話題として挙げたのだと「とおいちかば」の話もしてるね。

「のんのんびより」アニメ第三季が最終回を迎え、かなりのんのんロス状態なのだが、ラジオなどのコンテンツをまだ楽しんでいる。のんのんのラジオ内のコーナーで「のんのんかくれんぼ」てのがあって、例えば

新谷良子しんたにりょうこ」の中に、「単に凝り性たんにこりしょう」がかくれんぼしていました

みたいに、ある文章内に隠れているものを探す、なんてことをやっていて。こういうの、回が進むと投稿も進化していくもので、後半はアナグラムになってるネタばかりになっていった。そういえば昔「saku saku」で回文が流行って、とんでもない長文回文が投稿されてたっけなぁ、なんてことも思い出した。

おそらく本当に自分の頭だけで考えて投稿している人もいるんだとは思うのだけれど、パソコンの力を借りた人もいるんだろうなぁと思うのよね。で、改めてアナグラムメーカーを探してみようと。その「うまくいってない」話、ね。

実はこれで「Python 製を探したがいいのはなかった」として記録しなかったのが良くなかったんだわ。また懲りずに探してしまってな。案の定。

「簡単に見つかるもの」が二つあり、結論から言えばどっちもダメ。

特に「anagrammer」は相当にダメ。なぜって、「python 3.x に pip でインストール出来るのに、python 3.x 対応されてないので動かない」から。そして、これ、動くように自力で python 3.x 対応はすぐに出来るけれど、そうした場合、「辞書を自分で作る」必要があるなど、まぁ使い始めるのに手間なのよね、ちゃちゃっと使いたい向けではないわ。

もう一つの「anagram」もダメはダメなんだけれど、まぁ要するにこれだけ:

anagram.py (これでこのパッケージの全て)
 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 import sys
 4 import requests
 5 import json
 6 from bs4 import BeautifulSoup
 7 
 8 class Anagram:
 9     url = "http://wordsmith.org/anagram/anagram.cgi?anagram={0}&language=english&t=0&d=&include=&exclude=&n=&m=&source=adv&a=n&l=n&q=n&k=0"
10 
11     def __init__(self, argv):
12         self.argv = ' '.join(argv)
13         if len(argv) == 1:
14             self.url = self.url.format(argv[0])
15             self.transfer()
16         elif len(argv) > 1:
17             content = '+'.join(argv)
18             self.url = self.url.format(content)
19             self.transfer()
20         else:
21             print('INPUT ERROR!')
22 
23     def transfer(self):
24         anagrams = self.parse()
25         for i, anagram in enumerate(anagrams):
26             print(str(i + 1)+'. ' + anagram)
27         # print(json.dumps({self.argv : anagrams}))
28 
29     def parse(self):
30         response = requests.get(self.url)
31         soup = BeautifulSoup(response.text,'lxml')
32         contents = soup.findAll('p')[-3]
33         contents = str(contents).split('<br/>')[1:-1]
34         for i, content in enumerate(contents):
35             if content.startswith('\n'):
36                 content = content[1:]
37                 contents[i] = content
38 
39         return contents
40 
41 def main():
42     Anagram(sys.argv[1:])
43 
44 if __name__ == '__main__':
45     main()

pip でインストールすると結構デカい依存パッケージをもろともインストールする。だからさぞかしの大物かと思って覗き込むとガッカリする、てわけな。

このオリジナルバージョンの anagram.py が正しいのかどうかはわからんのだけど、とにかく動かしてみて「動かないので書き直し」てるうちにこうなった:

書き換え版 anagram.py
 1 # -*- coding: utf-8 -*-
 2 import sys
 3 import requests
 4 import re
 5 
 6 
 7 _cgiurl = "https://wordsmith.org/anagram/anagram.cgi"
 8 _opts = "&language=english&t=500&d=&include=&exclude=&n=&m=&a=n&l=n&q=y&k=1&source=adv"
 9 _requrlfmt = _cgiurl + "?anagram={0}" + _opts
10 
11 
12 def main():
13     argv = sys.argv[1:]
14     #
15     s = '+'.join(argv)
16     if len(s) > 26:
17         raise ValueError("string length is too long!")
18     response = requests.get(_requrlfmt.format(s))
19     anagrams = re.findall(r"\d+\. ([^<>]+)<br>", response.text)
20     for i, anagram in enumerate(anagrams):
21         print(str(i + 1)+'. ' + anagram)
22 
23 if __name__ == '__main__':
24     main()

まぁこのスクリプト自身はなんにもしてなくて、https://wordsmith.org/anagram/anagram.cgi 任せ、てことね。日本語は使えない。

てわけで、この二つに関しては、全然使えない、今回の目的には。ただし「命名に困ったときの西洋人」ネタと同じ目的で、自分のアプリケーションの命名に使いたい、などには、ワタシが書き換えた方の anagram.py は使えないことはないね。

あと「anagrammer」の方、「ちゃんと動くなら良いものか」の評価はしてないんで、気が向いたらやってみるかもしれない。むろん「もっといいものがきっとあるよね」とは思ってるけど。


なお、「アナグラムメーカーのうち半分」は実は簡単で:

ありえない文字列だろうとおかまいなし
1 # -*- coding: utf-8 -*-
2 from itertools import permutations
3 
4 s = "しんたにりょうこ"
5 print("\n".join(["".join(p) for p in set(permutations(s))]))
 1 うしたりょこんに
 2 んしうこょたにり
 3 りこうしょたんに
 4 ょうしりこんたに
 5 ょにりたしこうん
 6 しにこりょうたん
 7 ょにんりうたこし
 8 うたょにしりこん
 9 うにんりょこたし
10    ...

要は、「アナグラムメーカー」という道具として機能させるためには並び替え列挙だけではダメで、既知の文字列、つまり「日本語として成立する文字順」を辞書から引っ張ってくることが必要なわけね。どうもソースコードを読む限りだと、anagrammer の方はそれを試みてはいるようで、なので動けば価値があるのかもしんない。