<jupyter_start><jupyter_text>Dokumentation der Tags s[]s	Stichwort p[]p	PersonFür die Ansetzung von Personennamen kommen folgende Stichwortteile bzw. Ordnungshilfen in Frage:1. Name, 2. Vorname(n), 3. Adelstitel/Herrschaftsbezeichnung, 4. Akademischer Grad, 5. Beruf, 6. Ort7. Sonstiges8. Präfixe vor Personennamen9. Pseudonym / angenommene NamenBeispiel:- der Aktentitel enthält:... der Prager Buchhändler <NAME> ...- in Kat. 40 wird aufgenommen:... der p[6{Prag}er 5{Buchhändler} 2{J}.{} 1{Gelder}]p ...Im Personenregister entsteht daraus:Gelder, Johannes Zusätzlich werden Berufe und Orte indiziert, d.h. verklammerte Indizierung: der p[6{o[Prag]o}er 5{s[Buchhändler]s} 2{J}. 1{Gelder}]pNamen von Adeligen/Königen/Herzögen usw. werden nur unter dem Vornamen in Klammer 2 indiziert. Bekannte Zusätze werden in  eingefügt. k[]k	Körperschaft o[]o	Ortsregister t[]t	Titel z[]z	Zeit<jupyter_code>import json
import re
import csv
import glob

jsonpath = '../json'
csvpath = '../csv'
docpath = '../docx'
with open(f"{jsonpath}/2021-03-16-inventar-gesamt.json", 'r') as f:
    db = json.load(f)
# logik zum parsen der lemmata aus den kategorien-strings, gibt eine liste aller lemmata einer kategorie aus.
def re_parse(type, string):
    # print(f"type {type} und string {string}\n")
    ergebnis_liste = list()
    if substring_re_ergebnisse := re.finditer(r"([a-z])\[(.+)\]\1", string):
        for substring_match in substring_re_ergebnisse:
            ergebnis_liste.extend(re_parse(substring_match.group(1), substring_match.group(2)))
    match type:
        case "p":
            person = dict()
            string = re.sub(r"([tksop]\[)|(\][tksop])","",string)
            if re_matches := re.findall(r"([1-9])\{([^\{]+)}", string):
                for re_match in re_matches:
                    match re_match[0]:
                        case "1":
                            person["name"] = re_match[1]
                        case "2":
                            person["vorname"] = re_match[1]
                        case "3":
                            person["adelstitel"] = re_match[1]
                        case "4":
                            person["akademischergrad"] = re_match[1]
                        case "5":
                            person["beruf"] = re_match[1]
                        case "6":
                            person["ort"] = re_match[1]
                        case "7":
                            person["sonstiges"] = re_match[1]
                        case "8":
                            person["praefix"] = re_match[1]
                        case "9":
                            person["pseudonym"] = re_match[1]
            else:
                person["name"] = string
            ergebnis_liste.append({'p':person})
            return ergebnis_liste

        case "s":
            newstring = re.sub(r"([tksopz]\[)|(\][tksopz])","",string)
            if re_matches := re.findall(r"([1-9])\{([^\{]+)}", newstring):
                schlagwort = dict()
                for re_match in re_matches:
                    match re_match[0]:
                        case "1":
                            schlagwort["1"] = re_match[1]
                        case "2":
                            schlagwort["2"] = re_match[1]
                        case "3":
                            schlagwort["3"] = re_match[1]
            else:
                schlagwort = string
            ergebnis_liste.append({'s':schlagwort})
            return ergebnis_liste

        case "k":
            string = re.sub(r"([tksopt]\[)|(\][tksopt])","",string)
            string = re.sub(r"([1-9]\{)|(\})", "", string)
            if re_matches := re.findall(r"([1-9])\{([^\{]+)}", string):
                koerperschaft = dict()
                for re_match in re_matches:
                    match re_match[0]:
                        case "1":
                            koerperschaft["1"] = re_match[1]
                        case "2":
                            koerperschaft["2"] = re_match[1]
            else:
                koerperschaft = string

            ergebnis_liste.append({'k':koerperschaft})
            return ergebnis_liste
            
        case "o":
            if re_matches := re.findall(r"([1-9])\{([^\{]+)}", string):
                ort = dict()
                for re_match in re_matches:
                    match re_match[0]:
                        case "1":
                            ort["1"] = re_match[1]
                        case "2":
                            ort["2"] = re_match[1]
                        case "3":
                            ort["3"] = re_match[1]
            else:
                ort = string
            ergebnis_liste.append({'o': ort})
            return ergebnis_liste
        case "t":
            titel = re.sub(r"([tksopz]\[)|(\][tksopz])","",string)
            titel = re.sub(r"([1-9]\{)|(\})", "", titel)
            ergebnis_liste.append({'t':titel})
            return ergebnis_liste
        case "z":
            return ergebnis_liste
