ナイツ関数(ボケの方)
Posted feedbacks - Python
Java版でレーベンシュタイン距離を使っていたのに触発されたRuby版に触発されて、同じようなものを書いてみました。if-else式のために、Python2.5以上です。
Java版そのままだと、総あたり検索していて遅かったので、先頭文字が一致する単語のみに絞ることにしました。あと、候補が複数ある場合はランダムに選択するようにしています。
ちなみに単語辞書は毎回元サイトから拾っているので、オフラインでは動きません。
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 | #!coding: utf-8
import urllib, random
def download_words():
prefix = "http://www.ais.riec.tohoku.ac.jp/lab/wordlist/"
files = ["fam70_55.txt", "fam55_40.txt",
"fam40_25.txt", "fam25_10.txt"]
words = []
for f in files:
fd = urllib.urlopen(prefix + f)
for line in fd:
if line.strip() != "":
words.extend(line.strip().decode("sjis").split("\t"))
fd.close()
return words
allwords = download_words()
def Levenshtein_distance(word0, word1):
d = dict()
for i in range(len(word0) + 1): d[(i,0)] = i
for j in range(len(word1) + 1): d[(0,j)] = j
for i in range(1, len(word0) + 1):
for j in range(1, len(word1) + 1):
cost = 0 if word0[i-1] == word1[j-1] else 1
d[(i,j)] = min(d[(i-1,j)]+1, d[(i,j-1)]+1, d[(i-1,j-1)]+cost)
return d[(len(word0), len(word1))]
def similarity(word0, word1):
l = max(len(word0), len(word1))
return float(l - Levenshtein_distance(word0, word1)) / l
def find_alt_word(word):
alt_words = filter(
lambda alt: alt[0] == word[0] and similarity(word, alt) > 0.5,
allwords)
)
return random.choice(alt_words) if alt_words else word
def knights(text):
return u" ".join([find_alt_word(w) for w in text.split(u" ")])
print knights(u'''ドウカク org ヘ ヨウコソ
コノ サイト ハ ダサレタ オダイ ヲ イカニ トクカ キソイアウ
プログラマ ノ タメノ コロシアム デス
トウコウ ヲ タメシテ ミタイ カタ ハ テスト
トリアエズ ナガメテ ミタイ カタ ハ ゲンゴ ノ イチラン ガ オススメ デス'''
).encode("sjis")
|


syat
#8549()
[
Other
]
Rating-2/2=-1.00
(ナベアツ算を見てて思いつきました)
入出力の方法は標準入出力や引数・戻り値など、扱いやすい方法でかまいません。
文字単位でランダムに間違えても面白くないので、単語のリストから似た単語の候補を探すようにしてください。英単語でもOKです。単語のリストは参考ページからダウンロードしたものを加工して利用すると良いと思います。(4000個あります)
結果がつまらなくても構いませんが、面白いボケをうむ工夫があると良いです。
※人が考えたボケは求めてませんよ!
入力の例として「どう書く?org」の前文をお借りしました。ご自分でヤホーで調べたりして手ごろな文章を見つけて下しあ。
see: 日本語単語リスト
Rating-2/2=-1.00-0+
[ reply ]