-
Notifications
You must be signed in to change notification settings - Fork 0
/
markov.py
56 lines (48 loc) · 1.58 KB
/
markov.py
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
from difflib import SequenceMatcher
from pymarkovchain import MarkovChain
import argparse
import sys
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
parser = argparse.ArgumentParser(description='Spew some dank memes.')
parser.add_argument('-n', '--num', type=int, default=1,
help='Number of memes to spit. 0 is infinite.')
parser.add_argument('-s', '--similarity', type=float, default=1.0,
help='Reject memes until they\'re at most this dank.')
parser.add_argument('-l', '--length', type=int, default=0,
help='Reject memes until they\'re at least this long.')
args = parser.parse_args()
def mkdb():
mc = MarkovChain('./markov')
with open('yaks.txt') as input:
mc.generateDatabase(input.read())
with open('yaks.txt') as input:
yaks = [l.strip() for l in input]
return mc, yaks
def mkstr(mc, yaks):
res = mc.generateString()
sim = 0.0
avg = 0.0
for yak in yaks:
new_sim = similar(res.split(), yak.split())
if new_sim > sim:
sim = new_sim
avg += new_sim
avg /= len(yaks)
avg *= 100
return res, sim, avg
if args.num > 0:
mc, yaks = mkdb()
for x in range(args.num):
sim = args.similarity
yak = ''
while sim >= args.similarity or len(yak.split()) < args.length:
yak, sim, avg = mkstr(mc, yaks)
print('{:.2f} {:.2f} {}'.format(sim, avg, yak))
else:
while True:
mc, yaks = mkdb()
sim = args.similarity
while sim >= args.similarity or len(yak.split()) < args.length:
yak, sim, avg = mkstr(mc, yaks)
print('{:.2f} {:.2f} {}'.format(sim, avg, yak))