# nimmt eine Liste aller lemmata eines faszikels entgegen, formatiert diese und schreibt sie in die passende csv-datei
def write_faszikellemmata(sig, faszikel_lemmata):
    for lemma in faszikel_lemmata:
        match list(lemma.keys())[0]:
            case 'p':
                person_format = ""
                if "name" in lemma['p']:
                    person_format = lemma['p']["name"]
                    if "vorname" in lemma['p']:
                        person_format += f', {lemma["p"]["vorname"]}'
                    if "praefix" in lemma['p']:
                        person_format += f' {lemma["p"]["praefix"]}'
                    if "akademischergrad" in lemma['p']:
                        person_format += f' ({lemma["p"]["akademischergrad"]})'
                if "adelstitel" in lemma['p'] and "beruf" not in lemma['p']:
                    if "ort" in lemma['p']:
                        person_format += f'{lemma["p"]["ort"]}, '
                    person_format += f'{lemma["p"]["adelstitel"]} '
                    if "vorname" in lemma['p']:
                        person_format += f'{lemma["p"]["vorname"]} '
                    if "name" in lemma['p']:
                        person_format += f'{lemma["p"]["name"] } '
                    if "praefix" in lemma['p']:
                        person_format += f'{lemma["p"]["praefix"]}'
                elif "beruf" in lemma['p'] or "ort" in lemma['p'] or "pseudonym" in lemma['p'] or "sonstiges" in lemma['p']:
                    person_format += ' <'
                    if "beruf" in lemma['p'] and "ort" in lemma['p']:
                        person_format += f'{lemma["p"]["beruf"]} in {lemma["p"]["ort"]}'
                    elif "beruf" in lemma['p'] and "ort" not in lemma['p']:
                        person_format += f"{lemma['p']['beruf']}"
                    elif "ort" in lemma['p'] and "beruf" not in lemma['p']:
                        person_format += lemma['p']["ort"]
                    if "adelstitel" in lemma['p']:
                        person_format += lemma['p']['adelstitel']
                    if "sonstiges" in lemma['p']:
                        person_format += f" {lemma['p']['sonstiges']}"
                    person_format += '>'

                    with open(f"{csvpath}/personen.csv","a", newline='') as p:
                        csvwriter = csv.writer(p, delimiter=',', quoting=csv.QUOTE_ALL, escapechar='\\', quotechar='"')
                        csvwriter.writerow([person_format,sig])
            
            case 't':
                with open(f'{csvpath}/titel.csv', 'a', newline='') as t:
                    csvwriter = csv.writer(t, delimiter=',', quoting=csv.QUOTE_ALL, escapechar='\\', quotechar='"')
                    csvwriter.writerow([lemma["t"],sig])
            
            case 's':
                if isinstance(lemma['s'], dict):
                    schlagwort_format = str()
                    if "1" in lemma['s']:
                        schlagwort_format += lemma['s']['1']
                    if "2" in lemma['s']:
                        schlagwort_format += f", {lemma['s']['2']}"
                    if "3" in lemma['s']:
                        schlagwort_format += f", {lemma['s']['3']}"
                else:
                    schlagwort_format = lemma['s']

                with open(f'{csvpath}/schlagworte.csv', 'a', newline='') as s:
                    csvwriter = csv.writer(s, delimiter=',', quoting=csv.QUOTE_ALL, escapechar='\\', quotechar='"')
                    csvwriter.writerow([schlagwort_format,sig])

            case 'o':
                if isinstance(lemma['o'], dict):
                    ort_format = str()
                    if "1" in lemma['o']:
                        ort_format = lemma['o']['1']
                    if "2" in lemma['o']:
                        ort_format += f", {lemma['o']['2']}"
                    if "3" in lemma['o']:
                        ort_format += f", {lemma['o']['3']}"
                else:
                    ort_format = lemma['o']
                with open(f'{csvpath}/orte.csv', 'a', newline='') as o:
                    csvwriter = csv.writer(o, delimiter=',', quoting=csv.QUOTE_ALL, escapechar='\\', quotechar='"')
                    csvwriter.writerow([ort_format,sig])
            
            case 'k':
                if isinstance(lemma['k'], dict):
                    koerperschaft_format = str()
                    if "1" in lemma['k']:
                        koerperschaft_format = lemma['k']['1']
                    if "2" in lemma['k']:
                        koerperschaft_format += f", {lemma['k']['2']}"
                else:
                    koerperschaft_format = lemma['k']
                with open(f'{csvpath}/koerperschaften.csv', 'a', newline='') as k:
                    csvwriter = csv.writer(k, delimiter=',', quoting=csv.QUOTE_ALL, escapechar='\\', quotechar='"')
                    csvwriter.writerow([koerperschaft_format,sig])

