X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=find_best_caesar_break_parameters.py;h=7a8ddc9dc0a4dd3340a84c3fb021d44131d1ab87;hb=f420062910c850658815504763c8ca77067bac82;hp=9ed53488dde8161ea13b1b6caa35b8aa60eb0fa0;hpb=dad438b5689c3748bb0ac4e4aa70802504abcea8;p=cipher-tools.git diff --git a/find_best_caesar_break_parameters.py b/find_best_caesar_break_parameters.py index 9ed5348..7a8ddc9 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) - 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) + writer = csv.DictWriter(f, ['name'] + message_lengths, + quoting=csv.QUOTE_NONNUMERIC) + writer.writeheader() + for scoring in sorted(scores): + scores[scoring]['name'] = scoring + writer.writerow(scores[scoring]) eval_scores() show_results()