diff --git a/markup_my_version.ipynb b/markup_my_version.ipynb
new file mode 100644
index 0000000..f7944be
--- /dev/null
+++ b/markup_my_version.ipynb
@@ -0,0 +1,632 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import json\n",
+ "import pickle\n",
+ "from ipymarkup import show_box_markup\n",
+ "\n",
+ "import pandas as pd\n",
+ "from IPython.display import clear_output\n",
+ "\n",
+ "from modules.utils import get_diffs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "project_name = 'sf_upd'"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "config_path = f'out/{project_name}/config.json'\n",
+ "\n",
+ "config = {}\n",
+ "config['df_path'] = [f'out/{project_name}/data/df/df_tsusus.pickle']\n",
+ "config['spans_path'] = f'out/{project_name}/data/markup/spans_true_clean_tsusus.pickle'\n",
+ "config['spans_pred_path'] = f'out/{project_name}/data/markup/spans_pred.pickle'\n",
+ "\n",
+ "\n",
+ "with open(config_path, 'w', encoding='utf8') as config_file:\n",
+ " json.dump(config, config_file)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'df_path': ['out/sf_upd/data/df/df_tsusus.pickle'],\n",
+ " 'spans_path': 'out/sf_upd/data/markup/spans_true_clean_tsusus.pickle',\n",
+ " 'spans_pred_path': 'out/sf_upd/data/markup/spans_pred.pickle'}"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "with open(config_path,'r', encoding='utf8') as config_file:\n",
+ " config = json.load(config_file)\n",
+ "config"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Чтение данных \n",
+ "\n",
+ "* df содержит название документа и его текст;\n",
+ "* spans_true - название документа и разметку формата (<индекс начала>, <индекс конца>, <наименование сущности>);\n",
+ "* spans_pred - предсказание модели"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "602\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " file | \n",
+ " text | \n",
+ " file_short | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " Сч-ф_Роуминг_Сф за Февраль 2023, ка - БУ ОО МФ... | \n",
+ " Приложение № 1 к постановлению Правительства Р... | \n",
+ " Сч-ф_Роуминг_Сф за Февраль 2023, ка - БУ ОО МФ... | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " Сч-ф_Роуминг_Сф за Февраль 2023, ка - БУ ОО МФ... | \n",
+ " Предоставление в аренду нежилого\\nпомещения | \n",
+ " Сч-ф_Роуминг_Сф за Февраль 2023, ка - БУ ОО МФ... | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " УПД_Роуминг_Оплата КУ за Декабрь 2022 по дог. ... | \n",
+ " Счет-фактура № Э/64/100157 ОТ 31 декабря 2022 ... | \n",
+ " УПД_Роуминг_Оплата КУ за Декабрь 2022 по дог. ... | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " УПД_Роуминг_Оплата КУ за Декабрь 2022 по дог. ... | \n",
+ " Эл. энергия по нерегулируемой цене за\\n12.2022г. | \n",
+ " УПД_Роуминг_Оплата КУ за Декабрь 2022 по дог. ... | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " СФ_Роуминг_за Декабрь 2022, ка - БУ Сургутская... | \n",
+ " СЧЕТ-ФАКТУРА № ООГУ-0467 от 31.12.2022 приложе... | \n",
+ " СФ_Роуминг_за Декабрь 2022, ка - БУ Сургутская... | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " file \\\n",
+ "0 Сч-ф_Роуминг_Сф за Февраль 2023, ка - БУ ОО МФ... \n",
+ "1 Сч-ф_Роуминг_Сф за Февраль 2023, ка - БУ ОО МФ... \n",
+ "2 УПД_Роуминг_Оплата КУ за Декабрь 2022 по дог. ... \n",
+ "3 УПД_Роуминг_Оплата КУ за Декабрь 2022 по дог. ... \n",
+ "4 СФ_Роуминг_за Декабрь 2022, ка - БУ Сургутская... \n",
+ "\n",
+ " text \\\n",
+ "0 Приложение № 1 к постановлению Правительства Р... \n",
+ "1 Предоставление в аренду нежилого\\nпомещения \n",
+ "2 Счет-фактура № Э/64/100157 ОТ 31 декабря 2022 ... \n",
+ "3 Эл. энергия по нерегулируемой цене за\\n12.2022г. \n",
+ "4 СЧЕТ-ФАКТУРА № ООГУ-0467 от 31.12.2022 приложе... \n",
+ "\n",
+ " file_short \n",
+ "0 Сч-ф_Роуминг_Сф за Февраль 2023, ка - БУ ОО МФ... \n",
+ "1 Сч-ф_Роуминг_Сф за Февраль 2023, ка - БУ ОО МФ... \n",
+ "2 УПД_Роуминг_Оплата КУ за Декабрь 2022 по дог. ... \n",
+ "3 УПД_Роуминг_Оплата КУ за Декабрь 2022 по дог. ... \n",
+ "4 СФ_Роуминг_за Декабрь 2022, ка - БУ Сургутская... "
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = pd.DataFrame()\n",
+ "for path in config['df_path']:\n",
+ " df_ = pd.read_pickle(path)\n",
+ " df = pd.concat([df,df_])\n",
+ "df = df.reset_index(drop=True)\n",
+ "print(df.shape[0])\n",
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 71,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "with open(config['spans_path'],'rb') as f:\n",
+ " spans_true = pickle.load(f)\n",
+ " spans_true = {k: sorted(v) for k, v in spans_true.items()}\n",
+ "\n",
+ "with open(config['spans_pred_path'],'rb') as f:\n",
+ " spans_pred = pickle.load(f)\n",
+ " spans_pred = {k: sorted(v) for k, v in spans_pred.items()}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 80,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(374, 207, 374, 602)"
+ ]
+ },
+ "execution_count": 80,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "spans_true_diff, spans_pred_diff = get_diffs(spans_true, spans_pred, df)\n",
+ "\n",
+ "union_keys = spans_pred_diff.keys() | spans_true_diff.keys()\n",
+ "\n",
+ "len(spans_true_diff), len(spans_pred_diff), len(union_keys), len(spans_true)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 73,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#u2 = pd.Series(list(union_keys), index=range(1, 402))\n",
+ "\n",
+ "#with open('union_keys_todo.pickle', 'wb') as f:\n",
+ "# pickle.dump(u2, f)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 74,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "3\n"
+ ]
+ }
+ ],
+ "source": [
+ "with open('union_keys_todo.pickle','rb') as f:\n",
+ " u2 = pickle.load(f)\n",
+ "\n",
+ "with open('union_keys_all.pickle','rb') as f:\n",
+ " union_keys = pickle.load(f)\n",
+ "\n",
+ "num = u2.index[0]\n",
+ "\n",
+ "diff_files = set(list(df[df.file.isin(u2)]['file']))\n",
+ "\n",
+ "categories = {'1': 'ADDRESSBUYER',\n",
+ " '2': 'ADDRESSSELLER',\n",
+ " '3': 'ADDRESSSHIPPER',\n",
+ " '4': 'ADDROBJ',\n",
+ " '5': 'BPINN',\n",
+ " '6': 'BPKPP',\n",
+ " '7': 'BPNAME',\n",
+ " '8': 'CONTENT',\n",
+ " '9': 'CURRENCY',\n",
+ " '10': 'CURRENCYKOD',\n",
+ " '11': 'DOCDATE',\n",
+ " '12': 'DOGDATE',\n",
+ " '13': 'DOGNUM',\n",
+ " '14': 'INNBUYER',\n",
+ " '15': 'KPPBUYER',\n",
+ " '16': 'NAMEBUYER',\n",
+ " '17': 'PERIOD',\n",
+ " '18': 'SFNUM',\n",
+ " '19': 'SHIPPERNAME',\n",
+ " '20': 'SUMM'}\n",
+ "\n",
+ "idx = iter(u2.index)\n",
+ "print(len(u2))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 75,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def save_data(key, spans_true, spans_add, spans_del):\n",
+ " for key in spans_add.keys():\n",
+ " if key in spans_true.keys():\n",
+ " spans_true[key] = spans_add[key] + spans_true[key]\n",
+ " else:\n",
+ " spans_true[key] = spans_add[key]\n",
+ " \n",
+ " for key in spans_del.keys():\n",
+ " if key in spans_true.keys():\n",
+ " spans_true[key] = [x for x in spans_true[key] if x not in spans_del[key]]\n",
+ "\n",
+ " with open(config['spans_path'], 'wb') as f:\n",
+ " pickle.dump(spans_true, f)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 76,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def show_info(df, key, spans_pred_diff, spans_true_diff, spans_true):\n",
+ " text = df[df.file == key]['text'].values[0]\n",
+ " text = text.replace('\\n', ' ')\n",
+ "\n",
+ " print('Разметка модели целиком: ')\n",
+ " show_box_markup(text, spans_pred[key])\n",
+ "\n",
+ " \"\"\"\n",
+ " print('Разметка человека: ')\n",
+ " spans = spans_true_diff.get(key, [])\n",
+ " print(spans)\n",
+ " show_box_markup(text, spans)\n",
+ " \"\"\"\n",
+ "\n",
+ " print('Разметка человека целиком: ')\n",
+ " show_box_markup(text, spans_true[key])\n",
+ "\n",
+ " print('Исходный текст')\n",
+ " show_box_markup(text, [])\n",
+ "\n",
+ " return text"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 77,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def find_all_string_idx(text, s):\n",
+ " length = len(s)\n",
+ " count = 1\n",
+ " string_idx_in_text = {}\n",
+ " start_index_text = 0\n",
+ " while text[start_index_text:].find(s) != -1:\n",
+ " start_index = text[start_index_text:].find(s) + start_index_text\n",
+ " string_idx_in_text[f'{count}'] = start_index\n",
+ " count += 1\n",
+ " start_index_text = start_index + length\n",
+ " return string_idx_in_text"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Проверка"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### spans_true"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 85,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "СЧЕТ-ФАКТУРА № 132SFNUM от 31.12.2022DOCDATE приложение n 1 ИСПРАВЛЕНИЕ № - от - к nocrakopnecwiccopapvrrpaBg ОТ 26.12.2011 №1137 (в ред. Постановления Правительства РФ от 02.04.2021 N 534) Продавец: Новозыбковское районное потребительское обществоBPNAME Адрес: 243020, Брянская область, г. Новозыбков, ул. Советская, д. 18ADDRESSSELLER ИНН/КПП продавца: 3222000141BPINN/322201001BPKPP Грузоотправитель и его адрес: Новозыбковское районное потребительское обществоSHIPPERNAME, 243020, Брянская область, г. Новозыбков, ул. Советская, д. 18ADDRESSSHIPPER Грузополучатель и его адрес: - К платежно-расчетному документу: - Документ об отгрузке: № 132 от 31.12.2022 Покупатель: Публичное акционерное общество "Сбербанк России"NAMEBUYER Адрес: 117997, г. Москва, ул. Вавилова, д. 19ADDRESSBUYER ИНН/КПП покупателя: 7707083893INNBUYER/775002002KPPBUYER Валюта: наименование, код Российский рубльCURRENCY, 643CURRENCYKOD Идентификатор государственного контракта, договора (соглашения) (при наличии) 1 1 Всего к оплате 1 075.25SUMM X 215.05SUMM 1 290.30SUMM Руководитель Главный бухгалтер организации или иное или иное уполномоченное лицо электронно СЕМЕНЬКОВ ВАСИЛИЙ ИВАНОВИЧ уполномоченное лицо (подпись) (ф.и.о.) (подпись) (ф.и.о.) Индивидуальный предприниматель или иное уполномоченное лицо (подпись) (ф.и.о.) (Реквизиты свидетельства о государственной регистрации индивидуального предпринимателя)
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# key = 'УПД_Роуминг_Оплата ЭУ за Июнь 2022 по дог. 50003889985 от 20.10.2014 № 1_page000_text.html'\n",
+ "union_keys = list(union_keys)\n",
+ "key = union_keys[290]\n",
+ "text = df[df.file == key]['text'].values[0]\n",
+ "text = text.replace('\\n', ' ')\n",
+ "show_box_markup(text, spans_true[key])"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### spans_pred"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Приложение N 1 Счет-фактура № ООБГ-000005SFNUM ОТ 01 сентября 2022 Г. К постановлению Правительства Российской Федерации Исправление № - от - от 26.12.2011 №1137 (в ред. Постановления Правительства РФ от 02.04.2021 N 534) Продавец Муниципальное бюджетное учреждение "Административно - хозяйственное управлениеBPNAME" Адрес 140407, Московская область, Коломна г, Советская пл, д. 1, кв. 135ADDRESSSELLER ИНН/КПП продавца 5022059952BPINN/502201001BPKPP Грузоотправитель и его адрес: Грузополучатель и его адрес: К платежно-расчетному документу Документ об отгрузке: Покупатель СРЕДНЕРУССКИЙ БАНК ПАО СБЕРБАНКNAMEBUYER Адрес 117312, Москва г, вн.тер.г, муниципальный округ Донской, ул Вавилова, д. 19ADDRESSBUYER ИНН/КПП покупателя 7707083893INNBUYER/773643002KPPBUYER Валюта: наименование, код Российский рубльCURRENCY, код - 643CURRENCYKOD Идентификатор государственного контракта, договора (соглашения) (пои наличии 1 । Всего К оплате232.75SUMM X46.55SUMM 279.30SUMM Руководитель организации Главный бухгалтер или иное уполномоченное лицо электронно Маслов Евгений Алексеевич или иное уполномоченное лицо —ЛИСТаХ (подпись) (ф.и.о.) (подпись) (ф.и.о.) Индивидуальный предприниматель или иное уполномоченное лицо (подпись) (ф.и.о.) , v , 4 7 ' (реквизиты свидетельства о государственной регистрации индивидуального предпринимателя) Основание передачи (сдачи)/получения приемки Договор №1/2022DOGNUM от 20.07.2022 (договор; доверенность и др.) Данные о транспортировке и грузе (транспортная накладная, поручение экспедитору, экспедиторская/складская расписка и др./масса нетто/брутто груза, если не приведены ссылки на транспортные документы, содержащие эти сведения) Товар (груз) передал/услуги, результаты работ, права сдал Товар (груз) получил/услуги, результаты работ, права принял Директор электронно Маслов Евгений Алексеевич Руководитель направления электронно Рожков Владимир Александрович (должность) (подпись) (ф.и.о.) (должность) (подпись) (ф.и.о.) Должностные обязанности Дата получения (приемки) « 01 » сентября 20 22PERIOD г. Дата отгрузки, передачи (сдачи) « 01 » сентября 20 22PERIOD г. Иные сведения о получении, приемке Иные сведения об отгрузке, передаче Товар(груз) получил/успуги, результаты работ, права принял (информация о наличии/отсутствии претензии; ссылки на неотъемлемые приложения и другие документы и т. п.) (ссылки на неотъемлемые приложения, сопутствующие документы, иные документы и т. п.) Ответственный за правильность оформления факта хозяйственной жизни Ответственный за правильность оформления факта хозяйственной жизни Руководитель направления электронно Рожков Владимир Александрович Директор электронно Маслов Евгений Алексеевич (должность) (подпись) (ф.и.о.) (должность) (подпись) (ф.и.о.) Наименование экономического субъекта — составителя документа Наименование экономического субъекта — составителя документа (в т. ч. комиссионера/агента) ПАО СБЕРБАНК Муниципальное бюджетное учреждение "Административно - хозяйственное управление" (может не заполняться при проставлении печати в м. п., может быть указан инн/кпп)
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "key = 'Роуминг_оплата аренды с 20.07.2022г. по 31.07.2022г дог.50004220061 от 20.07. (2)_page000_text.html'\n",
+ "text = df[df.file == key]['text'].values[0]\n",
+ "text = text.replace('\\n', ' ')\n",
+ "show_box_markup(text, spans_pred[key])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 70,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "IndexError",
+ "evalue": "index 0 is out of bounds for axis 0 with size 0",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)",
+ "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python310\\site-packages\\pandas\\core\\indexes\\range.py:912\u001b[0m, in \u001b[0;36mRangeIndex.__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 911\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[1;32m--> 912\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_range[new_key]\n\u001b[0;32m 913\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mIndexError\u001b[39;00m \u001b[39mas\u001b[39;00m err:\n",
+ "\u001b[1;31mIndexError\u001b[0m: range object index out of range",
+ "\nThe above exception was the direct cause of the following exception:\n",
+ "\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[70], line 6\u001b[0m\n\u001b[0;32m 2\u001b[0m spans_del \u001b[39m=\u001b[39m {}\n\u001b[0;32m 4\u001b[0m \u001b[39mwhile\u001b[39;00m \u001b[39mTrue\u001b[39;00m:\n\u001b[1;32m----> 6\u001b[0m num \u001b[39m=\u001b[39m u2\u001b[39m.\u001b[39;49mindex[\u001b[39m0\u001b[39;49m]\n\u001b[0;32m 7\u001b[0m key \u001b[39m=\u001b[39m u2[num]\n\u001b[0;32m 9\u001b[0m new_spans \u001b[39m=\u001b[39m []\n",
+ "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python310\\site-packages\\pandas\\core\\indexes\\range.py:914\u001b[0m, in \u001b[0;36mRangeIndex.__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 912\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_range[new_key]\n\u001b[0;32m 913\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mIndexError\u001b[39;00m \u001b[39mas\u001b[39;00m err:\n\u001b[1;32m--> 914\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mIndexError\u001b[39;00m(\n\u001b[0;32m 915\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mindex \u001b[39m\u001b[39m{\u001b[39;00mkey\u001b[39m}\u001b[39;00m\u001b[39m is out of bounds for axis 0 with size \u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mlen\u001b[39m(\u001b[39mself\u001b[39m)\u001b[39m}\u001b[39;00m\u001b[39m\"\u001b[39m\n\u001b[0;32m 916\u001b[0m ) \u001b[39mfrom\u001b[39;00m \u001b[39merr\u001b[39;00m\n\u001b[0;32m 917\u001b[0m \u001b[39melif\u001b[39;00m is_scalar(key):\n\u001b[0;32m 918\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mIndexError\u001b[39;00m(\n\u001b[0;32m 919\u001b[0m \u001b[39m\"\u001b[39m\u001b[39monly integers, slices (`:`), \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 920\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mellipsis (`...`), numpy.newaxis (`None`) \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 921\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mand integer or boolean \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 922\u001b[0m \u001b[39m\"\u001b[39m\u001b[39marrays are valid indices\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 923\u001b[0m )\n",
+ "\u001b[1;31mIndexError\u001b[0m: index 0 is out of bounds for axis 0 with size 0"
+ ]
+ }
+ ],
+ "source": [
+ "spans_add = {}\n",
+ "spans_del = {}\n",
+ "\n",
+ "while True:\n",
+ "\n",
+ " num = u2.index[0]\n",
+ " key = u2[num]\n",
+ "\n",
+ " new_spans = []\n",
+ " del_spans = []\n",
+ " count = 0\n",
+ "\n",
+ " print(f'Документ: {num}/401\\n')\n",
+ " print(f'Ключ: {key}\\n')\n",
+ "\n",
+ " text = show_info(df, key, spans_pred_diff, spans_true_diff, spans_true)\n",
+ "\n",
+ " while True:\n",
+ " var = input('1 - ДОБАВИТЬ МЕТКУ, 2 - УДАЛИТЬ, 3 - ВЫБРАТЬ ФАЙЛ') or 'blank'\n",
+ " if var != 'blank':\n",
+ " if var == '1':\n",
+ " while True:\n",
+ " s = input('ВВЕДИТЕ ТЕКСТ РАЗМЕТКИ или ENTER: ') or 'blank'\n",
+ " if s != 'blank':\n",
+ " if text.find(s) != -1:\n",
+ " length = len(s)\n",
+ " if len(find_all_string_idx(text, s)) == 1:\n",
+ " start_index = text.find(s)\n",
+ " category = input(f'ВЫБЕРИТЕ КАТРЕГОРИЮ:\\n {categories}')\n",
+ " new_spans.append((start_index, start_index+length, categories[category]))\n",
+ " var_ = input('Продолжить добавление? 1 - ДА, 2 - НЕТ')\n",
+ " if var_ == '1':\n",
+ " continue\n",
+ " else:\n",
+ " spans_add[key] = new_spans\n",
+ " print(f'Итоговый текст {count}')\n",
+ " show_box_markup(text, [x for x in new_spans+spans_true[key] if x not in del_spans])\n",
+ " count += 1\n",
+ " break\n",
+ " else:\n",
+ " string_idx_in_text = find_all_string_idx(text, s) \n",
+ " idx_ = input(f'Выберите нужную строку: {string_idx_in_text}') or 'blank'\n",
+ " if idx_ != 'blank':\n",
+ " try:\n",
+ " start_index = string_idx_in_text[idx_]\n",
+ " category = input(f'ВЫБЕРИТЕ КАТРЕГОРИЮ:\\n {categories}')\n",
+ " new_spans.append((start_index, start_index+length, categories[category]))\n",
+ " var_ = input('Продолжить добавление? 1 - ДА, 2 - НЕТ')\n",
+ " except:\n",
+ " print('Указанной строки нет в списке')\n",
+ " if var_ == '1':\n",
+ " continue\n",
+ " else:\n",
+ " spans_add[key] = new_spans\n",
+ " print(f'Итоговый текст {count}')\n",
+ " show_box_markup(text, [x for x in new_spans+spans_true[key] if x not in del_spans])\n",
+ " count += 1\n",
+ " break\n",
+ " else:\n",
+ " pass\n",
+ " else:\n",
+ " var_ = input('Текст не найден. Повторить попытку? 1 - ДА, ОСТАЛЬНОЕ - НЕТ')\n",
+ " if var_ == '1':\n",
+ " continue\n",
+ " else: break\n",
+ " else: break\n",
+ " elif var == '2':\n",
+ " while True:\n",
+ " actual_spans_list = [x for x in new_spans+spans_true[key] if x not in del_spans]\n",
+ " print(f' Актуально: {actual_spans_list}')\n",
+ " del_span_index = input(f'Выберите метку для удаления или ENTER: \\\n",
+ " {[i for i in enumerate(actual_spans_list)]}') or 'blank'\n",
+ " if del_span_index != 'blank':\n",
+ " if del_span_index.isdigit():\n",
+ " del_spans.append(actual_spans_list[int(del_span_index)])\n",
+ " var_ = input('Продолжить удаление? 1 - ДА, 2 - НЕТ')\n",
+ " if var_ == '1':\n",
+ " continue\n",
+ " else:\n",
+ " spans_del[key] = del_spans\n",
+ " print(f'Итоговый текст {count}')\n",
+ " show_box_markup(text, [x for x in new_spans+spans_true[key] if x not in del_spans])\n",
+ " count += 1\n",
+ " break\n",
+ " else:\n",
+ " print('Ошибка ввода!')\n",
+ " continue\n",
+ " else: break\n",
+ " elif var == '3':\n",
+ " while True:\n",
+ " num_ = input('Введите номер ключа или ENTER, чтобы вернуть исходный: ') or 'blank'\n",
+ " if num_ != 'blank':\n",
+ " if num_.isdigit():\n",
+ " try:\n",
+ " key = union_keys[int(num_)]\n",
+ " clear_output()\n",
+ " print(f'Документ изменен на: {num_}/401\\n')\n",
+ " print(f'Ключ: {key}\\n')\n",
+ " text = show_info(df, key, spans_pred_diff, spans_true_diff, spans_true)\n",
+ " break\n",
+ " except:\n",
+ " print('Ошибка ввода! Указанного индекса нет в файле')\n",
+ " else:\n",
+ " print('Ошибка ввода! Вы ввели не число')\n",
+ " else:\n",
+ " key = u2[num]\n",
+ " print(f'Документ: {num}/401 (исходный)\\n')\n",
+ " break\n",
+ " else:\n",
+ " if key == u2[num]: break\n",
+ " else:\n",
+ " var_ = input(f'Редактирование документа {num_} завершено! 1 - Вернуться к разметке документа {num}, ENTER - завершить') or 'blank'\n",
+ " if var_ == '1':\n",
+ " save_data(key, spans_true, spans_add, spans_del) # не проверено\n",
+ " spans_add = {} # не проверено\n",
+ " spans_del = {} # не проверено\n",
+ " key == u2[num]\n",
+ " clear_output()\n",
+ " print(f'Документ изменен на исходный: {num}/401\\n')\n",
+ " print(f'Ключ: {key}\\n')\n",
+ " text = show_info(df, key, spans_pred_diff, spans_true_diff, spans_true)\n",
+ " else: break\n",
+ "\n",
+ " # сохранение данных\n",
+ " save_data(key, spans_true, spans_add, spans_del)\n",
+ "\n",
+ " spans_add = {}\n",
+ " spans_del = {}\n",
+ " \n",
+ " _var = input('ПРОДОЛЖИТЬ - 1, ЗАВЕРШИТЬ РАБОТУ - ENTER')\n",
+ " if _var == '1':\n",
+ " u2 = u2[1:]\n",
+ " clear_output()\n",
+ " else:\n",
+ " var_ = input('СОХРАНИТЬ ИНДЕКС НАЧАЛА - ENTER, 1 - ПРОПУСТИТЬ')\n",
+ " if var_ != '1':\n",
+ " with open('union_keys_todo.pickle', 'wb') as f:\n",
+ " pickle.dump(u2, f)\n",
+ " break"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.2"
+ },
+ "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}