#main
# print(f'{len(db["archive"])} Archive')
lemmata = list()
for archiv in db["archive"].items():
    # print(archiv)
    for bestand in archiv[1]["bestaende"].items():
        # print(bestand)
        if "unterbestaende" in bestand[1]:
            for unterbestand in bestand[1]["unterbestaende"].items():
                if "faszikel" in unterbestand[1]:
                    for faszikel in unterbestand[1]["faszikel"].items():
                        faszikel_lemmata = list()
                        sig = f"{archiv[0]} / {bestand[0]} / {unterbestand[0]} / {faszikel[0]}"
                        for kategorie in faszikel[1].items():
                            if re_ergebnisse := re.finditer(r"([a-z])\[(.+)\]\1", kategorie[1]):
                                for match in re_ergebnisse:
                                    faszikel_lemmata.extend(re_parse(match.group(1), match.group(2)))
                        write_faszikellemmata(sig, faszikel_lemmata)
        elif "faszikel" in bestand[1]:
            for faszikel in bestand[1]["faszikel"].items():
                faszikel_lemmata = list()
                sig = f"{archiv[0]} / {bestand[0]} / {faszikel[0]}"
                for kategorie in faszikel[1].items():
                    if re_ergebnisse := re.finditer(r"([a-z])\[(.+)\]\1", kategorie[1]):
                        for match in re_ergebnisse:
                            faszikel_lemmata.extend(re_parse(match.group(1), match.group(2)))
                write_faszikellemmata(sig, faszikel_lemmata)<jupyter_output><empty_output><jupyter_text>CSV-Dateien sortieren<jupyter_code>file_list = glob.glob(f'{csvpath}/*.csv')
for file in file_list:
    with open(file, 'r') as f:
        reader = csv.reader(f, delimiter=",", quoting=csv.QUOTE_ALL, escapechar='\\', quotechar='"')
        sortedlist = sorted(reader, key=lambda row: row[0])
    with open(file, 'w') as f:
        writer = csv.writer(f, delimiter=',', quoting=csv.QUOTE_ALL, escapechar='\\', quotechar='"')
        for item in sortedlist:
            writer.writerow(item)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15181952906306603, 'fraction_numerical': 0.010785443767495472, 'mean_word_length': 1.5686191583844364, 'pattern_counts': {'":': 23, '<': 11, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '146647', 'license': 'CC0-1.0', 'n_tokens_mistral': 3866, 'n_tokens_neox': 3707, 'n_words': 755, 'path': 'scripte/verzeichnisse.ipynb', 'repo_name': 'buchmuseum/inventar-buchhandelsquellen', 'size': '12149'}