tag_year.py

Ab 3309: erzeugt tags/<JJJJ>.json aus den automatischen Vorschlägen plus Claudes Korrekturen (tags_src/y<JJJJ>.py).

Ablage beim Arbeiten: tag_year.py. Herunterladen: auf den Dateinamen über dem Code klicken.

tag_year.py
"""tag_year.py RAW JAHR MODUL -> tags/<JAHR>.json  (automatische Vorschlaege + Korrekturen aus tags_src/<MODUL>.py)"""
import json,re,sys,csv,importlib
from pathlib import Path
sys.path.insert(0,'tags_src'); import common as C; import names as N
R=Path(sys.argv[1]); year=int(sys.argv[2]); O=importlib.import_module(sys.argv[3]).O
def load(L):
    d={}
    for f in (R/L).glob('*.json'):
        if int(f.stem[:4])-1286==year:
            for a in json.load(open(f,encoding='utf-8'))['articles']: d[a['id']]=a
    return d
EN,DE=load('EN'),load('DE')
idx=[r for r in csv.DictReader(open(R/'index.csv',encoding='utf-8'),delimiter=';') if int(r['date'][:4])==year]
def find(t,d): return sorted({v for k,v in d.items() if re.search(r'(?<![\w-])'+re.escape(k),t)})
inv=lambda d: {v:k for k,v in d.items()}
out={}
for i,r in enumerate(idx):
    a=EN.get(r['frontier_id']) or DE[r['frontier_id']]; de=DE.get(r['frontier_id'],{})
    t=re.sub(r"\*?Pilots[’']? Federation (ALERT|Alert)\*?",'',a['title']+'\n'+a['body'])
    tg=dict(factions=find(t,N.FACTIONS),corporations=find(t,N.CORPORATIONS),persons=find(t,N.PERSONS),codex=find(t,N.CODEX),
            related=find(t,N.SHIPS),storyline=[])
    sysc=set(re.findall(r"System(?:s)? ((?:[A-Z0-9][\w'+-]*)(?: (?:[A-Z0-9][\w'+-]*|Sector|[a-z]\d[\w-]*))*)",de.get('body','')))
    sysc|=set(re.findall(r"the ((?:[A-Z0-9][\w'+.-]*)(?: [A-Z0-9][\w'+.-]*)*) system",a['body']))
    tg['systems']=sorted({C.sys_id(s.rstrip('.')) for s in sysc})
    o=O.get(i,{})
    if 'f' in o: tg['factions']=[C.F[k] for k in o['f'].split()]
    if 'y' in o: tg['systems']=[C.sys_id(s) for s in o['y'].split(';') if s]
    if '+y' in o: tg['systems']+= [C.sys_id(s) for s in o['+y'].split(';')]
    if 'r' in o: tg['related']=[C.R[k] for k in o['r'].split()]
    for key,field,M in (('p','persons',C.P),('c','corporations',C.C),('x','codex',C.X)):
        for k in o.get('-'+key,'').split(): tg[field]=[v for v in tg[field] if v!=M[k]]
        for k in o.get('+'+key,'').split():
            if M[k] not in tg[field]: tg[field].append(M[k])
    tg['storyline']=[C.S[k] for k in o.get('s','').split()]
    # Caspian Leopold u. ae. sind keine Schiffe
    tg['related']=[x for x in tg['related'] if not (x.endswith('caspian_explorer') and 'Caspian Leopold' in t)]
    out[r['frontier_id']]={k:sorted(set(v)) for k,v in tg.items()}
json.dump(out,open(f'tags/{year}.json','w'),ensure_ascii=False,indent=1)
print(len(out),'Meldungen;', sum(len(v) for t in out.values() for k,v in t.items() if k!='related'),'Verknuepfungen')