new-words
diff misc/zubrator.py @ 47:d708e2c1bad8
compressed wordlist support
author | Igor Chubin <igor@chub.in> |
---|---|
date | Mon Feb 07 21:21:17 2011 +0200 (2011-02-07) |
parents | |
children | abd4080ee583 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/misc/zubrator.py Mon Feb 07 21:21:17 2011 +0200 1.3 @@ -0,0 +1,150 @@ 1.4 +#!/usr/bin/python 1.5 + 1.6 +import random 1.7 +import sys 1.8 + 1.9 +# TODO: 1.10 +# * persistent weight dict 1.11 +# * log 1.12 +# * stats (top5, time_total, time_last, correct_answers_rate_total, correct_answers_rate_last) 1.13 + 1.14 +# DONE: 1.15 +# * correct quit (ctrl d) 1.16 + 1.17 +def color_for_answer(answer): 1.18 + color_table = { 1.19 + 'der': 'Blue', 1.20 + 'das': 'Green', 1.21 + 'die': 'Red', 1.22 + } 1.23 + if not answer in color_table: 1.24 + return 'Normal' 1.25 + else: 1.26 + return color_table[answer] 1.27 + 1.28 +def colorprint(string, color=None): 1.29 + color_table = { 1.30 + 'Gray': '\033[1;30m', 1.31 + 'Red': '\033[1;31m', 1.32 + 'Green': '\033[1;32m', 1.33 + 'Yellow': '\033[1;33m', 1.34 + 'Blue': '\033[1;34m', 1.35 + 'Magenta': '\033[1;35m', 1.36 + 'Cyan': '\033[1;36m', 1.37 + 'White': '\033[1;37m', 1.38 + 'Crimson': '\033[1;38m', 1.39 + 'Highlighted_Red': '\033[1;41m', 1.40 + 'Highlighted_Green': '\033[1;42m', 1.41 + 'Highlighted_Brown': '\033[1;43m', 1.42 + 'Highlighted_Blue': '\033[1;44m', 1.43 + 'Highlighted_Magenta': '\033[1;45m', 1.44 + 'Highlighted_Cyan': '\033[1;46m', 1.45 + 'Highlighted_Gray': '\033[1;47m', 1.46 + 'Highlighted_Crimson': '\033[1;48m', 1.47 + } 1.48 + normal_color_code = '\033[1;m' 1.49 + if not color or color == 'Normal' or not color in color_table: 1.50 + print string 1.51 + else: 1.52 + print "%s%s%s" % (color_table[color], string, normal_color_code) 1.53 + 1.54 +def wrandom(dict): 1.55 + total = sum(dict.values()) 1.56 + n = random.uniform(0, total) 1.57 + 1.58 + for key in sorted(dict.keys()): 1.59 + item = key 1.60 + if n < dict[key]: 1.61 + break 1.62 + n -= dict[key] 1.63 + 1.64 + return item 1.65 + 1.66 +def set_weight(weight, word, new_weight): 1.67 + if len(weight) <= 1: 1.68 + raise Exception("Can't set weight; weight dictionary is too small; need at least two members") 1.69 + sum_before = sum(weight.values()) 1.70 + w_before = weight[word] 1.71 + w_after = new_weight 1.72 + delta = (w_after - w_before)*1.0/(len(weight)-1) 1.73 + for k in weight.keys(): 1.74 + if k == word: 1.75 + weight[k] = w_after 1.76 + else: 1.77 + weight[k] -= delta 1.78 + sum_after = sum(weight.values()) 1.79 + if abs(sum_before-sum_after)> 0.0001: 1.80 + raise Exception("%s != %s ; function set_weight works incorrectly" % (sum_before, sum_after)) 1.81 + return weight 1.82 + 1.83 +def print_stats(stats, weight, correct_answer): 1.84 + print "------------------------" 1.85 + print "total questions = %s" % stats['total_questions'] 1.86 + print "last questions = %s" % stats['last_questions'] 1.87 + print "total errors = %s (%.2f)" % (stats['total_errors'], 1.0*stats['total_errors']/stats['total_questions']) 1.88 + print "last errors = %s (%.2f)" % (stats['last_errors'], 1.0*stats['last_errors']/stats['last_questions']) 1.89 + print "top 5 questions:" 1.90 + for question in sorted(weight.keys(),key=lambda x: weight[x], reverse=True)[:5]: 1.91 + colorprint( 1.92 + " %s %s %5.2f" % (correct_answer[question], question, weight[question]), 1.93 + color_for_answer(correct_answer[question]) 1.94 + ) 1.95 + 1.96 + print "------------------------" 1.97 + 1.98 +filename = sys.argv[1] 1.99 +correct_answer = {} 1.100 +with open(filename) as f: 1.101 + for line in f.readlines(): 1.102 + line = line.rstrip('\n') 1.103 + try: 1.104 + (q, a) = line.split(' ', 1) 1.105 + correct_answer[q] = a 1.106 + except: 1.107 + pass 1.108 + 1.109 +saved_weight = { 1.110 + 'Auskunft' : 2, 1.111 +} 1.112 + 1.113 +weight = {} 1.114 +for word in correct_answer.keys(): 1.115 + if word in saved_weight: 1.116 + weight[word] = saved_weight[word] 1.117 + else: 1.118 + weight[word] = 1 1.119 + 1.120 +stats = { 1.121 + 'total_errors' :0, 1.122 + 'last_errors' :0, 1.123 + 'total_questions' :0, 1.124 + 'last_questions' :0, 1.125 + } 1.126 + 1.127 +while 1: 1.128 + question = wrandom(weight) 1.129 + colorprint(question, 'Yellow') 1.130 + answer = sys.stdin.readline().rstrip('\n') 1.131 + if not answer: 1.132 + break 1.133 + if answer != correct_answer[question]: 1.134 + colorprint( 1.135 + "%s %s" % (correct_answer[question], question), 1.136 + color_for_answer(correct_answer[question]) 1.137 + ) 1.138 + weight = set_weight(weight, question, weight[question]*1.5) 1.139 + stats['total_errors'] += 1 1.140 + stats['last_errors'] += 1 1.141 + else: 1.142 + weight = set_weight(weight, question, weight[question]*0.8) 1.143 + 1.144 + stats['total_questions'] += 1 1.145 + stats['last_questions'] += 1 1.146 + 1.147 + if stats['last_questions'] == 20: 1.148 + print_stats(stats, weight, correct_answer) 1.149 + stats['last_questions'] = 0 1.150 + stats['last_errors'] = 0 1.151 + 1.152 + print 1.153 +