sj4/tools/wnn2sj4.py
2026-06-21 08:00:44 +09:00

166 lines
2.9 KiB
Python
Executable file

#!/usr/bin/env python3
# THIS IS FOR SYSTEM DICTIONARY GENERATION!!!!!
import sys
import re
from math import *
from collections import defaultdict
HINSHI = {
"名詞": "名1",
"固有名詞": "名1",
"単漢字": "名1",
"人名": "名前",
"地名": "地名",
"人名&地名": "地名",
"数詞": "数詞",
"助数詞": "助数",
"サ行(する)&名詞": "名6",
"形容動詞": "形動1",
"形容動詞&名詞": "形動1",
"形容動詞(たる)": "形動1",
"形容詞": "形1",
"副詞": "副1",
"連体詞": "連体",
"接続詞,感動詞": "接続",
"一段": "一段1",
"一段&名詞": "一段1",
"カ行五段": "カ五1",
"ガ行五段": "ガ五1",
"サ行五段": "サ五1",
"タ行五段": "タ五1",
"ナ行五段": "ナ五",
"バ行五段": "バ五1",
"マ行五段": "マ五1",
"ラ行五段": "ラ五1",
"ワ行五段": "ワ五1",
"サ行(する)": "サ変",
"ザ行(ずる)": "ザ変",
"ラ行(下さい)": "ラ五1",
"カ行(行く)": "カ五1",
"接頭語": "接頭1",
"接頭語(お)": "接頭1",
"接頭語(各)": "接頭1",
"接頭助数詞": "接頭4",
"接頭数詞": "接頭4",
"接頭地名": "接頭3",
"接尾語": "接尾1",
"接尾人名": "接尾1",
"接尾地名": "接尾4",
"接尾助数詞": "助数",
"接尾動詞": "接尾5",
"形容動詞化接尾語": "接尾6",
"サ行(する)&名詞化接尾語": "接尾7",
"形容詞化接尾動詞": "接尾5",
"一動幹": "一段1"
}
SKIP = {
"記号",
"開括弧",
"閉括弧",
"来(こ)",
"来(く)",
"来(き)",
"為(せ)",
"為(し)",
"為(す)"
}
def p_freq(fields):
if len(fields) < 4:
return 0
return int(fields[-1])
if len(sys.argv) != 3:
print("usage: wnn2sj4.py input.u output.dic", file=sys.stderr)
sys.exit(1)
inp = sys.argv[1]
outp = sys.argv[2]
entries = {}
fp = open(inp, "r", encoding="euc_jp")
for lineno, line in enumerate(fp, 1):
line = line.rstrip()
if not(line):
continue
fields = line.split()
if len(fields) < 3:
continue
y = fields[0]
k = fields[1]
h = fields[2]
if h in SKIP:
continue
if re.findall(r'[^あ-んー]', y):
continue
sj = HINSHI[h]
if sj is None:
sys.stderr.write(f"{lineno}: unknown hinshi: {h}\n")
sj = "名1"
freq = p_freq(fields)
key = (y, k, sj)
old = entries.get(key)
if old is None or freq > old:
entries[key] = freq
fp.close()
grouped = defaultdict(list)
maxf = 0
for (y, k, sj), freq in entries.items():
if maxf < freq:
maxf = freq
grouped[y].append((freq, k, sj, freq))
fp = open(outp, "w", encoding="utf-8")
for y in sorted(grouped.keys()):
lst = grouped[y]
lst.sort(key=lambda x: (-x[0], x[1]))
t = "\t" * (4 - (len(y) // 4))
for freq, k, sj, freq in lst:
t2 = "\t" * (4 - (len(k) // 4))
freq = floor(freq / maxf * 0xffff)
fp.write(f"{y}{t}{k}{t2}{sj}:[C{freq}]:\n")
fp.close()