summaryrefslogtreecommitdiff
path: root/lulua/stats.py
diff options
context:
space:
mode:
Diffstat (limited to 'lulua/stats.py')
-rw-r--r--lulua/stats.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/lulua/stats.py b/lulua/stats.py
index 6665ac8..a7980d6 100644
--- a/lulua/stats.py
+++ b/lulua/stats.py
@@ -22,6 +22,7 @@ import sys, operator, pickle, argparse, logging, yaml, math, time
from operator import itemgetter
from itertools import chain, groupby, product
from collections import defaultdict
+from decimal import Decimal
from .layout import *
from .keyboard import defaultKeyboards
@@ -326,6 +327,58 @@ def latinImeDict (args):
p = count/total
print (f' word={word},f={f(p)}')
+def corpusStats (args):
+ """ Get corpus stats from stat files """
+ stats = pickle.load (sys.stdin.buffer)
+ meta = yaml.safe_load (args.metadata)
+
+ meta['stats'] = dict (characters=sum (stats['simple'].combinations.values ()),
+ words=sum (stats['words'].words.values ()))
+
+ yaml.dump (meta, sys.stdout)
+ # make document concatable
+ print ('---')
+
+def approx (i):
+ """ Get approximate human-readable string for large number """
+
+ units = ['', 'thousand', 'million', 'billion']
+ base = Decimal (1000)
+ i = Decimal (i)
+ while i >= base and len (units) > 1:
+ i /= base
+ units.pop (0)
+ i = round (i, 1)
+ return int (i), int (i%1*10), units[0]
+
+def corpusHtml (args):
+ meta = list (filter (lambda x: x is not None, yaml.safe_load_all (sys.stdin)))
+ total = {'words': 0, 'characters': 0}
+ print ('<table class="pure-table"><thead><tr><th>Source</th><th colspan="2"></th><th colspan="2">Words</th><th colspan="2">Characters</th></thead><tbody>')
+ for c in sorted (meta, key=lambda x: x['source']['name'].lower ()):
+ print ('<tr>')
+ print (f'<td><a href="{c["source"]["url"]}">{c["source"]["name"]}</a></td>')
+ count = c.get ('count')
+ if count:
+ print (f'<td class="numint">{count[0]//1000:d},</td><td class="numfrac">{count[0]%1000:03d}\u202f{count[1]}</td></td>')
+ else:
+ print ('<td class="numint"></td><td class="numfrac"></td>')
+
+ stats = c.get ('stats')
+ for k in ('words', 'characters'):
+ i = approx (stats[k])
+ print (f'<td class="numint">{i[0]}.</td><td class="numfrac">{i[1]}\u202f{i[2]}</td>')
+ print ('</tr>')
+
+ for k in ('words', 'characters'):
+ total[k] += c['stats'][k]
+ print ('<tr><td>Total</td><td class="numint"></td><td class="numfrac"></td>')
+ for k in ('words', 'characters'):
+ i = approx (total[k])
+ print (f'<td class="numint">{i[0]}.</td><td class="numfrac">{i[1]}\u202f{i[2]}</td>')
+ print ('</tr>')
+ print ('</tbody></table>')
+
def main ():
parser = argparse.ArgumentParser(description='Process statistics files.')
parser.add_argument('-l', '--layout', metavar='LAYOUT', help='Keyboard layout name')
@@ -350,6 +403,11 @@ def main ():
sp.set_defaults (func=fingerHand)
sp = subparsers.add_parser('latinime')
sp.set_defaults (func=latinImeDict)
+ sp = subparsers.add_parser('corpusstats')
+ sp.add_argument('metadata', type=argparse.FileType ('r'))
+ sp.set_defaults (func=corpusStats)
+ sp = subparsers.add_parser('corpushtml')
+ sp.set_defaults (func=corpusHtml)
logging.basicConfig (level=logging.INFO)
args = parser.parse_args()