diff --git a/Notebooks/Analyze_ALMA_export.ipynb b/Notebooks/Analyze_ALMA_export.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..9fbd5e674b2b87176f1c8b52d4230248d3204a83 --- /dev/null +++ b/Notebooks/Analyze_ALMA_export.ipynb @@ -0,0 +1,2889 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "fa2c0c2d-356b-4ea7-ac83-d1a0246b1139", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: openpyxl in /opt/conda/lib/python3.10/site-packages (3.1.2)\n", + "Requirement already satisfied: et-xmlfile in /opt/conda/lib/python3.10/site-packages (from openpyxl) (1.1.0)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install openpyxl" + ] + }, + { + "cell_type": "code", + "execution_count": 619, + "id": "6ec73b33-1f5d-4445-9d84-a85545cd5733", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import re\n", + "import requests\n", + "import json" + ] + }, + { + "cell_type": "code", + "execution_count": 882, + "id": "4773a522-d048-4bc1-80b1-55e1d8c595a5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n" + ] + } + ], + "source": [ + "p = re.compile('Z[0-9X]+')\n", + "print(bool(p.search('+Z203753604')))\n", + "print(bool(p.search('B1575290')))\n", + "\n", + "def extract_valid_bc(bc):\n", + " pattern = 'Z[0-9X]+'\n", + " match = re.search(pattern, str(bc))\n", + " if match:\n", + " return match.group(0)\n", + " return None\n", + "\n", + "def get_iiif_manifest(bcs):\n", + " mans = []\n", + " for bc in bcs:\n", + " r = requests.get(f'https://iiif.onb.ac.at/presentation/ABO/{bc}/manifest/')\n", + " if r.status_code == 200:\n", + " man = r.content\n", + " mans.append(man)\n", + " return mans" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "id": "424debb0-4153-4b21-8ac5-b754d4df2008", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df_1 = pd.read_excel('data/catalogue/BE ANAv4.xlsx')\n", + "df_2 = pd.read_excel('data/catalogue/notBE-Eugeniana ANA.xlsx')\n", + "df_3 = pd.read_excel('data/catalogue/NichtBE-Eugeniana SW6xx-ME.xlsx')\n", + "df_4 = pd.read_excel('data/catalogue/BE ANA ohne Item.xlsx')\n", + "df_5 = pd.read_excel('data/catalogue/Signatur BE2 ME SW etc + ALMA.xlsx')" + ] + }, + { + "cell_type": "code", + "execution_count": 192, + "id": "c1a776c7-6b78-4a2e-aa28-eda36f9d35d1", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "22412\n", + "Index([ 'Permanent Call Number', 992,\n", + " 993, 695,\n", + " 866, 'Library Code (Active)',\n", + " 'Location Code', 'Barcode',\n", + " 'Item Call Number', 'Title',\n", + " 'Author', 'Author (contributor)',\n", + " 'Begin Publication Date', 'End Publication Date',\n", + " 'Publication Date', 'Publication Place',\n", + " 'Publisher', 'Unnamed: 17',\n", + " 'MMS Id', 856,\n", + " 'Subjects', 'Subjects (Names)'],\n", + " dtype='object')\n", + "2\n", + "31\n", + "Index([ 'Permanent Call Number', 992,\n", + " 993, 695,\n", + " 866, 'Library Code (Active)',\n", + " 'Location Code', 'Barcode',\n", + " 'Item Call Number', 'Author',\n", + " 'Author (contributor)', 'Begin Publication Date',\n", + " 'MMS Id', 'Publication Date',\n", + " 'Publication Place', 'Publisher',\n", + " 'Title', 'End Publication Date',\n", + " 856, 'Subjects',\n", + " 'Subjects (Names)'],\n", + " dtype='object')\n", + "3\n", + "31\n", + "Index(['001', 600, 610, 611, 630, 648, 650, 651, 653, 655, 689], dtype='object')\n", + "4\n", + "22496\n", + "Index([ 'Permanent Call Number', '992 HOL',\n", + " '993 HOL', '695 HOL',\n", + " '866 HOL', 'Library Code (Active)',\n", + " 'Location Code', 'Author',\n", + " 'Author (contributor)', 'Title',\n", + " 'Begin Publication Date', 'End Publication Date',\n", + " 'Publication Date', 'Publication Place',\n", + " 'Publisher', 856,\n", + " 'Subjects', 'Subjects (Names)',\n", + " 'Unnamed: 18', 'MMS Id'],\n", + " dtype='object')\n", + "5\n", + "20706\n", + "Index([ '001', 600,\n", + " 610, 611,\n", + " 630, 648,\n", + " 650, 651,\n", + " 653, '655',\n", + " '689', '130$a',\n", + " '245$a', '245$c',\n", + " '500$a', '751$a',\n", + " '982$z', 'Type / Creator / Imprint',\n", + " 'Unnamed: 18', 'Subject',\n", + " 'Title', 'Series',\n", + " 'Availability', 'Modification Date',\n", + " 'Edition', 'Record number',\n", + " 'Language', 'MMS ID'],\n", + " dtype='object')\n" + ] + } + ], + "source": [ + "for i in range(1, 6):\n", + " print(i)\n", + " print(len(eval(f'df_{i}')))\n", + " print(eval(f'df_{i}').columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 379, + "id": "2376519e-bac0-44c0-9365-542845f3a6bc", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 740, + "id": "0a39cd9f-8687-4f82-84b0-836fe40ac366", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "merge_23 = df_2.merge(df_3, how='outer', left_on='MMS Id', right_on='001')\n", + "merge_23['Begin Publication Date'] = merge_23['Begin Publication Date'].astype(object)\n", + "merge_23['End Publication Date'] = merge_23['End Publication Date'].astype(object)\n", + "merge_23['Publication Date'] = merge_23['Publication Date'].astype(object)\n", + "\n", + "merge_123 = df_1.merge(merge_23, how='outer', on=['Begin Publication Date', 'End Publication Date', 'Publication Date', 'Barcode', 'Permanent Call Number', 992, 695, 'Library Code (Active)', 'Location Code', 'Title', 'Author', 'Author (contributor)', 'Publication Place', 'Publisher', 'MMS Id', 856, 'Subjects'])\n", + "merge_45 = df_4.merge(df_5, how='outer', left_on='MMS Id', right_on='MMS ID')\n", + "merge_45['Title'] = merge_45.apply(lambda x: combine_entries(x['Title_x'], x['Title_y']), axis=1)\n", + "merge_12345 = merge_45.merge(merge_123, how='outer', on=['Begin Publication Date', 'End Publication Date', 'Publication Date', 'Permanent Call Number', 'Library Code (Active)', 'Location Code', 'Title', 'Author', 'Author (contributor)', 'Publication Place', 'Publisher', 'MMS Id', 856, 'Subjects'])" + ] + }, + { + "cell_type": "code", + "execution_count": 745, + "id": "018d5635-7b0a-496f-97a7-44e04afe4c39", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Index([ 'Permanent Call Number', '992 HOL',\n", + " '993 HOL', '695 HOL',\n", + " '866 HOL', 'Library Code (Active)',\n", + " 'Location Code', 'Author',\n", + " 'Author (contributor)', 'Title_x',\n", + " 'Begin Publication Date', 'End Publication Date',\n", + " 'Publication Date', 'Publication Place',\n", + " 'Publisher', 856,\n", + " 'Subjects', 'Subjects (Names)',\n", + " 'MMS Id', '001_x',\n", + " '600_x', '610_x',\n", + " '650_x', '653_x',\n", + " '655', '689',\n", + " '130$a', '245$a',\n", + " '245$c', '500$a',\n", + " '751$a', '982$z',\n", + " 'Type / Creator / Imprint', 'Unnamed: 18_y',\n", + " 'Subject', 'Title_y',\n", + " 'Series', 'Availability',\n", + " 'Modification Date', 'Edition',\n", + " 'Record number', 'Language',\n", + " 'MMS ID', 'Title',\n", + " 992, '993_x',\n", + " 695, '866_x',\n", + " 'Barcode', 'Item Call Number_x',\n", + " 'Subjects (Names)_x', '001_y',\n", + " 655, 689],\n", + " dtype='object')" + ] + }, + "execution_count": 745, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "merge_12345_dropna = merge_12345.dropna(axis=1, how='all', ignore_index=True)\n", + "merge_12345_dropna.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 746, + "id": "d8b8ed91-fb6b-4eb8-87f3-2bb45f32c144", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['001_x',\n", + " '001_y',\n", + " '130$a',\n", + " '245$a',\n", + " '245$c',\n", + " '500$a',\n", + " '600_x',\n", + " '610_x',\n", + " '650_x',\n", + " '653_x',\n", + " '655',\n", + " '655',\n", + " '689',\n", + " '689',\n", + " '695',\n", + " '695 HOL',\n", + " '751$a',\n", + " '856',\n", + " '866 HOL',\n", + " '866_x',\n", + " '982$z',\n", + " '992',\n", + " '992 HOL',\n", + " '993 HOL',\n", + " '993_x',\n", + " 'Author',\n", + " 'Author (contributor)',\n", + " 'Availability',\n", + " 'Barcode',\n", + " 'Begin Publication Date',\n", + " 'Edition',\n", + " 'End Publication Date',\n", + " 'Item Call Number_x',\n", + " 'Language',\n", + " 'Library Code (Active)',\n", + " 'Location Code',\n", + " 'MMS ID',\n", + " 'MMS Id',\n", + " 'Modification Date',\n", + " 'Permanent Call Number',\n", + " 'Publication Date',\n", + " 'Publication Place',\n", + " 'Publisher',\n", + " 'Record number',\n", + " 'Series',\n", + " 'Subject',\n", + " 'Subjects',\n", + " 'Subjects (Names)',\n", + " 'Subjects (Names)_x',\n", + " 'Title',\n", + " 'Title_x',\n", + " 'Title_y',\n", + " 'Type / Creator / Imprint',\n", + " 'Unnamed: 18_y']" + ] + }, + "execution_count": 746, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sorted([ 'Permanent Call Number', '992 HOL',\n", + " '993 HOL', '695 HOL',\n", + " '866 HOL', 'Library Code (Active)',\n", + " 'Location Code', 'Author',\n", + " 'Author (contributor)', 'Title_x',\n", + " 'Begin Publication Date', 'End Publication Date',\n", + " 'Publication Date', 'Publication Place',\n", + " 'Publisher', '856',\n", + " 'Subjects', 'Subjects (Names)',\n", + " 'MMS Id', '001_x',\n", + " '600_x', '610_x',\n", + " '650_x', '653_x',\n", + " '655', '689',\n", + " '130$a', '245$a',\n", + " '245$c', '500$a',\n", + " '751$a', '982$z',\n", + " 'Type / Creator / Imprint', 'Unnamed: 18_y',\n", + " 'Subject', 'Title_y',\n", + " 'Series', 'Availability',\n", + " 'Modification Date', 'Edition',\n", + " 'Record number', 'Language',\n", + " 'MMS ID', 'Title',\n", + " '992', '993_x',\n", + " '695', '866_x',\n", + " 'Barcode', 'Item Call Number_x',\n", + " 'Subjects (Names)_x', '001_y',\n", + " '655', '689'])" + ] + }, + { + "cell_type": "code", + "execution_count": 963, + "id": "4868e5a1-cdb3-4b3c-9d1d-248cadbcb4a0", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def combine_ids(lis):\n", + " int_lis = []\n", + " for e in lis:\n", + " if not np.isnan(e):\n", + " int_lis.append(int(e))\n", + " return list(set(int_lis))[0]\n", + "\n", + "def combine_entries(a, b):\n", + " if a == b:\n", + " return a\n", + " else:\n", + " if isinstance(a, str) and isinstance(b, str):\n", + " return a + b\n", + " elif isinstance(a, str):\n", + " return a\n", + " else:\n", + " return b\n", + "\n", + "def get_signature(a, b):\n", + " if isinstance(a, str):\n", + " return a\n", + " else:\n", + " match = re.search('BE.*;|\\d{6}.*;', b)\n", + " if match:\n", + " return match.group(0)\n", + " else:\n", + " return a\n", + "\n", + "merge_IDs = merge_12345_dropna.apply(lambda x: combine_ids([x['001_x'], x['001_y'], x['MMS Id'], x['MMS ID']]), axis=1)\n", + "merge_655 = merge_12345_dropna.apply(lambda x: combine_entries(x[655], x['655']), axis=1)\n", + "merge_689 = merge_12345_dropna.apply(lambda x: combine_entries(x[689], x['689']), axis=1)\n", + "merge_695 = merge_12345_dropna.apply(lambda x: combine_entries(x[695], x['695 HOL']), axis=1)\n", + "merge_866 = merge_12345_dropna.apply(lambda x: combine_entries(x['866 HOL'], x['866_x']), axis=1)\n", + "merge_992 = merge_12345_dropna.apply(lambda x: combine_entries(x[992], x['992 HOL']), axis=1)\n", + "merge_993 = merge_12345_dropna.apply(lambda x: combine_entries(x['993_x'], x['993 HOL']), axis=1)\n", + "merge_992_993 = pd.concat([merge_992, merge_993], axis=1)\n", + "merge_992_993['Bemerkungen'] = merge_992_993.apply(lambda x: combine_entries(x[0], x[1]), axis=1)\n", + "merge_subject_names = merge_12345_dropna.apply(lambda x: combine_entries(x['Subjects (Names)'], x['Subjects (Names)_x']), axis=1)\n", + "merge_begin_date = merge_12345_dropna['Begin Publication Date'][(merge_12345_dropna['Begin Publication Date'] != '####') & (merge_12345_dropna['Begin Publication Date'] != '9999')]\n", + "merge_end_date = merge_12345_dropna['End Publication Date'][(merge_12345_dropna['End Publication Date'] != '####') & (merge_12345_dropna['End Publication Date'] != '9999')]\n", + "merge_date = merge_12345_dropna['Publication Date'][(merge_12345_dropna['Publication Date'] != '####') & (merge_12345_dropna['Publication Date'] != '9999')]\n", + "merge_signatur = merge_12345_dropna.apply(lambda x: get_signature(x['Permanent Call Number'], x['Availability']), axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 999, + "id": "c5813ff3-1734-4273-b49b-3f5d4bc6964f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "c_df = pd.concat([merge_signatur,\n", + " merge_12345_dropna['Barcode'],\n", + " merge_12345_dropna['Title'], \n", + " merge_12345_dropna['Author'], \n", + " merge_12345_dropna['Author (contributor)'], \n", + " merge_begin_date, \n", + " merge_end_date, \n", + " merge_date, \n", + " merge_12345_dropna['Publication Place'], \n", + " merge_12345_dropna['751$a'],\n", + " merge_12345_dropna['Subjects'],\n", + " merge_689,\n", + " merge_695,\n", + " merge_655,\n", + " merge_992_993['Bemerkungen'],\n", + " ], axis=1)\n", + "c_df.rename(columns={0: 'Signatur', 'Title': 'Titel', 'Author': 'Autor', 'Author (contributor)': 'Mitwirkender', 'Begin Publication Date': 'Anfang Veröffentlichungsdatum', 'End Publication Date': 'Ende Veröffentlichungsdatum', 'Publication Date': 'Veröffentlichungsdatum', 'Publication Place': 'Veröffentlichungsort', '751$a': 'Veröffentlichungsort (normiert)', 'Subjects': 'Schlagwörter', 1: 'Schlagwörter (mit GND)', 2: 'Vorbesitzer', 3: 'Typ'}, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 1000, + "id": "43bf5dc7-b9e0-40e9-9e27-244ed09e508f", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SignaturBarcodeTitelAutorMitwirkenderAnfang VeröffentlichungsdatumEnde VeröffentlichungsdatumVeröffentlichungsdatumVeröffentlichungsortVeröffentlichungsort (normiert)SchlagwörterSchlagwörter (mit GND)VorbesitzerTypBemerkungenvalid_bc
0BE.1.A.13537581-20Flora Napolitana, ossia descrizione delle pian...Tenore, MicheleNaN181118361811-36NapoliNaNNeapel; PflanzenNeapel$Dg--(DE-588)4041476-0;Pflanzen$Ds--(DE-...NaNNaNNaNNone
1BE.1.C.10B1711164Flora Napolitana, ossia descrizione delle pian...Tenore, MicheleNaN181118361811-36NapoliNaNNeapel; PflanzenNeapel$Dg--(DE-588)4041476-0;Pflanzen$Ds--(DE-...NaNNaNNaNNone
2BE.1.A.10B1214205Antiquites du Bosphore Cimmerien conservees au...NaNGosudarstvennyj ĖrmitažNaNNaNNaNSt. PetersburgNaNSankt Petersburg; Museum; Eremitage; Straße vo...Antiquität$Ds--(DE-588)4002325-4;Straße von Ke...NaNNaNNaNNone
3BE.1.A.11B1475984Musee des antiques dessine et grave par P. Bou...Bouillon, PierreSaint-Victor, Jacques Maximilien Renjamin Bins de181118271811-1827ParisNaNAltertümerAltertümer$Ds--(DE-588)4201096-2;AT-OBV--ONB-AKNaNNaNNaNNone
4BE.1.A.12B1771764Divers works of early masters in christian dec...Weale, JohnNaN1846NaN1846LondonNaNDekoration; ChristentumDekoration$Ds--(DE-588)4149033-2;Christentum$D...NaNNaNNaNNone
...................................................
22638Ink 7.E.11566517-10Biblia Mit Postilla litteralis von Nicolaus de...NaNKoberger, Anton1485NaN7. Mai 1485; [1485.05.07]NürnbergNaNInkunabelInkunabel$Af$$a Savoyen-Carignan, Eugen <von>; $$b [Vorbes...NaN$$c Rote Rubriken und Lombarden (Punktverdicku...None
22639Ink 8.E.26+Z158726101La nef des fols du monde Aus dem Lat. des Jako...Brant, Sebastian 1458-1521Jean Lambert; Rivière, Pierre -14991497NaN[nicht vor Dez.] 1497ParisNaNInkunabelInkunabel$Af$$a Savoyen-Carignan, Eugen <von>; $$b [Vorbes...NaN$$d Barock-Einband für Eugen von Savoyen: rote...Z158726101
22640Ink 9.D.5+Z35095803Thesaurus Cornu copiae et Horti Adonidis <grie...NaNManuzio, Aldo Pio; Bolzanio, Urbano 1443-1524;...1496NaNAug. 1496; [1496.08]VenedigNaNInkunabelInkunabel$Af$$a Savoyen-Carignan, Eugen <von>; $$b [Vorbes...NaN$$f Ink 9.D.5; $$m Vereinzelt griechische Marg...Z35095803
22641Ink 9.F.22+Z96101306Comoediae ; Francesco Petrarca: Vita TerentiiTerentius Afer, Publius v195-v159Zarotto, Antonio1476NaN23. Feb. 1476; [1476.02.23]MailandNaNInkunabelInkunabel$Af$$a Wappen; $$b [Vorbesitzer, 15./16. Jh?]; $$...NaN$$c Wappenschild (Bl.3a, a1a) mit Wasserfarben...Z96101306
22642Ink 9.F.51460328-10Biblia ; Interpretationes Hebraicorum nominumNaNWild, Leonhard1481NaN1481VenedigNaNInkunabelInkunabel$Af$$a Savoyen-Carignan, Eugen <von>; $$b [Vorbes...NaN$$c Rote und blaue Lombarden (verwischt), rote...None
\n", + "

22643 rows × 16 columns

\n", + "
" + ], + "text/plain": [ + " Signatur Barcode \n", + "0 BE.1.A.1 3537581-20 \\\n", + "1 BE.1.C.10 B1711164 \n", + "2 BE.1.A.10 B1214205 \n", + "3 BE.1.A.11 B1475984 \n", + "4 BE.1.A.12 B1771764 \n", + "... ... ... \n", + "22638 Ink 7.E.1 1566517-10 \n", + "22639 Ink 8.E.26 +Z158726101 \n", + "22640 Ink 9.D.5 +Z35095803 \n", + "22641 Ink 9.F.22 +Z96101306 \n", + "22642 Ink 9.F.5 1460328-10 \n", + "\n", + " Titel \n", + "0 Flora Napolitana, ossia descrizione delle pian... \\\n", + "1 Flora Napolitana, ossia descrizione delle pian... \n", + "2 Antiquites du Bosphore Cimmerien conservees au... \n", + "3 Musee des antiques dessine et grave par P. Bou... \n", + "4 Divers works of early masters in christian dec... \n", + "... ... \n", + "22638 Biblia Mit Postilla litteralis von Nicolaus de... \n", + "22639 La nef des fols du monde Aus dem Lat. des Jako... \n", + "22640 Thesaurus Cornu copiae et Horti Adonidis ; $$b [Vorbes... NaN \n", + "22639 $$a Savoyen-Carignan, Eugen ; $$b [Vorbes... NaN \n", + "22640 $$a Savoyen-Carignan, Eugen ; $$b [Vorbes... NaN \n", + "22641 $$a Wappen; $$b [Vorbesitzer, 15./16. Jh?]; $$... NaN \n", + "22642 $$a Savoyen-Carignan, Eugen ; $$b [Vorbes... NaN \n", + "\n", + " Bemerkungen valid_bc \n", + "0 NaN None \n", + "1 NaN None \n", + "2 NaN None \n", + "3 NaN None \n", + "4 NaN None \n", + "... ... ... \n", + "22638 $$c Rote Rubriken und Lombarden (Punktverdicku... None \n", + "22639 $$d Barock-Einband für Eugen von Savoyen: rote... Z158726101 \n", + "22640 $$f Ink 9.D.5; $$m Vereinzelt griechische Marg... Z35095803 \n", + "22641 $$c Wappenschild (Bl.3a, a1a) mit Wasserfarben... Z96101306 \n", + "22642 $$c Rote und blaue Lombarden (verwischt), rote... None \n", + "\n", + "[22643 rows x 16 columns]" + ] + }, + "execution_count": 1000, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "c_df['valid_bc'] = c_df['Barcode'].apply(lambda x: extract_valid_bc(x))\n", + "c_df" + ] + }, + { + "cell_type": "code", + "execution_count": 988, + "id": "ea675efe-3005-4052-9290-ec4b3262b7bb", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "final = pd.read_csv('data/predictions/final_predictions.csv')\n", + "final['valid_bc'] = final['filename'].apply(lambda x: extract_valid_bc(x))\n", + "final_color_preds = final.drop_duplicates(subset='valid_bc')" + ] + }, + { + "cell_type": "code", + "execution_count": 1004, + "id": "8d681b59-7f88-4747-9923-11223e79305d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "merged_col_pred = c_df.merge(final_color_preds, how='left', on='valid_bc')" + ] + }, + { + "cell_type": "code", + "execution_count": 209, + "id": "3ad5557e-e3c9-4505-8589-79f2b1118aa6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "pred = pd.read_csv('data/predictions/combined_predictions.csv')\n", + "pred = pred.drop('Unnamed: 0', axis=1)\n", + "pred['valid_bc'] = pred['filename'].apply(lambda x: extract_valid_bc(x))" + ] + }, + { + "cell_type": "code", + "execution_count": 1057, + "id": "f9536ee4-4f27-4047-b4dc-cdac170b8400", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "pred_drop = pred.drop_duplicates(subset=['prediction', 'valid_bc'])" + ] + }, + { + "cell_type": "code", + "execution_count": 1065, + "id": "6906dc88-62e9-4adb-9ca1-e22c4de78c13", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "20574" + ] + }, + "execution_count": 1065, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pred_drop.drop_duplicates('valid_bc')['valid_bc'].isin(c_df['valid_bc']).sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 1080, + "id": "ce8c0d9b-3b6e-4766-9e25-403ee3bb3aed", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "supralibros_bc = pred[pred['prediction'] != 'N']['valid_bc']\n", + "neg_preds = pred[~pred['valid_bc'].isin(supralibros_bc)].drop_duplicates('valid_bc')" + ] + }, + { + "cell_type": "code", + "execution_count": 1095, + "id": "109706d0-4a93-4df4-8682-be91044c2446", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "all_predictions = pd.concat([final_color_preds, neg_preds]).drop(['years', 'man_prediction', 'man_color'], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 1101, + "id": "5a608b2a-de63-4eb5-b2d3-48eaeccfb9a6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "cat_pred_comb = c_df.merge(all_predictions, how='left', on='valid_bc')" + ] + }, + { + "cell_type": "code", + "execution_count": 1108, + "id": "b9ff69db-bea1-47c8-92ac-8f11176d4fca", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Signatur', 'Barcode', 'Titel', 'Autor', 'Mitwirkender',\n", + " 'Anfang Veröffentlichungsdatum', 'Ende Veröffentlichungsdatum',\n", + " 'Veröffentlichungsdatum', 'Veröffentlichungsort',\n", + " 'Veröffentlichungsort (normiert)', 'Schlagwörter',\n", + " 'Schlagwörter (mit GND)', 'Vorbesitzer', 'Typ', 'Bemerkungen',\n", + " 'valid_bc', 'filename', 'prediction', 'p_A', 'p_B', 'p_C', 'p_N',\n", + " 'color', 'p_blue', 'p_red', 'p_yellow'],\n", + " dtype='object')" + ] + }, + "execution_count": 1108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cat_pred_comb.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 1111, + "id": "fdde2770-b2cb-402f-aa55-572239be15f0", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "cat_pred_comb.rename(columns={'valid_bc': 'Gültiger Barcode', 'filename': 'Dateiname', 'prediction': 'Wappenklassifizierung', 'color': 'Farbklassifizierung'}, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 1183, + "id": "3e2838ff-c5d9-49dc-817c-cc1ec9393f61", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SignaturBarcodeTitelAutorMitwirkenderAnfang VeröffentlichungsdatumEnde VeröffentlichungsdatumVeröffentlichungsdatumVeröffentlichungsortVeröffentlichungsort (normiert)...DateinameWappenklassifizierungp_Ap_Bp_Cp_NFarbklassifizierungp_bluep_redp_yellow
0BE.1.A.13537581-20Flora Napolitana, ossia descrizione delle pian...Tenore, MicheleNaN181118361811-36NapoliNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1BE.1.C.10B1711164Flora Napolitana, ossia descrizione delle pian...Tenore, MicheleNaN181118361811-36NapoliNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2BE.1.A.10B1214205Antiquites du Bosphore Cimmerien conservees au...NaNGosudarstvennyj ĖrmitažNaNNaNNaNSt. PetersburgNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3BE.1.A.11B1475984Musee des antiques dessine et grave par P. Bou...Bouillon, PierreSaint-Victor, Jacques Maximilien Renjamin Bins de181118271811-1827ParisNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4BE.1.A.12B1771764Divers works of early masters in christian dec...Weale, JohnNaN1846NaN1846LondonNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
..................................................................
22638Ink 7.E.11566517-10Biblia Mit Postilla litteralis von Nicolaus de...NaNKoberger, Anton1485NaN7. Mai 1485; [1485.05.07]NürnbergNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22639Ink 8.E.26+Z158726101La nef des fols du monde Aus dem Lat. des Jako...Brant, Sebastian 1458-1521Jean Lambert; Rivière, Pierre -14991497NaN[nicht vor Dez.] 1497ParisNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22640Ink 9.D.5+Z35095803Thesaurus Cornu copiae et Horti Adonidis <grie...NaNManuzio, Aldo Pio; Bolzanio, Urbano 1443-1524;...1496NaNAug. 1496; [1496.08]VenedigNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22641Ink 9.F.22+Z96101306Comoediae ; Francesco Petrarca: Vita TerentiiTerentius Afer, Publius v195-v159Zarotto, Antonio1476NaN23. Feb. 1476; [1476.02.23]MailandNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22642Ink 9.F.51460328-10Biblia ; Interpretationes Hebraicorum nominumNaNWild, Leonhard1481NaN1481VenedigNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", + "

22643 rows × 26 columns

\n", + "
" + ], + "text/plain": [ + " Signatur Barcode \n", + "0 BE.1.A.1 3537581-20 \\\n", + "1 BE.1.C.10 B1711164 \n", + "2 BE.1.A.10 B1214205 \n", + "3 BE.1.A.11 B1475984 \n", + "4 BE.1.A.12 B1771764 \n", + "... ... ... \n", + "22638 Ink 7.E.1 1566517-10 \n", + "22639 Ink 8.E.26 +Z158726101 \n", + "22640 Ink 9.D.5 +Z35095803 \n", + "22641 Ink 9.F.22 +Z96101306 \n", + "22642 Ink 9.F.5 1460328-10 \n", + "\n", + " Titel \n", + "0 Flora Napolitana, ossia descrizione delle pian... \\\n", + "1 Flora Napolitana, ossia descrizione delle pian... \n", + "2 Antiquites du Bosphore Cimmerien conservees au... \n", + "3 Musee des antiques dessine et grave par P. Bou... \n", + "4 Divers works of early masters in christian dec... \n", + "... ... \n", + "22638 Biblia Mit Postilla litteralis von Nicolaus de... \n", + "22639 La nef des fols du monde Aus dem Lat. des Jako... \n", + "22640 Thesaurus Cornu copiae et Horti Adonidis \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SignaturBarcodeTitelAutorMitwirkenderAnfang VeröffentlichungsdatumEnde VeröffentlichungsdatumVeröffentlichungsdatumVeröffentlichungsortVeröffentlichungsort (normiert)...DateinameWappenklassifizierungp_Ap_Bp_Cp_NFarbklassifizierungp_bluep_redp_yellow
659BE.1.N.75*+Z167910202Postila to est, kratko istlmačenje vsih' nedel...NaNChristoph Württemberg, Herzog 1515-1568; Consu...1562NaN1562V Tubingi [Urach]Tübingen;Urach...Z167910202_00000001.jpgN0.0005090.0000980.0009440.998449NaNNaNNaNNaN
\n", + "

1 rows × 27 columns

\n", + "" + ], + "text/plain": [ + " Signatur Barcode \n", + "659 BE.1.N.75* +Z167910202 \\\n", + "\n", + " Titel Autor \n", + "659 Postila to est, kratko istlmačenje vsih' nedel... NaN \\\n", + "\n", + " Mitwirkender \n", + "659 Christoph Württemberg, Herzog 1515-1568; Consu... \\\n", + "\n", + " Anfang Veröffentlichungsdatum Ende Veröffentlichungsdatum \n", + "659 1562 NaN \\\n", + "\n", + " Veröffentlichungsdatum Veröffentlichungsort \n", + "659 1562 V Tubingi [Urach] \\\n", + "\n", + " Veröffentlichungsort (normiert) ... Dateiname \n", + "659 Tübingen;Urach ... Z167910202_00000001.jpg \\\n", + "\n", + " Wappenklassifizierung p_A p_B p_C p_N \n", + "659 N 0.000509 0.000098 0.000944 0.998449 \\\n", + "\n", + " Farbklassifizierung p_blue p_red p_yellow \n", + "659 NaN NaN NaN NaN \n", + "\n", + "[1 rows x 27 columns]" + ] + }, + "execution_count": 1242, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cat_pred_comb[cat_pred_comb['Gültiger Barcode'] == 'Z167910202']" + ] + }, + { + "cell_type": "code", + "execution_count": 1200, + "id": "6423f5bb-d52a-4b49-b91e-1d085daf70fd", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SignaturBarcodeTitelAutorMitwirkenderAnfang VeröffentlichungsdatumEnde VeröffentlichungsdatumVeröffentlichungsdatumVeröffentlichungsortVeröffentlichungsort (normiert)...DateinameWappenklassifizierungp_Ap_Bp_Cp_NFarbklassifizierungp_bluep_redp_yellow
\n", + "

0 rows × 26 columns

\n", + "
" + ], + "text/plain": [ + "Empty DataFrame\n", + "Columns: [Signatur, Barcode, Titel, Autor, Mitwirkender, Anfang Veröffentlichungsdatum, Ende Veröffentlichungsdatum, Veröffentlichungsdatum, Veröffentlichungsort, Veröffentlichungsort (normiert), Schlagwörter, Schlagwörter (mit GND), Vorbesitzer, Typ, Bemerkungen, Gültiger Barcode, Dateiname, Wappenklassifizierung, p_A, p_B, p_C, p_N, Farbklassifizierung, p_blue, p_red, p_yellow]\n", + "Index: []\n", + "\n", + "[0 rows x 26 columns]" + ] + }, + "execution_count": 1200, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cat_pred_comb.dropna(subset='Dateiname')[cat_pred_comb.dropna(subset='Dateiname').duplicated('Dateiname', keep=False)]" + ] + }, + { + "cell_type": "code", + "execution_count": 1244, + "id": "c6428a9b-2b1f-4bc8-967f-4314fbd06bee", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SignaturBarcodeTitelAutorMitwirkenderAnfang VeröffentlichungsdatumEnde VeröffentlichungsdatumVeröffentlichungsdatumVeröffentlichungsortVeröffentlichungsort (normiert)SpracheSchlagwörter
0BE.1.A.13537581-20Flora Napolitana, ossia descrizione delle pian...Tenore, MicheleNaN181118361811-36NapoliNaNItalianNeapel; Pflanzen
1BE.1.C.10B1711164Flora Napolitana, ossia descrizione delle pian...Tenore, MicheleNaN181118361811-36NapoliNaNItalianNeapel; Pflanzen
2BE.1.A.10B1214205Antiquites du Bosphore Cimmerien conservees au...NaNGosudarstvennyj ĖrmitažNaNNaNNaNSt. PetersburgNaNunknownSankt Petersburg; Museum; Eremitage; Straße vo...
3BE.1.A.11B1475984Musee des antiques dessine et grave par P. Bou...Bouillon, PierreSaint-Victor, Jacques Maximilien Renjamin Bins de181118271811-1827ParisNaNFrenchAltertümer
4BE.1.A.12B1771764Divers works of early masters in christian dec...Weale, JohnNaN1846NaN1846LondonNaNEnglishDekoration; Christentum
5BE.1.A.13B986740Colonna Traiana eretta dal senato, e popolo Ro...Bartoli, Pietro Santo 1635-1700Chacón, Alfonso 1540-15991751NaN1751RomaNaNItalianTrajanssäule--Rom; Trajan--Römisches Reich, Ka...
6BE.1.A.14B998501Columna Cochlis M. Aurelio Antonio Augusto dicataBellori, Giovanni PietroNaN1704NaN1704RomaNaNItalianMark Aurel--Römisches Reich, Kaiser--121-180; ...
7BE.1.A.15B1581441A new collection of chimney pieces. Ornamented...Richardson, GeorgeNaN1781NaN1781LondonNaNEnglishAquatinta; Schornstein
8BE.1.A.16B1417347Raccolta Di Statve Antiche E Moderne Data In L...NaNMaffei, Paolo Alessandro 1653-1716; Rossi, Dom...1704NaN1704RomaNaNItalianPlastik
9BE.1.A.17B992390Le Grand Porte-Feuille Politique A l'usage des...Beaufort, Louis <<de>> 1703-1795Maradan, Claude François; Selbstverl.; Beaufor...1789NaN1789A ParisParisFrenchFranzösische Revolution; Bild
\n", + "
" + ], + "text/plain": [ + " Signatur Barcode Titel \n", + "0 BE.1.A.1 3537581-20 Flora Napolitana, ossia descrizione delle pian... \\\n", + "1 BE.1.C.10 B1711164 Flora Napolitana, ossia descrizione delle pian... \n", + "2 BE.1.A.10 B1214205 Antiquites du Bosphore Cimmerien conservees au... \n", + "3 BE.1.A.11 B1475984 Musee des antiques dessine et grave par P. Bou... \n", + "4 BE.1.A.12 B1771764 Divers works of early masters in christian dec... \n", + "5 BE.1.A.13 B986740 Colonna Traiana eretta dal senato, e popolo Ro... \n", + "6 BE.1.A.14 B998501 Columna Cochlis M. Aurelio Antonio Augusto dicata \n", + "7 BE.1.A.15 B1581441 A new collection of chimney pieces. Ornamented... \n", + "8 BE.1.A.16 B1417347 Raccolta Di Statve Antiche E Moderne Data In L... \n", + "9 BE.1.A.17 B992390 Le Grand Porte-Feuille Politique A l'usage des... \n", + "\n", + " Autor \n", + "0 Tenore, Michele \\\n", + "1 Tenore, Michele \n", + "2 NaN \n", + "3 Bouillon, Pierre \n", + "4 Weale, John \n", + "5 Bartoli, Pietro Santo 1635-1700 \n", + "6 Bellori, Giovanni Pietro \n", + "7 Richardson, George \n", + "8 NaN \n", + "9 Beaufort, Louis <> 1703-1795 \n", + "\n", + " Mitwirkender \n", + "0 NaN \\\n", + "1 NaN \n", + "2 Gosudarstvennyj Ėrmitaž \n", + "3 Saint-Victor, Jacques Maximilien Renjamin Bins de \n", + "4 NaN \n", + "5 Chacón, Alfonso 1540-1599 \n", + "6 NaN \n", + "7 NaN \n", + "8 Maffei, Paolo Alessandro 1653-1716; Rossi, Dom... \n", + "9 Maradan, Claude François; Selbstverl.; Beaufor... \n", + "\n", + " Anfang Veröffentlichungsdatum Ende Veröffentlichungsdatum \n", + "0 1811 1836 \\\n", + "1 1811 1836 \n", + "2 NaN NaN \n", + "3 1811 1827 \n", + "4 1846 NaN \n", + "5 1751 NaN \n", + "6 1704 NaN \n", + "7 1781 NaN \n", + "8 1704 NaN \n", + "9 1789 NaN \n", + "\n", + " Veröffentlichungsdatum Veröffentlichungsort Veröffentlichungsort (normiert) \n", + "0 1811-36 Napoli NaN \\\n", + "1 1811-36 Napoli NaN \n", + "2 NaN St. Petersburg NaN \n", + "3 1811-1827 Paris NaN \n", + "4 1846 London NaN \n", + "5 1751 Roma NaN \n", + "6 1704 Roma NaN \n", + "7 1781 London NaN \n", + "8 1704 Roma NaN \n", + "9 1789 A Paris Paris \n", + "\n", + " Sprache Schlagwörter \n", + "0 Italian Neapel; Pflanzen \n", + "1 Italian Neapel; Pflanzen \n", + "2 unknown Sankt Petersburg; Museum; Eremitage; Straße vo... \n", + "3 French Altertümer \n", + "4 English Dekoration; Christentum \n", + "5 Italian Trajanssäule--Rom; Trajan--Römisches Reich, Ka... \n", + "6 Italian Mark Aurel--Römisches Reich, Kaiser--121-180; ... \n", + "7 English Aquatinta; Schornstein \n", + "8 Italian Plastik \n", + "9 French Französische Revolution; Bild " + ] + }, + "execution_count": 1244, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cat_pred_comb.iloc[0:10,0:12]" + ] + }, + { + "cell_type": "code", + "execution_count": 1250, + "id": "e450dd3d-1d5f-4b52-a52c-b3d0ad48515a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SignaturBarcodeTitelAutorMitwirkenderAnfang VeröffentlichungsdatumEnde VeröffentlichungsdatumVeröffentlichungsdatumVeröffentlichungsortVeröffentlichungsort (normiert)...DateinameWappenklassifizierungp_Ap_Bp_Cp_NFarbklassifizierungp_bluep_redp_yellow
22620Ink 2.D.15+Z158717306Ars memorandi per figuras evangelistarumNaNNaN1470NaN[um 1470][Süddeutschland]NaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22621Ink 3.H.31+Z173262908De consuetudinibus et conditionibus orientaliu...Polo, Marco 1254-1324Leeu, Gerard1483NaN[zwischen 1483 und 11. Juni 1484][Gouda]NaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22622Ink 3.H.8+Z158731704Herbarium Apulei Mit Widmungsbrief des Drucker...NaNLignamine, Johannes Philippus de1482NaN[um 1481-82][Rom]NaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22623Ink 4.A.21638836-20Biblia Mit Glossa ordinaria und InterlinearglosseNaNRusch, Adolf1480NaN[nicht nach 1480][Straßburg]NaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22624Ink 4.C.31605764-10Biblia ; Menardus Monachus: Generalis et compe...NaNWinters, Konrad1479NaN20. Sept. 1479; [1479.09.20]KölnNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22625Ink 4.E.4+Z158736209Elegantiae linguae latinae Mit Brief des Autor...Valla, Lorenzo 1407-1457Jenson, Nicolas1471NaN[vor Juli] 1471VenedigNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22626Ink 4.E.9+Z158719005Hypnerotomachia Poliphili Mit lat. Widmungsbri...Colonna, Francesco 1433-1527Manuzio, Aldo Pio 1450-15151499NaNDezember 1499; [1499.12]VenedigNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22627Ink 4.G.19+Z158745004Biblia ; Interpretationes Hebraicorum nominumNaNRenner, Franz1480NaN1480VenedigNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22628Ink 4.H.44+Z15872590XConcordantia astronomie cum theologia. Concord...Peter von Ailly, Kardinal 1351-1420Ratdolt, Erhard1490NaN2. Jan. 1490; [1490.01.02]AugsburgNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22629Ink 4.H.451444073-10Biblia ; Interpretationes Hebraicorum nominumNaNNaN1480NaN31. Mai 1480; [1480.05.31]VenedigNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22630Ink 4.H.58+Z158747906Coronica del cid ruy diazNaNNaN1498NaNMai 1498SevillaNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22631Ink 5.B.10+Z158733907Biblia <dt.> Übers. aus dem Lateinischen. Mit ...NaNKoberger, Anton1483NaN17. Feb. 1483; [1483.02.17]NürnbergNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22632Ink 5.C.121571736-10BibliaNaNSchöffer, Peter (der Ältere)1472NaN23. Feb. 1472MainzNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22633Ink 5.C.9+Z173284400Historiae Romanae decades Mit den Periochae. M...Livius, Titus v59-17NaN1470NaN1470[Venedig]NaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22634Ink 5.E.4+Z158727300DecameroneBoccaccio, Giovanni 1313-1375Zarotto, Antonio1476NaN1476MailandNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22635Ink 6.B.21639891-10Biblia <ital.> Übers. aus dem LateinischenNaNAmmergau, Adam von1471NaN1. Okt. 1471[Venedig]NaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22636Ink 6.E.11+Z158731601De materia medica <lat.> Mit Glossen und Zusät...Dioscorides, Pedanius 40-90NaN1478NaNJuli 1478; [1478.07]ColleNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22637Ink 7.D.16+Z95540203Mathesis Mit Widmungsbrief an Kardinal Ippolit...Firmicus Maternus, Iulius ca. 335/350Manuzio, Aldo Pio 1450-1515; Guidobaldo I. Urb...1499NaN1499; Juni (P. 1), Okt. 1499 (P. 2)VenedigNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22638Ink 7.E.11566517-10Biblia Mit Postilla litteralis von Nicolaus de...NaNKoberger, Anton1485NaN7. Mai 1485; [1485.05.07]NürnbergNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22639Ink 8.E.26+Z158726101La nef des fols du monde Aus dem Lat. des Jako...Brant, Sebastian 1458-1521Jean Lambert; Rivière, Pierre -14991497NaN[nicht vor Dez.] 1497ParisNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22640Ink 9.D.5+Z35095803Thesaurus Cornu copiae et Horti Adonidis <grie...NaNManuzio, Aldo Pio; Bolzanio, Urbano 1443-1524;...1496NaNAug. 1496; [1496.08]VenedigNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22641Ink 9.F.22+Z96101306Comoediae ; Francesco Petrarca: Vita TerentiiTerentius Afer, Publius v195-v159Zarotto, Antonio1476NaN23. Feb. 1476; [1476.02.23]MailandNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22642Ink 9.F.51460328-10Biblia ; Interpretationes Hebraicorum nominumNaNWild, Leonhard1481NaN1481VenedigNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", + "

23 rows × 27 columns

\n", + "
" + ], + "text/plain": [ + " Signatur Barcode \n", + "22620 Ink 2.D.15 +Z158717306 \\\n", + "22621 Ink 3.H.31 +Z173262908 \n", + "22622 Ink 3.H.8 +Z158731704 \n", + "22623 Ink 4.A.2 1638836-20 \n", + "22624 Ink 4.C.3 1605764-10 \n", + "22625 Ink 4.E.4 +Z158736209 \n", + "22626 Ink 4.E.9 +Z158719005 \n", + "22627 Ink 4.G.19 +Z158745004 \n", + "22628 Ink 4.H.44 +Z15872590X \n", + "22629 Ink 4.H.45 1444073-10 \n", + "22630 Ink 4.H.58 +Z158747906 \n", + "22631 Ink 5.B.10 +Z158733907 \n", + "22632 Ink 5.C.12 1571736-10 \n", + "22633 Ink 5.C.9 +Z173284400 \n", + "22634 Ink 5.E.4 +Z158727300 \n", + "22635 Ink 6.B.2 1639891-10 \n", + "22636 Ink 6.E.11 +Z158731601 \n", + "22637 Ink 7.D.16 +Z95540203 \n", + "22638 Ink 7.E.1 1566517-10 \n", + "22639 Ink 8.E.26 +Z158726101 \n", + "22640 Ink 9.D.5 +Z35095803 \n", + "22641 Ink 9.F.22 +Z96101306 \n", + "22642 Ink 9.F.5 1460328-10 \n", + "\n", + " Titel \n", + "22620 Ars memorandi per figuras evangelistarum \\\n", + "22621 De consuetudinibus et conditionibus orientaliu... \n", + "22622 Herbarium Apulei Mit Widmungsbrief des Drucker... \n", + "22623 Biblia Mit Glossa ordinaria und Interlinearglosse \n", + "22624 Biblia ; Menardus Monachus: Generalis et compe... \n", + "22625 Elegantiae linguae latinae Mit Brief des Autor... \n", + "22626 Hypnerotomachia Poliphili Mit lat. Widmungsbri... \n", + "22627 Biblia ; Interpretationes Hebraicorum nominum \n", + "22628 Concordantia astronomie cum theologia. Concord... \n", + "22629 Biblia ; Interpretationes Hebraicorum nominum \n", + "22630 Coronica del cid ruy diaz \n", + "22631 Biblia Übers. aus dem Lateinischen. Mit ... \n", + "22632 Biblia \n", + "22633 Historiae Romanae decades Mit den Periochae. M... \n", + "22634 Decamerone \n", + "22635 Biblia Übers. aus dem Lateinischen \n", + "22636 De materia medica Mit Glossen und Zusät... \n", + "22637 Mathesis Mit Widmungsbrief an Kardinal Ippolit... \n", + "22638 Biblia Mit Postilla litteralis von Nicolaus de... \n", + "22639 La nef des fols du monde Aus dem Lat. des Jako... \n", + "22640 Thesaurus Cornu copiae et Horti Adonidis " ] @@ -4130,6 +4130,11 @@ } ], "source": [ + "from matplotlib import rc\n", + "rc('font',**{'family':'serif','serif':['Palatino'], 'size': 16})\n", + "rc('text', usetex=True)\n", + "\n", + "\n", "classes = ['A', 'B', 'C', 'N']\n", "fp_d = {\n", " 'A': A_fp,\n", @@ -4156,9 +4161,9 @@ " ax = plt.subplot(1, 4, i+1)\n", " ax.hist(hist_data[i], bins=60, log=True, stacked=True, label=labels[i])\n", " ax.set_title(f\"Type {classes[i]}: {(both_full['prediction'] == classes[i]).sum()} predictions\")\n", - " ax.set_xlabel(f'p_{classes[i]}')\n", - " if i > 0:\n", - " ax.set_ylabel('')\n", + " ax.set_xlabel(f'$p_\\mathrm {classes[i]}$')\n", + " if i == 0:\n", + " ax.set_ylabel('Frequency')\n", " if i < 3:\n", " ax.legend()\n", "\n", @@ -4468,8 +4473,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "c1f9d79e-979d-434c-bec0-33e45b40c822", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ABO_df['filename'].str.contains('Z166436806').sum()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28436237-75c6-45d5-8932-31ce37781da6", "metadata": {}, "outputs": [], "source": [] diff --git a/Notebooks/Color_classifier.ipynb b/Notebooks/Color_classifier.ipynb index 725a38d981e40455cdc314ea3bc551aac2480f84..14fca07196c55e2d50756cde9f54379d9db2e3a0 100644 --- a/Notebooks/Color_classifier.ipynb +++ b/Notebooks/Color_classifier.ipynb @@ -11,7 +11,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 2, @@ -1604,9 +1604,11 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 3, "id": "d12e2f21-50ba-402c-9ddd-672a3ec3e0d9", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "combined_df = pd.read_csv('data/predictions/old/best_color_combined_predictions.csv')" @@ -1896,7 +1898,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 4, "id": "4aa3fbc3-662d-4aaa-b90d-0324d4851f8e", "metadata": { "tags": [] @@ -2253,7 +2255,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 5, "id": "d5ca0f92-298e-4a54-a569-6861bcb0a3c8", "metadata": { "tags": [] @@ -2287,7 +2289,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 16, "id": "6aec4623-719e-49ef-8bd9-b38518d8a8fc", "metadata": { "tags": [] @@ -2295,7 +2297,7 @@ "outputs": [ { "data": { - "image/png": "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ytvbW5MmTZIknT17VsOHD1f58uXl6empypUra9KkSbp165bNOk6fPq0+ffrIz89P/v7+6tu3r86ePZtmXHdL7/dGaGiovvzySx0/ftym3UiW2u2iWfn8lyxZovHjxysoKEhFixZVp06d9Msvv9gsu2/fPnXv3t16LAYFBen+++9P8ZsFaSPJVsAdPXpUklSjRg1r2aZNm9S6dWtdvnxZH3zwgVavXq0GDRqob9++NsmO2NhYdezYUZcvX1Z0dLQ++OAD7du3T1OmTMnUtjds2KA2bdroxIkTmjFjhtatW6eXX37ZpsHZvHmzOnTooL/++ktz587VkiVL5Ofnpx49eqToDXa3xYsX68EHH1TRokW1ZMkSzZ07V3/++adCQ0P17bffpli+d+/eqlatmpYtW6YPPvhA0v81tJkdE2zOnDn6/vvv9f7772e4rDFGt27dUlxcnNavX6+3335bjz32mCpWrJju+44cOaLjx4+nuFVUkg4fPqzixYvL3d1dVatW1fjx4/X3339nKnZJev/997V+/XrNnDlTn3zyiQoVKqSwsLBUb/1JbX8NHz5co0ePVqdOnbRq1SpFRUXpp59+UqtWrWw+10mTJumFF15Q586dtWrVKj399NN68sknU5zkU/PDDz+oadOm2rlzpyZPnqx169Zp6tSpSkhI0I0bN3T//ffrjTfekHT7QnzHjh3asWOH7r///lTXZ4xRz5499a9//Uv9+/fXl19+qYiICC1YsEAdOnRQQkJCiu0/99xzGjNmjFavXq169epp6NCh2rJli3WZiIgIzZo1S6NGjdL69ev18ccf65FHHtGlS5cy/hCAXCoyMlJ+fn4aMmSIRo4cqRs3bmjevHmZbjMy6+mnn7aeH9asWaPXXntN69evV6tWrXTx4kVJt3v/GmNs/gT4+uuv5ePjo5iYGGvZ7t27dfnyZXXq1Cndbb766qt64oknFBQUpOjoaK1cuVIDBw60GTdm6tSpGjp0qO655x6tWLFC//73v/Xjjz+qZcuWGY5tmpk6JTtz5oz69eunxx9/XGvXrtXIkSMl3U7YOHq80y1btqh48eL6+eef1aBBA7m7u6t06dIaMWKE4uLirMvduHFD0u3exXfy8PCQxWLRjz/+mO525s6dq6JFi1r/AMmMoUOHqlChQtaxab7//nuFhoam+PMjtf117do1tWvXTgsWLNCoUaO0bt06vfDCC4qOjtYDDzwgY4yk/zv/J190rly5Ui1atFBYWFimYpw7d666deumpKQkffDBB/riiy80atQo64XIK6+8oocffliSrG1RerecXrhwQa1atdJXX32l1157TWvWrFGnTp00duzYFOO7Sre/kzExMZo5c6YWLVqk+Ph4devWTX/99Zd1mW7dumnPnj2aNm2aYmJiNGvWLDVs2DDFfgTyqsTERN26dUs3b960jhcWHx+vxx9/3GHbeOONN/TYY48pJCREn332mT7++GNduXJFbdq0UWxsbLrv/f3339W0aVOtXLlSERERWrdunWbOnCl/f3/rmJZZ/e7f6ZdfflGrVq30008/6d1339WKFSsUEhKiQYMGadq0aSmWHzdunE6cOGE9Z5UuXdqauHfWGJG3bt3S33//rX379mn06NGqUaOGzd0+N27cSNG+SP/X5mTUxiTr1auXqlWrpuXLl2vixIlatWqVunbtmqIDyN69e/XPf/7T+jv9oYcesg6xsGHDBr366qtat26dhg4dqqlTp1p7aku3e7116tRJX331laZOnaply5apTJky6tu3b6ZizOj3RlRUlFq3bq0yZcrYtBtpyern/9JLL+n48eOaM2eOZs+erUOHDqlHjx5KTEyUdLvneefOnXXu3DmbNqZixYq6cuVKpuoISQYFwvz5840ks3PnTnPz5k1z5coVs379elOmTBnTtm1bc/PmTeuytWrVMg0bNrQpM8aY7t27m7Jly5rExERjjDF9+/Y1Pj4+5uzZs9Zlbt26ZWrVqmUkmaNHj6YbU9WqVU3VqlXN33//neYyLVq0MKVLlzZXrlyx2UadOnVM+fLlTVJSkjHGmE2bNhlJZtOmTcYYYxITE01QUJCpW7euNV5jjLly5YopXbq0adWqlbVswoQJRpJ59dVXU2x/wYIFxs3NzSxYsCDduhhjzKlTp4y/v7/58MMPrWWSTHh4eKrLL1myxEiyPgYPHpxin9/t5s2bJjQ01BQtWtScOHHC5rXx48ebqKgos3HjRvPll1+aZ555xri7u5u2bdva7IPUHD161EgyQUFBNp9HXFycKV68uOnUqZO1LK39tWPHDiPJvP322zblJ0+eND4+Pub55583xhjz559/Gm9vb9OrVy+b5bZt22YkmXbt2qWIa/78+dayDh06mGLFipnz58+nWZ9ly5bZHA93GjhwoAkODrY+X79+vZFkpk2bZrPc0qVLjSQze/Zsa1lwcLDx9vY2x48ft5b9/fffpnjx4mb48OHWsjp16piePXumGR+QV61du9Z6zvr444+NMZlvM+4+Txvzf+eTZAcPHjSSzMiRI23W9d133xlJ5qWXXrKWlS9f3gwZMsQYY0xCQoIpXLiweeGFF4wk63f09ddfNx4eHubq1atp1unIkSPGzc3NPPHEE2ku8+effxofHx/TrVs3m/ITJ04YLy8v8/jjjzukTu3atTOSzH//+98UMQwZMsS4ubmZY8eOpRlnau6//36bc96datasaby9vY2fn5954403zKZNm8y0adOMj4+Pad26tbWN3b9/v5FkXnvtNZv3//e//zWSjKenZ5rbT67/nefI9CT/XkmrjZgyZYq1LK39NXXqVFOoUCGza9cum/Lly5cbSWbt2rXGGGPWrVtnJJl///vfNsu9/vrrRpKZMGFCiriSf9tcuXLFFC1a1Nx7773W/ZSa8PBwm+PhTsHBwWbgwIHW5y+++KKRZL777jub5Z5++mljsVjML7/8Yoz5v7axbt265tatW9blvv/+eyPJLFmyxBhjzMWLF40kM3PmzDTjA/Kq5O/k3Q8vLy8TFRWVYvm7v9N3n6vvXm/yd/3EiRPG3d3d/OMf/7BZ7sqVK6ZMmTKmT58+6cY5ZMgQ4+HhYWJjY9NcJrPf/dTq8eijjxovL68U1wVhYWHG19fXXL582Rjzf21w27ZtU2z/2LFjxs3NzdqmZtauXbtS/E6/25kzZ2w+n+bNm5vff//dZpmePXuaYsWK2VzvGWNMmzZtjCTzxhtvpBtH8mc5ZswYm/JFixYZSeaTTz6xlgUHBxs3NzebfWqMMcOHDzdFihSx+Y1vjDH/+te/jCTz008/GWOMmTVrlpFkVq9ebbPck08+mWJf3H2MZeb3hjHpt9v2fv53/4757LPPjCSzY8cOY4wxu3fvNpLMqlWr0o0R6aMnWwHTokULeXh4yM/PzzpmwerVq61ddn/77Tf9/PPPeuKJJyTd/uch+dGtWzedOXPG2tto06ZN6tixowIDA63rd3Nzy1Qm/9dff9Xhw4c1dOhQeXt7p7pMfHy8vvvuOz388MMqUqSIzTb69++vU6dOpdnz6ZdfftHp06fVv39/m27NRYoU0UMPPaSdO3fq2rVrNu9JbVDNAQMG6NatWxowYECGdRoxYoTq169v829Herp27apdu3Zp48aNev311/X555/roYceSrNbuDFGQ4cO1datW7Vw4UJVqFDB5vUpU6bo6aefVvv27dWtWze99957evPNN7VlyxatXr06UzH17t3b5vNI7jW4ZcsW6z8cye7eX//5z39ksVjUr18/m+OmTJkyql+/vnVGwR07duj69evWYyxZq1atFBwcnG58165d0+bNm9WnTx+HjY2zceNGSUrx790jjzyiwoULp7hdtkGDBja9Db29vVWjRg2bHi/NmjXTunXr9OKLL+qbb77JUm9CIDcLCwtTixYtVL16dfXr1y9LbUZmbNq0SVLK72OzZs1Uu3Ztm+9jx44drRPFbN++XdeuXVNERIRKlixp7c329ddfW2/vSUtMTIwSExNtbjO9244dO/T333+niKtChQrq0KFDivNEduskSQEBAerQoUOK9cydO1e3bt3K8DyZFUlJSbp+/bpeeukljRs3TqGhofrnP/+pqVOnatu2bdbY6tevr7Zt22r69OlatmyZLl++rO3bt2vEiBFyc3NL9/ah5FtgMnOr6J3SaiOS92ey1PbXf/7zH9WpU0cNGjSwOSa7du1qM8Nt8rru3lZmesBs375dcXFxGjlypMNmk924caNCQkLUrFkzm/JBgwbJGGNtr5Ldf//9cnNzsz6vV6+eJFnbo+LFi6tq1aqaPn26ZsyYoX379mXq1jMgL1m4cKF27dqlXbt2ad26dRo4cKDCw8MzdVdJZmzYsMF6LXDn+cTb21vt2rWzmTE7NevWrVP79u1Vu3btNJfJ6nf/7vd27NgxxXXBoEGDdO3atRS9oFK73gkODtatW7dSDJHgCCVLltSuXbv07bff6qOPPtIff/yh9u3b68yZM9ZlnnnmGf31118aMGCAjhw5onPnzumVV17R9u3bJWX+FtW7z+V9+vSRu7t7inajXr16NndxSbfbjfbt2ysoKMjmc07u2bx582ZJt9sNPz8/PfDAAzbvz0y7kZnfG1mV1c//7rjvbjeqVaumgIAAvfDCC/rggw8y7KmJ1JFkK2CSG6KNGzdq+PDhOnjwoB577DHr68m39I0dO1YeHh42j+RbVpJvbbl06ZLKlCmTYhupld0t+f749AaD/PPPP2WMSfW2iqCgIGsMqUkuT+u9SUlJ1i7aybI6Y9idli9frvXr12vatGn666+/dPnyZeutGDdu3NDly5dTdFUOCAhQkyZN1L59e7300kuaPXu21qxZk2pCzBijYcOG6ZNPPlF0dLQefPDBTMXVr18/SUoxRkta0vo8b9y4oatXr9qU372/zp07J2OMAgMDUxw7O3futDlu0ttWev78808lJiY6dBDRS5cuyd3dPUXSzmKxqEyZMimOseSZkO7k5eVlk0h799139cILL2jVqlVq3769ihcvrp49e2Z4SxmQF3h5ecnT01NS1tqMzMjo3H3n97FTp046ceKEDh06pK+//loNGzZU6dKl1aFDB3399df6+++/tX379gxvFc1Me5SVuOx9rz1tUVYln8+6du1qU558UbF3715r2bJly9S6dWv16dNHAQEBat++vXr37q0GDRrYjKNzp5s3b2rhwoWqX7++zcDkmZFWG5GZ/XXu3Dn9+OOPKY5JPz8/GWNs2iN3d/cU53VH/Y7JqkuXLmXpN8/dcSffWpXcHlksFv33v/9V165dNW3aNDVq1EilSpXSqFGjuO0H+Ubt2rXVpEkTNWnSRPfdd58+/PBDdenSRc8//7xDbotObueaNm2a4pyydOnSDNu4CxcuZHieyOp335735mQbI90ee61JkyZq3bq1hg0bpo0bN+rIkSN68803rct07NhR8+fP15YtW1S1alWVKVNGK1as0GuvvSZJabYxd7v73J18fs9su/HFF1+k+IyTh+e5s924s4NJWttOTV5oN/z9/bV582Y1aNBAL730ku655x4FBQVpwoQJWRp3vaBjdtECJrkhkm4PCp+YmKg5c+Zo+fLlevjhh1WyZElJt+/XT21mTEnWmcFKlCiR6iCPqZXdLTmhkd4AigEBASpUqJDNPx3JTp8+LUnWeO+WfAJJ672FChVSQECATbk9/0QfOHBAt27dSnXGl48++kgfffSRVq5cqZ49e6a5juR/r+4ecDk5wTZ//nzNnTvXmjjLisz+A5TW5+np6WnTm1BKub9Kliwpi8WirVu3pjuuQvJnk9a27p6U4E7FixeXm5ubQwfeLFGihG7duqULFy7YJNrM/58KvmnTplleZ+HChTVp0iRNmjRJ586ds/Zq69Gjh37++WeHxQ64WlbajMy489x994/Q06dP25zzO3bsKOl2b7WYmBh17tzZWv7yyy9ry5YtSkhIyDDJdmd7dPc/wanFdbe747KnTpJ9bVFW1atXL9U/Ycz/H7PszrajdOnSWrt2rc6fP6+zZ88qODhYPj4+ioqKso47drf//Oc/On/+vF555ZUsx5ZWG3H3TLap7a+SJUvKx8cnxaQ0d74u/d/5/9KlSzYXHo76HZNVJUqUyNZvnvQEBwdbe6f8+uuv+uyzzzRx4kTduHHDOp4qkN/Uq1dPGzZs0K+//pqid1iy5Ds3EhISbH633p00S/7eLV++PFs9iUuVKpXhecKe735W35uTbUxqypcvr6CgoBTXOwMHDtQTTzyhQ4cOycPDQ9WqVdPUqVNlsVjUpk2bTK377NmzNgm51M7vUtrtRr169fT666+nuu7kpFWJEiVSnYghq+1GWr83ssoZ7UbdunX16aefyhijH3/8UdHR0Zo8ebJ8fHz04osv2h1zQUBPtgJu2rRpCggI0KuvvqqkpCTVrFlT1atX1w8//GD9V+juh5+fn6TbSbr//ve/NgPaJyYmZjghgXR7ooWqVatq3rx5KQaWT1a4cGE1b95cK1assOkllJSUpE8++UTly5dP0dU3Wc2aNVWuXDktXrzYerEg3b4F9fPPP7fOOOoogwYN0qZNm1I8JKlnz57atGmT7r333nTXkbz8nRcQxhg9+eSTmj9/vj788EMNHjw4S3ElzyyT2emeV6xYoevXr1ufX7lyRV988YXatGljc0tKarp37y5jjH7//fdUj5u6detaY/H29taiRYts3r99+3abWy5T4+Pjo3bt2mnZsmXp/nN4978y6Um+UP/kk09syj///HPFx8dbX8+uwMBADRo0SI899ph++eWXFLcpA3lZVtqMzEi+7e/u7+OuXbt08OBBm+9j2bJlFRISos8//1x79uyxJtk6d+6sCxcuaMaMGSpatGiGifIuXbrIzc1Ns2bNSnOZli1bysfHJ0Vcp06dst6q4Yg65bTk24bunt157dq1klJvO0qXLq169erJ399fH3zwgeLj49McmHvu3Lny9vZOcQtPZqTVRoSGhmb43u7du+vw4cMqUaJEqsdk8p857du3T3VbixcvznAbrVq1su6DO39n3C2r7VFsbKxND0Lp9l0IFovFGm921ahRQy+//LLq1q2bYhtAfpI8e256Q4sknwfuHlT/iy++sHnetWtXubu76/Dhw2m2c+kJCwvTpk2b0h06wZ7vfseOHbVx40ZrUuXO9/r6+mb6GiCn/Pbbbzp16lSKP0yk2z3PateurWrVqumvv/7S7Nmz9eCDD2Y6uXn3ufyzzz7TrVu3Mt1uHDhwQFWrVk31M05OsrVv315XrlzRmjVrbN6fmXYjM783pJR3yKTHmZ+/xWJR/fr19c4776hYsWK0G1lAT7YCLiAgQOPGjdPzzz+vxYsXq1+/fvrwww8VFhamrl27atCgQSpXrpz++OMPHTx4UHv37tWyZcskSS+//LLWrFmjDh066NVXX5Wvr68iIyMVHx+fqW1HRkaqR48eatGihcaMGaOKFSvqxIkT2rBhg/UkOXXqVHXu3Fnt27fX2LFj5enpqaioKB04cEBLlixJ89+YQoUKadq0aXriiSfUvXt3DR8+XAkJCZo+fbouX75s00U5PQsXLtSQIUM0b968dMdlq1SpUpo9sMqVK2dzcv/www+1detWdenSRRUqVFB8fLy2bt2q9957T61atbK5FXTUqFGaO3euhgwZorp169r0OPDy8lLDhg0lSVu3btXrr7+uXr16qUqVKrp+/brWrVun2bNnq0OHDurRo0em6uvm5qbOnTsrIiJCSUlJeuuttxQXF2ed2jo9rVu31lNPPaXBgwdr9+7datu2rQoXLqwzZ87o22+/Vd26dfX0008rICBAY8eO1ZQpUzRs2DA98sgjOnnypCZOnJiprtYzZszQvffeq+bNm+vFF19UtWrVdO7cOa1Zs0Yffvih/Pz8VKdOHUnS7Nmz5efnJ29vb1WuXDnVWz07d+6srl276oUXXlBcXJxat26tH3/8URMmTFDDhg3Vv3//TO27OzVv3lzdu3dXvXr1FBAQoIMHD+rjjz92eHIXyA0y22ZkRs2aNfXUU0/pvffes85ufOzYMb3yyiuqUKGCxowZY7N8x44d9d5778nHx0etW7eWJFWuXFmVK1fWV199pQceeMA65mhaKlWqpJdeekmvvfaa/v77bz322GPy9/dXbGysLl68qEmTJqlYsWJ65ZVX9NJLL2nAgAF67LHHdOnSJU2aNEne3t6aMGGCw+qUlqFDh2rBggU6fPhwhhccsbGx1nFUzp49q2vXrmn58uWSpJCQEIWEhEi6/YO/R48emjx5spKSktSiRQvt3r1bkyZNUvfu3W3+HProo48kSVWrVtXly5e1bt06zZ07V2+88YYaNWqUIobTp09r/fr16tu3b4qe45mxe/dumzZi/PjxKleunPU25PSMHj1an3/+udq2basxY8aoXr16SkpK0okTJ/TVV1/pueeeU/PmzdWlSxe1bdtWzz//vOLj49WkSRNt27ZNH3/8cYbbKFKkiN5++20NGzZMnTp10pNPPqnAwED99ttv+uGHH6zjQSX/wfTWW28pLCxMbm5uqlevnvWW6zuNGTNGCxcu1P3336/JkycrODhYX375paKiovT000+n+cdiWn788Uc988wzeuSRR1S9enV5enpq48aN+vHHH+mNgHwj+W4S6fatcStWrFBMTIx69eqlypUrp/m+bt26qXjx4ho6dKgmT54sd3d3RUdH6+TJkzbLVapUSZMnT9b48eN15MgR65jW586d0/fff2+9eyEtkydP1rp169S2bVu99NJLqlu3ri5fvqz169crIiJCtWrVsuu7P2HCBOt4Yq+++qqKFy+uRYsW6csvv9S0adPk7++f4T48fvy4qlatqoEDB2ZqXLbk9uTIkSOSbp+vk+94Se7Z/OOPP2rMmDF6+OGHVaVKFRUqVEj/+9//9M4776hEiRIaO3asdX3nz5/X22+/rdatW8vPz08///yzpk2bpkKFCikyMjLDeJKtWLFC7u7u6ty5s3766Se98sorql+/vvr06ZPheydPnqyYmBi1atVKo0aNUs2aNXX9+nUdO3ZMa9eu1QcffKDy5ctrwIABeueddzRgwAC9/vrrql69utauXasNGzZkuI3M/N6QbrcbK1as0KxZs9S4cWMVKlQozWSuIz7/O/3nP/9RVFSUevbsqSpVqsgYoxUrVujy5cvWPzORCTk/1wJcIXmmnLtn2jLm9uyIFStWNNWrV7fOUvXDDz+YPn36mNKlSxsPDw9TpkwZ06FDB/PBBx/YvHfbtm2mRYsWxsvLy5QpU8b885//NLNnz87U7KLG3J6RMiwszPj7+xsvLy9TtWrVFDPDbN261XTo0MEULlzY+Pj4mBYtWpgvvvjCZpnUZq0zxphVq1aZ5s2bG29vb1O4cGHTsWNHs23bNptlkmd+uXDhQpr7Lb1Zc9KjVGYX3bZtm+nevbsJCgoynp6extfX19SvX9+89tprJj4+3mbZ4ODgVGdOkmQz68yhQ4dMt27dTLly5YyXl5fx9vY2devWNa+//rq5fv16hnEmz1T21ltvmUmTJpny5csbT09P07BhQ7NhwwabZdPbX8YYM2/ePNO8eXPr51W1alUzYMAAs3v3busySUlJZurUqaZChQrG09PT1KtXz3zxxRemXbt2Gc4uaowxsbGx5pFHHjElSpQwnp6epmLFimbQoEE2dZ05c6apXLmycXNzs1nH3bOLGnP7O/DCCy+Y4OBg4+HhYcqWLWuefvpp8+eff9osFxwcbO6///4Udb477hdffNE0adLEBAQEGC8vL1OlShUzZswYc/HixVT3GZCXtGvXztxzzz02ZZlpMzIzu6gxt2eHfuutt0yNGjWMh4eHKVmypOnXr585efJkilhWr15tJJnOnTvblCfP8vXuu+9mul4LFy40TZs2Nd7e3qZIkSKmYcOGKc49c+bMMfXq1TOenp7G39/fPPjgg9YZxxxRp9T2bbKBAwdmum1NjiG1x52zkhljzLVr18wLL7xgKlSoYNzd3U3FihXNuHHjUrQdH374oaldu7bx9fU1RYoUMW3atEl39rHkGTo3btyYYbx3Sm53v/rqK9O/f39TrFgx68yuhw4dslk2vf119epV8/LLL5uaNWtaP6+6deuaMWPG2MyKfvnyZTNkyBBTrFgx4+vrazp37mx+/vnnDGcXTbZ27VrTrl07U7hwYePr62tCQkLMW2+9ZX09ISHBDBs2zJQqVcpYLBabddw9u6gxxhw/ftw8/vjjpkSJEsbDw8PUrFnTTJ8+3WaW8OS2cfr06SnqfWfc586dM4MGDTK1atUyhQsXNkWKFDH16tUz77zzjs2spEBelNrsov7+/qZBgwZmxowZKc5hqZ3/vv/+e9OqVStTuHBhU65cOTNhwgQzZ86cVL/rq1atMu3btzdFixY1Xl5eJjg42Dz88MPm66+/zjDWkydPmiFDhpgyZcoYDw8PExQUZPr06WPOnTtnXSYz3/206vG///3P9OjRw/j7+xtPT09Tv379FO1Xchu8bNmyFPEln1PuPh+lJa325c627+zZs6Zfv36matWqxtfX13h6epoqVaqYESNGpJgJ89KlS6ZLly6mVKlSxsPDw1SsWNH84x//SPNa427Jbd6ePXtMjx49TJEiRYyfn5957LHHbPaxMWn/ljfGmAsXLphRo0aZypUrGw8PD1O8eHHTuHFjM378eJtZyk+dOmUeeugh63Yeeughs3379gxnF02W0e+NP/74wzz88MOmWLFi1nbj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ODDDdTlyoNDdu3crKSmJLtMAAJdjdlEAQDKLxWLz3BhjU7ZhwwZduHBB165d06lTp2g7ACCPylZPtvnz56tIkSJ65JFHbMqXLVuma9euZSq5lix5oNDBgwfroYceSvF68kChUVFR1ttQw8LCFBsbq4oVK1qXu3TpkgYMGKA5c+aku72EhAQlJCRYnzNQKADAGcLDwxUeHq64uDj5+/u7OhwAcLi1/Uq5OoRcr2TJknJzc7PptSZJ58+fT9G7DQCQ92WrJ9ubb76pkiVLpigvXbq03njjjSytyxEDhSYkJKhXr14aN26cWrVqle72GCgUQF622sOS4gEAAHInT09PNW7cWDExMTblMTExGV63AADynmwl2Y4fP67KlSunKA8ODs72VNSpycxAocYYDRo0SB06dFD//v0zXCcDhQIAAABwlKtXr2r//v3av3+/JOno0aPav3+/9booIiJCc+bM0bx583Tw4EGNGTNGJ06c0IgRI1wYNQDAGbJ1u2jp0qX1448/qlKlSjblP/zwg0qUKOGIuCRlbqDQbdu2aenSpapXr551PLePP/5YdevWTXWdDBQKAAAAwFF2796t9u3bW59HRERIkgYOHKjo6Gj17dtXly5d0uTJk3XmzBnVqVNHa9euVXBwsKtCBgA4SbaSbI8++qhGjRolPz8/tW3bVpK0efNmPfvss3r00UcdGqCU/kCh9957r5KSkhy+TQAAAADISGhoqIwx6S4zcuRIjRw50qHbjYyMVGRkpBITEx26XgBwthIlU47jf+niAhdE4njZSrJNmTJFx48fV8eOHeXufnsVSUlJGjBgQJbHZEuPMwcKpVECADgT7QwAwJmYYAcAcp9sjcnm6emppUuX6ueff9aiRYu0YsUKHT58WPPmzZOnp6fDgnPmQKHh4eGKjY3Vrl277FoPAACpoZ0BAAAACpZs9WRLVqNGDdWoUcOuAK5evarffvvN+jx5oNDixYurYsWKioiIUP/+/dWkSRO1bNlSs2fPZqBQAAAAAAAA5CrZSrIlJiYqOjpa//3vf3X+/PkUY6Jt3Lgx0+tioFAAAAAAAADkddlKsj377LOKjo7W/fffrzp16qSYmCArGCgUAAAAAAAAeV22kmyffvqpPvvsM3Xr1s3R8eQYBgoFAAAAAACAo2R74oNq1ao5OhYAAAAAAAAgT8pWku25557Tv//9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zWVTG5Jg//79slgsOnbsmLUso2sgIDcgyQbkgAULFsjd3V3fffed3n33Xb3zzjuaM2dOpt47ffp01alTR3v27NErr7yi//3vf+ratat69+6tH3/8UUuXLtW3336rZ555xvqeQYMG6dixY9q4caOWL1+uqKgonT9/3lnVAwA4SXbajyFDhig2Nla7du2ylv3444/at2+fBg0aJEn66KOPNH78eL3++us6ePCg3njjDb3yyitasGBBpuLas2eP+vTpo0cffVT/+9//NHHiRL3yyiuKjo6WdPvi7KefftLFixclSZs3b1bJkiW1efNmSdKtW7e0fft2tWvXLot7BACQU+y9hqlXr5727t2rcePGacyYMYqJicl2LJm5BgJyBQPAqdq1a2dq165tkpKSrGUvvPCCqV27dobvDQ4ONj179rQp69+/v3nqqadsyrZu3WoKFSpk/v77b/PLL78YSWbnzp3W1w8ePGgkmXfeece+ygAAcow97UdYWJh5+umnrc9Hjx5tQkNDrc8rVKhgFi9ebPOe1157zbRs2dIYY8zRo0eNJLNv3z5jjDGbNm0yksyff/5pjDHm8ccfN507d7Z5/z//+U8TEhJijDEmKSnJlCxZ0ixfvtwYY0yDBg3M1KlTTenSpY0xxmzfvt24u7ubK1euZGZXAABymL3XMPfdd59NWd++fU1YWJj1uSSzcuVKY0zKNsYYY/bt22ckmaNHjxpjMr4GAnILerIBOaBFixayWCzW5y1bttShQ4eUmJiY4XubNGli83zPnj2Kjo5WkSJFrI+uXbsqKSlJR48e1cGDB+Xu7m7zvlq1aqlYsWIOqw8AIGdkt/148skntWTJEl2/fl03b97UokWLNGTIEEnShQsXdPLkSQ0dOtSmLZkyZYoOHz6cqbgOHjyo1q1b25S1bt3aGpvFYlHbtm31zTff6PLly/rpp580YsQIJSYm6uDBg/rmm2/UqFEjFSlSJIt7BACQU+y5hmnZsmWK5wcPHsx2LBldAwG5hburAwCQvsKFC9s8T0pK0vDhwzVq1KgUy1asWFG//PKLJNk0iACAgqVHjx7y8vLSypUr5eXlpYSEBD300EOSbrcj0u1bRps3b27zPjc3t0yt3xiTop0xd43TExoaqtmzZ2vr1q2qX7++ihUrprZt22rz5s365ptvFBoams3aAQDyorSuTwoVut3358525ObNmzbLZHQNBOQWJNmAHLBz584Uz6tXr57pi5k7NWrUSD/99JOqVauW6uu1a9fWrVu3tHv3bjVr1kyS9Msvv9gMJAoAyBuy2364u7tr4MCBmj9/vry8vPToo4/K19dXkhQYGKhy5crpyJEjeuKJJ7IVV0hIiL799lubsu3bt6tGjRrW2EJDQ/Xss89q+fLl1oRau3bt9PXXX2v79u169tlns7VtAEDOsOcaJrX31qpVK9VlS5UqJUk6c+aMAgICJN2e+OBOGV0DAbkFSTYgB5w8eVIREREaPny49u7dq/fee89mFraseOGFF9SiRQuFh4frySefVOHChXXw4EHFxMTovffeU82aNXXffffpySef1OzZs+Xu7q7Ro0fLx8fHwbUCADibPe3HsGHDVLt2bUnStm3bbF6bOHGiRo0apaJFiyosLEwJCQnavXu3/vzzT0VERGS47ueee05NmzbVa6+9pr59+2rHjh16//33bWYorVOnjkqUKKFFixZp9erVkm4n3p577jlJ0r333pupegAAXMOeNmjbtm2aNm2aevbsqZiYGC1btkxffvllqstWq1ZNFSpU0MSJEzVlyhQdOnQoxXYyugYCcguSbEAOGDBggP7++281a9ZMbm5u+sc//qGnnnoqW+uqV6+eNm/erPHjx6tNmzYyxqhq1arq27evdZn58+dr2LBhateunQIDAzVlyhS98sorjqoOACCH2NN+VK9eXa1atdKlS5dS3BY6bNgw+fr6avr06Xr++edVuHBh1a1bV6NHj87Uuhs1aqTPPvtMr776ql577TWVLVtWkydPts5eKt2+Lahdu3ZatWqV2rRpI+l2G+bv768qVaqoaNGimdoWAMA17GmDnnvuOe3Zs0eTJk2Sn5+f3n77bXXt2jXVZT08PLRkyRI9/fTTql+/vpo2baopU6bokUcesS6TmWsgIDewmLsH0ADgUKGhoWrQoIFmzpzp6lAAAHmIve2HMUa1atXS8OHDM9U7DQCAZFzDANlDTzYAAIB85vz58/r444/1+++/a/Dgwa4OBwAAoEAgyQa4yNatWxUWFpbm61evXs3BaAAAeUVm2o/AwECVLFlSs2fPtg4iDQCAvbiGAdLH7aKAi/z999/6/fff03ydmXMAAKmh/QAAuAptEJA+kmwAAAAAAACAnQq5OgAAAAAAAAAgryPJBgAAAAAAANiJJBsAAAAAAABgJ5JsAAAAAAAAgJ1IsgEAAAAAAAB2IskGAAAAAAAA2IkkGwAAAAAAAGCn/wcwLKptE6OPOQAAAABJRU5ErkJggg==", + "image/png": "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", "text/plain": [ "
" ] @@ -2305,6 +2307,10 @@ } ], "source": [ + "from matplotlib import rc\n", + "rc('font',**{'family':'serif','serif':['Palatino'], 'size': 16})\n", + "rc('text', usetex=True)\n", + "\n", "colors = ('red', 'yellow', 'blue')\n", "\n", "nicer_colors = {\n", @@ -2319,7 +2325,7 @@ " ax = plt.subplot(1, 3, i+1)\n", " combined_df[combined_df['man_color'] == colors[i]][f'p_{colors[i]}'].plot.hist(bins=60, log=True, color=nicer_colors[colors[i]])\n", " ax.set_title(f\"{colors[i].capitalize()} color: {(combined_df['man_color'] == colors[i]).sum()} predictions\")\n", - " ax.set_xlabel(f'p_{colors[i]}')\n", + " ax.set_xlabel(\"$p_\\mathrm{\" + colors[i] + \"}$\")\n", " if i > 0:\n", " ax.set_ylabel('')\n", "\n", @@ -2329,7 +2335,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 14, "id": "faacafb5-d11d-4be8-9f83-54ec142d0db5", "metadata": { "tags": [] @@ -2409,7 +2415,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 18, "id": "80219328-80ac-4a54-979b-b67e85e3dacd", "metadata": { "tags": [] @@ -2417,7 +2423,7 @@ "outputs": [ { "data": { - "image/png": "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CwsLODg4GKzP1dUV6enpSo2Li0upbbq4uCg1Jc2aNUu5fkan08HT07OmXSMiIiIVqNbppNuNHTsWR48exe7duw2mDxo0SPm3n58fOnbsCC8vL2zevBkDBgwod30iAo1Go7y//d/l1dxuypQpmDBhgvI+OzubQYaIiKgeq9GRmHHjxuHnn3/Gzp070bhx4wpr3d3d4eXlhdOnTwMA3NzckJ+fj6ysLIO6jIwMuLq6KjUXL14sta7MzEylpiStVgt7e3uDFxEREdVf1QoxIoKxY8di3bp12LFjB7y9vStd5vLly0hNTYW7uzsAoEOHDjA3N0dsbKxSk5aWhuPHjyMoKAgAEBgYCL1ej3379ik1e/fuhV6vV2qIiIjo/lat00ljxozBqlWr8NNPP8HOzk65PkWn08HKygo5OTmYNm0ann76abi7u+PcuXN4++234ezsjP79+yu1w4YNw8SJE+Hk5ARHR0dMmjQJ/v7+yt1Kvr6+6NmzJ0aMGIFFixYBAEaOHImwsDDemUREREQAqhliFi5cCAAICQkxmL5s2TIMHToUpqamOHbsGP7zn//g6tWrcHd3R+fOnbFmzRrY2dkp9fPmzYOZmRkGDhyI3NxcdO3aFdHR0TA1NVVqVq5cifHjxyt3MfXp0wdRUVE17ScRERHVMxoREWM34m7Izs6GTqeDXq/n9TFElfjJvOwL5ql29S2ol39uiWpVdT6/+d1JREREpEoMMURERKRKDDFERESkSgwxREREpEoMMURERKRKDDFERESkSgwxREREpEoMMURERKRKDDFERESkSgwxREREpEoMMURERKRKDDFERESkSgwxREREpEoMMURERKRKDDFERESkSgwxREREpEoMMURERKRKDDFERESkSgwxREREpEoMMURERKRKDDFERESkSgwxREREpEoMMURERKRKDDFERESkSgwxREREpEoMMURERKRKDDFERESkSgwxREREpEoMMURERKRKDDFERESkSgwxREREpEoMMURERKRKDDFERESkSmbGboBaOTlHGLsJ94XLl74zdhOIiKiO4pEYIiIiUiWGGCIiIlKlaoWYWbNm4eGHH4adnR1cXFzQr18/nDx50qBGRDBt2jR4eHjAysoKISEh+OOPPwxq8vLyMG7cODg7O8PGxgZ9+vTB+fPnDWqysrIQHh4OnU4HnU6H8PBwXL16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tU8n5eTk4K+//lLep6SkICkpCY6OjnB0dMS0adPw9NNPw93dHefOncPbb78NZ2dn9O/fHwCg0+kwbNgwTJw4EU5OTnB0dMSkSZPg7++v3K3k6+uLnj17YsSIEVi0aBEAYOTIkQgLC+OdSURERASgBiHmwIED6Ny5s/J+woQJAICIiAgsXLgQx44dw3/+8x9cvXoV7u7u6Ny5M9asWQM7OztlmXnz5sHMzAwDBw5Ebm4uunbtiujoaJiamio1K1euxPjx45W7mPr06VPhs2mIiIjo/qIRETF2I+6G7Oxs6HQ66PX6u3JqacuQhrW+TirtyRWZxm7CfeEn87IvmKfa1begXv65JapV1fn85ncnERERkSoxxBAREZEqMcQQERGRKjHEEBERkSoxxBAREZEqMcQQERGRKjHEEBERkSoxxBAREZEqMcQQERGRKjHEEBERkSoxxBAREZEqVfsLIOlfBWsuGbsJ94cVxm4AERHVVTwSQ0RERKrEEENERESqxBBDREREqsQQQ0RERKrEEENERESqxBBDREREqsQQQ0RERKrEEENERESqxBBDREREqsQQQ0RERKrEEENERESqxBBDREREqsQQQ0RERKrEEENERESqxBBDREREqsQQQ0RERKrEEENERESqxBBDREREqsQQQ0RERKrEEENERESqxBBDREREqsQQQ0RERKrEEENERESqxBBDREREqlTtELNr1y707t0bHh4e0Gg02LBhg8F8EcG0adPg4eEBKysrhISE4I8//jCoycvLw7hx4+Ds7AwbGxv06dMH58+fN6jJyspCeHg4dDoddDodwsPDcfXq1Wp3kIiIiOqnaoeY69evo23btoiKiipz/pw5czB37lxERUVh//79cHNzQ/fu3XHt2jWlJjIyEuvXr8fq1auxe/du5OTkICwsDIWFhUrN4MGDkZSUhJiYGMTExCApKQnh4eE16CIRERHVRxoRkRovrNFg/fr16NevH4B/j8J4eHggMjISkydPBvDvURdXV1fMnj0bo0aNgl6vR8OGDbF8+XIMGjQIAHDhwgV4enpiy5YtCA0NRXJyMlq3bo3ExEQEBAQAABITExEYGIg///wTPj4+lbYtOzsbOp0Oer0e9vb2Ne1iuX4y19T6Oqm0vgU1Hp5UDRzP9wbHM1HlqvP5XavXxKSkpCA9PR09evRQpmm1WgQHByMh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0KCBODo6Sp8+fSQlJaXS9kybNk2ee+45SU5OFjs7O8nJyamVftL9oa6M55SUFAEghw8fNpjepUsXGT169B33k+4PdWU87927VwDI559/Xub8rKysGvdRDXg6SSU0Gg1efvllLFu2zGD60qVL8fjjj+OBBx5Qpr333nt4+umnceTIEQwZMgTPP/88kpOTAQA3btxA586dYWtri127dmH37t2wtbVFz549kZ+fX+72RQTLli3DkCFD0KpVK7Rs2RI//PDD3eks1XvGHs8lHThwAIcOHUJAQEDtdJDuK8YczytXroStrW25D4Wt998haOwUReW7PemLiFy4cEFMTU1l7969IiKSn58vDRs2lOjoaKUGgLzyyisG6wkICJBXX31VRESWLFkiPj4+UlRUpMzPy8sTKysr+eWXX8pty7Zt26Rhw4ZSUFAgIiLz5s2TRx999I77SPePujKei4/EWFlZiY2NjZibmwsAGTlyZG11le4DdWU89+rVS9q0aVNb3VIdHolREXd3dzz11FNYunQpAGDTpk24efMmnn32WYO6wMDAUu+Lk/7Bgwfx119/wc7ODra2trC1tYWjoyNu3ryJM2fOlLvtJUuWYNCgQTAz+/cyqueffx579+41OB9MVB3GHM/Av9c0JCUl4ciRI1izZg1++uknvPXWW7XYQ7qfGGs8iwg0Gs1d6JE68MJelRk+fDjCw8Mxb948LFu2DIMGDYK1tXWlyxUP8qKiInTo0AErV64sVdOwYcMyl71y5Qo2bNiAgoICLFy4UJleWFiIpUuXYvbs2TXsDd3vjDGei3l6eqJ58+YAAF9fX5w9exbvvfcepk2bBktLyxr0hu53xhjPLVu2xO7du1FQUABzc/M764AK8UiMyjz55JOwsbHBwoULsXXrVrz88sulakre/pyYmIhWrVoBAB566CGcPn0aLi4uaN68ucFLp9OVuc2VK1eicePGOHLkCJKSkpTX559/ju+++w63bt2q/Y7SfcEY47k8pqamuHXrVrWupSG6nTHG8+DBg5GTk4MFCxaUOf/q1at31qm6ztjns6h8Jc+5Fnv77bfFwsJCWrVqVWoeAHF2dpYlS5bIyZMn5f333xcTExP5448/RETk+vXr0qJFCwkJCZFdu3bJ2bNnJS4uTsaPHy+pqalltqNt27YyefLkUtOzs7NFq9XKhg0b7qyjdF+o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", + "image/png": "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OipfL168uMfcAACAXfcggabZbOrdu3fyfV+dTkdRFCkIAklSt9uVpLlXVsZZlrVWuXG9Xk/X19fl6/379+vPBAAAqIwHCTSu684EDd/3Jals82JuIS0KLObzVcuNOzw81PPnzydeAADg6XrUXk62bcu2bUn/uLIy75ZRnudrlwMAAPtr44FmWZuXq6ursvu1CSJv3ryZKZdl2drlAADA/tp4oDk7O5vozWSkaaparVbeejJXa6YHxsvzXFmWlePMrFoOAADsr40HGs/z1G63J0JNmqbqdruK43iibBiGStN04jEJ3W5Xvu9P3EpatRwAANhPB0VRFJueqOd5ev36tSTp5OREzWazvDIzLUmSsgeUZVk6PT2dW3bVcvPc3Nzo6OhI19fXD9JA+PfPDjY+Tcz6zaeNb6qYg+358bBNA8utc/5+kECzawg0TwMH/8fB9vx42KaB5dY5f2/1WU4AAACbQKABAACVR6ABAACVR6ABAACVR6ABAACVR6ABAACV9+NtVwAAgIf0h9/+fNtV2Au//t2ft/r7XKEBAACVR6ABAACVR6ABAACVR6ABAACVR6ABAACVR6ABAACVR7dtAMCT9unih21XYT/8brs/zxUaAABQeQQaAABQeQQaAABQeQQaAABQeQQaAABQeQQaAABQeQQaAABQeQQaAABQeQQaAABQeQQaAABQeQQaAABQeQQaAABQeQQaAABQeQQaAABQeQQaAABQeQQaAABQeQQaAABQeQQaAABQeT/edgVWlSSJ4jhWnudqNptqtVrbrhIAANgRlQg07XZbp6en6vV6yrJML1++1MXFhaIo2nbVAADADtj5W07n5+fK81y+78uyLDmOo1evXmkwGChJkm1XDwAA7ICdDzRhGKrZbE68Z243hWG4jSoBAIAds9OBJssyZVkmx3FmPnMcR2mabqFWAABg1+x0G5osyyRJtVpt5rNarVZ+Pu3jx4/6+PFj+f/r62tJ0s3NzQPUUvr/igeZLKY81PrDJLbnx8M2/TjYph/HQ2zPZppFcftK3OlAk+f5ws8sy1r4+dnZmf7jP/5j5v0XL15sqGbYiqOjbdcA2Cy2aTwlD7g9/+Uvf9HRLdPf6UBzdXW19HPLsua+3+v19G//9m/l///+97/r6upKX3zxhQ4ODjZZxUq6ubnRixcv9P79ez1//nzb1QHuhe0ZTw3b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", "text/plain": [ "
" ] @@ -2427,6 +2433,8 @@ } ], "source": [ + "rc('font',**{'family':'serif','serif':['Palatino'], 'size': 14})\n", + "\n", "types = ('Type A', 'Type B', 'Type C')\n", "colors = ('Red', 'Yellow', 'Blue')\n", "color_counts = {\n", diff --git a/Notebooks/TEI_Export.ipynb b/Notebooks/TEI_Export.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..be30e8c1176637764cafb76cf4724249e07bab4a --- /dev/null +++ b/Notebooks/TEI_Export.ipynb @@ -0,0 +1,1537 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "8a7c8849-b1a3-4f88-b534-cec8b4c13f09", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install -r requirements.txt -q" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5b24e324-6659-482d-8d82-39c1d604f0d3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from bs4 import BeautifulSoup as bs\n", + "import cv2 as cv\n", + "import re\n", + "import pathlib\n", + "import numpy as np\n", + "import json\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.mixture import GaussianMixture\n", + "# from scipy.optimize import curve_fit\n", + "# import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "id": "f7535107-5d1e-43d9-b0ed-077c306a73c1", + "metadata": {}, + "source": [ + "# Klassenstruktur für eine Seite und ihre Untereinheiten" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "97ce5633-934c-4fbb-a71f-7e4710ff4211", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def prepare_string(s):\n", + " new = s.lower()\n", + " new = re.sub(r'[àáâãäå]', 'a', new)\n", + " new = re.sub(r'[èéêë]', 'e', new)\n", + " new = re.sub(r'[ìíîï]', 'i', new)\n", + " new = re.sub(r'[òóôõö]', 'o', new)\n", + " new = re.sub(r'[ùúûü]', 'u', new)\n", + " new = re.sub('\\.|,|;|\\s', '', new)\n", + " return new\n", + "\n", + "class Page:\n", + " def __init__(self, page_xml_string, tei_xml_string):\n", + " self.XMLSources = XMLSources(page_xml_string, tei_xml_string)\n", + " self.Header = Header(self.XMLSources)\n", + " self.Entries = Entries(self.Header, self.XMLSources)\n", + " self.RemainingLines = RemainingLines(self.Header, self.Entries, self.XMLSources)\n", + " \n", + " def __str__(self):\n", + " return f'Filename: {self.XMLSources.PageXML.find_all(\"Page\")[0].attrs[\"imageFilename\"]}\\n' \\\n", + " f'{self.Header}'\n", + " \n", + " def get_filename(self):\n", + " return self.XMLSources.PageXML.find_all(\"Page\")[0].attrs[\"imageFilename\"]\n", + "\n", + "class Line:\n", + " def __init__(self, xml_line):\n", + " self.ID = xml_line.attrs['id']\n", + " polygon_string = xml_line.Coords.attrs['points']\n", + " polygon_tuples = polygon_string.split(' ')\n", + " polygon = [tup.split(',') for tup in polygon_tuples]\n", + " self.BoundingPolygon = np.array(polygon, dtype='int')\n", + " baseline_string = xml_line.Baseline.attrs['points']\n", + " baseline_tuples = baseline_string.split(' ')\n", + " baseline = [tup.split(',') for tup in baseline_tuples]\n", + " self.Baseline = np.array(baseline, dtype='int')\n", + " self.Text = xml_line.find_all('TextEquiv')[-1].Unicode.text\n", + " self.Tags = xml_line.attrs['custom']\n", + " \n", + " def __str__(self):\n", + " # return f'ID: {self.ID}, text: {self.Text}\\n'\n", + " return self.Text\n", + " \n", + " def get_polygon_bb(self):\n", + " pass\n", + "\n", + "class Header:\n", + " def __init__(self, XMLSources):\n", + " self.XMLSources = XMLSources\n", + " self.PageNumber = self.get_page_number()\n", + " self.Format = self.get_format()\n", + " self.Category = self.get_category()\n", + " self.Subcategory = self.get_subcategory()\n", + " self.isValid = self.check_validity()\n", + " \n", + " def __str__(self):\n", + " # header_string = f'Has valid header: {self.isValid}\\n'\n", + " header_string = ''\n", + " if self.isValid:\n", + " header_string += f'Page number(s): {\"\".join(self.PageNumber[0])}\\n' \\\n", + " f'Format: {\" \".join(self.Format[0])}\\n' \\\n", + " f'Category: {\" \".join(self.Category[0])}\\n' \\\n", + " f'Subcategory: {\" \".join(self.Subcategory[0])}'\n", + " return header_string\n", + "\n", + " def get_all_ids(self):\n", + " lines = []\n", + " lines += self.PageNumber[1] + self.Format[1] + self.Category[1] + self.Subcategory[1]\n", + " ids = [l.ID for l in lines]\n", + " return ids\n", + " \n", + " def check_validity(self):\n", + " hasPageNumber = self.PageNumber[0]\n", + " # hasFormat = self.Format[0]\n", + " hasCategory = self.Category[0]\n", + " # hasSubcategory = self.Subcategory[0]\n", + " # check if a header line has more than one tag\n", + " # ids = self.get_all_ids()\n", + " # id_set = set(ids)\n", + " # if len(ids) != len(id_set):\n", + " # print('more than one tag for header lines')\n", + " categories, category_lines = self.Category\n", + " subcategory_line_IDs = [subcat_l.ID for subcat_l in self.Subcategory[1]]\n", + " for cat, cat_l in zip(categories, category_lines):\n", + " if cat_l.ID in subcategory_line_IDs:\n", + " category_lines.remove(cat_l)\n", + " categories.remove(cat)\n", + " self.Category = (categories, category_lines)\n", + " return bool(hasPageNumber and hasCategory)\n", + " \n", + " def get_width_height(self):\n", + " page = self.XMLSources.PageXML.find_all('Page')[0]\n", + " w, h = int(page.attrs['imageWidth']), int(page.attrs['imageHeight'])\n", + " return w, h\n", + "\n", + " def get_page_number(self):\n", + " page_regex = '^[IVX]+\\Z|^\\d+\\**\\Z|^\\d+⁎*\\Z|^[a-h]\\Z|^\\*+\\Z'\n", + " textlines = self.XMLSources.PageXML.find_all('TextLine')\n", + " w, h = self.get_width_height()\n", + " w_cut, h_cut = 0.75, 0.1\n", + " page_numbers = []\n", + " page_number_lines = []\n", + " for line in textlines:\n", + " l = Line(line)\n", + " avg_x, avg_y = np.mean(l.Baseline, axis=0)\n", + " text = l.Text\n", + " prep_text = re.sub('\\.|\\s', '', text)\n", + " m = re.match(page_regex, prep_text)\n", + " if m and (avg_y < h_cut * h) and ((avg_x > w_cut * w) or (avg_x < (1 - w_cut) * w)):\n", + " page_numbers.append(m.group(0))\n", + " page_number_lines.append(l)\n", + " return (page_numbers, page_number_lines)\n", + " \n", + " def get_format(self):\n", + " true_formats = ['infolio', 'inquarto', 'inoctavo', '&minforma']\n", + " index_to_format = {\n", + " 0: 'Folio',\n", + " 1: 'Quarto',\n", + " 2: 'Octavo und kleiner',\n", + " 3: 'Octavo und kleiner'\n", + " }\n", + " textlines = self.XMLSources.PageXML.find_all('TextLine')\n", + " w, h = self.get_width_height()\n", + " w_cut, h_cut = 0.75, 0.2\n", + " formats = []\n", + " format_lines = []\n", + " for line in textlines:\n", + " l = Line(line)\n", + " avg_x, avg_y = np.mean(l.Baseline, axis=0)\n", + " text = l.Text\n", + " cand_format = prepare_string(text)\n", + " if (cand_format in true_formats) and (avg_y < h_cut * h) and ((avg_x > w_cut * w) or (avg_x < (1 - w_cut) * w)):\n", + " # formats.append(index_to_format[true_formats.index(cand_format)])\n", + " formats.append(text)\n", + " format_lines.append(l)\n", + " return (formats, format_lines)\n", + " \n", + " def get_category(self):\n", + " true_categories = ['Theologia', 'Iurisprudentia', 'Philosophia', 'Historia Naturalis', 'Medicina', 'Mathematica', 'Artes', 'Grammatica', 'Rhetorica',\n", + " 'Poëtica', 'Philologia', 'Geographia', 'Chronologia', 'Historia Ecclesiastica', 'Historia Antiqua',\n", + " 'Historia Nova Europæ', 'Hist. Nova Europæ', 'Historia Nova extra Europam', 'Hist. Nova extra Europam', 'Miscellanea Historica', \n", + " 'Paralipomena historica', 'Codices Manuscripti', 'Imagines', 'Imagines Incisæ', 'Imagines Variæ Incisæ', 'Effigierum Incisar. Collectio',\n", + " 'Imaginum Delineatar. Collectio'\n", + " ]\n", + " textlines = self.XMLSources.PageXML.find_all('TextLine')\n", + " # w, h = self.get_width_height()\n", + " # w_cut, h_cut = 0.1, 0.1\n", + " categories = []\n", + " category_lines = []\n", + " for line in textlines:\n", + " l = Line(line)\n", + " # avg_x, avg_y = np.mean(l.Baseline, axis=0)\n", + " text = l.Text\n", + " # TODO: implement similarity comparison and location check\n", + " prepared_string = prepare_string(text)\n", + " prep_text = re.sub('\\d', '', prepared_string)\n", + " # if a 4-digit number was removed from the text we're probably looking at a line from an entry\n", + " if len(prepared_string) - len(prep_text) > 3:\n", + " continue\n", + " prep_text_in_cats = [prep_text in prepare_string(cat) for cat in true_categories]\n", + " # code snippet for location check:\n", + " # ... and (avg_y < h_cut * h) and (abs(avg_x - w/2) < w_cut * w)\n", + " if sum(prep_text_in_cats) and len(prep_text) > 3:\n", + " categories.append(text)\n", + " category_lines.append(l)\n", + " return (categories, category_lines)\n", + " \n", + " def get_subcategory(self):\n", + " true_categories = ['Theologia', 'Iurisprudentia', 'Philosophia', 'Historia Naturalis', 'Medicina', 'Mathematica', 'Artes', 'Grammatica', 'Rhetorica',\n", + " 'Poëtica', 'Philologia', 'Geographia', 'Chronologia', 'Historia Ecclesiastica', 'Historia Antiqua',\n", + " 'Historia Nova Europæ', 'Hist. Nova Europæ', 'Historia Nova extra Europam', 'Hist. Nova extra Europam', 'Miscellanea Historica', \n", + " 'Paralipomena historica', 'Codices Manuscripti', 'Imagines', 'Imagines Incisæ', 'Imagines Variæ Incisæ', 'Effigierum Incisar. Collectio',\n", + " 'Imaginum Delineatar. Collectio'\n", + " ]\n", + " prep_cats = [prepare_string(cat) for cat in true_categories]\n", + " true_subcategories = ['Textus & Versiones Sacræ Scripturæ',\n", + " 'Textus & Versiones S. Scripturæ',\n", + " 'Interpretes, Commentatores, & Paraphrastæ in S. Scripturam',\n", + " 'Critici Sacri',\n", + " 'Liturgiæ Sacræ',\n", + " 'Concilia & ad Eadem pertinentia',\n", + " 'Concilia, & quæ ad eamdem Rem pertinent.',\n", + " 'Concilia, & quæ ad eamd. Rem pertinent.',\n", + " 'SS. Patres Græci',\n", + " 'SS. Patres Latini',\n", + " 'Collectiones & Excerpta SS. Patrum & Scriptorum Ecclesiasticorum',\n", + " 'Collectiones ac Excerpta SS. PP. & Scriptorum Ecclesiasticorum',\n", + " 'Collectiones & Excerpta SS. PP. & Scriptor. Ecclesiasticorum',\n", + " 'Collectiones ac Excerpta SS. PP. & Scriptor. Ecclesiasticorum',\n", + " 'Theologi Scholastici',\n", + " 'Theologi Morales, Ascetici, & Parænetici',\n", + " 'Theologi Polemici',\n", + " 'Theologi Heterodoxi',\n", + " 'Canonum collectores & Canonistæ; Epistolæ decretales; necnon de Hierarchiâ & Rebus Ecclesiasticis',\n", + " 'Canonum collectores, & Canonistæ. Epistolæ decretal. & Bullæ; necnon de Hierarchiâ & Reb. Ecclesiast.',\n", + " 'Canonum collectores, & Canonistæ. Epistolæ decretal. ac Bullæ; necnon de Hierarchiâ & Reb. Ecclesiast.',\n", + " 'Canonum collectores & Canonistæ; Epist. decretal. & Bullæ; necnon de Hierarchiâ & Reb. Ecclesiast.',\n", + " 'De Potestate Spirituali & Temporali Pontificis Max; ac de Potestate Regiâ in Regimine Ecclesiastico',\n", + " 'De Potestate Spirituali & Temporali Pontific. Max. ac de Regiâ Potestate in Regimine Ecclesiast.',\n", + " 'Ius Civile, Publicum, & Municipale',\n", + " 'Philosophi Veteres & novi cum suis Interpretibus, & Tractatus Philosophici generales',\n", + " 'Philosophi Veteres & novi cum suis Interpretibus necnon Tractatus Philosophici generales',\n", + " 'Philosophi veteres & novi cum suis Interpret. necnon Tractatus Philosophici general.',\n", + " 'Philosophi veteres ac novi cum suis Interpretib. nec non Tractatus Philosophici generales',\n", + " 'Philosophi veteres ac novi cum suis Interpretibus; necnon Tractatus Philosophici generales',\n", + " 'Logici, Morales, & Politici',\n", + " 'Metaphysici, Physici, & Philosophia Arcana',\n", + " 'Tractatus Vniversales Hist. Nat. cum miscellan.',\n", + " 'Tractatus Vniversales Historiæ Natural. cum Miscellaneis',\n", + " 'Tractatus Vniversales Historiæ Naturalis cum Miscellaneis',\n", + " 'Metallorum, Fossilium, Gemmarum, Lapidum, Aquarum, Conchiliorum, &c. Historia',\n", + " 'Metallorum, Fossilium, Gemmar. Lapidum, Aquarum, Conchilior. &c.',\n", + " 'De Agriculturâ & Re Rusticâ',\n", + " 'Plantarum Historia',\n", + " 'Plantarum, Arborum, Fruticum & Florum',\n", + " 'Animalium Historia',\n", + " 'Medicina; Chirurgia, Anatomia & Pharmac.',\n", + " 'Vbi etiam Chirurgia, Anatomia, Pharmacia & Chimia',\n", + " 'Vbi etiam Chirurgia, Anatomia, Pharmacia, necnon Chimia',\n", + " 'Tractatus generales; Arithmetica, Geometria & Musica',\n", + " 'Astronomia; Astrologia; Gnomonica; & optica',\n", + " 'Cosmographia; Astronomia; Astrologia; Gnomonica, Optica',\n", + " 'Tractatus Mechanici',\n", + " 'Ars Militaris, cum tractatibus de Tormentis Bellicis',\n", + " 'Ars Militaris, & de Bellicis Tormentis Tractat.',\n", + " 'Ars Militaris, & de Bellicis Machinis Tractat.',\n", + " 'Ars Hydraulica & Nautica',\n", + " 'Ars Delineatoria, Pictoria, & Sculptoria',\n", + " 'Ars Delineatoria, Pictoria, Sculptoria, & Chalcographica',\n", + " 'Architectura Civilis',\n", + " 'Architectura Militaris, & Arcium Icones',\n", + " 'Architectura Militar. vbi etiam Arcium Icones',\n", + " 'Architectura Militaris, vbi etiam Arcium Icones',\n", + " 'Ars Graphica, Typographica, Gymnastica, & Aliæ Artes',\n", + " 'Tractatus Grammatici general. cum Lexicograph.',\n", + " 'Tractatus Grammatici cum Lexicographis',\n", + " 'Tractat. Grammatici cum Lexicographis',\n", + " 'Rhetores, Seu Artis Rhetoricæ Scriptores',\n", + " 'Oratores Græci, & Latini Antiqui',\n", + " 'Oratores Latini recentiores, Gallici, & Italici',\n", + " 'De Arte Poëticâ, & Poëtis Scriptores',\n", + " 'Scriptores de Arte Poëticâ & Poëtis ',\n", + " 'Poëtæ Græci',\n", + " 'Poëtæ Latini Antiqui',\n", + " 'Poëtæ Latini Recentiores, cum Germanicis',\n", + " 'Poëtæ Gallici unà cum Dramaticis',\n", + " 'Poëtæ Gallici vnà cum Dramaticis',\n", + " 'Poëtæ Gallici cum Dramaticis',\n", + " 'Poëtæ Gallici unà cum Drammaticis',\n", + " 'Poëtæ Gallici unà cum Dramatic.',\n", + " 'Poëtæ Italici, & Hispanici, unà cum Dramat.',\n", + " 'Poëtæ Italici, Hispanici, & Lusitanici, unà cum Dramaticis',\n", + " 'Poëtæ Italici, Hispan. & Lusitanici cum Dramatic.',\n", + " 'Mythologi, & Fabularum Scriptores',\n", + " 'Poësis Prosaïca, Seu Facetiarum, Narrationum & Historiarum Eroticarum Scriptores',\n", + " 'Poësis Prosaïca, Sive Facetiarum, Narrationum, & Historiarum Eroticarum Scriptores',\n", + " 'Poësis Prosaïca, Sive Facetiarum, Narrationum, & Historiarum Eroticar. Scriptores.'\n", + " 'Operum Græcor. varij Argumenti Collectiones',\n", + " 'Operum Græcorum varij Argumenti Collectiones',\n", + " 'Operum Græcorum varij Argumenti Scriptores',\n", + " 'Operum Latinor. varij Argumenti Collectiones',\n", + " 'Operum Latinorum varij Argumenti Collectiones',\n", + " 'Operum Gallicorum & Italicorum Argumenti varij Collectiones',\n", + " 'Operum Gallicorum & Italicorum varij Argum. Collectiones',\n", + " 'Operum Gallicorum & Italicorum varij Argumenti Collectiones',\n", + " 'Critici',\n", + " 'Epistolographi Græci & Latini',\n", + " 'Epistolographi Gallici, & Italici',\n", + " 'Gnomici, Seu Sententiæ, Apophtegmata, Adagia, Dictaque moralia & critica',\n", + " 'Satyræ, Apologiæ, ac dissertationes variæ',\n", + " 'Hieroglyphica, Seu Symbola, Emblemata, &c.',\n", + " 'Dialogi, & Colloquia',\n", + " 'Geographi veteres & novi',\n", + " 'Geographi veteres ac Novi',\n", + " 'Descriptiones & Tabulæ Geographicæ, Chorographicæ, ac Topographicæ',\n", + " 'Descript. & Tabulæ Geographicæ, Chorograph., ac Topographicæ',\n", + " 'Descript. & Tabulæ Geographicæ, Chorographicæ, ac Topographicæ',\n", + " 'Descript. & Tabulæ Geographicæ, Chorograph; ac Topographicæ',\n", + " 'Peregrinationes, & Navigationes',\n", + " 'Peregrinationes, Navigationes, & Itinera',\n", + " 'Chronologia Technica & Historica',\n", + " 'Chronographi, Seu Chronica, & Historiæ Vniversal',\n", + " 'Chronographi, seu Chronica, & Historiæ Vniversales',\n", + " 'Historia generalis ante & post Christum natum',\n", + " 'Historiæ general. ante & post Christum natum',\n", + " 'Hist. general. ante & post Christum natum',\n", + " 'Historia Eccles. ante & post Christum natum',\n", + " 'Historia Eccl. ante & post Christum nat.',\n", + " 'Historia Ecclesiarum Europæ cum Episcopor. Vitis',\n", + " 'Histor. Ecclesiarum Europæ cum Episcopor. vitis',\n", + " 'Historia Ecclesiar. Europæ cum Episcopor. Vitis',\n", + " 'Historia Ecclesiarum Europæ, cum Episcop. Vitis',\n", + " 'Historia Ecclesiar. Europæ cum Episcoporum Vitis',\n", + " 'Historia Ecclesiarum extra Europam, & Missionum ad Fidei Propagationem',\n", + " 'Historia Ecclesiar. extra Europam, & Missionum ad Fidei Propagationem',\n", + " 'Historia Ecclesiarum extra Europ. & Missionum ad Fidei Propagationem',\n", + " 'Historia Ecclesiar. extra Europ. & Missionum ad Fidei Propagationem',\n", + " 'Vitæ Sanctorum, Martyrologia, & Hist. de Locis Sacr. SS. Reliquiis, Imaginibus miraculosis, &c.',\n", + " 'Vitæ SS, Martyrologia; & Hist. de Locis Sacris, Reliquiis, Imaginibus miraculosis, &c.',\n", + " 'Martyrologia, Vitæ SS. & Hist. de Locis Sacr., Reliquiis, Imaginibus miraculosis, &c',\n", + " 'Historia Summorum Pontificum & Cardinalium',\n", + " 'Historia Ordinum Religiosorum, & Coenobiorum cum Institutorum, Fundatorum, &c. Vitis',\n", + " 'Historia Ordinum Religiosor. & Monasterior. cum Institutorum, Fundator. &c Vitis',\n", + " 'Historia Ordinum Religiosorum, & Monaster. cum Institutorum, Fundatorum, &c. Vitis',\n", + " 'Historia Ordinum Religiosorum & Monasteriorum, cum Institutorum, Fundatorum, &c Vitis.',\n", + " 'Hist. Ordinum Religiosorum, & Monasterior. cum Institutorum, Fundatorum, &c Vitis.',\n", + " 'Historia Ordinum Religiosor. & Monasteriorum, cum Institutorum, Fundatorum, &c Vitis.',\n", + " 'Historia Ordinum Militarium & Equestrium',\n", + " 'Historia Hæresium & Hæreticorum, necnon de Inquisitione Tractatus',\n", + " 'Historia Judaïca, Assyria, Medorum, Persica vetus, Macedonica, Babylonica, Trojana, &c.',\n", + " 'Historia Judaïca, Assyria, Medorum, Persica vet., Macedonica, Babylonica, Trojana, &c.',\n", + " 'Historia Græca generalis & Singularis, cum Atticâ, & Insularum descriptionibus',\n", + " 'Historia Romana generalis, seu ab Vrbe conditâ. & Imperij Romani notitia',\n", + " 'Historia Romana Sæculorum aliq. præsertim Imperatorum temporibus',\n", + " 'Historia Romana Sæculorum aliquot, præsertim Imperatorum temporibus',\n", + " 'Historia Romana Sæculorum aliquot, præsertim Imperatorum tempore',\n", + " 'Historia Imperij Oriental. Seu Bysantina',\n", + " 'Historia Imperij Orientalis, Seu Bysantina',\n", + " 'Historia Imperii Orientalis, Seu Bysantina',\n", + " 'Historia Europæa Vniversalis',\n", + " 'Italiæ universæ Historia & Notitia',\n", + " 'Italiæ Vniversæ Historia & Notitia',\n", + " 'Hist. Latij, Romæ modernæ, ac Status Ecclesiastici, ubi etiam Parmensis, Vrbinensis & Ferrariensis',\n", + " 'Historia Latij, Romæ modernæ, ac Statûs Ecclesiastici',\n", + " 'Historia Neapolitana generalis & Singularis Historia Sicula generalis & Singularis',\n", + " 'Hist. Neapolitana & Sicula gener. & Singul.',\n", + " 'Hist. Neapolitana, & Sicula gener. ac Singul.',\n", + " 'Historia Neapolit. & Sicula gener. ac Sing.',\n", + " 'Historia Veneta generalis & Singularis',\n", + " 'Historia Veneta generalis & Singular.',\n", + " 'Historia Veneta generalis & Singul.',\n", + " 'Historia Florentina generalis & Singularis',\n", + " 'Historia Mediolanensis, Mantuana, & Monferrat',\n", + " 'Historia Mediolanens. Mantuana, & Monferrat',\n", + " 'Hist. Mediolanens, Mantuana, & Monferratens.',\n", + " 'Historia Pedemontana & Sabaudica',\n", + " 'Hist. Sabaudica & Pedemont. gener. ac Singul.',\n", + " 'Hist. Sabaudica & Pedemont. gener. & Singul',\n", + " 'Historia Genuensis & Ligustica; Corsica, Sardinica, Tremitensis, & Melitensis',\n", + " 'Hist. Genuensis & Ligustica; Corsica; Sardinica; Ragusina & Melitens.',\n", + " 'Hist. Genuensis ac Ligustica; Corsica; Sardinica; Ragusina & Melitens.',\n", + " 'Hist. Genuensis ac Ligustica; Corsica; Sardin; Ragusina & Melitens.',\n", + " 'Histor. Genuens. ac Ligustica, Corsica, Sardinic; Ragusina & Melitensis',\n", + " 'Franciæ Historia generalis & Notitia, ubi etiam Historia Gallica Vetus',\n", + " 'Franciæ Historia generalis & Notitia, necnon Historia Gallica vetus',\n", + " 'Historia Franciæ aliquot temporum, ubi etiam Regum Historiæ, Libelli memoriales, Vitae, aliaque ad eamdem Historiam pertinentia',\n", + " 'Hist. Franciæ Singul. vel aliquot temporum; Vitæ Regum, & aliæ; Libelli Memoriales; aliaque',\n", + " 'Hist. Franciæ Singul. vel aliquot temporum; Vitæ Regum, & aliæ; Libelli Memoriales; alteraque',\n", + " 'Hist. Franciæ Singul. vel aliquot tempor; Vitæ Regum, & aliæ; Libelli Memoriales; aliaque',\n", + " 'Hist. Franciæ Singul. vel aliquot tempor; Vitæ Regum & alior; Libelli Memoriales; aliaque',\n", + " 'Hist. Franciæ Singul. vel aliquot tempor; Vitæ Regum ac alior; Libelli Memoriales; & alia.',\n", + " 'Hist. Franciæ Singul. vel aliquot tempor; Vitæ Regum & aliorum; Libelli Memoriales; aliaque',\n", + " 'Hist. Franciæ Singul. vel aliquot temp; Vitæ Regum & alior; Libelli Memoriales; aliaque',\n", + " 'Historia Franciæ Sing. vel aliq. tempor; Vitæ Regum, & aliæ; Libelli Memoriales; aliaque',\n", + " 'Historia Provinciarum & Vrbium Franciæ',\n", + " 'Historia Provinciarum & Vrbium Galliæ',\n", + " 'Historia Germaniæ generalis & Singularis seu aliquot temporum, cum Imperatorum Vitis, &c',\n", + " 'Historia Germaniæ general. & aliquot tempor; cum Imperatorum Vitis; &c',\n", + " 'Historia Germaniæ generalis & aliquot tempor, cum Imperatorum Vitis; &c',\n", + " 'Historia & descriptio Regionum Germaniæ',\n", + " 'Descriptio & Historia Regionum Germaniæ',\n", + " 'Historia Belgij Catholici generalis & Singular.',\n", + " 'Historia general. & Singul. Belgij Catholici',\n", + " 'Historia general. & Singular. Belgij Regij',\n", + " 'Historia general. & Singularis Belgij Regij',\n", + " 'Historia Generalis & Singularis Belgij Regij',\n", + " 'Historia generalis & Singular. Belgij Regij',\n", + " 'Historia Belgij foederati generalis & Singular',\n", + " 'Historia generalis & Singular. Belgij Foederati',\n", + " 'Historia generalis & Singul. Belgij Foederati',\n", + " 'Historia Lotharingica, Helvetica, & Populorum consinium',\n", + " 'Historia Lotharingica, Helvetica, & Rhætica',\n", + " 'Historia Lotharingica, Helvetica & Rhoetica',\n", + " 'Historia Hispanica generalis & aliquot temporum cum Regum Vitis, &c',\n", + " 'Historia Hispanica general. & aliquot tempor; Vitæ Regum & alia',\n", + " 'Historia Hispanica general. & aliquot tempor; Vitæ Regum; aliaque',\n", + " 'Historia Regnorum, seu Provinciarum & Vrbium Hispaniæ',\n", + " 'Hispaniæ Regnorum Seu Provinciar; & Vrbium Historia',\n", + " 'Hispaniæ Regnorum Seu Provinciar; & Vrbium Historia',\n", + " 'Hispaniæ Regnorum vel Provinciarum & Vrbium Historia',\n", + " 'Hispaniæ Regnorum vel Provinciar. ac Vrbium Historia',\n", + " 'Historia Lusitanica generalis & Singularis',\n", + " 'Historia Lusitaniæ generalis & Singularis',\n", + " 'Historica Anglica, Scotica, & Hybernica, general. & Singularis',\n", + " 'Angliæ, Scotiæ, ac Hyberniæ Hist. generalis & Singularis',\n", + " 'Angliæ, Scotiæ, ac Hiberniæ Histor. generalis & Singularis',\n", + " 'Historia Septentrionalis general. vetus & nova',\n", + " 'Historia Septentrionalis generalis vetus & nova',\n", + " 'Regionum Septentrion. nempe Daniæ, Norweg. Lapponiæ, Islandiæ, Sueciæ, ac Livoniæ Historia',\n", + " 'Regionum Septentrion. nempe Daniæ, Norwegiæ, Lapponiæ, Islandiæ, Sueciæ, ac Livoniæ Histor.',\n", + " 'Historia Regionum Septentrionalium, Scilicet Daniæ, Norwegiæ, Lapponiæ, Islandiæ Groënlandiæ, Sueciæ, ac Livoniæ',\n", + " 'Regionum Septentrion. Sive Moscoviæ, Poloniæ, Lithuaniæ, ac Prussiæ Regiæ Hist.',\n", + " 'Regionum Septentrion. sive Moscoviæ, Poloniæ, Lithuaniæ, ac Prussiæ Regiæ Historia',\n", + " 'Regionum Septentrion. seu Moscoviæ, Poloniæ, Lithuaniæ ac Prussiæ Regiæ Historia',\n", + " 'Historiæ Regionum Septentrion. seu Moscoviæ, Poloniæ, Lithuaniæ, ac Prussiæ Regiæ',\n", + " 'Historia Regionum Septentrionalium, nempe Moscoviæ, Poloniæ, Lithuaniæ, ac Prussiæ Reg.',\n", + " 'Historia Regionum Septentrionalium, nempè Hungariæ, Sclavoniæ, Croatiæ, Dalmatiæ, Transylvaniæ, Moldaviæ, ac Valachiæ',\n", + " 'Regionum Septentrionalium Sive Hungariæ, Sclavoniæ, Croatiæ, Dalmatiæ, Transylvaniæ, Moldaviæ, ac Valachiæ Historia',\n", + " 'Regionum Septentrion. seu Hungariæ, Sclavoniæ, Croatiæ, Dalmatiæ, Transylvaniæ, Moldaviæ, ac Valachiæ Historia',\n", + " 'Regionum Septentrion. Seu Hungariæ, Sclavon; Croatiæ, Dalmatiæ, Transylvaniæ, Moldaviæ, ac Valachiæ Historia',\n", + " 'Regionum Septentr. Seu Hungariæ, Sclavoniæ, Croatiæ, Dalmatiæ, Transylvaniæ, Moldaviæ, ac Valachiæ Historia',\n", + " 'Historia Orientalis generalis, cum Arabicâ, Sarracenicâ, & Turcicâ',\n", + " 'Historia Orientalis general. & Singul. Sive Arabica, Sarracenica, & Turcica',\n", + " 'Historia Orientalis general. & Singular. sive Arabica, Sarracenica, & Turcica',\n", + " 'Historia Asiatica generalis & Singularis',\n", + " 'Historia Africana generalis & Singularis',\n", + " 'Historia Americana generalis & Singularis',\n", + " 'Historiæ variæ, Dictionaria historica, & acta Publica',\n", + " 'Historiæ diversæ; Dictionaria Historica, & Acta Publica',\n", + " 'Historia Heraldica, necnon de Nobilitate ac Nobilib.',\n", + " 'Tractatus Heroïci ac Heraldici, seu de Nobilitate ac Insignibus',\n", + " 'Tractatus Heroici & Heraldici; seu de Nobilitate ac Insignibus',\n", + " 'Historia Genealogica',\n", + " 'Genealogiæ',\n", + " 'Miscellanea Antiquaria, seu Antiquitatum collectiones, & Museorum descriptions',\n", + " 'Antiquitatum collectiones cum Museis',\n", + " 'Antiquitatis Monumenta varia',\n", + " 'Antiquitatis Monumenta, seu Ædificia, Amphith., Obelisci, Statuæ, Gemmæ, Lucernæ, Vasa, &c',\n", + " 'Antiquitatis Monumenta, seu Ædificia, Amphitheatr., Obelisci, Statuæ, Gemmæ, Lucernæ, Vasa, &c',\n", + " 'Ritus Veterum, Seu de Rebus eorum Sacris, Civilibus, Militaribus, ac Domesticis',\n", + " 'Ritus Veterum; seu de Reb. eorum Sacris, Civilib; Militaribus ac Domesticis',\n", + " 'Ritus Veterum, seu de Rebus eor. Sacris, Civilibus, Militaribus ac Domesticis',\n", + " 'Inscriptiones ex Lapidibus excerptæ',\n", + " 'Inscriptiones antiquæ ex Lapidibus excerptæ',\n", + " 'Historia de Numismatibus & Re Monetariâ',\n", + " 'Pomparum Triumphalium ac Ludicrar. Historia',\n", + " 'Pompæ, ac Ceremoniæ Triumphales & Ludicræ',\n", + " 'Pomparum Exequialium Historia',\n", + " 'Pompæ, ac Ceremoniæ Exequiales',\n", + " 'Historia Litteraria & Bibliographica cum Biblioth. Catalogis',\n", + " 'De Re Litterariâ & Bibliographicâ, cum Catalogis Bibliothecarum',\n", + " 'De Re Litteriâ & Bibliographicâ cum Catalogis Bibliothecarum',\n", + " 'Historia Academiarum, Scholarum, Vniversitatum, & Collegiorum',\n", + " 'De Academiis, Vniversitatibus, Scholis, Colleg. &c',\n", + " 'Icones, Vitæ, ac Elogia Illustrium Veterum',\n", + " 'Icones, Vitæ, ac Elogia Principum, & Illustrium Militiâ, Dignitatibusque Recentiorum',\n", + " 'Icones & Vitæ Recentiorum Principum, & Militiâ Dignitatibusque Illustr.',\n", + " 'Icones, Vitæ, ac Elogia Scientiis & Artibus Illustrium',\n", + " 'Icones ac Vitæ Recentiorum Principum, & Militiâ Dignitatibusque Illustr.',\n", + " 'Icones ac Vitæ Recentior. Principum, & Militiâ Dignitatibusque Illustrium',\n", + " 'Icones & Vitæ Veterum Ill. Græcor. ac Romanor.',\n", + " 'Icones & Vitæ Veterum Ill. Græcorum ac Roman.',\n", + " 'Icones & Vitæ Veterum Ill. Græcor. & Roman.',\n", + " 'Icones ac Vitæ Scientiis & Artibus Illustrium',\n", + " 'Opera integra Pictorum, Sculptorum, & Chalcographorum',\n", + " 'Opera Integra Pictorum, Sculptorum & Cælatorum Ecole de Florence',\n", + " 'Opera Integra Pictorum, Sculptorum, & Cælator',\n", + " 'Imaginum Romæ in æs incisarum Collectio',\n", + " 'Imaginum Romæ Incisarum Collectio',\n", + " 'Imaginum Romæ Collectio',\n", + " 'Imaginum Pynacothecæ Regiæ Collectio',\n", + " 'Imaginum variarum Collectio',\n", + " 'Imagines Variæ Incisæ',\n", + " 'Effigierum in æs incisarum Collectio',\n", + " 'Imaginum delineatarum Collectio'\n", + " ]\n", + " textlines = self.XMLSources.PageXML.find_all('TextLine')\n", + " subcategories = []\n", + " subcategory_lines = []\n", + " for line in textlines:\n", + " l = Line(line)\n", + " text = l.Text\n", + " prepared_string = prepare_string(text)\n", + " prep_text = re.sub('\\d', '', prepared_string)\n", + " # if a 4-digit number was removed from the text we're probably looking at a line from an entry\n", + " if len(prepared_string) - len(prep_text) > 3:\n", + " continue\n", + " # if there is no subcategory\n", + " # if prep_text == 'codicesmanuscripti' \\\n", + " # or prep_text == 'imaginesvariæincisæ' \\\n", + " # or prep_text =='effigierumincisarcollectio' \\\n", + " # or prep_text == 'imaginumdelineatarcollectio':\n", + " # subcategories.append(text)\n", + " # subcategory_lines.append(l)\n", + " # if category skip this line\n", + " if prep_text in prep_cats:\n", + " continue\n", + " prep_text_in_subcat = [prep_text in prepare_string(subcat) for subcat in true_subcategories]\n", + " # TODO: implement similarity comparison and location check\n", + " if sum(prep_text_in_subcat) and len(prep_text) > 3:\n", + " subcategories.append(text)\n", + " subcategory_lines.append(l)\n", + " return (subcategories, subcategory_lines)\n", + "\n", + "class Entries:\n", + " def __init__(self, Header, XMLSources):\n", + " self.Entries = self.group_entries(Header, XMLSources)\n", + " \n", + " def __str__(self):\n", + " entry_string = '\\n'\n", + " for entry in self.Entries:\n", + " # entry_string += f'Entry of length {len(entry)}:\\n'\n", + " for line in entry:\n", + " if entry.index(line) > 0:\n", + " entry_string += '\\t'\n", + " entry_string += f'{line}\\n'\n", + " entry_string += '\\n'\n", + " return entry_string\n", + " \n", + " def get_all_ids(self):\n", + " lines = []\n", + " for entry in self.Entries:\n", + " for line in entry:\n", + " lines.append(line)\n", + " IDs = [l.ID for l in lines]\n", + " return IDs\n", + " \n", + " def group_entries(self, Header, XMLSources):\n", + " entries = []\n", + " if Header.isValid:\n", + " all_lines = [Line(line) for line in XMLSources.PageXML.find_all('TextLine')]\n", + " header_ids = Header.get_all_ids()\n", + " no_header_lines = list(filter(lambda x: x.ID not in header_ids, all_lines))\n", + " sorted_lines = sorted(no_header_lines, key=lambda x: x.Baseline[0][1])\n", + " w, h = Header.get_width_height()\n", + " filter_lines = list(filter(lambda x: x.Baseline[0][0] < 0.4 * w, sorted_lines))\n", + " if not filter_lines:\n", + " return entries\n", + " bl_centers_x = [np.mean(l.Baseline, axis=0)[0] for l in filter_lines]\n", + " bl_left_x = [l.Baseline[0][0] for l in filter_lines]\n", + " # print(bl_centers_x)\n", + " bl_left_x_mean = np.mean(bl_left_x)\n", + " # print('bl_left_x_mean:', bl_left_x_mean)\n", + " left_outliers_removed = []\n", + " for line, center, left in zip(filter_lines, bl_centers_x, bl_left_x):\n", + " if (center > bl_left_x_mean + 50 and left < bl_left_x_mean + 700):\n", + " left_outliers_removed.append(line)\n", + " filter_coord = [line.Baseline[0][0] for line in left_outliers_removed]\n", + " if not filter_coord:\n", + " return entries\n", + " X = np.array(filter_coord)[:, np.newaxis]\n", + " # for line in left_outliers_removed:\n", + " # print(line)\n", + " # print(X)\n", + " gm = GaussianMixture(n_components=2, random_state=42).fit(X)\n", + " preds = gm.predict(X)\n", + " # print(gm.means_)\n", + " # print(preds)\n", + " beg_marker = int(not (gm.means_[0, 0] < gm.means_[1, 0]))\n", + " # print(beg_marker)\n", + " # print('Means:', gm.means_[0][0], gm.means_[1][0])\n", + " # print('Covariances:', gm.covariances_[0, 0, 0], gm.covariances_[1, 0, 0])\n", + " for line, pred in zip(left_outliers_removed, preds):\n", + " if pred == beg_marker or left_outliers_removed.index(line) == 0:\n", + " entries.append([line])\n", + " else:\n", + " entries[-1].append(line)\n", + " return entries\n", + "\n", + "class RemainingLines:\n", + " def __init__(self, Header, Entries, XMLSources):\n", + " self.Lines = self.get_remaining_lines(Header, Entries, XMLSources)\n", + " \n", + " def __str__(self):\n", + " rem_string = 'Remaining Lines:\\n'\n", + " for line in self.Lines:\n", + " rem_string += f'{line}\\n'\n", + " return rem_string\n", + " \n", + " def get_remaining_lines(self, Header, Entries, XMLSources):\n", + " all_lines = [Line(line) for line in XMLSources.PageXML.find_all('TextLine')]\n", + " header_ids = Header.get_all_ids()\n", + " no_header_lines = list(filter(lambda x: x.ID not in header_ids, all_lines))\n", + " entry_ids = Entries.get_all_ids()\n", + " no_entry_lines = list(filter(lambda x: x.ID not in entry_ids, no_header_lines))\n", + " return no_entry_lines\n", + "\n", + "class XMLSources:\n", + " def __init__(self, page_string, tei_string):\n", + " with open(page_string, 'r') as page_xml:\n", + " content = page_xml.readlines()\n", + " content = \"\".join(content)\n", + " bs_content = bs(content, \"lxml-xml\")\n", + " self.PageXML = bs_content\n", + " with open(tei_string, 'r') as tei_xml:\n", + " content = tei_xml.readlines()\n", + " content = \"\".join(content)\n", + " bs_content = bs(content, \"lxml-xml\")\n", + " self.TEIXML = bs_content\n" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "d0100237-c1ee-4771-9f78-fc42877e259a", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filename: 14.376_00000025.jpeg\n", + "Page number(s): 1\n", + "Format: in folio\n", + "Category: Theologia\n", + "Subcategory: Textus & Versiones S. Scripturæ\n", + "\n", + "1 Biblia Sacra Polyglotta curis Cardinalis Ximenij¬\n", + "\tedita, cum Vocabulario Hebraïco & Chaldaïco veteris\n", + "\tTestamenti. 5 Vol. Compluti. 1515. & annis Seqq.\n", + "\tGuill. de Brocario. n. 84. Integra biblia sunt V. volumini=\n", + "\tbus comprehensa. deest Vocabularium, quod pro sexto numeratur.\n", + "\n", + "2 Biblia Sacra Polyglotta Philippi II. Regis Cathol. pietate,\n", + "\tac # Studio ad Sacro- Sanctæ Ecclesiæ usum edita, cum\n", + "\tApparatu & Lexico. 8 Vol. Antuerp. 1572. Plantin.\n", + "\tn. 9.\n", + "\n", + "3 Biblia Sacra Polyglotta Studio & curâ Briani Waltoni\n", + "\tedita. 6 Vol. chartâ Magnâ. Londini. 1637. Roycroft.\n", + "\taccedit n. 36.\n", + "\tLexicon Heptaglotton ad eadem Biblia Polyglotta\n", + "\tautore Edmundo Castello. 2 Vol. chartâ M. Londini.\n", + "\t1669. Roycroft. N. 36.\n", + "\n", + "4 Biblia Sacra Latina Moguntina dicta, prima omnium\n", + "\teditio in Membranis. 2 Vol. Moguntiæ. 1462.¬\n", + "\tIoan. Fust, & Petr. Schoiffer de Gerneshem. n. 2088. II.O.5.\n", + "\n", + "5 Biblia Sacra Latina Moguntina, editio altera 2 Vol.\n", + "\tchartâ Magnâ. Moguntiæ. 1472. Petr. Schoiffer. II.O.7.\n", + "\tde Gerneshem. n. 2089.\n", + "\n", + "6 Biblia Sacra Latina cum glossa & Comment. 4 Vol.\n", + "\tchartâ Magnâ. Editio perantiqua sine loco & II.O.1.\n", + "\tanno n. 2086.\n", + "\n", + "7 Biblia Sacra latina vulgatæ Editionis. 2 Vol. chartâ III.B.3.\n", + "\tMagnâ. 1474. absque loco Editionis n. 2090.\n", + "\n", + "8 Biblia Sacra Latina cum Evangelistarum Canonibus III.B.7.\n", + "\t& concordantiis. chartâ M. Coloniæ. 1479. de Homborch. n. 2093.\n", + "\n", + "\n", + "Remaining Lines:\n", + "# Benedicti\n", + "Arriæ Montani\n", + "\n" + ] + } + ], + "source": [ + "# TODO: continue correcting headings here\n", + "page = Page('data/tei-xml/14.376/14.376_00000025.xml', 'data/tei-xml/old/codex_14_376_up_to_30_tei.xml')\n", + "print(page)\n", + "print(page.Entries)\n", + "print(page.RemainingLines)" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "e9741a33-f921-40f3-9bc7-6b8b2e28fc27", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filename: 14.376_00000027.jpeg\n", + "Page number(s): 3\n", + "Format: in folio\n", + "Category: Theologia\n", + "Subcategory: Textus & Versiones S. Scripturæ\n", + "\n", + "16 La Sacra Biblia tradotta dall'Ebraico in Italiana\n", + "\tlingua con commento per Ant. Bruccioli. 6 Vol. in\n", + "\t4 Tom. in Venetia. 1544. Franc. Bruccioli. n. 164.\n", + "\n", + "17 La Sacra Biblia tradotta in Italiano e commentata\n", + "\tda Giov: Diodati, coll'aggiunta de Sacri Salmi\n", + "\tmessi in rime dal medesimo. in Geneva. 1641. n. 163.\n", + "\n", + "18 La S.e Bible historiée dite d'Escholatre avec des fig.\n", + "\tgravées en bois. 2 Vol. sans datte. Barthel. Verard. n. 165.\n", + "\n", + "19 La S.te Bible traduite en françois par Rob. Olivetan\n", + "\tgrand Pap. Neufchatel. 1535. Pierre de Wingle dit\n", + "\tPirot Picard. n. 86.\n", + "\n", + "20 Biblia Sacra germanicè Scripta cum figuris. 2 Vol.\n", + "\tchartâ M. Norimbergæ. 1483. ant. Koberger. n. 2097. VI.D.20.\n", + "\n", + "21 Biblia Sacra germanicè Scripta Martino Luthero\n", + "\teditore cum figuris coloribus adornatis. 2 Vol. Wittemb.\n", + "\t1545. hans Lufft. n. 87.\n", + "\n", + "22 Biblia Sacra germanicè Mss. in Membranis cum\n", + "\tfiguris pictis. n. II.\n", + "\n", + "23 Biblia Sacra Hollandicé Mss. in Membranis cum fig.\n", + "\tpictis. 2 Vol. n. III.\n", + "\n", + "24 Biblia Sacra, Linguâ Valachâ Scripta. chartâ M.\n", + "\tBukurestini. 1688. n. 11.\n", + "\n", + "25 Historia Veteris ac Novi Testamenti MS. in Membranis\n", + "\tcum innumeris ferè Imaginibus miniatè depictis. n. 1.\n", + "\n", + "\n", + "Remaining Lines:\n", + "\n" + ] + } + ], + "source": [ + "page = Page('data/tei-xml/14.376/14.376_00000027.xml', 'data/tei-xml/old/codex_14_376_up_to_30_tei.xml')\n", + "print(page)\n", + "print(page.Entries)\n", + "print(page.RemainingLines)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "25e8978d-c62f-4b4c-88e1-be9f2c2b80c2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "page_dir_14376 = pathlib.Path('data/tei-xml/14.376')\n", + "pages_14376 = []\n", + "\n", + "for xml in page_dir_14376.glob('*.xml'):\n", + " try:\n", + " pages_14376.append(Page(xml, 'data/tei-xml/old/codex_14_376_up_to_30_tei.xml'))\n", + " except Exception as e:\n", + " print(xml)\n", + " print(e)\n", + "# pages = sorted(pages, key=(lambda x: int(x.Header.PageNumber[0][0])))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "57168e21-394a-44ed-b8e1-632a7ad76863", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "page_dir_14377 = pathlib.Path('data/tei-xml/14.377')\n", + "pages_14377 = []\n", + "\n", + "for xml in page_dir_14377.glob('*.xml'):\n", + " try:\n", + " pages_14377.append(Page(xml, 'data/tei-xml/old/codex_14_376_up_to_30_tei.xml'))\n", + " except Exception as e:\n", + " print(xml)\n", + " print(e)" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "edc2700e-7590-4f7f-a773-b6363552b473", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "page_dir_14378 = pathlib.Path('data/tei-xml/14.378')\n", + "pages_14378 = []\n", + "\n", + "for xml in page_dir_14378.glob('*.xml'):\n", + " try:\n", + " pages_14378.append(Page(xml, 'data/tei-xml/old/codex_14_376_up_to_30_tei.xml'))\n", + " except Exception as e:\n", + " print(xml)\n", + " print(e)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "0f1f3087-81c9-451c-81bb-2f2e59d29d96", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total: 451 pages\n", + "Valid header: 434 pages\n", + "Invalid header: 17 pages\n" + ] + } + ], + "source": [ + "invalid_pages_14376 = list(filter(lambda x: not x.Header.isValid, pages_14376))\n", + "print('Total:', len(pages_14376), 'pages')\n", + "print('Valid header:', len(pages_14376) - len(invalid_pages_14376), 'pages')\n", + "print('Invalid header:', len(invalid_pages_14376), 'pages')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "46836c45-0926-456b-bf94-a1ac07462e21", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total: 450 pages\n", + "Valid header: 440 pages\n", + "Invalid header: 10 pages\n" + ] + } + ], + "source": [ + "invalid_pages_14377 = list(filter(lambda x: not x.Header.isValid, pages_14377))\n", + "print('Total:', len(pages_14377), 'pages')\n", + "print('Valid header:', len(pages_14377) - len(invalid_pages_14377), 'pages')\n", + "print('Invalid header:', len(invalid_pages_14377), 'pages')" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "5e3b7597-72b0-4e06-a6fc-be069dfa9b7a", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total: 565 pages\n", + "Valid header: 556 pages\n", + "Invalid header: 9 pages\n" + ] + } + ], + "source": [ + "invalid_pages_14378 = list(filter(lambda x: not x.Header.isValid, pages_14378))\n", + "print('Total:', len(pages_14378), 'pages')\n", + "print('Valid header:', len(pages_14378) - len(invalid_pages_14378), 'pages')\n", + "print('Invalid header:', len(invalid_pages_14378), 'pages')\n", + "sorted_pages_14378 = sorted(pages_14378, key=lambda x: x.get_filename())\n", + "sorted_invalid_pages_14378 = sorted(invalid_pages_14378, key=lambda x: x.get_filename())" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "f18d74ec-63ac-4950-a1d8-89ab3c42849e", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "14.378_00000280.jpeg\n", + "14.378_00000328.jpeg\n", + "14.378_00000009.jpeg\n" + ] + } + ], + "source": [ + "def has_empty_header(page):\n", + " p_num = page.Header.PageNumber[0]\n", + " p_format = page.Header.Format[0]\n", + " p_cat = page.Header.Category[0]\n", + " p_subcat = page.Header.Subcategory[0]\n", + " return p_num + p_format + p_cat + p_subcat == []\n", + "\n", + "empty_headers = []\n", + "for page in invalid_pages_14378:\n", + " if has_empty_header(page):\n", + " empty_headers.append(page)\n", + "\n", + "for page in empty_headers:\n", + " print(page.XMLSources.PageXML.find_all('Page')[0].attrs['imageFilename'])" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "c92c8f90-ac4e-49eb-9d76-786ee0fc6ee3", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "14.378_00000009.jpeg\n", + "14.378_00000011.jpeg\n", + "14.378_00000279.jpeg\n", + "14.378_00000280.jpeg\n", + "14.378_00000317.jpeg\n", + "14.378_00000327.jpeg\n", + "14.378_00000328.jpeg\n", + "14.378_00000487.jpeg\n", + "14.378_00000531.jpeg\n" + ] + } + ], + "source": [ + "for page in sorted_invalid_pages_14378:\n", + " print(page.get_filename())\n", + " # print(page.Header.Format[0])\n", + " # if not page.Header.Format[0]:\n", + " # print(page.get_filename())" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "1b9ba554-0903-4367-b966-86ae213d59c5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "345\n", + "123\n", + "456\n", + "456\n" + ] + } + ], + "source": [ + "def extract_number(page_number_array):\n", + " pg_nums = page_number_array[0]\n", + " for num in pg_nums:\n", + " num_str = re.sub('\\*+|⁎+|X+', '', num)\n", + " if not num_str:\n", + " continue\n", + " parsed_num = int(num_str)\n", + " return parsed_num\n", + "\n", + "print(extract_number([['345', '*'], ['asdf', 'qwer']]))\n", + "print(extract_number([['**', '123'], ['asdf', 'qwer']]))\n", + "print(extract_number([['456**'], ['asdf']]))\n", + "print(extract_number([['456⁎⁎'], ['asdf']]))\n", + "sorted_valid_pages_14376 = sorted(set(pages_14376) - set(invalid_pages_14376), key=lambda x: x.get_filename())\n", + "sorted_valid_pages_14377 = sorted(set(pages_14377) - set(invalid_pages_14377), key=lambda x: x.get_filename())\n", + "sorted_valid_pages_14378 = sorted(set(pages_14378) - set(invalid_pages_14378), key=lambda x: x.get_filename())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9556eaa9-ba80-4960-a5f6-d351dc59fcab", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "for page in sorted_valid_pages_14378:\n", + " rem_page_str = str(page.RemainingLines)\n", + " if rem_page_str != 'Remaining Lines:\\n':\n", + " print(page.get_filename())\n", + " print(rem_page_str)" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "dddc2174-31a8-4165-80b7-ea519ccefb2e", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "for page in sorted_valid_pages_14378:\n", + " if len(page.Header.Format[0]) > 2 or len(page.Header.PageNumber[0]) > 2 or len(page.Header.Category[0]) > 1 or len(page.Header.Subcategory[0]) > 3:\n", + " print(page.XMLSources.PageXML.find_all('Page')[0].attrs['imageFilename'])" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "69fecbc7-77c2-4056-ba53-22a0a677c396", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# filenames where grouping entries failed:\n", + "failed_names_14376 = [\n", + " '14.376_00000049.jpeg',\n", + " '14.376_00000100.jpeg',\n", + " '14.376_00000104.jpeg',\n", + " '14.376_00000114.jpeg',\n", + " '14.376_00000127.jpeg',\n", + " '14.376_00000129.jpeg',\n", + " '14.376_00000133.jpeg',\n", + " '14.376_00000134.jpeg',\n", + " '14.376_00000182.jpeg',\n", + " '14.376_00000221.jpeg',\n", + " '14.376_00000226.jpeg',\n", + " '14.376_00000249.jpeg',\n", + " '14.376_00000270.jpeg',\n", + " '14.376_00000284.jpeg',\n", + " '14.376_00000297.jpeg',\n", + " '14.376_00000301.jpeg',\n", + " '14.376_00000324.jpeg',\n", + " '14.376_00000328.jpeg',\n", + " '14.376_00000338.jpeg',\n", + " '14.376_00000371.jpeg',\n", + " '14.376_00000381.jpeg',\n", + " '14.376_00000399.jpeg',\n", + " '14.376_00000414.jpeg',\n", + " '14.376_00000428.jpeg',\n", + " '14.376_00000438.jpeg',\n", + " '14.376_00000441.jpeg',\n", + " '14.376_00000443.jpeg'\n", + "]\n", + "\n", + "failed_names_14377 = [\n", + " '14.377_00000017.jpeg',\n", + " '14.377_00000025.jpeg',\n", + " '14.377_00000054.jpeg',\n", + " '14.377_00000064.jpeg',\n", + " '14.377_00000078.jpeg',\n", + " '14.377_00000079.jpeg',\n", + " '14.377_00000093.jpeg',\n", + " '14.377_00000096.jpeg',\n", + " '14.377_00000097.jpeg',\n", + " '14.377_00000098.jpeg',\n", + " '14.377_00000112.jpeg',\n", + " '14.377_00000122.jpeg',\n", + " '14.377_00000129.jpeg',\n", + " '14.377_00000130.jpeg',\n", + " '14.377_00000131.jpeg',\n", + " '14.377_00000132.jpeg',\n", + " '14.377_00000133.jpeg',\n", + " '14.377_00000134.jpeg',\n", + " '14.377_00000135.jpeg',\n", + " '14.377_00000136.jpeg',\n", + " '14.377_00000137.jpeg',\n", + " '14.377_00000138.jpeg',\n", + " '14.377_00000139.jpeg',\n", + " '14.377_00000153.jpeg',\n", + " '14.377_00000155.jpeg',\n", + " '14.377_00000172.jpeg',\n", + " '14.377_00000179.jpeg',\n", + " '14.377_00000180.jpeg',\n", + " '14.377_00000181.jpeg',\n", + " '14.377_00000186.jpeg',\n", + " '14.377_00000199.jpeg',\n", + " '14.377_00000231.jpeg',\n", + " '14.377_00000259.jpeg',\n", + " '14.377_00000273.jpeg',\n", + " '14.377_00000281.jpeg',\n", + " '14.377_00000291.jpeg',\n", + " '14.377_00000292.jpeg',\n", + " '14.377_00000294.jpeg',\n", + " '14.377_00000295.jpeg',\n", + " '14.377_00000329.jpeg',\n", + " '14.377_00000366.jpeg',\n", + " '14.377_00000386.jpeg',\n", + " '14.377_00000387.jpeg',\n", + " '14.377_00000392.jpeg',\n", + " '14.377_00000407.jpeg',\n", + " '14.377_00000433.jpeg',\n", + "]\n", + "\n", + "failed_names_14378 = [\n", + " '14.378_00000015.jpeg',\n", + " '14.378_00000059.jpeg',\n", + " '14.378_00000064.jpeg',\n", + " '14.378_00000076.jpeg',\n", + " '14.378_00000079.jpeg',\n", + " '14.378_00000091.jpeg',\n", + " '14.378_00000101.jpeg',\n", + " '14.378_00000111.jpeg',\n", + " '14.378_00000125.jpeg',\n", + " '14.378_00000139.jpeg',\n", + " '14.378_00000147.jpeg',\n", + " '14.378_00000151.jpeg',\n", + " '14.378_00000152.jpeg',\n", + " '14.378_00000153.jpeg',\n", + " '14.378_00000155.jpeg',\n", + " '14.378_00000169.jpeg',\n", + " '14.378_00000171.jpeg',\n", + " '14.378_00000173.jpeg',\n", + " '14.378_00000205.jpeg',\n", + " '14.378_00000210.jpeg',\n", + " '14.378_00000246.jpeg',\n", + " '14.378_00000251.jpeg',\n", + " '14.378_00000258.jpeg',\n", + " '14.378_00000261.jpeg',\n", + " '14.378_00000266.jpeg',\n", + " '14.378_00000274.jpeg',\n", + " '14.378_00000282.jpeg',\n", + " '14.378_00000283.jpeg',\n", + " '14.378_00000310.jpeg',\n", + " '14.378_00000322.jpeg',\n", + " '14.378_00000388.jpeg',\n", + " '14.378_00000392.jpeg',\n", + " '14.378_00000393.jpeg',\n", + " '14.378_00000399.jpeg',\n", + " '14.378_00000408.jpeg',\n", + " '14.378_00000410.jpeg',\n", + " '14.378_00000433.jpeg',\n", + " '14.378_00000452.jpeg',\n", + " '14.378_00000461.jpeg',\n", + " '14.378_00000462.jpeg',\n", + " '14.378_00000465.jpeg',\n", + " '14.378_00000466.jpeg',\n", + " '14.378_00000498.jpeg',\n", + " '14.378_00000513.jpeg',\n", + " '14.378_00000529.jpeg',\n", + " '14.378_00000579.jpeg',\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "313f429d-25af-4dd1-b2b2-ee48d515b619", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "119\n" + ] + } + ], + "source": [ + "print(len(failed_names_14376 + failed_names_14377 + failed_names_14378))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "85aacdce-6686-46f7-9200-c77a87ac2569", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filename: 14.378_00000577.jpeg\n", + "Page number(s): 1397\n", + "Format: \n", + "Category: Imagines Variæ Incisæ\n", + "Subcategory: Imagines Variæ Incisæ\n", + "\n", + "CCLXXXIX Les Heros de la Ligue, ou la Procession Monacale conduite\n", + "\tpar Louis XIV. pour la conversion des Heretiques de\n", + "\tSon Royaume. in 4.° Paris. 1691. P. Peters n. 2249. in 42.\n", + "\n", + "CCXC Il Claustro di S. Michele nel boseo di Bologna dipinto\n", + "\tda Lodovico Carraccio ed Altri Maestri asciti dalla sua\n", + "\tSeuola, intagliato per Giac. Giovannini, e descritto\n", + "\tda Carlo Cesare Malvasia. in fol.° carta grande. in\n", + "\tBologna 1694. p-335- n. 881.\n", + "\n", + "CCXCI Vlisse all'Isola di Circe, figure Teatrali intagliate\n", + "\tper R. van Hoecke. n. 1366.\n", + "\n", + "CCXCII Palazzi antichi di Genova raccolti e disegnati da P.\n", + "\tPaolo Rubens, carta Maggiore. in Anversa. 1652.\n", + "\tGiac. Meursio. n. CCL.\n", + "\n", + "CCXCIII Le Fabriche e Vedute di Venezia disegnate ed intagliate\n", + "\tda Luca Carlevariis. in fol.° oblongo. in Venezia. 1703.\n", + "\tGiov. Batt. Finazzi. n. 1110.\n", + "\n", + "CCXCIV Il gran Teatro delle Pitture e Perspettive di Venezia.\n", + "\tdisegnate ed intagliate da'piu Eccellenti Professori.¬\n", + "\tin fol. carta grande 2 Vol. in 1. Tom in Venezia.\n", + "\t1720. Domenico Lovisa. n. CXCIII.\n", + "\n", + "CCXCV La Vita di S. Filippo di Neri espressa con Imagini da\n", + "\tGiac. Stella inventate, e da Christiano Sas intagliate.\n", + "\tin fol.° n. 1215.\n", + "\n", + "CCXCVI Feste fatte Sopra l'Arno per le Nozze del Principe di\n", + "\tToscana l'anno 1608. disegnatè da Giulio Parigi.\n", + "\tin fol.° in carta grande. n. CLXII.\n", + "\tLivre des Vales invené par Mr. Stella Caris 1667.\n", + "\tn. 1111.\n", + "\n", + "\n", + "Remaining Lines:\n", + "2\n", + "\n", + "Filename: 14.378_00000578.jpeg\n", + "Page number(s): 1398\n", + "Format: \n", + "Category: Imagines Variæ Incisæ.\n", + "Subcategory: Imagines Variæ Incisæ.\n", + "\n", + "CCXVII Gli Habiti di tutte le Parti del Mondo intagliati da\n", + "\tBartolomeo Grassi in fol.° oblongo. in Roma. 1585. n.1112\n", + "\n", + "CCXCVIII. Habiti delle Donne Venetiane intagliati in Rame da\n", + "\tGiac. Franco, con una descrizione breve. in 4.° oblong. n. 2020\n", + "\n", + "CCXCVIIII Plans des Maisons de plaisance de l’Etat de Milan, tres\n", + "\tgrand in fol.° Vol. non converte\n", + "\n", + "CCC Recueil de figures contenant differens Evenemens arrivés\n", + "\ten France pendant et depuis le Regne d’Henry II.¬\n", + "\ttres grand in fol.° oblong Sans datte. La Monpieles\n", + "\n", + "CCCI. Recueil d'Estampes gravées d'après les Tableaux des plus\n", + "\tbeaux Cabinets de France par les Soins de M.r Crozat.\n", + "\tin fol.° Tr Vol. 2\n", + "\tAmori sdegni et gielosie di Giunone Julio Bonatone\n", + "\tinventore. S. L. et A. n. 958.\n", + "\tScherzi d’amore espressi da Odoardo Fialetti, Venet.\n", + "\t1617. n. 959.\n", + "\tBakhuizen /:Ludolf/ Ob het Kunstig zeeschilderen,\n", + "\tAmsterd. 1701. n. 960.\n", + "\tLe Blond / La Gallerie de Ann. Carrache S. L et A. n. 957.\n", + "\tRecueil des Estampes S. L. et A. et sine Authore n. 956.\n", + "\tBerrettini (Pietro) Galleria, dipinta nel Palazzo del\n", + "\tPrencipe Pansilio. Roma S. A. n. 987.\n", + "\tvan Dyck (Ant:) Jcones Principum aliorumque in fol. C. M.\n", + "\tn. 986.\n", + "\tCarrache (Annibal) Diverse figure disegnate di pen=\n", + "\tna nell' hore di ricreatione. Roma 1646. n. 974.\n", + "\tComitium Gloriæ centum quâ Sanguine quâ virtute\n", + "\tillustrium Heroum per. El. Wideman. Aug. S. A. n. 976.\n", + "\tHistoire de Psiche et cupidon gravee sur les desseins\n", + "\tde Raphael par Aug. Venitien S. L et A. n. 975.\n", + "\tStrasburger Trachten von Mann und Weib 1680. n. 2250. 4.to\n", + "\tHuret / Gregor / Theatrum dolorum Jesu Christi, Paris 1664. n. CCLXXII.\n", + "\tPicart /: Bern:/ Jmpostures innocentes, ou recueil\n", + "\td’Estampes, &c. Amsterd. 1734. n. 987⁎\n", + "\n", + "\n", + "Remaining Lines:\n", + "\n", + "Filename: 14.378_00000579.jpeg\n", + "Page number(s): 1399\n", + "Format: \n", + "Category: Effigierum Incisar. Collectio\n", + "Subcategory: Effigierum Incisar. Collectio\n", + "\n", + "Recueil de Portraits en 216 Portefeüilles, savoir\n", + "\n", + "CCCII Des Anciens. 6\n", + "\n", + "CCCIII d'Italie. 31.\n", + "\n", + "CCCIV De France. 48.\n", + "\n", + "CCCV D'Allemagne. 61.\n", + "\n", + "CCCVI Des Paysbas Catholiques. 9.\n", + "\n", + "CCCVII Des Provinces Vnies. 10\n", + "\n", + "CCCVIII De Lorraine. 2\n", + "\n", + "CCCIX D'Espagne. 5.\n", + "\n", + "CCCX De Portugal. 2.\n", + "\n", + "CCCXI D'Angleterre. 13.\n", + "\n", + "CCCXII De Pologne. 2\n", + "\n", + "CCCXIII De Suede. 2.\n", + "\n", + "CCCXIV De Dannemarck. 2. I\n", + "\n", + "CCCXV D'Hongrie, Transylvanie, & Valachie. 3.\n", + "\n", + "CCCXVI De Turquie, Grece, & de l'Archipel. 1.\n", + "\n", + "CCCXVII D'Asie, d'Afrique, & d'Amerique. 1.\n", + "\n", + "\n", + "Remaining Lines:\n", + "\n", + "Filename: 14.378_00000580.jpeg\n", + "Page number(s): 1400\n", + "Format: \n", + "Category: Effigierum Incisar. Collectio\n", + "Subcategory: Effigierum Incisar. Collectio\n", + "\n", + "CCCXVIII D'Anciens Evêques, & d'Evêques in Partibus. 1.\n", + "\n", + "CCCXIX Des Ordres Religieux. 14.\n", + "\n", + "CCCXX Des Ordres Militaires. a la fin des Ordres Religieux\n", + "\n", + "CCCXXI Anonymes. 2.\n", + "\tCCCXXII En Petites Suittes. 1.\n", + "\tCCCXXIII De Comediens & figures Extraordinaires. 1.\n", + "\n", + "\n", + "Remaining Lines:\n", + "\n", + "Filename: 14.378_00000581.jpeg\n", + "Page number(s): 1401\n", + "Format: \n", + "Category: Imaginum Delineatar. Collectio\n", + "Subcategory: Imaginum Delineatar. Collectio\n", + "\n", + "CCCXXIV Vn Porte feuilles contenant des Desseins de differens\n", + "\tMaitres d'Italie, avec le Cataloque, savoir\n", + "\tde Raphaël & de Son Ecole.\n", + "\tde L'Ecole Florentine\n", + "\tde l'Ecole de Venise.\n", + "\tde L'Ecole de Lombardie\n", + "\tde L'Ecole de Bologne.\n", + "\tde L'Ecole de Sienne.\n", + "\n", + "CCCXXV Vn Portefeüilles contenant des Desseins de Maitres\n", + "\tde France, avec diverses Etudes faites d'apres des\n", + "\tTableaux de Raphael & de Michel-Ange par\n", + "\tun Anonyme, & le Cataloque. n. CCLXV. 2. Vol.\n", + "\n", + "CCCXXVI Vn Portefeüilles contenant des Desseins de Paÿsages\n", + "\tpar differens Maitres, avec le Cataloque.\n", + "\tIl y a dans ce Portefeüilles un grand Dessein de¬\n", + "\tIules Romain qui represente Thesée & Hercules¬\n", + "\tcombattans contre les Amazones, lequel n'a pu entrer\n", + "\tdans le Portefeüilles ou sont les autres Desseins de\n", + "\tce Maitre acause de sa grandeur. n. CCLIV.\n", + "\n", + "CCCXXVII Vn Portefeüilles contenant des Desseins de Paysages\n", + "\tpar differens Maitres, sans Cataloque. n. CCLXIX.\n", + "\n", + "CCCXXVIII Vn Portefeüilles contenant des dessems de plusieurs¬\n", + "\tgenres par differens Maitres, Sans Cataloque. n. 891\n", + "\n", + "CCCXXIX Deux Portefeüilles contenans des Desseins de Fleurs\n", + "\tpar Robert. n. 892.\n", + "\n", + "CCCXXX Vn Portefeüilles contenans des Desseins d'Oiseaux\n", + "\tpar Robert. n. 893. et 894\n", + "\n", + "\n", + "Remaining Lines:\n", + "\n", + "Filename: 14.378_00000582.jpeg\n", + "Page number(s): 1402\n", + "Format: \n", + "Category: Imaginum Delineatar. Collectio\n", + "Subcategory: Imaginum Delineatar. Collectio\n", + "\n", + "CCCXXXI Vn Portefeüilles contenant des Desseins de plusieurs\n", + "\tVilles d'Espagne par Ant. Van-den-Wingarde.\n", + "\tdont il n'y a pas de Catalogue. n. 990.\n", + "\n", + "CCCXXXII Vn Recueil des Portraits peints en miniature sur velains\n", + "\tau nombres de 34. dont le Premier est celuy de\n", + "\n", + "mi n. 17\n", + "\tPhilippe le Hardy. n. CCIV.\n", + "\n", + "CCCXXXIII Dix Vol. de Plantes peintes en miniature par Nicol.\n", + "\tRobert. vide. Hist. Plantarum\n", + "\n", + "CCCXXXIV Cinq Vol. d'Oiseaux peints en Miniature par Nic.\n", + "\tRobert. vide. Histor. Animalium.\n", + "\n", + "CCCXXXV Divers Portraits, Ceremonies, Marches &c. des Turcs &\n", + "\td'autres nations du Levant, peints en miniature n. CCLXX.\n", + "\n", + "\n", + "Remaining Lines:\n", + "Teil von\n", + "Cod. mi n 41?\n", + "mi n. 53\n", + "mi n. 52\n", + "\n" + ] + } + ], + "source": [ + "x = 550\n", + "\n", + "for page in sorted_valid_pages_14378[x:x+50]:\n", + " print(page)\n", + " print(page.Entries)\n", + " print(page.RemainingLines)" + ] + }, + { + "cell_type": "markdown", + "id": "dfd319f6-268c-415a-95bb-bbbca979dfda", + "metadata": {}, + "source": [ + "# Counting number of entries" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "b08d2889-3dd3-4cb4-8cb5-2a297ee336c1", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2787 3105 3510 9402\n" + ] + } + ], + "source": [ + "count_14376 = 0\n", + "count_14377 = 0\n", + "count_14378 = 0\n", + "\n", + "for page in sorted_valid_pages_14376:\n", + " entries = page.Entries.Entries\n", + " count_14376 += len(entries)\n", + "\n", + "for page in sorted_valid_pages_14377:\n", + " entries = page.Entries.Entries\n", + " count_14377 += len(entries)\n", + " \n", + "for page in sorted_valid_pages_14378:\n", + " entries = page.Entries.Entries\n", + " count_14378 += len(entries)\n", + " \n", + "print(count_14376, count_14377, count_14378, count_14376 + count_14377 + count_14378)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0e18ec97-2c48-4625-99ba-f98051e7ec8c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Skripte/plot_WER.py b/Skripte/plot_WER.py index 1d051219e9807ab8c7fac0b412b06283d0f088e5..47bf9877bb499199a9b6ce452ecf405d71d5a8d0 100644 --- a/Skripte/plot_WER.py +++ b/Skripte/plot_WER.py @@ -2,6 +2,11 @@ import matplotlib.pyplot as plt from matplotlib.patches import Rectangle import pandas as pd import numpy as np +from matplotlib import rc +#rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']}) +## for Palatino and other serif fonts use: +rc('font',**{'family':'serif','serif':['Palatino']}) +rc('text', usetex=True) WER_array = [['Modellname', 'Id', 'WER_A', 'WER_B'], ['German_Kurrent_17th-18th', 27457, 26.6, 30.3], @@ -13,14 +18,15 @@ WER_array = [['Modellname', 'Id', 'WER_A', 'WER_B'], WER_df = pd.DataFrame(WER_array[1:], columns=WER_array[0]) fig, ax = plt.subplots() -ax.bar(np.arange(6), WER_df['WER_A'], width=0.3, label='$\mathregular{WER}_\mathregular{all}$') -ax.bar(np.arange(6) + 0.3, WER_df['WER_B'], width=0.3, label='$\mathregular{WER}_{\{1, 3, 4\}}$') +ax.bar(np.arange(6), WER_df['WER_A'], width=0.3, label='$\mathrm{WER}_\mathrm{all}$') +ax.bar(np.arange(6) + 0.3, WER_df['WER_B'], width=0.3, label='$\mathrm{WER}_{\{1, 3, 4\}}$') plt.xticks(np.arange(6) + 0.15, WER_df['Id']) -plt.xlabel('Modell-Id') -plt.ylabel('WER [%]') -plt.title('Manuell bestimmte Wortfehlerraten auf dem Validierungs-Set') +# plt.xlabel('Modell-Id') +plt.xlabel('Model ID') +plt.ylabel('WER [\%]') +# plt.title('Manuell bestimmte Wortfehlerraten auf dem Validierungs-Set') +plt.title('Manually determined word error rates on the validation set') plt.legend(loc='upper right') - -# plt.savefig('../Bilder/WER_Validation.png', bbox_inches='tight', dpi=300) -plt.show() +plt.savefig('../img/documentation/WER_Validation_eng.png', bbox_inches='tight', dpi=300) +# plt.show() diff --git a/Skripte/plot_bounding_boxes.py b/Skripte/plot_bounding_boxes.py index 3da765d4f9d4614a93b248afdff16349fc0ab938..3da2c3d73f74627fec201f8510476b4d30dfb12e 100644 --- a/Skripte/plot_bounding_boxes.py +++ b/Skripte/plot_bounding_boxes.py @@ -2,8 +2,11 @@ import matplotlib.pyplot as plt from matplotlib.patches import Rectangle import pandas as pd import numpy as np +from matplotlib import rc +rc('font',**{'family':'serif','serif':['Palatino'], 'size': 14}) +rc('text', usetex=True) -bb_df = pd.read_csv('../Groundtruth/bounding_boxes.csv') +bb_df = pd.read_csv('../data/groundtruth/bounding_boxes.csv') bb_df['cent_x'] = bb_df.apply(lambda x: x['BB_x/w'] + x['BB_w/w']/2, axis=1) bb_df['cent_y'] = bb_df.apply(lambda x: x['BB_y/h'] + x['BB_h/h']/2, axis=1) @@ -36,11 +39,13 @@ ax.set(xlim=(0, 1), ylim=(0, 1)) ax.set_aspect(1.5) plt.gca().invert_yaxis() plt.title('Supralibros bounding boxes') -plt.xlabel('Normierte Breite') -plt.ylabel('Normierte Höhe') +# plt.xlabel('Normierte Breite') +plt.xlabel('Normalized width') +# plt.ylabel('Normierte Höhe') +plt.ylabel('Normalized height') -plt.show() -# plt.savefig('../Bilder/bounding_boxes.png', bbox_inches='tight', dpi=300) +# plt.show() +plt.savefig('../img/documentation/bounding_boxes_eng.png', bbox_inches='tight', dpi=300) print('Die Daten des 97% Quantil Rechtecks sind x,y,w,h =', average_x, average_y, hull_width, hull_height) print('Ausgedrueckt in Koordinaten fuer iiif ist das', (average_x - hull_width/2)*100, (average_y - hull_height/2)*100, hull_width*100, hull_height*100)