Pythonで言葉遊び

# coding: utf-8
# wordplay.py

import random

dic = {
    "は": {"クレタ人": 2,"哲学者": 2,"私":2, "好き": 4,"嫌い": 5,"、": 3, "嘘つき":2, "正直":2},
    "な": {"クレタ人": 1, "哲学者":1, "私":1, "彼女":1, },
    "も": {"クレタ人": 1, "哲学者":1, "私":1, "彼女":1, "好き":1, "嫌い":1, "嘘つき":1, "正直":1},
    "が": {"クレタ人": 1, "哲学者":1, "私":1, "彼女":1, "、": 2, "実際":1, "好き":2, "嫌い":2},
    "と": {"クレタ人":1, "哲学者":1, "私":1, "彼女":1, "同様":3,},
    "です": {"。": 5,"が": 1,},
    
    "、": {"実際":1, "人間":2, "クレタ人":1, "好き":1, "嫌い":1},

    "クレタ人": {"です": 1, "は": 1, "が":1},
    "哲学者": {"です": 3, "が":1},
    "私":  {"は": 8, "も": 2, "が": 3, "と": 2,},
    "彼女": {"は": 5, "と": 2},
    "人間": {"は": 5, "が":2},

    "好き": {"です": 3, "な":2},
    "嫌い": {"です": 3, "な":2},
    "嘘つき": {"です":1},
    "正直": {"です":1},

    "実際": {"は":3, "、": 1},

    "だから": {"私":1, "哲学者":1},
    "つまり": {"私":1, "彼女":1},
    "しかし": {"私":1, "、":1},
    "一方": {"私":1, "、":1},
    "同様": {"彼女":1, "、":1},

    "。": {"だから":1, "つまり":1, "しかし":1, "一方":1},
}        

def sample(c):
    s = sum([dic[c][k] for k in dic[c]])
    r = random.randint(1, s)
    s = 0
    for k in dic[c]:
        s += dic[c][k]
        if s >= r:
            c = k
            break
    return c    
            

def wordplay():
    startword = ["私", "彼女", "人間", "実際", "クレタ人"]
    word = random.choice(startword)
    string = [word]
    cnt = 0
    while (word != "。" or random.random() < 0.3) and cnt < 100:
        word = sample(word)
        string.append(word)
        cnt += 1
    return "".join(string)

def main():
    import sys
    if len(sys.argv) != 2:
        print wordplay()
    else:
        count = int(sys.argv[1])
        print "\n".join([wordplay() for _ in xrange(count)])

if __name__ == "__main__":
    main()

実行:

$ python wordplay.py 20
クレタ人が哲学者です。
私は嫌いです。だから哲学者です。
私がクレタ人が、人間は嫌いです。
人間は正直です。
私と同様、人間は哲学者です。だから私がクレタ人です。
クレタ人は哲学者ですが好きな彼女と私が、嫌いです。
クレタ人ですが好きです。
人間は好きなクレタ人も好きです。つまり私はクレタ人は、嫌いな哲学者です。
クレタ人です。
実際は、実際は嘘つきですが、クレタ人と私はクレタ人と私も私は好きです。
私も彼女は嘘つきです。しかし私は好きです。だから哲学者ですが好きです。つまり彼女は嫌いです。
クレタ人も嫌いです。
実際は、嫌いです。だから哲学者です。
私と同様、人間が好きな彼女は、嫌いですが、好きです。つまり彼女は好きな彼女と同様、クレタ人です。一方私も嘘つきですが好きです。しかし私も嫌いな哲学者が、人間が、人間は、人間が実際は私も嫌いな彼女は哲学者です。つまり私は、嫌いです。
人間は嫌いです。
彼女と同様彼女は嘘つきですが嫌いです。
実際は哲学者が実際、人間がクレタ人も哲学者が好きな私と哲学者が私もクレタ人が彼女は好きです。
私が哲学者です。
彼女は、人間は好きな彼女は、嫌いですが実際は好きです。
彼女とクレタ人と同様、人間がクレタ人も嘘つきです。