autotag.py

Gibt pro Meldung Vorschläge aus (bekannte Namen, Systeme, unbekannte Personen) – Grundlage für die Durchsicht durch Claude.

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

autotag.py
import json,re,sys,csv
from pathlib import Path
import names as N
R=Path(sys.argv[1]); years={int(x) for x in sys.argv[2].split(',')}
def load(L):
    d={}
    for f in (R/L).glob('*.json'):
        if int(f.stem[:4])-1286 in years:
            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]) in years]
def find(t,d): return sorted({v for k,v in d.items() if re.search(r'(?<![\w-])'+re.escape(k),t)})
known=set(N.PERSONS)|set(N.CORPORATIONS)|set(N.CODEX)
for n,r in enumerate(idx):
    a=EN.get(r['frontier_id']); de=DE.get(r['frontier_id'],{})
    t=a['title']+'\n'+a['body']
    # alerts header nicht als Pilotenvereinigung werten
    t2=re.sub(r"\*?Pilots[’'] Federation ALERT\*?",'',t)
    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']))
    pc=set(re.findall(r"\b(?:President|Admiral|Senator|Councillor|Commander|Captain|Professor|Dr\.?|CEO|Chancellor|Ambassador|Emperor|Prime Minister|Vice President|Director|General|Minister|Commodore|Shadow President|Princess|Prince|Senator)\s+((?:[A-Z][\w'-]+)(?:\s[A-Z][\w'-]+)*)",a['body']))
    pc|=set(re.findall(r"\b([A-Z][a-z]+(?:-[a-z]+)? [A-Z][a-z]+(?:-[A-Z]?[a-z]+)?)\b,? (?:said|stated|added|explained|told|announced|commented|declared|continued|confirmed)",a['body']))
    pc={p for p in pc if not any(p in k or k in p for k in known)}
    tags=dict(factions=find(t2,N.FACTIONS),corporations=find(t2,N.CORPORATIONS),persons=find(t2,N.PERSONS),codex=find(t2,N.CODEX),ships=find(t2,N.SHIPS))
    short=lambda v:[x.split(':')[-1] if not x.endswith('start') else x.split(':')[-2] for x in v]
    print(f"#{n} {r['frontier_id']} {r['date_ingame']} | {a['title']}")
    print('  A:',{k:short(v) for k,v in tags.items() if v},'| SYS:',sorted(sysc),'| P?:',sorted(pc))
    print('  ',re.sub(r'\s+',' ',a['body'])[:260])