Files
tudien/bin/utils/tab_stats.py
T
2026-10-02 22:54:53 +08:00

163 lines
4.8 KiB
Python

"""Statistics for the dictionary data file"""
import argparse
import collections
import pathlib
import string
def frequency(l):
cp = []
maxl = []
minl = []
ctr = collections.Counter(l)
print(ctr.most_common())
for i in ctr:
r = ctr[i]
cp.append(r)
p = max(cp)
q = min(cp)
# print(cp)
for i in ctr:
if ctr[i] == p:
maxl.append(i)
if ctr[i] == q:
minl.append(i)
return (sorted(minl), sorted(maxl))
COUNT = 10
DEF_LEN_DIV = 100
MAX_LINE = 1000 # Run multitple round to avoid loading a huge file
def list_words(text):
return [word.strip(string.punctuation + "\n") for word in text.split()]
def writeStats(file, contents):
print(str(contents))
file.write(f"{str(contents)}\n")
def main() -> None:
parser = argparse.ArgumentParser(
description="Convert all dictionaries in a folder", usage="Usage: python tab_stats.py --input data.tab --output data.stats"
)
parser.add_argument("-i", "--input", required=True, help="Input folder containing .tsv and .dfo files")
parser.add_argument("-o", "--output", help="Output folder containing dictionary files")
args, array = parser.parse_known_args()
inputfile = args.input
ouputfile = args.output
mainCharCounter = collections.Counter()
mainWordCounter = collections.Counter()
mainHeadwordCounter = collections.Counter()
mainDefinitionCounter = collections.Counter()
# Stats về chiều dài headword, definition
# Tách lượt để thống kê không thì hết bộ nhớ
inputpath = pathlib.Path(inputfile)
if not ouputfile:
ouputpath = inputpath.with_suffix(".stats")
else:
ouputpath = pathlib.Path(ouputfile)
try:
infile = open(inputpath, encoding="utf-8", errors="strict")
outfile = open(ouputpath, "w", encoding="utf-8")
line = infile.readline()
line_count = 1
issue_count = 0
lines = []
text = ""
words = []
writeStats(outfile, "# File Checks")
while line:
# print(f'Line {line_count}')
# lines.append(line)
mainCharCounter = mainCharCounter + collections.Counter(line)
# mainWordCounter = mainWordCounter + collections.Counter(list_words(line))
items = line.strip().split("\t")
no_items = len(items)
if no_items != 2:
writeStats(outfile, f"### Error on line {line_count}: Wrong number of items ({no_items})> {line.strip()}")
issue_count += 1
else:
mainHeadwordCounter.update([len(items[0])])
mainDefinitionCounter.update([len(items[1]) // DEF_LEN_DIV * DEF_LEN_DIV])
pass
line_count += 1
line = infile.readline()
if not line or ((line_count % MAX_LINE) == 0): # Every MAX_LINE lines, accomulate stats
print(f"Line {line_count}")
# mainCharCounter = mainCharCounter + collections.Counter(text)
# mainWordCounter = mainWordCounter + collections.Counter(words)
# text = ''
# lines = []
# words = []
outfile.flush()
writeStats(outfile, "# Line stats")
writeStats(outfile, f"## Line count: {line_count}")
writeStats(outfile, f"## Issue count: {issue_count}")
writeStats(outfile, "# Character frequency")
writeStats(outfile, str(mainCharCounter.most_common(COUNT)))
writeStats(outfile, str(mainCharCounter.most_common()[: -COUNT - 1 : -1]))
# writeStats(outfile, '# Word frequency')
# writeStats(outfile, str(mainWordCounter.most_common(COUNT)))
# writeStats(outfile, str(mainWordCounter.most_common()[:-COUNT-1:-1]))
writeStats(outfile, "# Headword len frequency")
writeStats(outfile, str(mainHeadwordCounter.most_common(COUNT)))
writeStats(outfile, str(mainHeadwordCounter.most_common()[: -COUNT - 1 : -1]))
writeStats(outfile, "# Definition len frequency")
writeStats(outfile, str(mainDefinitionCounter.most_common(COUNT)))
writeStats(outfile, str(mainDefinitionCounter.most_common()[: -COUNT - 1 : -1]))
except IOError as err:
print(f"Error reading file: {err}")
except UnicodeDecodeError as err:
print(f"Error decoding file: {err}")
# try:
# print('Write file to compare')
# infile = open(inputpath, encoding='utf-8', errors='replace')
# lines = infile.readlines()
# infile.close()
# outfile = open(str(inputpath) + '.txt', 'w', encoding='utf-8')
# outfile.writelines(lines)
# outfile.close()
# except IOError as err1:
# print(f'Error reading file: {err1}')
# exit(1)
if __name__ == "__main__":
main()