Commit 2cbd09ca authored by Georg Brandl's avatar Georg Brandl

Merged revisions 75339 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r75339 | georg.brandl | 2009-10-11 10:39:16 +0200 (So, 11 Okt 2009) | 1 line

  Update markov demo.
........
parent e63514b0
...@@ -5,11 +5,10 @@ class Markov: ...@@ -5,11 +5,10 @@ class Markov:
self.histsize = histsize self.histsize = histsize
self.choice = choice self.choice = choice
self.trans = {} self.trans = {}
def add(self, state, next): def add(self, state, next):
if state not in self.trans: self.trans.setdefault(state, []).append(next)
self.trans[state] = [next]
else:
self.trans[state].append(next)
def put(self, seq): def put(self, seq):
n = self.histsize n = self.histsize
add = self.add add = self.add
...@@ -17,26 +16,29 @@ class Markov: ...@@ -17,26 +16,29 @@ class Markov:
for i in range(len(seq)): for i in range(len(seq)):
add(seq[max(0, i-n):i], seq[i:i+1]) add(seq[max(0, i-n):i], seq[i:i+1])
add(seq[len(seq)-n:], None) add(seq[len(seq)-n:], None)
def get(self): def get(self):
choice = self.choice choice = self.choice
trans = self.trans trans = self.trans
n = self.histsize n = self.histsize
seq = choice(trans[None]) seq = choice(trans[None])
while 1: while True:
subseq = seq[max(0, len(seq)-n):] subseq = seq[max(0, len(seq)-n):]
options = trans[subseq] options = trans[subseq]
next = choice(options) next = choice(options)
if not next: break if not next:
seq = seq + next break
seq += next
return seq return seq
def test(): def test():
import sys, string, random, getopt import sys, random, getopt
args = sys.argv[1:] args = sys.argv[1:]
try: try:
opts, args = getopt.getopt(args, '0123456789cdw') opts, args = getopt.getopt(args, '0123456789cdwq')
except getopt.error: except getopt.error:
print('Usage: markov [-#] [-cddqw] [file] ...') print('Usage: %s [-#] [-cddqw] [file] ...' % sys.argv[0])
print('Options:') print('Options:')
print('-#: 1-digit history size (default 2)') print('-#: 1-digit history size (default 2)')
print('-c: characters (default)') print('-c: characters (default)')
...@@ -49,16 +51,19 @@ def test(): ...@@ -49,16 +51,19 @@ def test():
print('exactly one space separating words.') print('exactly one space separating words.')
print('Output consists of paragraphs separated by blank') print('Output consists of paragraphs separated by blank')
print('lines, where lines are no longer than 72 characters.') print('lines, where lines are no longer than 72 characters.')
sys.exit(2)
histsize = 2 histsize = 2
do_words = 0 do_words = False
debug = 1 debug = 1
for o, a in opts: for o, a in opts:
if '-0' <= o <= '-9': histsize = eval(o[1:]) if '-0' <= o <= '-9': histsize = int(o[1:])
if o == '-c': do_words = 0 if o == '-c': do_words = False
if o == '-d': debug = debug + 1 if o == '-d': debug += 1
if o == '-q': debug = 0 if o == '-q': debug = 0
if o == '-w': do_words = 1 if o == '-w': do_words = True
if not args: args = ['-'] if not args:
args = ['-']
m = Markov(histsize, random.choice) m = Markov(histsize, random.choice)
try: try:
for filename in args: for filename in args:
...@@ -72,13 +77,15 @@ def test(): ...@@ -72,13 +77,15 @@ def test():
if debug: print('processing', filename, '...') if debug: print('processing', filename, '...')
text = f.read() text = f.read()
f.close() f.close()
paralist = string.splitfields(text, '\n\n') paralist = text.split('\n\n')
for para in paralist: for para in paralist:
if debug > 1: print('feeding ...') if debug > 1: print('feeding ...')
words = string.split(para) words = para.split()
if words: if words:
if do_words: data = tuple(words) if do_words:
else: data = string.joinfields(words, ' ') data = tuple(words)
else:
data = ' '.join(words)
m.put(data) m.put(data)
except KeyboardInterrupt: except KeyboardInterrupt:
print('Interrupted -- continue with data read so far') print('Interrupted -- continue with data read so far')
...@@ -86,16 +93,19 @@ def test(): ...@@ -86,16 +93,19 @@ def test():
print('No valid input files') print('No valid input files')
return return
if debug: print('done.') if debug: print('done.')
if debug > 1: if debug > 1:
for key in m.trans.keys(): for key in m.trans.keys():
if key is None or len(key) < histsize: if key is None or len(key) < histsize:
print(repr(key), m.trans[key]) print(repr(key), m.trans[key])
if histsize == 0: print(repr(''), m.trans['']) if histsize == 0: print(repr(''), m.trans[''])
print() print()
while 1: while True:
data = m.get() data = m.get()
if do_words: words = data if do_words:
else: words = string.split(data) words = data
else:
words = data.split()
n = 0 n = 0
limit = 72 limit = 72
for w in words: for w in words:
...@@ -103,15 +113,9 @@ def test(): ...@@ -103,15 +113,9 @@ def test():
print() print()
n = 0 n = 0
print(w, end=' ') print(w, end=' ')
n = n + len(w) + 1 n += len(w) + 1
print() print()
print() print()
def tuple(list):
if len(list) == 0: return ()
if len(list) == 1: return (list[0],)
i = len(list)//2
return tuple(list[:i]) + tuple(list[i:])
if __name__ == "__main__": if __name__ == "__main__":
test() test()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment