162 lines
5.5 KiB
Python
162 lines
5.5 KiB
Python
#!python
|
|
from lxml import etree
|
|
from collections import OrderedDict
|
|
import json
|
|
import sys
|
|
from io import open
|
|
|
|
entries = []
|
|
|
|
XML_LANG = '{http://www.w3.org/XML/1998/namespace}lang'
|
|
|
|
# whether to only output english definitions - if so, glosses are just the gloss text, not a dictionary
|
|
eng_only = True
|
|
|
|
parser = etree.XMLParser(resolve_entities=False)
|
|
root = etree.parse("JMdict", parser);
|
|
for ent in root.iter(etree.Entity):
|
|
if ent.getparent() is not None:
|
|
if not ent.getparent().text:
|
|
ent.getparent().text = ""
|
|
if ent.text:
|
|
ent.getparent().text += ent.text
|
|
if ent.tail:
|
|
ent.getparent().text += ent.tail
|
|
root = root.getroot();
|
|
for entry in root.iter("entry"):
|
|
myentry = OrderedDict()
|
|
seq = int(entry.find("ent_seq").text)
|
|
k_eles = []
|
|
for k_ele in entry.iter("k_ele"):
|
|
keb = k_ele.find("keb").text
|
|
ke_infs = []
|
|
for ke_inf in k_ele.iter("ke_inf"):
|
|
ke_infs += [ke_inf.text]
|
|
ke_pris = []
|
|
for ke_pri in k_ele.iter("ke_pri"):
|
|
ke_pris += [ke_pri.text]
|
|
element = OrderedDict()
|
|
element["keb"] = keb
|
|
if(len(ke_infs) > 0): element["inf"] = ke_infs
|
|
if(len(ke_pris) > 0): element["pri"] = ke_pris
|
|
k_eles += [element]
|
|
r_eles = []
|
|
for r_ele in entry.iter("r_ele"):
|
|
reb = r_ele.find("reb").text
|
|
re_nokanji = None
|
|
if r_ele.find("re_nokanji") is not None:
|
|
re_nokanji = r_ele.find("re_nokanji").text
|
|
re_restrs = []
|
|
for re_restr in r_ele.iter("re_restr"):
|
|
re_restrs += [re_restr.text]
|
|
re_infs = []
|
|
for re_inf in r_ele.iter("re_inf"):
|
|
re_infs += [re_inf.text]
|
|
re_pris = []
|
|
for re_pri in r_ele.iter("re_pri"):
|
|
re_pris += [re_pri.text]
|
|
element = OrderedDict()
|
|
element["reb"] = reb
|
|
if(re_nokanji != None): element["nokanji"] = re_nokanji
|
|
if(len(re_restrs) > 0): element["restr"] = re_restrs
|
|
if(len(re_infs) > 0): element["inf"] = re_infs
|
|
if(len(re_pris) > 0): element["pri"] = re_pris
|
|
r_eles += [element]
|
|
senses = []
|
|
for sense in entry.iter("sense"):
|
|
stagks = []
|
|
for stagk in sense.iter("stagk"):
|
|
stagks += [stagk.text]
|
|
stagrs = []
|
|
for stagr in sense.iter("stagr"):
|
|
stagrs += [stagr.text]
|
|
poss = []
|
|
for pos in sense.iter("pos"):
|
|
#poss += [pos.getchildren()[0].text]
|
|
poss += [pos.text]
|
|
xrefs = []
|
|
for xref in sense.iter("xref"):
|
|
xrefs += [xref.text]
|
|
ants = []
|
|
for ant in sense.iter("ant"):
|
|
ants += [ant.text]
|
|
fields = []
|
|
for field in sense.iter("field"):
|
|
fields += [field.text]
|
|
miscs = []
|
|
for misc in sense.iter("misc"):
|
|
miscs += [misc.text]
|
|
s_infs = []
|
|
for s_inf in sense.iter("s_inf"):
|
|
s_infs += [s_inf.text]
|
|
lsources = []
|
|
for lsource in sense.iter("lsource"):
|
|
source = OrderedDict()
|
|
source["text"] = lsource.text
|
|
source["lang"] = "eng"
|
|
if lsource.get(XML_LANG): source["lang"] = lsource.get(XML_LANG)
|
|
source["type"] = "full"
|
|
if lsource.get("ls_type"): source["type"] = lsource.get("ls_type")
|
|
source["wasei"] = "n"
|
|
if lsource.get("ls_wasei"): source["wasei"] = lsource.get("ls_wasei")
|
|
lsources += [source]
|
|
dials = []
|
|
for dial in sense.iter("dial"):
|
|
dials += [dial.text]
|
|
glosss = []
|
|
for gloss in sense.iter("gloss"):
|
|
definition = OrderedDict()
|
|
definition["text"] = gloss.text
|
|
definition["lang"] = "eng"
|
|
if gloss.get(XML_LANG): definition["lang"] = gloss.get(XML_LANG)
|
|
if eng_only and definition["lang"] != "eng": continue
|
|
if eng_only:
|
|
glosss += [gloss.text]
|
|
else:
|
|
glosss += [definition]
|
|
element = OrderedDict()
|
|
if(len(stagks) > 0): element["stagk"] = stagks
|
|
if(len(stagrs) > 0): element["stagr"] = stagrs
|
|
if(len(poss) > 0): element["pos"] = poss
|
|
if(len(xrefs) > 0): element["xref"] = xrefs
|
|
if(len(ants) > 0): element["ant"] = ants
|
|
if(len(fields) > 0): element["field"] = fields
|
|
if(len(miscs) > 0): element["misc"] = miscs
|
|
if(len(s_infs) > 0): element["inf"] = s_infs
|
|
if(len(lsources) > 0): element["lsource"] = lsources
|
|
if(len(dials) > 0): element["dial"] = dials
|
|
if(len(glosss) > 0): element["gloss"] = glosss
|
|
|
|
if(len(element) > 0): senses += [element]
|
|
|
|
myentry["seq"] = seq
|
|
if(len(k_eles) > 0): myentry["k_ele"] = k_eles
|
|
myentry["r_ele"] = r_eles
|
|
myentry["sense"] = senses
|
|
entries += [myentry]
|
|
|
|
#print(entries)
|
|
|
|
#print(json.dumps(entries, ensure_ascii=False))
|
|
#sys.stdout.buffer.write(json.dumps(entries, ensure_ascii=False, separators=(',',':')).encode("utf-8"))
|
|
i = 0
|
|
under = 1
|
|
copylist = []
|
|
basename = "JMdict"
|
|
extension = ".json"
|
|
limit = 18000
|
|
for entry in entries:
|
|
i += 1
|
|
copylist += [entry]
|
|
if i >= limit:
|
|
f = open(basename+str(under)+extension, "w", newline="\n", encoding="utf-8")
|
|
f.write(json.dumps(copylist, ensure_ascii=False, separators=(',',':')));
|
|
copylist = []
|
|
i = 0
|
|
under += 1
|
|
|
|
f = open(basename+str(under)+extension, "w", newline="\n", encoding="utf-8")
|
|
f.write(json.dumps(copylist, ensure_ascii=False, separators=(',',':')));
|
|
|
|
|