Newer
Older
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import argparse
import json
import random
from typing import List
from unidecode import unidecode
from .style import mark_correct
from .model import Verse
from .scanner import Scanner
def dev(reference_verses, number=10, randomize=False) -> List[Verse]:
"""Scan verses and compare them with their correct reference version."""
scanner = Scanner()
all_analyses = []
correct = 0
if randomize:
sample = random.sample(reference_verses, number)
else:
sample = reference_verses[:number]
for i, ref in enumerate(sample):
if i != 0:
print()
ref_reading = ref.readings[0]
analysis = scanner.scan_verses([unidecode(ref.text)])[0]
all_analyses.append(analysis)
correct_schema = ref_reading.get_schema()
analysis_correctnesses = [r.get_schema() == correct_schema
for r in analysis.readings]
this_correct = any(analysis_correctnesses)
if this_correct:
correct += 1
print('{ref} ({n} readings)'
.format(ref=mark_correct(ref_reading),
n=len(analysis.readings)))
else:
print('{ref} ({n} readings)'
.format(ref=ref_reading, n=len(analysis.readings)))
for reading in analysis.readings:
print(' {}'.format(reading.format_differences(ref_reading)))
print('\nCorrect: {}/{} ({:.2f})'
.format(correct, len(sample),
correct / len(sample)))
return all_analyses
def parse_args() -> argparse.Namespace:
"""Parse arguments from the commandline.
:return: An argparse Namespace holding the arguments.
"""
d = 'Identify errors in verse parsing.'
parser = argparse.ArgumentParser(prog='allzweckmesser', description=d)
parser.add_argument('--infile', help=('A JSON file containing verses'
' with one reading each.'))
parser.add_argument('--number', '-n', default=10, type=int,
help='Number of verses to analyze')
parser.add_argument('--randomize', '-r', default=False,
action='store_true',
help=('Randomize what verses are analyzed. If this is'
' not set, the first {number} verses are'
' analyzed.'))
args = parser.parse_args()
return args
def main():
"""Parse CLI arguments then read and scan verses."""
args = vars(parse_args())
args['reference_verses'] = [Verse.from_json(verse)
for verse
in json.load(open(args['infile']))]
del args['infile']
verse_analyses = dev(**args)
if __name__ == '__main__':
main()