X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=find_best_caesar_break_parameters.py;h=7a550aaacc3cfade2fe06b9b6f6b81675fa8f6b6;hb=2def5210d568279bb38890c2de282e171f4ff7dd;hp=9ed53488dde8161ea13b1b6caa35b8aa60eb0fa0;hpb=3e8d2bd8cd7c623116fa3d2b77db954f51b191e4;p=cipher-training.git diff --git a/find_best_caesar_break_parameters.py b/find_best_caesar_break_parameters.py index 9ed5348..7a550aa 100644 --- a/find_best_caesar_break_parameters.py +++ b/find_best_caesar_break_parameters.py @@ -3,6 +3,7 @@ import collections from cipher import * from cipherbreak import * import itertools +import csv corpus = sanitise(''.join([open('shakespeare.txt', 'r').read(), open('sherlock-holmes.txt', 'r').read(), @@ -11,27 +12,19 @@ corpus_length = len(corpus) euclidean_scaled_english_counts = norms.euclidean_scale(english_counts) -# def frequency_compare(text, target_frequency, frequency_scaling, metric): -# counts = frequency_scaling(frequencies(text)) -# return -1 * metric(target_frequency, counts) - -# def euclidean_compare(text): -# return frequency_compare(text, norms.euclidean_scale(english_counts), -# norms.euclidean_scale, norms.euclidean_distance) - metrics = [{'func': norms.l1, 'invert': True, 'name': 'l1'}, {'func': norms.l2, 'invert': True, 'name': 'l2'}, {'func': norms.l3, 'invert': True, 'name': 'l3'}, - {'func': norms.cosine_distance, 'invert': False, 'name': 'cosine_distance'}, - {'func': norms.harmonic_mean, 'invert': True, 'name': 'harmonic_mean'}, - {'func': norms.geometric_mean, 'invert': True, 'name': 'geometric_mean'}] + {'func': norms.cosine_similarity, 'invert': False, 'name': 'cosine_similarity'}] + # {'func': norms.harmonic_mean, 'invert': True, 'name': 'harmonic_mean'}, + # {'func': norms.geometric_mean, 'invert': True, 'name': 'geometric_mean'}] scalings = [{'corpus_frequency': normalised_english_counts, 'scaling': norms.normalise, 'name': 'normalised'}, {'corpus_frequency': euclidean_scaled_english_counts, 'scaling': norms.euclidean_scale, 'name': 'euclidean_scaled'}] -message_lengths = [300, 100, 50, 30, 20, 10, 5] +message_lengths = [100, 50, 30, 20, 10, 5] trials = 5000 @@ -48,7 +41,6 @@ def make_frequency_compare_function(target_frequency, frequency_scaling, metric, return score return frequency_compare - def scoring_functions(): return [{'func': make_frequency_compare_function(s['corpus_frequency'], s['scaling'], m['func'], m['invert']), @@ -77,14 +69,12 @@ def eval_one_score(scoring_function, message_length): def show_results(): with open('caesar_break_parameter_trials.csv', 'w') as f: - print(',message_length', file = f) - print('scoring,', ', '.join([str(l) for l in message_lengths]), file = f) + writer = csv.DictWriter(f, ['name'] + message_lengths, + quoting=csv.QUOTE_NONNUMERIC) + writer.writeheader() for scoring in sorted(scores.keys()): - for length in message_lengths: - print(scoring, end='', sep='', file=f) - for l in message_lengths: - print(',', scores[scoring][l] / trials, end='', file=f) - print('', file = f) + scores[scoring]['name'] = scoring + writer.writerow(scores[scoring]) eval_scores() show_results()