From 5374e44c44181ee1c0473ae01f7ba30aed635dac Mon Sep 17 00:00:00 2001 From: Marius Ciepluch <11855163+norandom@users.noreply.github.com> Date: Thu, 21 Mar 2024 16:22:56 +0000 Subject: [PATCH] First status of bookworm --- EverNote_To_OpenAI.ipynb | 1432 ++++++++++++++++++++++++++++++++++++++ requirements.txt | 12 +- 2 files changed, 1443 insertions(+), 1 deletion(-) create mode 100644 EverNote_To_OpenAI.ipynb diff --git a/EverNote_To_OpenAI.ipynb b/EverNote_To_OpenAI.ipynb new file mode 100644 index 0000000..31a4681 --- /dev/null +++ b/EverNote_To_OpenAI.ipynb @@ -0,0 +1,1432 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "18d62071e34b0d53", + "metadata": { + "collapsed": false + }, + "source": [ + "# This is an experiment: create vectorized embeddings out of an EverNote DB (PDF, DOCX, HTML, TXT)\n", + "\n", + "* vectorize text, html files, pdfs and docx into one vector DB, split in tables (sqlite vss)\n", + "* use local self-hosted embeddings (CPU computed)\n", + " * for sentences \n", + "* query a local sqlite vss vector db, use cache from LangChain (sqlite)\n", + "* use OpenAI API and (Ollama op-prem self-hosted) Mistral for the response processing\n", + "* compare with LLMware Bling \n", + "\n", + "Due to cost reasons the OpenAI embeddings don't get used. So sorry :p " + ] + }, + { + "cell_type": "markdown", + "id": "a8c8692786d83c00", + "metadata": { + "collapsed": false + }, + "source": [ + "## Dependencies\n", + "\n", + "* Cryptography is used to handle some PDF functions here (signatures)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bb34db1ea75a1edf", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-21T15:10:31.827945Z", + "start_time": "2024-03-21T15:10:29.646399Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Name: cryptography\r\n", + "Version: 42.0.5\r\n", + "Summary: cryptography is a package which provides cryptographic recipes and primitives to Python developers.\r\n", + "Home-page: \r\n", + "Author: \r\n", + "Author-email: The Python Cryptographic Authority and individual contributors \r\n", + "License: Apache-2.0 OR BSD-3-Clause\r\n", + "Location: /home/marius/miniconda3/envs/llm_langchain/lib/python3.11/site-packages\r\n", + "Requires: cffi\r\n", + "Required-by: \r\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip show cryptography" + ] + }, + { + "cell_type": "markdown", + "id": "297746c807e95fbf", + "metadata": { + "collapsed": false + }, + "source": [ + "* pikepdf is used to repair some PDFs" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ebc8af0183532fc2", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-21T15:12:47.900384Z", + "start_time": "2024-03-21T15:12:45.782477Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Name: pikepdf\r\n", + "Version: 8.13.0\r\n", + "Summary: Read and write PDFs with Python, powered by qpdf\r\n", + "Home-page: \r\n", + "Author: \r\n", + "Author-email: \"James R. Barlow\" \r\n", + "License: MPL-2.0\r\n", + "Location: /home/marius/miniconda3/envs/llm_langchain/lib/python3.11/site-packages\r\n", + "Requires: Deprecated, lxml, packaging, Pillow\r\n", + "Required-by: \r\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip show pikepdf" + ] + }, + { + "cell_type": "markdown", + "id": "7c7a7f6b0db3719e", + "metadata": { + "collapsed": false + }, + "source": [ + "* pypdf with all features is needed because this DB consists of 100+ PDFs " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "779f81e2ab00f73c", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-21T15:17:00.760871Z", + "start_time": "2024-03-21T15:16:58.635484Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Name: pypdf\r\n", + "Version: 4.0.2\r\n", + "Summary: A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files\r\n", + "Home-page: \r\n", + "Author: \r\n", + "Author-email: Mathieu Fenniak \r\n", + "License: \r\n", + "Location: /home/marius/miniconda3/envs/llm_langchain/lib/python3.11/site-packages\r\n", + "Requires: \r\n", + "Required-by: \r\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip show \"pypdf\"" + ] + }, + { + "cell_type": "markdown", + "id": "ce1350d2d6e3ed63", + "metadata": { + "collapsed": false + }, + "source": [ + "## Text extraction\n", + "\n", + "* Here the html and text data is extracted into one txt\n", + "* The PDF and DOCX data is extracted into another txt\n", + "* the texts are normalized\n", + "* different encodings get handled\n", + "* difficult files get repaired\n", + "* exceptions get handled (UTF-16 issues, PDF reference errors)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "b557444b8b1d4839", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-17T15:34:05.847778Z", + "start_time": "2024-03-17T15:25:49.787814Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋| 4868/4877 [04:02<00:00, 20.10it/s]\u001b[A\n", + "\n", + "Processing files: 0%| | 1/4877 [00:00<16:09, 5.03it/s]\u001b[A\n", + "Processing files: 5%|███████▎ | 221/4877 [00:00<00:06, 731.58it/s]\u001b[A\n", + "Processing files: 6%|█████████▊ | 301/4877 [00:01<00:30, 149.67it/s]\u001b[A\n", + "Processing files: 7%|███████████▍ | 348/4877 [00:02<00:42, 105.60it/s]\u001b[A\n", + "Processing files: 8%|████████████▍ | 378/4877 [00:03<00:46, 97.05it/s]\u001b[A\n", + "Processing files: 8%|█████████████▏ | 400/4877 [00:03<00:50, 89.38it/s]\u001b[A\n", + "Processing files: 9%|█████████████▊ | 417/4877 [00:04<01:14, 59.57it/s]\u001b[A\n", + "Processing files: 9%|██████████████▏ | 429/4877 [00:04<01:12, 61.35it/s]\u001b[A\n", + "Processing files: 9%|██████████████▌ | 440/4877 [00:04<01:13, 60.08it/s]\u001b[A\n", + "Processing files: 9%|██████████████▊ | 449/4877 [00:04<01:13, 59.90it/s]\u001b[A\n", + "Processing files: 9%|███████████████ | 457/4877 [00:04<01:13, 59.74it/s]\u001b[A\n", + "Processing files: 10%|███████████████▎ | 465/4877 [00:05<01:23, 53.14it/s]\u001b[A\n", + "Processing files: 10%|███████████████▌ | 472/4877 [00:05<01:24, 52.08it/s]\u001b[A\n", + "Processing files: 10%|███████████████▊ | 478/4877 [00:05<01:23, 52.37it/s]\u001b[A\n", + "Processing files: 10%|███████████████▉ | 484/4877 [00:05<01:40, 43.93it/s]\u001b[A\n", + "Processing files: 10%|████████████████▏ | 490/4877 [00:05<01:34, 46.36it/s]\u001b[A\n", + "Processing files: 10%|████████████████▍ | 497/4877 [00:05<01:26, 50.42it/s]\u001b[A\n", + "Processing files: 10%|████████████████▊ | 510/4877 [00:05<01:07, 65.13it/s]\u001b[A\n", + "Processing files: 11%|█████████████████ | 518/4877 [00:06<01:12, 59.99it/s]\u001b[A\n", + "Processing files: 11%|█████████████████▍ | 527/4877 [00:06<01:09, 62.34it/s]\u001b[A\n", + "Processing files: 11%|█████████████████▋ | 534/4877 [00:06<01:25, 50.93it/s]\u001b[A\n", + "Processing files: 11%|█████████████████▊ | 540/4877 [00:06<01:31, 47.22it/s]\u001b[A\n", + "Processing files: 11%|██████████████████ | 546/4877 [00:06<01:29, 48.47it/s]\u001b[A\n", + "Processing files: 11%|██████████████████▏ | 552/4877 [00:06<01:42, 42.22it/s]\u001b[A\n", + "Processing files: 11%|██████████████████▍ | 557/4877 [00:07<01:46, 40.47it/s]\u001b[A\n", + "Processing files: 12%|██████████████████▌ | 562/4877 [00:07<01:46, 40.50it/s]\u001b[A\n", + "Processing files: 12%|██████████████████▋ | 567/4877 [00:07<01:49, 39.28it/s]\u001b[A\n", + "Processing files: 12%|██████████████████▉ | 572/4877 [00:07<01:55, 37.37it/s]\u001b[A\n", + "Processing files: 12%|███████████████████ | 576/4877 [00:07<02:11, 32.80it/s]\u001b[A\n", + "Processing files: 12%|███████████████████▏ | 580/4877 [00:07<02:31, 28.42it/s]\u001b[A\n", + "Processing files: 12%|███████████████████▏ | 583/4877 [00:08<02:36, 27.52it/s]\u001b[A\n", + "Processing files: 12%|███████████████████▎ | 586/4877 [00:08<02:34, 27.77it/s]\u001b[A\n", + "Processing files: 12%|███████████████████▍ | 589/4877 [00:08<03:01, 23.58it/s]\u001b[A\n", + "Processing files: 13%|████████████████████▏ | 612/4877 [00:08<01:03, 67.43it/s]\u001b[A\n", + "Processing files: 13%|████████████████████▍ | 620/4877 [00:08<01:09, 61.13it/s]\u001b[A\n", + "Processing files: 13%|████████████████████▋ | 628/4877 [00:08<01:06, 63.84it/s]\u001b[A\n", + "Processing files: 13%|████████████████████▉ | 636/4877 [00:08<01:23, 51.04it/s]\u001b[A\n", + "Processing files: 13%|█████████████████████▏ | 643/4877 [00:09<01:22, 51.24it/s]\u001b[A\n", + "Processing files: 13%|█████████████████████▌ | 655/4877 [00:09<01:04, 65.29it/s]\u001b[A\n", + "Processing files: 14%|█████████████████████▉ | 665/4877 [00:09<00:59, 70.60it/s]\u001b[A\n", + "Processing files: 14%|██████████████████████▏ | 673/4877 [00:09<02:00, 34.76it/s]\u001b[A\n", + "Processing files: 14%|██████████████████████▍ | 679/4877 [00:09<01:56, 36.01it/s]\u001b[A\n", + "Processing files: 14%|██████████████████████▋ | 688/4877 [00:10<01:37, 42.97it/s]\u001b[A\n", + "Processing files: 14%|██████████████████████▉ | 696/4877 [00:10<01:29, 46.48it/s]\u001b[A\n", + "Processing files: 14%|███████████████████████▏ | 703/4877 [00:10<01:21, 51.02it/s]\u001b[A\n", + "Processing files: 15%|███████████████████████▍ | 710/4877 [00:10<01:18, 52.86it/s]\u001b[A\n", + "Processing files: 15%|███████████████████████▊ | 722/4877 [00:10<01:10, 59.09it/s]\u001b[A\n", + "Processing files: 15%|████████████████████████ | 729/4877 [00:10<01:23, 49.86it/s]\u001b[A\n", + "Processing files: 15%|████████████████████████▎ | 735/4877 [00:10<01:25, 48.25it/s]\u001b[A\n", + "Processing files: 15%|████████████████████████▍ | 741/4877 [00:11<01:27, 47.03it/s]\u001b[A\n", + "Processing files: 15%|████████████████████████▊ | 750/4877 [00:11<01:16, 54.12it/s]\u001b[A\n", + "Processing files: 16%|█████████████████████████ | 758/4877 [00:11<01:09, 59.23it/s]\u001b[A\n", + "Processing files: 16%|█████████████████████████▎ | 766/4877 [00:11<01:07, 60.58it/s]\u001b[A\n", + "Processing files: 16%|█████████████████████████▌ | 773/4877 [00:11<01:29, 45.79it/s]\u001b[A\n", + "Processing files: 16%|█████████████████████████▋ | 780/4877 [00:11<01:21, 50.34it/s]\u001b[A\n", + "Processing files: 16%|██████████████████████████ | 788/4877 [00:11<01:12, 56.10it/s]\u001b[A\n", + "Processing files: 16%|██████████████████████████▌ | 804/4877 [00:12<00:54, 74.41it/s]\u001b[A\n", + "Processing files: 17%|██████████████████████████▊ | 812/4877 [00:12<00:55, 73.20it/s]\u001b[A\n", + "Processing files: 17%|███████████████████████████ | 820/4877 [00:12<00:59, 67.93it/s]\u001b[A\n", + "Processing files: 17%|███████████████████████████▍ | 832/4877 [00:12<00:53, 75.87it/s]\u001b[A\n", + "Processing files: 17%|███████████████████████████▊ | 842/4877 [00:12<00:55, 72.26it/s]\u001b[A\n", + "Processing files: 17%|████████████████████████████ | 850/4877 [00:12<00:55, 72.96it/s]\u001b[A\n", + "Processing files: 18%|████████████████████████████▎ | 858/4877 [00:12<01:04, 62.03it/s]\u001b[A\n", + "Processing files: 18%|████████████████████████████▌ | 865/4877 [00:13<01:20, 49.57it/s]\u001b[A\n", + "Processing files: 18%|████████████████████████████▊ | 871/4877 [00:13<01:19, 50.31it/s]\u001b[A\n", + "Processing files: 18%|████████████████████████████▉ | 877/4877 [00:13<02:17, 29.09it/s]\u001b[A\n", + "Processing files: 18%|█████████████████████████████ | 882/4877 [00:13<02:15, 29.42it/s]\u001b[A\n", + "Processing files: 18%|█████████████████████████████▎ | 887/4877 [00:13<02:03, 32.41it/s]\u001b[A\n", + "Processing files: 18%|█████████████████████████████▍ | 892/4877 [00:14<01:51, 35.60it/s]\u001b[A\n", + "Processing files: 18%|█████████████████████████████▋ | 901/4877 [00:14<01:27, 45.63it/s]\u001b[A\n", + "Processing files: 19%|█████████████████████████████▉ | 907/4877 [00:14<01:34, 42.07it/s]\u001b[A\n", + "Processing files: 19%|██████████████████████████████▎ | 917/4877 [00:14<01:16, 51.43it/s]\u001b[A\n", + "Processing files: 19%|██████████████████████████████▍ | 923/4877 [00:14<01:20, 49.27it/s]\u001b[A\n", + "Processing files: 19%|██████████████████████████████▊ | 934/4877 [00:14<01:07, 58.26it/s]\u001b[A\n", + "Processing files: 19%|███████████████████████████████▏ | 944/4877 [00:14<01:00, 64.53it/s]\u001b[A\n", + "Processing files: 20%|███████████████████████████████▍ | 952/4877 [00:14<01:03, 62.07it/s]\u001b[A\n", + "Processing files: 20%|███████████████████████████████▋ | 959/4877 [00:15<01:01, 63.80it/s]\u001b[A\n", + "Processing files: 20%|███████████████████████████████▉ | 966/4877 [00:15<01:01, 64.05it/s]\u001b[A\n", + "Processing files: 20%|████████████████████████████████▎ | 978/4877 [00:15<00:50, 77.28it/s]\u001b[A\n", + "Processing files: 20%|████████████████████████████████▌ | 986/4877 [00:15<00:54, 71.40it/s]\u001b[A\n", + "Processing files: 20%|████████████████████████████████▊ | 994/4877 [00:15<01:01, 62.73it/s]\u001b[A\n", + "Processing files: 21%|████████████████████████████████▊ | 1001/4877 [00:15<01:07, 57.76it/s]\u001b[A\n", + "Processing files: 21%|█████████████████████████████████▏ | 1011/4877 [00:15<00:57, 67.00it/s]\u001b[A\n", + "Processing files: 21%|█████████████████████████████████▍ | 1019/4877 [00:16<01:10, 54.55it/s]\u001b[A\n", + "Processing files: 21%|█████████████████████████████████▋ | 1028/4877 [00:16<01:04, 59.88it/s]\u001b[A\n", + "Processing files: 21%|█████████████████████████████████▉ | 1035/4877 [00:16<01:03, 60.19it/s]\u001b[A\n", + "Processing files: 21%|██████████████████████████████████▏ | 1043/4877 [00:16<01:01, 62.77it/s]\u001b[A\n", + "Processing files: 22%|██████████████████████████████████▍ | 1050/4877 [00:16<01:18, 48.61it/s]\u001b[A\n", + "Processing files: 22%|██████████████████████████████████▋ | 1057/4877 [00:16<01:11, 53.12it/s]\u001b[A\n", + "Processing files: 22%|██████████████████████████████████▉ | 1065/4877 [00:16<01:04, 59.10it/s]\u001b[A\n", + "Processing files: 22%|███████████████████████████████████▏ | 1072/4877 [00:16<01:03, 59.49it/s]\u001b[A\n", + "Processing files: 22%|███████████████████████████████████▍ | 1079/4877 [00:17<01:06, 57.53it/s]\u001b[A\n", + "Processing files: 22%|███████████████████████████████████▋ | 1086/4877 [00:17<01:13, 51.77it/s]\u001b[A\n", + "Processing files: 22%|███████████████████████████████████▊ | 1092/4877 [00:17<01:13, 51.37it/s]\u001b[A\n", + "Processing files: 23%|████████████████████████████████████ | 1101/4877 [00:17<01:03, 59.28it/s]\u001b[A\n", + "Processing files: 23%|████████████████████████████████████▍ | 1111/4877 [00:17<00:54, 69.29it/s]\u001b[A\n", + "Processing files: 23%|████████████████████████████████████▊ | 1121/4877 [00:17<00:48, 77.41it/s]\u001b[A\n", + "Processing files: 23%|█████████████████████████████████████ | 1130/4877 [00:17<00:48, 76.92it/s]\u001b[A\n", + "Processing files: 23%|█████████████████████████████████████▎ | 1138/4877 [00:17<00:55, 67.09it/s]\u001b[A\n", + "Processing files: 23%|█████████████████████████████████████▌ | 1146/4877 [00:18<00:59, 62.20it/s]\u001b[A\n", + "Processing files: 24%|█████████████████████████████████████▉ | 1155/4877 [00:18<00:56, 65.32it/s]\u001b[A\n", + "Processing files: 24%|██████████████████████████████████████▎ | 1168/4877 [00:18<00:51, 72.04it/s]\u001b[A\n", + "Processing files: 24%|██████████████████████████████████████▋ | 1179/4877 [00:18<00:46, 80.16it/s]\u001b[A\n", + "Processing files: 24%|██████████████████████████████████████▉ | 1188/4877 [00:18<00:45, 80.44it/s]\u001b[A\n", + "Processing files: 25%|███████████████████████████████████████▎ | 1197/4877 [00:18<01:09, 52.60it/s]\u001b[A\n", + "Processing files: 25%|███████████████████████████████████████▍ | 1204/4877 [00:19<01:53, 32.25it/s]\u001b[A\n", + "Processing files: 25%|███████████████████████████████████████▋ | 1211/4877 [00:19<01:41, 35.97it/s]\u001b[A\n", + "Processing files: 25%|███████████████████████████████████████▉ | 1217/4877 [00:19<01:53, 32.33it/s]\u001b[A\n", + "Processing files: 25%|████████████████████████████████████████ | 1223/4877 [00:19<01:40, 36.22it/s]\u001b[A\n", + "Processing files: 25%|████████████████████████████████████████▎ | 1228/4877 [00:20<01:41, 36.05it/s]\u001b[A\n", + "Processing files: 25%|████████████████████████████████████████▍ | 1233/4877 [00:20<01:47, 33.76it/s]\u001b[A\n", + "Processing files: 25%|████████████████████████████████████████▌ | 1237/4877 [00:20<01:51, 32.69it/s]\u001b[A\n", + "Processing files: 25%|████████████████████████████████████████▋ | 1241/4877 [00:20<02:31, 24.04it/s]\u001b[A\n", + "Processing files: 26%|████████████████████████████████████████▉ | 1248/4877 [00:20<01:57, 30.88it/s]\u001b[A\n", + "Processing files: 26%|█████████████████████████████████████████▏ | 1254/4877 [00:20<01:41, 35.67it/s]\u001b[A\n", + "Processing files: 26%|█████████████████████████████████████████▎ | 1259/4877 [00:20<01:34, 38.20it/s]\u001b[A\n", + "Processing files: 26%|█████████████████████████████████████████▍ | 1264/4877 [00:21<01:32, 39.10it/s]\u001b[A\n", + "Processing files: 26%|█████████████████████████████████████████▋ | 1270/4877 [00:21<01:23, 43.01it/s]\u001b[A\n", + "Processing files: 26%|█████████████████████████████████████████▉ | 1280/4877 [00:21<01:06, 54.33it/s]\u001b[A\n", + "Processing files: 26%|██████████████████████████████████████████▎ | 1288/4877 [00:21<01:01, 58.46it/s]\u001b[A\n", + "Processing files: 27%|██████████████████████████████████████████▋ | 1300/4877 [00:21<00:51, 69.19it/s]\u001b[A\n", + "Processing files: 27%|██████████████████████████████████████████▉ | 1308/4877 [00:21<00:52, 68.36it/s]\u001b[A\n", + "Processing files: 27%|███████████████████████████████████████████▏ | 1315/4877 [00:21<00:58, 60.84it/s]\u001b[A\n", + "Processing files: 27%|███████████████████████████████████████████▎ | 1322/4877 [00:22<01:06, 53.52it/s]\u001b[A\n", + "Processing files: 27%|███████████████████████████████████████████▋ | 1333/4877 [00:22<00:55, 63.33it/s]\u001b[A\n", + "Processing files: 27%|███████████████████████████████████████████▉ | 1340/4877 [00:22<00:56, 62.99it/s]\u001b[A\n", + "Processing files: 28%|████████████████████████████████████████████▍ | 1353/4877 [00:22<00:46, 75.10it/s]\u001b[A\n", + "Processing files: 28%|████████████████████████████████████████████▋ | 1363/4877 [00:22<00:45, 76.91it/s]\u001b[A\n", + "Processing files: 28%|████████████████████████████████████████████▉ | 1371/4877 [00:22<00:45, 76.29it/s]\u001b[A\n", + "Processing files: 28%|█████████████████████████████████████████████▏ | 1379/4877 [00:22<00:53, 65.70it/s]\u001b[A\n", + "Processing files: 28%|█████████████████████████████████████████████▍ | 1386/4877 [00:23<01:12, 48.21it/s]\u001b[A\n", + "Processing files: 29%|█████████████████████████████████████████████▊ | 1395/4877 [00:23<01:03, 55.12it/s]\u001b[A\n", + "Processing files: 29%|██████████████████████████████████████████████ | 1403/4877 [00:23<01:08, 50.81it/s]\u001b[A\n", + "Processing files: 29%|██████████████████████████████████████████████▏ | 1409/4877 [00:23<01:23, 41.51it/s]\u001b[A\n", + "Processing files: 29%|██████████████████████████████████████████████▍ | 1414/4877 [00:23<01:23, 41.53it/s]\u001b[A\n", + "Processing files: 29%|██████████████████████████████████████████████▌ | 1419/4877 [00:23<01:26, 40.12it/s]\u001b[A\n", + "Processing files: 29%|██████████████████████████████████████████████▋ | 1424/4877 [00:23<01:31, 37.60it/s]\u001b[A\n", + "Processing files: 29%|██████████████████████████████████████████████▊ | 1428/4877 [00:24<02:07, 27.00it/s]\u001b[A\n", + "Processing files: 29%|███████████████████████████████████████████████ | 1433/4877 [00:24<02:01, 28.36it/s]\u001b[A\n", + "Processing files: 30%|███████████████████████████████████████████████▏ | 1440/4877 [00:24<01:38, 34.76it/s]\u001b[A\n", + "Processing files: 30%|███████████████████████████████████████████████▎ | 1444/4877 [00:24<01:35, 35.82it/s]\u001b[A\n", + "Processing files: 30%|███████████████████████████████████████████████▌ | 1450/4877 [00:24<01:34, 36.07it/s]\u001b[A\n", + "Processing files: 30%|███████████████████████████████████████████████▋ | 1454/4877 [00:25<01:58, 28.94it/s]\u001b[A\n", + "Processing files: 30%|███████████████████████████████████████████████▊ | 1458/4877 [00:25<02:07, 26.78it/s]\u001b[A\n", + "Processing files: 30%|███████████████████████████████████████████████▉ | 1461/4877 [00:25<02:18, 24.65it/s]\u001b[A\n", + "Processing files: 30%|████████████████████████████████████████████████ | 1464/4877 [00:25<02:30, 22.67it/s]\u001b[A\n", + "Processing files: 30%|████████████████████████████████████████████████▏ | 1467/4877 [00:25<02:37, 21.69it/s]\u001b[A\n", + "Processing files: 30%|████████████████████████████████████████████████▏ | 1470/4877 [00:25<02:42, 21.03it/s]\u001b[A\n", + "Processing files: 30%|████████████████████████████████████████████████▎ | 1474/4877 [00:26<02:23, 23.64it/s]\u001b[A\n", + "Processing files: 30%|████████████████████████████████████████████████▋ | 1484/4877 [00:26<01:28, 38.17it/s]\u001b[A\n", + "Processing files: 31%|████████████████████████████████████████████████▉ | 1491/4877 [00:26<01:17, 43.96it/s]\u001b[A\n", + "Processing files: 31%|█████████████████████████████████████████████████▏ | 1498/4877 [00:26<01:09, 48.90it/s]\u001b[A\n", + "Processing files: 31%|█████████████████████████████████████████████████▌ | 1512/4877 [00:26<00:48, 69.68it/s]\u001b[A\n", + "Processing files: 31%|█████████████████████████████████████████████████▊ | 1520/4877 [00:26<00:59, 56.57it/s]\u001b[A\n", + "Processing files: 31%|██████████████████████████████████████████████████▏ | 1530/4877 [00:26<00:51, 64.71it/s]\u001b[A\n", + "Processing files: 32%|██████████████████████████████████████████████████▍ | 1538/4877 [00:26<00:51, 64.27it/s]\u001b[A\n", + "Processing files: 32%|██████████████████████████████████████████████████▊ | 1550/4877 [00:27<00:43, 75.69it/s]\u001b[A\n", + "Processing files: 32%|███████████████████████████████████████████████████▏ | 1559/4877 [00:27<00:52, 63.56it/s]\u001b[A\n", + "Processing files: 32%|███████████████████████████████████████████████████▍ | 1568/4877 [00:27<00:49, 66.67it/s]\u001b[A\n", + "Processing files: 32%|███████████████████████████████████████████████████▋ | 1576/4877 [00:27<00:49, 66.62it/s]\u001b[A\n", + "Processing files: 33%|████████████████████████████████████████████████████▏ | 1589/4877 [00:27<00:41, 78.87it/s]\u001b[A\n", + "Processing files: 33%|████████████████████████████████████████████████████▍ | 1599/4877 [00:27<00:41, 78.68it/s]\u001b[A\n", + "Processing files: 33%|████████████████████████████████████████████████████▊ | 1608/4877 [00:27<00:42, 77.05it/s]\u001b[A\n", + "Processing files: 33%|█████████████████████████████████████████████████████ | 1616/4877 [00:28<00:50, 64.42it/s]\u001b[A\n", + "Processing files: 33%|█████████████████████████████████████████████████████▍ | 1627/4877 [00:28<00:48, 66.45it/s]\u001b[A\n", + "Processing files: 34%|█████████████████████████████████████████████████████▌ | 1634/4877 [00:28<00:58, 55.22it/s]\u001b[A\n", + "Processing files: 34%|█████████████████████████████████████████████████████▊ | 1640/4877 [00:28<01:02, 51.41it/s]\u001b[A\n", + "Processing files: 34%|██████████████████████████████████████████████████████ | 1646/4877 [00:29<01:49, 29.63it/s]\u001b[A\n", + "Processing files: 34%|██████████████████████████████████████████████████████▏ | 1651/4877 [00:29<02:03, 26.04it/s]\u001b[A\n", + "Processing files: 34%|██████████████████████████████████████████████████████▎ | 1655/4877 [00:29<02:33, 21.01it/s]\u001b[A\n", + "Processing files: 34%|██████████████████████████████████████████████████████▍ | 1658/4877 [00:29<02:27, 21.85it/s]\u001b[A\n", + "Processing files: 34%|██████████████████████████████████████████████████████▌ | 1664/4877 [00:29<01:58, 27.16it/s]\u001b[A\n", + "Processing files: 34%|██████████████████████████████████████████████████████▉ | 1674/4877 [00:29<01:22, 38.69it/s]\u001b[A\n", + "Processing files: 35%|███████████████████████████████████████████████████████▎ | 1686/4877 [00:30<01:00, 52.93it/s]\u001b[A\n", + "Processing files: 35%|███████████████████████████████████████████████████████▋ | 1697/4877 [00:30<00:51, 61.43it/s]\u001b[A\n", + "Processing files: 35%|███████████████████████████████████████████████████████▉ | 1705/4877 [00:30<00:49, 64.31it/s]\u001b[A\n", + "Processing files: 35%|████████████████████████████████████████████████████████▎ | 1716/4877 [00:30<00:43, 72.88it/s]\u001b[A\n", + "Processing files: 35%|████████████████████████████████████████████████████████▌ | 1724/4877 [00:30<00:47, 66.66it/s]\u001b[A\n", + "Processing files: 36%|████████████████████████████████████████████████████████▊ | 1732/4877 [00:30<00:52, 59.58it/s]\u001b[A\n", + "Processing files: 36%|█████████████████████████████████████████████████████████ | 1740/4877 [00:30<00:50, 62.31it/s]\u001b[A\n", + "Processing files: 36%|█████████████████████████████████████████████████████████▍ | 1750/4877 [00:30<00:47, 65.83it/s]\u001b[A\n", + "Processing files: 36%|█████████████████████████████████████████████████████████▋ | 1757/4877 [00:31<00:47, 65.33it/s]\u001b[A\n", + "Processing files: 36%|█████████████████████████████████████████████████████████▊ | 1764/4877 [00:31<00:54, 57.02it/s]\u001b[A\n", + "Processing files: 36%|██████████████████████████████████████████████████████████ | 1770/4877 [00:31<00:55, 56.05it/s]\u001b[A\n", + "Processing files: 36%|██████████████████████████████████████████████████████████▎ | 1776/4877 [00:31<01:01, 50.62it/s]\u001b[A\n", + "Processing files: 37%|██████████████████████████████████████████████████████████▍ | 1782/4877 [00:31<01:06, 46.20it/s]\u001b[A\n", + "Processing files: 37%|██████████████████████████████████████████████████████████▋ | 1787/4877 [00:32<01:38, 31.34it/s]\u001b[A\n", + "Processing files: 37%|██████████████████████████████████████████████████████████▊ | 1791/4877 [00:32<01:35, 32.45it/s]\u001b[A\n", + "Processing files: 37%|██████████████████████████████████████████████████████████▉ | 1795/4877 [00:32<02:14, 22.91it/s]\u001b[A\n", + "Processing files: 37%|███████████████████████████████████████████████████████████ | 1799/4877 [00:32<02:25, 21.13it/s]\u001b[A\n", + "Processing files: 37%|███████████████████████████████████████████████████████████ | 1802/4877 [00:32<02:16, 22.47it/s]\u001b[A\n", + "Processing files: 37%|███████████████████████████████████████████████████████████▏ | 1806/4877 [00:33<02:17, 22.30it/s]\u001b[A\n", + "Processing files: 37%|███████████████████████████████████████████████████████████▎ | 1809/4877 [00:33<02:12, 23.14it/s]\u001b[A\n", + "Processing files: 37%|███████████████████████████████████████████████████████████▌ | 1817/4877 [00:33<01:34, 32.26it/s]\u001b[A\n", + "Processing files: 37%|███████████████████████████████████████████████████████████▋ | 1821/4877 [00:33<01:44, 29.26it/s]\u001b[A\n", + "Processing files: 37%|███████████████████████████████████████████████████████████▊ | 1825/4877 [00:33<01:40, 30.46it/s]\u001b[A\n", + "Processing files: 38%|████████████████████████████████████████████████████████████▎ | 1837/4877 [00:33<01:12, 41.98it/s]\u001b[A\n", + "Processing files: 38%|████████████████████████████████████████████████████████████▍ | 1843/4877 [00:33<01:06, 45.75it/s]\u001b[A\n", + "Processing files: 38%|████████████████████████████████████████████████████████████▋ | 1848/4877 [00:33<01:05, 46.47it/s]\u001b[A\n", + "Processing files: 38%|████████████████████████████████████████████████████████████▊ | 1853/4877 [00:34<01:17, 39.26it/s]\u001b[A\n", + "Processing files: 38%|████████████████████████████████████████████████████████████▉ | 1858/4877 [00:34<01:19, 37.89it/s]\u001b[A\n", + "Processing files: 38%|█████████████████████████████████████████████████████████████ | 1862/4877 [00:34<01:24, 35.72it/s]\u001b[A\n", + "Processing files: 38%|█████████████████████████████████████████████████████████████▏ | 1866/4877 [00:34<01:33, 32.09it/s]\u001b[A\n", + "Processing files: 38%|█████████████████████████████████████████████████████████████▎ | 1870/4877 [00:34<01:50, 27.24it/s]\u001b[A\n", + "Processing files: 38%|█████████████████████████████████████████████████████████████▍ | 1873/4877 [00:34<02:07, 23.62it/s]\u001b[A\n", + "Processing files: 38%|█████████████████████████████████████████████████████████████▌ | 1876/4877 [00:35<02:01, 24.66it/s]\u001b[A\n", + "Processing files: 39%|█████████████████████████████████████████████████████████████▋ | 1882/4877 [00:35<01:37, 30.80it/s]\u001b[A\n", + "Processing files: 39%|██████████████████████████████████████████████████████████████ | 1892/4877 [00:35<01:04, 46.25it/s]\u001b[A\n", + "Processing files: 39%|██████████████████████████████████████████████████████████████▎ | 1901/4877 [00:35<00:53, 56.07it/s]\u001b[A\n", + "Processing files: 39%|██████████████████████████████████████████████████████████████▌ | 1908/4877 [00:35<00:52, 56.30it/s]\u001b[A\n", + "Processing files: 39%|██████████████████████████████████████████████████████████████▊ | 1915/4877 [00:35<00:54, 54.27it/s]\u001b[A\n", + "Processing files: 39%|███████████████████████████████████████████████████████████████ | 1921/4877 [00:35<00:56, 52.77it/s]\u001b[A\n", + "Processing files: 40%|███████████████████████████████████████████████████████████████▏ | 1927/4877 [00:35<01:01, 48.00it/s]\u001b[A\n", + "Processing files: 40%|███████████████████████████████████████████████████████████████▌ | 1937/4877 [00:36<00:51, 57.28it/s]\u001b[A\n", + "Processing files: 40%|███████████████████████████████████████████████████████████████▋ | 1943/4877 [00:36<00:51, 57.05it/s]\u001b[A\n", + "Processing files: 40%|███████████████████████████████████████████████████████████████▉ | 1949/4877 [00:36<00:58, 50.29it/s]\u001b[A\n", + "Processing files: 40%|████████████████████████████████████████████████████████████████▏ | 1955/4877 [00:36<00:57, 50.95it/s]\u001b[A\n", + "Processing files: 40%|████████████████████████████████████████████████████████████████▎ | 1961/4877 [00:36<01:00, 47.99it/s]\u001b[A\n", + "Processing files: 40%|████████████████████████████████████████████████████████████████▍ | 1966/4877 [00:36<01:07, 43.36it/s]\u001b[A\n", + "Processing files: 40%|████████████████████████████████████████████████████████████████▋ | 1971/4877 [00:36<01:20, 36.12it/s]\u001b[A\n", + "Processing files: 41%|████████████████████████████████████████████████████████████████▉ | 1978/4877 [00:37<01:10, 41.09it/s]\u001b[A\n", + "Processing files: 41%|█████████████████████████████████████████████████████████████████ | 1983/4877 [00:37<01:11, 40.68it/s]\u001b[A\n", + "Processing files: 41%|█████████████████████████████████████████████████████████████████▏ | 1988/4877 [00:37<01:30, 32.09it/s]\u001b[A\n", + "Processing files: 41%|█████████████████████████████████████████████████████████████████▎ | 1992/4877 [00:37<01:52, 25.63it/s]\u001b[A\n", + "Processing files: 41%|█████████████████████████████████████████████████████████████████▌ | 1997/4877 [00:37<01:39, 28.86it/s]\u001b[A\n", + "Processing files: 41%|█████████████████████████████████████████████████████████████████▋ | 2004/4877 [00:37<01:18, 36.37it/s]\u001b[A\n", + "Processing files: 41%|██████████████████████████████████████████████████████████████████ | 2012/4877 [00:37<01:03, 45.22it/s]\u001b[A\n", + "Processing files: 41%|██████████████████████████████████████████████████████████████████▎ | 2022/4877 [00:38<00:49, 57.77it/s]\u001b[A\n", + "Processing files: 42%|██████████████████████████████████████████████████████████████████▊ | 2035/4877 [00:38<00:41, 68.86it/s]\u001b[A\n", + "Processing files: 42%|███████████████████████████████████████████████████████████████████ | 2043/4877 [00:38<00:46, 60.83it/s]\u001b[A\n", + "Processing files: 42%|███████████████████████████████████████████████████████████████████▎ | 2050/4877 [00:38<00:46, 61.24it/s]\u001b[A\n", + "Processing files: 42%|███████████████████████████████████████████████████████████████████▍ | 2057/4877 [00:38<00:45, 62.20it/s]\u001b[A\n", + "Processing files: 42%|███████████████████████████████████████████████████████████████████▋ | 2064/4877 [00:39<01:15, 37.48it/s]\u001b[A\n", + "Processing files: 42%|███████████████████████████████████████████████████████████████████▉ | 2070/4877 [00:39<01:21, 34.36it/s]\u001b[A\n", + "Processing files: 43%|████████████████████████████████████████████████████████████████████ | 2075/4877 [00:39<01:19, 35.32it/s]\u001b[A\n", + "Processing files: 43%|████████████████████████████████████████████████████████████████████▎ | 2082/4877 [00:39<01:11, 39.16it/s]\u001b[A\n", + "Processing files: 43%|████████████████████████████████████████████████████████████████████▋ | 2092/4877 [00:39<00:55, 50.48it/s]\u001b[A\n", + "Processing files: 43%|████████████████████████████████████████████████████████████████████▉ | 2100/4877 [00:39<00:50, 55.51it/s]\u001b[A\n", + "Processing files: 43%|█████████████████████████████████████████████████████████████████████▏ | 2110/4877 [00:39<00:43, 63.74it/s]\u001b[A\n", + "Processing files: 43%|█████████████████████████████████████████████████████████████████████▌ | 2119/4877 [00:39<00:39, 69.68it/s]\u001b[A\n", + "Processing files: 44%|█████████████████████████████████████████████████████████████████████▊ | 2127/4877 [00:40<00:56, 48.98it/s]\u001b[A\n", + "Processing files: 44%|██████████████████████████████████████████████████████████████████████ | 2134/4877 [00:40<00:51, 53.13it/s]\u001b[A\n", + "Processing files: 44%|██████████████████████████████████████████████████████████████████████▏ | 2141/4877 [00:40<00:56, 48.60it/s]\u001b[A\n", + "Processing files: 44%|██████████████████████████████████████████████████████████████████████▌ | 2150/4877 [00:40<00:48, 56.70it/s]\u001b[A\n", + "Processing files: 44%|██████████████████████████████████████████████████████████████████████▉ | 2164/4877 [00:40<00:36, 73.84it/s]\u001b[A\n", + "Processing files: 45%|███████████████████████████████████████████████████████████████████████▍ | 2178/4877 [00:40<00:32, 84.30it/s]\u001b[A\n", + "Processing files: 45%|███████████████████████████████████████████████████████████████████████▊ | 2188/4877 [00:40<00:34, 77.53it/s]\u001b[A\n", + "Processing files: 45%|████████████████████████████████████████████████████████████████████████ | 2197/4877 [00:41<00:35, 75.97it/s]\u001b[A\n", + "Processing files: 45%|████████████████████████████████████████████████████████████████████████▎ | 2206/4877 [00:41<00:35, 74.56it/s]\u001b[A\n", + "Processing files: 45%|████████████████████████████████████████████████████████████████████████▋ | 2214/4877 [00:41<00:39, 66.69it/s]\u001b[A\n", + "Processing files: 46%|████████████████████████████████████████████████████████████████████████▊ | 2221/4877 [00:41<00:39, 66.91it/s]\u001b[A\n", + "Processing files: 46%|█████████████████████████████████████████████████████████████████████████ | 2228/4877 [00:41<00:42, 62.19it/s]\u001b[A\n", + "Processing files: 46%|█████████████████████████████████████████████████████████████████████████▎ | 2235/4877 [00:41<00:43, 61.30it/s]\u001b[A\n", + "Processing files: 46%|█████████████████████████████████████████████████████████████████████████▊ | 2248/4877 [00:41<00:33, 77.70it/s]\u001b[A\n", + "Processing files: 46%|██████████████████████████████████████████████████████████████████████████ | 2258/4877 [00:41<00:31, 82.44it/s]\u001b[A\n", + "Processing files: 46%|██████████████████████████████████████████████████████████████████████████▎ | 2267/4877 [00:42<00:39, 66.16it/s]\u001b[A\n", + "Processing files: 47%|██████████████████████████████████████████████████████████████████████████▋ | 2275/4877 [00:42<00:43, 60.00it/s]\u001b[A\n", + "Processing files: 47%|██████████████████████████████████████████████████████████████████████████▊ | 2282/4877 [00:42<01:00, 43.00it/s]\u001b[A\n", + "Processing files: 47%|███████████████████████████████████████████████████████████████████████████ | 2288/4877 [00:42<01:00, 43.00it/s]\u001b[A\n", + "Processing files: 47%|███████████████████████████████████████████████████████████████████████████▏ | 2293/4877 [00:43<01:34, 27.46it/s]\u001b[A\n", + "Processing files: 47%|███████████████████████████████████████████████████████████████████████████▍ | 2300/4877 [00:43<01:17, 33.11it/s]\u001b[A\n", + "Processing files: 47%|███████████████████████████████████████████████████████████████████████████▋ | 2308/4877 [00:43<01:03, 40.50it/s]\u001b[A\n", + "Processing files: 47%|███████████████████████████████████████████████████████████████████████████▉ | 2315/4877 [00:43<00:56, 45.56it/s]\u001b[A\n", + "Processing files: 48%|████████████████████████████████████████████████████████████████████████████▏ | 2321/4877 [00:43<01:02, 40.93it/s]\u001b[A\n", + "Processing files: 48%|████████████████████████████████████████████████████████████████████████████▍ | 2331/4877 [00:43<00:48, 52.78it/s]\u001b[A\n", + "Processing files: 48%|████████████████████████████████████████████████████████████████████████████▋ | 2338/4877 [00:43<00:46, 54.25it/s]\u001b[A\n", + "Processing files: 48%|█████████████████████████████████████████████████████████████████████████████ | 2349/4877 [00:44<00:38, 65.44it/s]\u001b[A\n", + "Processing files: 48%|█████████████████████████████████████████████████████████████████████████████▎ | 2357/4877 [00:44<00:44, 56.47it/s]\u001b[A\n", + "Processing files: 48%|█████████████████████████████████████████████████████████████████████████████▌ | 2365/4877 [00:44<00:41, 60.46it/s]\u001b[A\n", + "Processing files: 49%|█████████████████████████████████████████████████████████████████████████████▊ | 2372/4877 [00:44<00:51, 48.86it/s]\u001b[A\n", + "Processing files: 49%|██████████████████████████████████████████████████████████████████████████████ | 2378/4877 [00:44<00:53, 46.32it/s]\u001b[A\n", + "Processing files: 49%|██████████████████████████████████████████████████████████████████████████████▏ | 2385/4877 [00:44<00:49, 50.68it/s]\u001b[A\n", + "Processing files: 49%|██████████████████████████████████████████████████████████████████████████████▌ | 2394/4877 [00:44<00:45, 54.87it/s]\u001b[A\n", + "Processing files: 49%|██████████████████████████████████████████████████████████████████████████████▋ | 2400/4877 [00:45<01:05, 37.96it/s]\u001b[A\n", + "Processing files: 49%|██████████████████████████████████████████████████████████████████████████████▉ | 2405/4877 [00:45<01:02, 39.45it/s]\u001b[A\n", + "Processing files: 49%|███████████████████████████████████████████████████████████████████████████████ | 2410/4877 [00:45<01:01, 40.42it/s]\u001b[A\n", + "Processing files: 50%|███████████████████████████████████████████████████████████████████████████████▏ | 2415/4877 [00:46<03:26, 11.95it/s]\u001b[A\n", + "Processing files: 50%|███████████████████████████████████████████████████████████████████████████████▍ | 2423/4877 [00:46<02:21, 17.32it/s]\u001b[A\n", + "Processing files: 50%|███████████████████████████████████████████████████████████████████████████████▊ | 2431/4877 [00:46<01:43, 23.53it/s]\u001b[A\n", + "Processing files: 50%|███████████████████████████████████████████████████████████████████████████████▉ | 2438/4877 [00:47<01:24, 28.89it/s]\u001b[A\n", + "Processing files: 50%|████████████████████████████████████████████████████████████████████████████████▎ | 2449/4877 [00:47<00:59, 40.65it/s]\u001b[A\n", + "Processing files: 51%|████████████████████████████████████████████████████████████████████████████████▊ | 2463/4877 [00:47<00:42, 57.21it/s]\u001b[A\n", + "Processing files: 51%|█████████████████████████████████████████████████████████████████████████████████ | 2472/4877 [00:47<00:41, 58.55it/s]\u001b[A\n", + "Processing files: 51%|█████████████████████████████████████████████████████████████████████████████████▎ | 2480/4877 [00:47<00:39, 60.15it/s]\u001b[A\n", + "Processing files: 51%|█████████████████████████████████████████████████████████████████████████████████▌ | 2488/4877 [00:47<00:38, 61.60it/s]\u001b[A\n", + "Processing files: 51%|█████████████████████████████████████████████████████████████████████████████████▉ | 2496/4877 [00:47<00:40, 59.09it/s]\u001b[A\n", + "Processing files: 51%|██████████████████████████████████████████████████████████████████████████████████ | 2503/4877 [00:47<00:39, 60.83it/s]\u001b[A\n", + "Processing files: 52%|██████████████████████████████████████████████████████████████████████████████████▍ | 2512/4877 [00:48<00:36, 65.61it/s]\u001b[A\n", + "Processing files: 52%|██████████████████████████████████████████████████████████████████████████████████▋ | 2520/4877 [00:48<00:35, 66.93it/s]\u001b[A\n", + "Processing files: 52%|██████████████████████████████████████████████████████████████████████████████████▉ | 2528/4877 [00:48<00:34, 67.38it/s]\u001b[A\n", + "Processing files: 52%|███████████████████████████████████████████████████████████████████████████████████▏ | 2535/4877 [00:48<00:34, 66.97it/s]\u001b[A\n", + "Processing files: 52%|███████████████████████████████████████████████████████████████████████████████████▍ | 2544/4877 [00:48<00:33, 69.41it/s]\u001b[A\n", + "Processing files: 52%|███████████████████████████████████████████████████████████████████████████████████▋ | 2552/4877 [00:48<00:37, 61.81it/s]\u001b[A\n", + "Processing files: 52%|███████████████████████████████████████████████████████████████████████████████████▉ | 2559/4877 [00:48<00:41, 56.48it/s]\u001b[A\n", + "Processing files: 53%|████████████████████████████████████████████████████████████████████████████████████▏ | 2567/4877 [00:48<00:41, 55.52it/s]\u001b[A\n", + "Processing files: 53%|████████████████████████████████████████████████████████████████████████████████████▍ | 2573/4877 [00:49<00:45, 51.10it/s]\u001b[A\n", + "Processing files: 53%|████████████████████████████████████████████████████████████████████████████████████▌ | 2579/4877 [00:49<00:52, 43.79it/s]\u001b[A\n", + "Processing files: 53%|████████████████████████████████████████████████████████████████████████████████████▊ | 2585/4877 [00:49<00:51, 44.53it/s]\u001b[A\n", + "Processing files: 53%|████████████████████████████████████████████████████████████████████████████████████▉ | 2590/4877 [00:49<00:57, 39.51it/s]\u001b[A\n", + "Processing files: 53%|█████████████████████████████████████████████████████████████████████████████████████▏ | 2595/4877 [00:49<01:02, 36.29it/s]\u001b[A\n", + "Processing files: 53%|█████████████████████████████████████████████████████████████████████████████████████▎ | 2601/4877 [00:49<00:56, 40.29it/s]\u001b[A\n", + "Processing files: 53%|█████████████████████████████████████████████████████████████████████████████████████▍ | 2606/4877 [00:50<01:23, 27.22it/s]\u001b[A\n", + "Processing files: 54%|█████████████████████████████████████████████████████████████████████████████████████▋ | 2610/4877 [00:50<01:44, 21.62it/s]\u001b[A\n", + "Processing files: 54%|█████████████████████████████████████████████████████████████████████████████████████▋ | 2613/4877 [00:50<01:45, 21.44it/s]\u001b[A\n", + "Processing files: 54%|█████████████████████████████████████████████████████████████████████████████████████▊ | 2617/4877 [00:50<01:42, 22.07it/s]\u001b[A\n", + "Processing files: 54%|█████████████████████████████████████████████████████████████████████████████████████▉ | 2621/4877 [00:50<01:29, 25.15it/s]\u001b[A\n", + "Processing files: 54%|██████████████████████████████████████████████████████████████████████████████████████ | 2625/4877 [00:51<01:40, 22.47it/s]\u001b[A\n", + "Processing files: 54%|██████████████████████████████████████████████████████████████████████████████████████▎ | 2630/4877 [00:51<01:29, 25.01it/s]\u001b[A\n", + "Processing files: 54%|██████████████████████████████████████████████████████████████████████████████████████▍ | 2633/4877 [00:51<02:10, 17.21it/s]\u001b[A\n", + "Processing files: 54%|██████████████████████████████████████████████████████████████████████████████████████▌ | 2639/4877 [00:51<01:42, 21.78it/s]\u001b[A\n", + "Processing files: 54%|██████████████████████████████████████████████████████████████████████████████████████▋ | 2643/4877 [00:52<01:38, 22.70it/s]\u001b[A\n", + "Processing files: 54%|██████████████████████████████████████████████████████████████████████████████████████▊ | 2646/4877 [00:52<01:40, 22.28it/s]\u001b[A\n", + "Processing files: 54%|██████████████████████████████████████████████████████████████████████████████████████▉ | 2649/4877 [00:52<01:51, 20.03it/s]\u001b[A\n", + "Processing files: 54%|███████████████████████████████████████████████████████████████████████████████████████ | 2652/4877 [00:52<01:47, 20.72it/s]\u001b[A\n", + "Processing files: 55%|███████████████████████████████████████████████████████████████████████████████████████▏ | 2659/4877 [00:52<01:25, 26.09it/s]\u001b[A\n", + "Processing files: 55%|███████████████████████████████████████████████████████████████████████████████████████▍ | 2667/4877 [00:52<01:02, 35.22it/s]\u001b[A\n", + "Processing files: 55%|███████████████████████████████████████████████████████████████████████████████████████▋ | 2671/4877 [00:52<01:03, 35.01it/s]\u001b[A\n", + "Processing files: 55%|███████████████████████████████████████████████████████████████████████████████████████▉ | 2679/4877 [00:53<00:49, 44.20it/s]\u001b[A\n", + "Processing files: 55%|████████████████████████████████████████████████████████████████████████████████████████ | 2684/4877 [00:53<00:51, 42.67it/s]\u001b[A\n", + "Processing files: 55%|████████████████████████████████████████████████████████████████████████████████████████▎ | 2691/4877 [00:53<00:45, 48.57it/s]\u001b[A\n", + "Processing files: 55%|████████████████████████████████████████████████████████████████████████████████████████▍ | 2697/4877 [00:53<00:45, 47.62it/s]\u001b[A\n", + "Processing files: 56%|████████████████████████████████████████████████████████████████████████████████████████▉ | 2710/4877 [00:53<00:32, 67.02it/s]\u001b[A\n", + "Processing files: 56%|█████████████████████████████████████████████████████████████████████████████████████████▏ | 2718/4877 [00:53<00:50, 42.46it/s]\u001b[A\n", + "Processing files: 56%|█████████████████████████████████████████████████████████████████████████████████████████▎ | 2724/4877 [00:53<00:48, 44.40it/s]\u001b[A\n", + "Processing files: 56%|█████████████████████████████████████████████████████████████████████████████████████████▊ | 2736/4877 [00:54<00:36, 59.21it/s]\u001b[A\n", + "Processing files: 56%|██████████████████████████████████████████████████████████████████████████████████████████ | 2744/4877 [00:54<00:43, 49.30it/s]\u001b[A\n", + "Processing files: 56%|██████████████████████████████████████████████████████████████████████████████████████████▎ | 2751/4877 [00:54<00:57, 36.92it/s]\u001b[A\n", + "Processing files: 57%|██████████████████████████████████████████████████████████████████████████████████████████▌ | 2760/4877 [00:54<00:47, 44.60it/s]\u001b[A\n", + "Processing files: 57%|██████████████████████████████████████████████████████████████████████████████████████████▉ | 2771/4877 [00:54<00:37, 55.99it/s]\u001b[A\n", + "Processing files: 57%|███████████████████████████████████████████████████████████████████████████████████████████▏ | 2781/4877 [00:54<00:34, 60.94it/s]\u001b[A\n", + "Processing files: 57%|███████████████████████████████████████████████████████████████████████████████████████████▌ | 2791/4877 [00:55<00:30, 67.42it/s]\u001b[A\n", + "Processing files: 57%|███████████████████████████████████████████████████████████████████████████████████████████▊ | 2799/4877 [00:55<00:31, 66.33it/s]\u001b[A\n", + "Processing files: 58%|████████████████████████████████████████████████████████████████████████████████████████████ | 2807/4877 [00:55<00:30, 67.29it/s]\u001b[A\n", + "Processing files: 58%|████████████████████████████████████████████████████████████████████████████████████████████▍ | 2816/4877 [00:55<00:30, 68.59it/s]\u001b[A\n", + "Processing files: 58%|████████████████████████████████████████████████████████████████████████████████████████████▋ | 2824/4877 [00:55<00:40, 51.28it/s]\u001b[A\n", + "Processing files: 58%|████████████████████████████████████████████████████████████████████████████████████████████▉ | 2834/4877 [00:55<00:36, 56.31it/s]\u001b[A\n", + "Processing files: 58%|█████████████████████████████████████████████████████████████████████████████████████████████▏ | 2841/4877 [00:56<00:51, 39.57it/s]\u001b[A\n", + "Processing files: 58%|█████████████████████████████████████████████████████████████████████████████████████████████▌ | 2850/4877 [00:56<00:43, 46.57it/s]\u001b[A\n", + "Processing files: 59%|█████████████████████████████████████████████████████████████████████████████████████████████▋ | 2857/4877 [00:56<00:39, 50.98it/s]\u001b[A\n", + "Processing files: 59%|█████████████████████████████████████████████████████████████████████████████████████████████▉ | 2864/4877 [00:56<00:50, 40.17it/s]\u001b[A\n", + "Processing files: 59%|██████████████████████████████████████████████████████████████████████████████████████████████▏ | 2870/4877 [00:56<00:46, 43.09it/s]\u001b[A\n", + "Processing files: 59%|██████████████████████████████████████████████████████████████████████████████████████████████▎ | 2876/4877 [00:56<00:49, 40.45it/s]\u001b[A\n", + "Processing files: 59%|██████████████████████████████████████████████████████████████████████████████████████████████▋ | 2886/4877 [00:57<00:38, 51.58it/s]\u001b[A\n", + "Processing files: 59%|██████████████████████████████████████████████████████████████████████████████████████████████▉ | 2893/4877 [00:57<00:39, 50.15it/s]\u001b[A\n", + "Processing files: 59%|███████████████████████████████████████████████████████████████████████████████████████████████ | 2899/4877 [00:57<00:48, 40.81it/s]\u001b[A\n", + "Processing files: 60%|███████████████████████████████████████████████████████████████████████████████████████████████▎ | 2906/4877 [00:57<00:43, 45.38it/s]\u001b[A\n", + "Processing files: 60%|███████████████████████████████████████████████████████████████████████████████████████████████▌ | 2913/4877 [00:57<00:39, 50.11it/s]\u001b[A\n", + "Processing files: 60%|███████████████████████████████████████████████████████████████████████████████████████████████▊ | 2919/4877 [00:57<00:39, 49.92it/s]\u001b[A\n", + "Processing files: 60%|███████████████████████████████████████████████████████████████████████████████████████████████▉ | 2925/4877 [00:57<00:40, 47.94it/s]\u001b[A\n", + "Processing files: 60%|████████████████████████████████████████████████████████████████████████████████████████████████▏ | 2931/4877 [00:58<00:52, 37.38it/s]\u001b[A\n", + "Processing files: 60%|████████████████████████████████████████████████████████████████████████████████████████████████▌ | 2943/4877 [00:58<00:36, 52.53it/s]\u001b[A\n", + "Processing files: 61%|████████████████████████████████████████████████████████████████████████████████████████████████▊ | 2952/4877 [00:58<00:32, 58.79it/s]\u001b[A\n", + "Processing files: 61%|█████████████████████████████████████████████████████████████████████████████████████████████████ | 2959/4877 [00:58<00:34, 55.31it/s]\u001b[A\n", + "Processing files: 61%|█████████████████████████████████████████████████████████████████████████████████████████████████▎ | 2966/4877 [00:58<00:42, 44.77it/s]\u001b[A\n", + "Processing files: 61%|█████████████████████████████████████████████████████████████████████████████████████████████████▌ | 2972/4877 [00:59<00:46, 41.26it/s]\u001b[A\n", + "Processing files: 61%|█████████████████████████████████████████████████████████████████████████████████████████████████▋ | 2977/4877 [00:59<00:59, 32.08it/s]\u001b[A\n", + "Processing files: 61%|█████████████████████████████████████████████████████████████████████████████████████████████████▊ | 2981/4877 [00:59<01:07, 28.10it/s]\u001b[A\n", + "Processing files: 61%|█████████████████████████████████████████████████████████████████████████████████████████████████▉ | 2985/4877 [00:59<01:09, 27.18it/s]\u001b[A\n", + "Processing files: 61%|██████████████████████████████████████████████████████████████████████████████████████████████████ | 2990/4877 [00:59<01:00, 31.32it/s]\u001b[A\n", + "Processing files: 61%|██████████████████████████████████████████████████████████████████████████████████████████████████▎ | 2997/4877 [00:59<00:48, 38.96it/s]\u001b[A\n", + "Processing files: 62%|██████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3004/4877 [00:59<00:41, 44.92it/s]\u001b[A\n", + "Processing files: 62%|██████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3010/4877 [01:00<00:47, 39.57it/s]\u001b[A\n", + "Processing files: 62%|██████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3015/4877 [01:00<00:46, 40.19it/s]\u001b[A\n", + "Processing files: 62%|███████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3026/4877 [01:00<00:33, 55.80it/s]\u001b[A\n", + "Processing files: 62%|███████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3035/4877 [01:00<00:29, 62.35it/s]\u001b[A\n", + "Processing files: 62%|███████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3042/4877 [01:00<00:32, 56.07it/s]\u001b[A\n", + "Processing files: 63%|████████████████████████████████████████████████████████████████████████████████████████████████████ | 3049/4877 [01:00<00:32, 57.00it/s]\u001b[A\n", + "Processing files: 63%|████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3056/4877 [01:00<00:30, 59.29it/s]\u001b[A\n", + "Processing files: 63%|████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3065/4877 [01:00<00:30, 59.39it/s]\u001b[A\n", + "Processing files: 63%|████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3072/4877 [01:01<00:34, 52.86it/s]\u001b[A\n", + "Processing files: 63%|█████████████████████████████████████████████████████████████████████████████████████████████████████ | 3082/4877 [01:01<00:29, 61.06it/s]\u001b[A\n", + "Processing files: 63%|█████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3093/4877 [01:01<00:25, 70.27it/s]\u001b[A\n", + "Processing files: 64%|█████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3101/4877 [01:01<00:24, 71.88it/s]\u001b[A\n", + "Processing files: 64%|█████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3109/4877 [01:01<00:24, 71.52it/s]\u001b[A\n", + "Processing files: 64%|██████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3117/4877 [01:01<00:24, 73.27it/s]\u001b[A\n", + "Processing files: 64%|██████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3125/4877 [01:01<00:29, 59.03it/s]\u001b[A\n", + "Processing files: 64%|██████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3132/4877 [01:02<00:31, 56.11it/s]\u001b[A\n", + "Processing files: 64%|██████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3138/4877 [01:02<00:33, 51.69it/s]\u001b[A\n", + "Processing files: 64%|███████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3144/4877 [01:02<00:40, 42.55it/s]\u001b[A\n", + "Processing files: 65%|███████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3151/4877 [01:02<00:38, 44.87it/s]\u001b[A\n", + "Processing files: 65%|███████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3165/4877 [01:02<00:26, 63.44it/s]\u001b[A\n", + "Processing files: 65%|████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3176/4877 [01:02<00:24, 70.74it/s]\u001b[A\n", + "Processing files: 65%|████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3185/4877 [01:02<00:24, 69.97it/s]\u001b[A\n", + "Processing files: 65%|████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3193/4877 [01:03<00:25, 66.42it/s]\u001b[A\n", + "Processing files: 66%|█████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3202/4877 [01:03<00:23, 71.42it/s]\u001b[A\n", + "Processing files: 66%|█████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3210/4877 [01:03<00:25, 64.16it/s]\u001b[A\n", + "Processing files: 66%|█████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3217/4877 [01:03<00:31, 52.18it/s]\u001b[A\n", + "Processing files: 66%|█████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3223/4877 [01:03<00:46, 35.52it/s]\u001b[A\n", + "Processing files: 66%|█████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3229/4877 [01:03<00:41, 39.37it/s]\u001b[A\n", + "Processing files: 66%|██████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3241/4877 [01:04<00:30, 53.55it/s]\u001b[A\n", + "Processing files: 67%|██████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3254/4877 [01:04<00:23, 68.02it/s]\u001b[A\n", + "Processing files: 67%|███████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3263/4877 [01:04<00:23, 70.01it/s]\u001b[A\n", + "Processing files: 67%|███████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3271/4877 [01:04<00:32, 48.80it/s]\u001b[A\n", + "Processing files: 67%|███████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3279/4877 [01:04<00:29, 53.59it/s]\u001b[A\n", + "Processing files: 67%|███████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3286/4877 [01:04<00:28, 56.55it/s]\u001b[A\n", + "Processing files: 68%|████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3296/4877 [01:04<00:24, 65.30it/s]\u001b[A\n", + "Processing files: 68%|████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3305/4877 [01:05<00:22, 68.40it/s]\u001b[A\n", + "Processing files: 68%|████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3313/4877 [01:05<00:22, 70.71it/s]\u001b[A\n", + "Processing files: 68%|████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3321/4877 [01:05<00:27, 55.90it/s]\u001b[A\n", + "Processing files: 68%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3328/4877 [01:05<00:37, 40.92it/s]\u001b[A\n", + "Processing files: 68%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3334/4877 [01:06<00:53, 28.86it/s]\u001b[A\n", + "Processing files: 69%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3343/4877 [01:06<00:40, 37.55it/s]\u001b[A\n", + "Processing files: 69%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3357/4877 [01:06<00:28, 54.22it/s]\u001b[A\n", + "Processing files: 69%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3367/4877 [01:06<00:24, 62.64it/s]\u001b[A\n", + "Processing files: 69%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3377/4877 [01:06<00:22, 66.00it/s]\u001b[A\n", + "Processing files: 69%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3387/4877 [01:06<00:20, 72.89it/s]\u001b[A\n", + "Processing files: 70%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3398/4877 [01:06<00:19, 76.09it/s]\u001b[A\n", + "Processing files: 70%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3407/4877 [01:07<00:35, 41.29it/s]\u001b[A\n", + "Processing files: 70%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3415/4877 [01:07<00:31, 45.93it/s]\u001b[A\n", + "Processing files: 70%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3428/4877 [01:07<00:25, 56.90it/s]\u001b[A\n", + "Processing files: 70%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3436/4877 [01:07<00:33, 43.56it/s]\u001b[A\n", + "Processing files: 71%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3442/4877 [01:08<00:34, 41.44it/s]\u001b[A\n", + "Processing files: 71%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3450/4877 [01:08<00:30, 47.49it/s]\u001b[A\n", + "Processing files: 71%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3456/4877 [01:08<00:37, 38.09it/s]\u001b[A\n", + "Processing files: 71%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3461/4877 [01:08<00:38, 37.05it/s]\u001b[A\n", + "Processing files: 71%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3466/4877 [01:08<00:36, 38.21it/s]\u001b[A\n", + "Processing files: 71%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3471/4877 [01:08<00:35, 39.63it/s]\u001b[A\n", + "Processing files: 71%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3476/4877 [01:08<00:41, 33.86it/s]\u001b[A\n", + "Processing files: 71%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3480/4877 [01:09<00:41, 33.89it/s]\u001b[A\n", + "Processing files: 71%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3486/4877 [01:09<00:36, 38.05it/s]\u001b[A\n", + "Processing files: 72%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3491/4877 [01:09<00:35, 38.51it/s]\u001b[A\n", + "Processing files: 72%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3497/4877 [01:09<00:33, 41.61it/s]\u001b[A\n", + "Processing files: 72%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3504/4877 [01:09<00:28, 47.61it/s]\u001b[A\n", + "Processing files: 72%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3509/4877 [01:09<00:32, 41.57it/s]\u001b[A\n", + "Processing files: 72%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3516/4877 [01:09<00:28, 46.94it/s]\u001b[A\n", + "Processing files: 72%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3533/4877 [01:09<00:18, 71.33it/s]\u001b[A\n", + "Processing files: 73%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3541/4877 [01:10<00:18, 72.63it/s]\u001b[A\n", + "Processing files: 73%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3549/4877 [01:10<00:18, 72.75it/s]\u001b[A\n", + "Processing files: 73%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3560/4877 [01:10<00:16, 81.78it/s]\u001b[A\n", + "Processing files: 73%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3569/4877 [01:10<00:17, 74.52it/s]\u001b[A\n", + "Processing files: 73%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3577/4877 [01:10<00:19, 65.90it/s]\u001b[A\n", + "Processing files: 73%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3584/4877 [01:10<00:24, 53.22it/s]\u001b[A\n", + "Processing files: 74%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3590/4877 [01:10<00:27, 47.13it/s]\u001b[A\n", + "Processing files: 74%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3597/4877 [01:11<00:25, 50.56it/s]\u001b[A\n", + "Processing files: 74%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3603/4877 [01:11<00:29, 43.26it/s]\u001b[A\n", + "Processing files: 74%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3612/4877 [01:11<00:25, 49.21it/s]\u001b[A\n", + "Processing files: 74%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3619/4877 [01:11<00:30, 41.01it/s]\u001b[A\n", + "Processing files: 74%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3624/4877 [01:11<00:32, 38.41it/s]\u001b[A\n", + "Processing files: 74%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3629/4877 [01:12<00:43, 28.93it/s]\u001b[A\n", + "Processing files: 74%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3633/4877 [01:12<00:43, 28.32it/s]\u001b[A\n", + "Processing files: 75%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3637/4877 [01:12<00:40, 30.33it/s]\u001b[A\n", + "Processing files: 75%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3641/4877 [01:12<00:40, 30.59it/s]\u001b[A\n", + "Processing files: 75%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3645/4877 [01:12<00:44, 27.44it/s]\u001b[A\n", + "Processing files: 75%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3653/4877 [01:12<00:32, 38.11it/s]\u001b[A\n", + "Processing files: 75%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3659/4877 [01:12<00:29, 40.89it/s]\u001b[A\n", + "Processing files: 75%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3664/4877 [01:13<00:36, 33.42it/s]\u001b[A\n", + "Processing files: 75%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3668/4877 [01:13<00:35, 34.45it/s]\u001b[A\n", + "Processing files: 75%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3677/4877 [01:13<00:25, 46.32it/s]\u001b[A\n", + "Processing files: 76%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3688/4877 [01:13<00:23, 51.56it/s]\u001b[A\n", + "Processing files: 76%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3700/4877 [01:13<00:19, 60.77it/s]\u001b[A\n", + "Processing files: 76%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3708/4877 [01:13<00:17, 65.09it/s]\u001b[A\n", + "Processing files: 76%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3715/4877 [01:13<00:17, 65.78it/s]\u001b[A\n", + "Processing files: 76%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3723/4877 [01:14<00:19, 59.34it/s]\u001b[A\n", + "Processing files: 76%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3730/4877 [01:14<00:20, 57.08it/s]\u001b[A\n", + "Processing files: 77%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3736/4877 [01:14<00:20, 55.68it/s]\u001b[A\n", + "Processing files: 77%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3744/4877 [01:14<00:18, 60.10it/s]\u001b[A\n", + "Processing files: 77%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3753/4877 [01:14<00:18, 62.12it/s]\u001b[A\n", + "Processing files: 77%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3765/4877 [01:14<00:15, 74.08it/s]\u001b[A\n", + "Processing files: 77%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3774/4877 [01:14<00:15, 69.54it/s]\u001b[A\n", + "Processing files: 78%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3782/4877 [01:14<00:16, 66.79it/s]\u001b[A\n", + "Processing files: 78%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3790/4877 [01:15<00:16, 65.00it/s]\u001b[A\n", + "Processing files: 78%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3797/4877 [01:15<00:17, 60.76it/s]\u001b[A\n", + "Processing files: 78%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3809/4877 [01:15<00:14, 74.13it/s]\u001b[A\n", + "Processing files: 78%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3818/4877 [01:15<00:14, 72.79it/s]\u001b[A\n", + "Processing files: 78%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3827/4877 [01:15<00:13, 76.95it/s]\u001b[A\n", + "Processing files: 79%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3837/4877 [01:15<00:12, 81.41it/s]\u001b[A\n", + "Processing files: 79%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3847/4877 [01:15<00:12, 80.45it/s]\u001b[A\n", + "Processing files: 79%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3856/4877 [01:15<00:13, 74.25it/s]\u001b[A\n", + "Processing files: 79%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3864/4877 [01:16<00:15, 66.42it/s]\u001b[A\n", + "Processing files: 79%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3871/4877 [01:16<00:23, 43.61it/s]\u001b[A\n", + "Processing files: 79%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3877/4877 [01:16<00:22, 44.16it/s]\u001b[A\n", + "Processing files: 80%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3889/4877 [01:16<00:17, 57.98it/s]\u001b[A\n", + "Processing files: 80%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3896/4877 [01:16<00:16, 59.50it/s]\u001b[A\n", + "Processing files: 80%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3903/4877 [01:16<00:19, 50.56it/s]\u001b[A\n", + "Processing files: 80%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3909/4877 [01:17<00:19, 50.91it/s]\u001b[A\n", + "Processing files: 80%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3920/4877 [01:17<00:15, 60.35it/s]\u001b[A\n", + "Processing files: 81%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3927/4877 [01:17<00:17, 53.46it/s]\u001b[A\n", + "Processing files: 81%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3935/4877 [01:17<00:16, 57.04it/s]\u001b[A\n", + "Processing files: 81%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3942/4877 [01:17<00:15, 58.79it/s]\u001b[A\n", + "Processing files: 81%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3954/4877 [01:17<00:13, 70.97it/s]\u001b[A\n", + "Processing files: 81%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3962/4877 [01:17<00:15, 59.37it/s]\u001b[A\n", + "Processing files: 81%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3969/4877 [01:18<00:16, 54.87it/s]\u001b[A\n", + "Processing files: 82%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3978/4877 [01:18<00:14, 62.21it/s]\u001b[A\n", + "Processing files: 82%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3985/4877 [01:18<00:15, 59.21it/s]\u001b[A\n", + "Processing files: 82%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3997/4877 [01:18<00:13, 67.54it/s]\u001b[A\n", + "Processing files: 82%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4005/4877 [01:18<00:12, 68.06it/s]\u001b[A\n", + "Processing files: 82%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4017/4877 [01:18<00:10, 79.89it/s]\u001b[A\n", + "Processing files: 83%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4026/4877 [01:18<00:10, 82.11it/s]\u001b[A\n", + "Processing files: 83%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4038/4877 [01:18<00:09, 87.58it/s]\u001b[A\n", + "Processing files: 83%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4052/4877 [01:18<00:08, 92.68it/s]\u001b[A\n", + "Processing files: 83%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4062/4877 [01:19<00:08, 93.45it/s]\u001b[A\n", + "Processing files: 83%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4072/4877 [01:19<00:10, 73.42it/s]\u001b[A\n", + "Processing files: 84%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4081/4877 [01:19<00:12, 62.43it/s]\u001b[A\n", + "Processing files: 84%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4089/4877 [01:19<00:12, 65.25it/s]\u001b[A\n", + "Processing files: 84%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4097/4877 [01:19<00:12, 60.43it/s]\u001b[A\n", + "Processing files: 84%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4106/4877 [01:19<00:11, 66.33it/s]\u001b[A\n", + "Processing files: 84%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4115/4877 [01:19<00:10, 70.09it/s]\u001b[A\n", + "Processing files: 85%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4125/4877 [01:20<00:10, 74.37it/s]\u001b[A\n", + "Processing files: 85%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4133/4877 [01:20<00:10, 71.00it/s]\u001b[A\n", + "Processing files: 85%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4141/4877 [01:20<00:15, 46.67it/s]\u001b[A\n", + "Processing files: 85%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4147/4877 [01:20<00:14, 49.00it/s]\u001b[A\n", + "Processing files: 85%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4155/4877 [01:20<00:13, 55.13it/s]\u001b[A\n", + "Processing files: 85%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4162/4877 [01:20<00:15, 46.99it/s]\u001b[A\n", + "Processing files: 85%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4169/4877 [01:21<00:13, 51.71it/s]\u001b[A\n", + "Processing files: 86%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4175/4877 [01:21<00:13, 51.51it/s]\u001b[A\n", + "Processing files: 86%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4181/4877 [01:21<00:13, 53.27it/s]\u001b[A\n", + "Processing files: 86%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4188/4877 [01:21<00:12, 53.04it/s]\u001b[A\n", + "Processing files: 86%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4194/4877 [01:21<00:13, 48.82it/s]\u001b[A\n", + "Processing files: 86%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4200/4877 [01:21<00:14, 47.73it/s]\u001b[A\n", + "Processing files: 86%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4205/4877 [01:21<00:14, 45.10it/s]\u001b[A\n", + "Processing files: 86%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4213/4877 [01:21<00:13, 50.33it/s]\u001b[A\n", + "Processing files: 87%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4219/4877 [01:22<00:13, 50.39it/s]\u001b[A\n", + "Processing files: 87%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4225/4877 [01:22<00:12, 52.12it/s]\u001b[A\n", + "Processing files: 87%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4231/4877 [01:22<00:12, 53.16it/s]\u001b[A\n", + "Processing files: 87%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4238/4877 [01:22<00:13, 46.93it/s]\u001b[A\n", + "Processing files: 87%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4243/4877 [01:22<00:15, 40.90it/s]\u001b[A\n", + "Processing files: 87%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4253/4877 [01:22<00:12, 50.13it/s]\u001b[A\n", + "Processing files: 87%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4259/4877 [01:23<00:15, 40.54it/s]\u001b[A\n", + "Processing files: 87%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4264/4877 [01:23<00:16, 37.16it/s]\u001b[A\n", + "Processing files: 88%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4269/4877 [01:23<00:15, 39.52it/s]\u001b[A\n", + "Processing files: 88%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4274/4877 [01:23<00:15, 38.76it/s]\u001b[A\n", + "Processing files: 88%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4286/4877 [01:23<00:10, 55.81it/s]\u001b[A\n", + "Processing files: 88%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4293/4877 [01:23<00:12, 45.66it/s]\u001b[A\n", + "Processing files: 88%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4299/4877 [01:23<00:15, 38.10it/s]\u001b[A\n", + "Processing files: 88%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4304/4877 [01:24<00:14, 39.54it/s]\u001b[A\n", + "Processing files: 88%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4309/4877 [01:24<00:13, 40.89it/s]\u001b[A\n", + "Processing files: 89%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4322/4877 [01:24<00:09, 59.74it/s]\u001b[A\n", + "Processing files: 89%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4331/4877 [01:24<00:08, 66.52it/s]\u001b[A\n", + "Processing files: 89%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4339/4877 [01:24<00:07, 67.29it/s]\u001b[A\n", + "Processing files: 89%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4347/4877 [01:24<00:07, 67.23it/s]\u001b[A\n", + "Processing files: 89%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4356/4877 [01:24<00:07, 66.35it/s]\u001b[A\n", + "Processing files: 89%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4363/4877 [01:25<00:09, 56.20it/s]\u001b[A\n", + "Processing files: 90%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4370/4877 [01:25<00:08, 56.37it/s]\u001b[A\n", + "Processing files: 90%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4376/4877 [01:25<00:09, 54.55it/s]\u001b[A\n", + "Processing files: 90%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4382/4877 [01:25<00:10, 47.58it/s]\u001b[A\n", + "Processing files: 90%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4388/4877 [01:25<00:09, 50.01it/s]\u001b[A\n", + "Processing files: 90%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4394/4877 [01:25<00:11, 42.43it/s]\u001b[A\n", + "Processing files: 90%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4402/4877 [01:25<00:09, 50.23it/s]\u001b[A\n", + "Processing files: 90%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4411/4877 [01:26<00:12, 38.18it/s]\u001b[A\n", + "Processing files: 91%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4416/4877 [01:27<00:28, 16.28it/s]\u001b[A\n", + "Processing files: 91%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4424/4877 [01:27<00:20, 21.93it/s]\u001b[A\n", + "Processing files: 91%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4436/4877 [01:27<00:14, 31.38it/s]\u001b[A\n", + "Processing files: 91%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4444/4877 [01:27<00:11, 36.24it/s]\u001b[A\n", + "Processing files: 91%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4450/4877 [01:27<00:14, 30.46it/s]\u001b[A\n", + "Processing files: 91%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4455/4877 [01:27<00:12, 33.17it/s]\u001b[A\n", + "Processing files: 91%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4460/4877 [01:28<00:13, 30.88it/s]\u001b[A\n", + "Processing files: 92%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4471/4877 [01:28<00:09, 44.17it/s]\u001b[A\n", + "Processing files: 92%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4477/4877 [01:28<00:10, 38.92it/s]\u001b[A\n", + "Processing files: 92%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4485/4877 [01:28<00:08, 46.59it/s]\u001b[A\n", + "Processing files: 92%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4491/4877 [01:28<00:08, 47.89it/s]\u001b[A\n", + "Processing files: 92%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4508/4877 [01:28<00:04, 75.12it/s]\u001b[A\n", + "Processing files: 93%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4517/4877 [01:28<00:05, 63.65it/s]\u001b[A\n", + "Processing files: 93%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4525/4877 [01:29<00:05, 64.78it/s]\u001b[A\n", + "Processing files: 93%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4534/4877 [01:29<00:05, 68.25it/s]\u001b[A\n", + "Processing files: 93%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4548/4877 [01:29<00:03, 85.29it/s]\u001b[A\n", + "Processing files: 93%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4558/4877 [01:29<00:03, 83.73it/s]\u001b[A\n", + "Processing files: 94%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4570/4877 [01:29<00:03, 90.24it/s]\u001b[A\n", + "Processing files: 94%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4580/4877 [01:29<00:03, 86.85it/s]\u001b[A\n", + "Processing files: 94%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4590/4877 [01:29<00:03, 77.73it/s]\u001b[A\n", + "Processing files: 94%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4599/4877 [01:30<00:05, 55.07it/s]\u001b[A\n", + "Processing files: 94%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4606/4877 [01:30<00:07, 38.39it/s]\u001b[A\n", + "Processing files: 95%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4612/4877 [01:30<00:06, 41.53it/s]\u001b[A\n", + "Processing files: 95%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4621/4877 [01:30<00:05, 49.55it/s]\u001b[A\n", + "Processing files: 95%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4628/4877 [01:30<00:04, 51.50it/s]\u001b[A\n", + "Processing files: 95%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4641/4877 [01:30<00:03, 65.01it/s]\u001b[A\n", + "Processing files: 95%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4649/4877 [01:31<00:04, 53.61it/s]\u001b[A\n", + "Processing files: 95%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4656/4877 [01:31<00:03, 56.60it/s]\u001b[A\n", + "Processing files: 96%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4663/4877 [01:31<00:04, 51.69it/s]\u001b[A\n", + "Processing files: 96%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4675/4877 [01:31<00:03, 64.86it/s]\u001b[A\n", + "Processing files: 96%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4683/4877 [01:31<00:02, 64.94it/s]\u001b[A\n", + "Processing files: 96%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4691/4877 [01:31<00:02, 64.90it/s]\u001b[A\n", + "Processing files: 96%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4698/4877 [01:31<00:03, 52.37it/s]\u001b[A\n", + "Processing files: 96%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4704/4877 [01:32<00:04, 41.00it/s]\u001b[A\n", + "Processing files: 97%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4711/4877 [01:32<00:03, 44.31it/s]\u001b[A\n", + "Processing files: 97%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4721/4877 [01:32<00:02, 52.76it/s]\u001b[A\n", + "Processing files: 97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4730/4877 [01:32<00:02, 58.76it/s]\u001b[A\n", + "Processing files: 97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4737/4877 [01:32<00:02, 55.67it/s]\u001b[A\n", + "Processing files: 97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4743/4877 [01:32<00:02, 48.62it/s]\u001b[A\n", + "Processing files: 97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4749/4877 [01:37<00:28, 4.55it/s]\u001b[A\n", + "Processing files: 97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4753/4877 [01:43<01:00, 2.04it/s]\u001b[A\n", + "Processing files: 97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4754/4877 [01:58<01:00, 2.04it/s]\u001b[A\n", + "Processing files: 97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4755/4877 [02:02<03:12, 1.58s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4756/4877 [02:08<03:52, 1.92s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4758/4877 [02:08<03:09, 1.60s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4760/4877 [02:09<02:41, 1.38s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4762/4877 [02:13<02:51, 1.49s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4763/4877 [02:17<03:23, 1.79s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4764/4877 [02:17<02:57, 1.58s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4765/4877 [02:18<02:29, 1.33s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4766/4877 [02:18<02:11, 1.18s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4767/4877 [02:18<01:45, 1.05it/s]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4768/4877 [02:19<01:43, 1.06it/s]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4769/4877 [02:26<04:19, 2.40s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4770/4877 [02:28<04:00, 2.25s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4771/4877 [02:31<04:20, 2.46s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4772/4877 [02:31<03:24, 1.95s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4773/4877 [02:33<03:23, 1.96s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4774/4877 [02:35<03:28, 2.03s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4775/4877 [02:36<02:32, 1.49s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4776/4877 [02:37<02:29, 1.48s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4777/4877 [02:39<02:39, 1.59s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4778/4877 [02:39<01:58, 1.19s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4779/4877 [02:42<02:56, 1.80s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4780/4877 [02:43<02:26, 1.51s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4781/4877 [02:45<02:42, 1.70s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4782/4877 [02:48<03:14, 2.05s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4783/4877 [02:52<04:00, 2.56s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4784/4877 [02:52<02:57, 1.91s/it]\u001b[A\n", + "Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4785/4877 [02:54<02:55, 1.91s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4786/4877 [02:55<02:14, 1.48s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4787/4877 [02:56<01:51, 1.24s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4788/4877 [02:56<01:22, 1.08it/s]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4789/4877 [03:00<02:54, 1.99s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4791/4877 [03:02<02:10, 1.52s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4792/4877 [03:03<01:58, 1.39s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4793/4877 [03:04<01:41, 1.20s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4794/4877 [03:05<01:39, 1.20s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4795/4877 [03:07<01:50, 1.35s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4796/4877 [03:10<02:28, 1.84s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4797/4877 [03:12<02:29, 1.86s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4798/4877 [03:14<02:30, 1.91s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4799/4877 [03:15<02:11, 1.69s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4800/4877 [03:17<02:10, 1.70s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4801/4877 [03:17<01:48, 1.42s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4802/4877 [03:18<01:39, 1.33s/it]\u001b[A\n", + "Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4803/4877 [03:22<02:35, 2.10s/it]\u001b[A\n", + "Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4804/4877 [03:24<02:23, 1.97s/it]\u001b[A\n", + "Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4805/4877 [03:26<02:17, 1.92s/it]\u001b[A\n", + "Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4807/4877 [03:31<02:31, 2.16s/it]\u001b[A\n", + "Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4808/4877 [03:32<02:05, 1.82s/it]\u001b[A\n", + "Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4809/4877 [03:32<01:39, 1.46s/it]\u001b[A\n", + "Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4810/4877 [03:33<01:22, 1.23s/it]\u001b[A\n", + "Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4811/4877 [03:34<01:32, 1.40s/it]\u001b[A\n", + "Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4812/4877 [03:42<03:29, 3.22s/it]\u001b[A\n", + "Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4813/4877 [03:42<02:31, 2.36s/it]\u001b[A\n", + "Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4814/4877 [03:43<01:58, 1.88s/it]\u001b[A\n", + "Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4815/4877 [03:51<03:49, 3.69s/it]\u001b[A\n", + "Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4816/4877 [03:54<03:24, 3.35s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4817/4877 [03:59<03:57, 3.96s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4818/4877 [04:00<02:54, 2.96s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4819/4877 [04:01<02:20, 2.43s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4821/4877 [04:06<02:16, 2.43s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4822/4877 [04:09<02:28, 2.70s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4823/4877 [04:12<02:23, 2.65s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4825/4877 [04:17<02:18, 2.67s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4826/4877 [04:20<02:18, 2.72s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4827/4877 [04:21<01:49, 2.18s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4828/4877 [04:23<01:46, 2.17s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4829/4877 [04:23<01:23, 1.74s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4830/4877 [04:34<03:11, 4.08s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4831/4877 [04:39<03:32, 4.63s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4832/4877 [04:40<02:30, 3.33s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4833/4877 [04:40<01:52, 2.56s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4834/4877 [04:43<01:49, 2.54s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4835/4877 [04:52<03:04, 4.39s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4836/4877 [04:52<02:08, 3.14s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4837/4877 [04:53<01:40, 2.52s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4838/4877 [04:54<01:23, 2.15s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4839/4877 [04:56<01:19, 2.08s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4840/4877 [04:58<01:18, 2.11s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4841/4877 [05:00<01:14, 2.08s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4842/4877 [05:01<01:03, 1.82s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4843/4877 [05:03<01:03, 1.88s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4844/4877 [05:04<00:50, 1.53s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4845/4877 [05:05<00:44, 1.40s/it]\u001b[A\n", + "Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4846/4877 [05:09<01:01, 1.98s/it]\u001b[A\n", + "Processing files: 99%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4847/4877 [05:10<00:58, 1.94s/it]\u001b[A\n", + "Processing files: 99%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4848/4877 [05:12<00:54, 1.86s/it]\u001b[A\n", + "Processing files: 99%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4849/4877 [05:13<00:48, 1.72s/it]\u001b[A\n", + "Processing files: 99%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4850/4877 [05:15<00:47, 1.75s/it]\u001b[A\n", + "Processing files: 99%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏| 4851/4877 [05:17<00:46, 1.77s/it]\u001b[A\n", + "Processing files: 99%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏| 4852/4877 [05:19<00:43, 1.73s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏| 4853/4877 [05:27<01:30, 3.78s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏| 4854/4877 [05:28<01:06, 2.90s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎| 4855/4877 [05:30<00:53, 2.44s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎| 4856/4877 [05:36<01:13, 3.52s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎| 4857/4877 [05:46<01:51, 5.55s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍| 4858/4877 [05:51<01:42, 5.38s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍| 4859/4877 [05:53<01:20, 4.48s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍| 4860/4877 [06:07<02:05, 7.36s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍| 4861/4877 [06:11<01:37, 6.10s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌| 4862/4877 [06:25<02:09, 8.66s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌| 4863/4877 [06:33<01:56, 8.35s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌| 4864/4877 [06:43<01:55, 8.88s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌| 4865/4877 [06:50<01:39, 8.33s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋| 4866/4877 [06:51<01:07, 6.16s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋| 4867/4877 [06:52<00:47, 4.70s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋| 4868/4877 [06:55<00:36, 4.04s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋| 4869/4877 [07:13<01:06, 8.37s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊| 4870/4877 [07:15<00:45, 6.45s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊| 4871/4877 [07:16<00:27, 4.61s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊| 4872/4877 [07:17<00:18, 3.69s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊| 4873/4877 [07:20<00:13, 3.26s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉| 4874/4877 [07:21<00:08, 2.81s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉| 4875/4877 [07:42<00:16, 8.24s/it]\u001b[A\n", + "Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉| 4876/4877 [07:46<00:06, 6.88s/it]\u001b[A\n", + "Processing files: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 4877/4877 [08:15<00:00, 9.83it/s]\u001b[A\n" + ] + } + ], + "source": [ + "import glob\n", + "import os\n", + "from concurrent.futures import ThreadPoolExecutor\n", + "import unicodedata # to normalize text\n", + "import html2text # to convert html to text\n", + "from langchain.document_loaders import PyPDFLoader, Docx2txtLoader\n", + "import pikepdf # to repair PDFs\n", + "from pathlib import Path\n", + "from tqdm.notebook import tqdm\n", + "from concurrent.futures import ThreadPoolExecutor, as_completed\n", + "\n", + "# todo: hardcoded paths\n", + "output_path = \"/home/marius/source/bookworm/export.txt\"\n", + "\n", + "def convert_html_to_text(html_blob: str) -> str:\n", + " \"\"\"\n", + " Converts a html blob into a string.\n", + " \"\"\"\n", + " h = html2text.HTML2Text()\n", + " h.mark_code = True\n", + " h.escape_snob = True\n", + " h.unicode_snob = True\n", + " # h.use_automatic_links = True \n", + " h.images_as_html = True\n", + " h.single_line_break = True\n", + " h.ignore_links = True\n", + " return h.handle(html_blob)\n", + "\n", + "def normalize_text(txt_blob: str) -> str:\n", + " \"\"\"\n", + " Normalize a text blob using NFKD normalization.\n", + " \"\"\"\n", + " return unicodedata.normalize(\"NFKD\", txt_blob)\n", + "\n", + "def repair_pdf(file_path: str) -> bool:\n", + " \"\"\"\n", + " Attempts to repair a PDF file using pikepdf.\n", + " \"\"\"\n", + " try:\n", + " with pikepdf.open(file_path, allow_overwriting_input=True) as pdf:\n", + " pdf.save(file_path)\n", + " return True\n", + " except pikepdf.PdfError as e:\n", + " print(f\"Failed to repair PDF {file_path}: {e}\")\n", + " return False\n", + "\n", + "def read_and_convert_file(file_path: str, is_html: bool, is_pdf: bool, is_docx: bool) -> str:\n", + " \"\"\"\n", + " Reads and converts a file from HTML, PDF, DOCX, or plain text to text.\n", + " \"\"\"\n", + " content = \"\"\n", + " if is_html:\n", + " try:\n", + " with open(file_path, 'r', encoding='utf-8') as file:\n", + " content = file.read()\n", + " return convert_html_to_text(content)\n", + " except Exception as e:\n", + " print(f\"Error reading {file_path}: {e}\")\n", + " return \"\"\n", + "\n", + " elif is_pdf:\n", + " try:\n", + " loader = PyPDFLoader(file_path)\n", + " # ... fixes \"Multiple definitions in dictionary at byte 0xb32 for key /ExtGState\" error\n", + " documents = loader.load()\n", + " content = \"\\n\".join(doc.page_content for doc in documents if hasattr(doc, 'page_content'))\n", + " except Exception as e:\n", + " print(f\"Error loading PDF {file_path}: {e}. Attempting to repair...\")\n", + " if repair_pdf(file_path):\n", + " try:\n", + " loader = PyPDFLoader(file_path)\n", + " documents = loader.load()\n", + " content = \"\\n\".join(doc.page_content for doc in documents if hasattr(doc, 'page_content'))\n", + " except Exception as e:\n", + " print(f\"Failed to process PDF {file_path} after repair: {e}\")\n", + " return \"\"\n", + " return normalize_text(content)\n", + "\n", + " elif is_docx:\n", + " try:\n", + " loader = Docx2txtLoader(file_path)\n", + " content = loader.load()\n", + " if isinstance(content, list):\n", + " content = \"\\n\".join(content)\n", + " except Exception as e:\n", + " print(f\"Error reading DOCX {file_path}: {e}\")\n", + " return \"\"\n", + " return normalize_text(content)\n", + "\n", + " else: # For plain text files\n", + " try:\n", + " with open(file_path, 'r', encoding='utf-8') as file:\n", + " return normalize_text(file.read())\n", + " except Exception as e:\n", + " print(f\"Error reading {file_path}: {e}\")\n", + " return \"\"\n", + "\n", + "def sanitize_text(text):\n", + " \"\"\"\n", + " Removes or replaces surrogate characters from a string.\n", + " \"\"\"\n", + " return text.encode('utf-8', 'replace').decode('utf-8')\n", + "\n", + "def append_to_output(data: str, is_pdf: bool, is_docx: bool, output_path: str):\n", + " \"\"\"\n", + " Appends sanitized data to an output file.\n", + " \"\"\"\n", + " sanitized_data = sanitize_text(data)\n", + " if is_pdf or is_docx:\n", + " output_path = str(Path(output_path).with_suffix('')) + \".documents.txt\"\n", + " \n", + " with open(output_path, \"a\", encoding='utf-8') as output_file:\n", + " output_file.write(sanitized_data)\n", + "\n", + "def process_file(file):\n", + " is_html = file.endswith('.html')\n", + " is_pdf = file.endswith('.pdf')\n", + " is_docx = file.endswith('.docx')\n", + " \n", + " file_content = read_and_convert_file(file, is_html, is_pdf, is_docx)\n", + " append_to_output(file_content, is_pdf, is_docx, output_path=output_path)\n", + "\n", + "def process_files_in_directory(directory: str):\n", + " txt_html_files = glob.glob(os.path.join(directory, \"*.txt\")) + glob.glob(os.path.join(directory, \"*.html\"))\n", + " pdf_docx_files = glob.glob(os.path.join(directory, \"img\", \"*.pdf\")) + glob.glob(os.path.join(directory, \"img\", \"*.docx\"))\n", + " all_files = txt_html_files + pdf_docx_files\n", + "\n", + " # Initialize the progress bar\n", + " pbar = tqdm(total=len(all_files), desc=\"Processing files\")\n", + "\n", + " with ThreadPoolExecutor(max_workers=3) as executor:\n", + " # Submit all files to the executor and store future objects\n", + " futures = [executor.submit(process_file, file) for file in all_files]\n", + " \n", + " # As tasks complete, update the progress bar\n", + " for future in as_completed(futures):\n", + " pbar.update(1) # Update the progress bar by one for each task completed\n", + "\n", + " # Ensure the progress bar is closed upon completion\n", + " pbar.close()\n", + "\n", + "process_files_in_directory(\"/home/marius/data/it-sec-research-extracted/IT sec research\")" + ] + }, + { + "cell_type": "markdown", + "id": "e1bcc07f980c865f", + "metadata": { + "collapsed": false + }, + "source": [ + "## Chunking of the texts\n", + "\n", + "The texts need to get chunked (pre-processing) before the embedding process." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "b14fb1c3219660ad", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-17T16:13:14.479469Z", + "start_time": "2024-03-17T16:13:14.476765Z" + }, + "collapsed": false + }, + "outputs": [], + "source": [ + "os.chdir(\"/home/marius/source/bookworm\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "de8d9f18d8342c57", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-21T15:17:53.867414Z", + "start_time": "2024-03-21T15:17:32.731232Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Now you have 723845 chunks\n" + ] + } + ], + "source": [ + "from langchain.text_splitter import RecursiveCharacterTextSplitter\n", + "\n", + "def chunk_text_data():\n", + " \n", + " with open('/home/marius/source/bookworm/export.txt') as f:\n", + " text_notes = f.read()\n", + " \n", + " text_splitter = RecursiveCharacterTextSplitter(\n", + " chunk_size=100,\n", + " chunk_overlap=20,\n", + " length_function=len\n", + " )\n", + " \n", + " chunks = text_splitter.create_documents([text_notes])\n", + " print(f'Now you have {len(chunks)} chunks')\n", + " return chunks\n", + " \n", + "chunks = chunk_text_data()" + ] + }, + { + "cell_type": "markdown", + "id": "aea7ceb111fed5f3", + "metadata": { + "collapsed": false + }, + "source": [ + "### Embedding costs - why no OpenAI?\n", + "\n", + "The OpenAI API has a cost for the embeddings.\n", + "At this point there seems to be no way to pre-estimate the costs reliably. \n", + "The following calculation is flawed:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "afb2c8feb9ca0bb4", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-21T15:18:51.003585Z", + "start_time": "2024-03-21T15:18:31.411234Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total Tokens: 15769414\n", + "Embedding Cost in USD: 473.08241999999996\n" + ] + } + ], + "source": [ + "def print_embedding_cost(texts):\n", + " import tiktoken\n", + " enc = tiktoken.encoding_for_model('gpt-4')\n", + " total_tokens = sum([len(enc.encode(page.page_content)) for page in texts])\n", + " print(f'Total Tokens: {total_tokens}')\n", + " print(f'Embedding Cost in USD: { (0.03 / 1_000) * total_tokens}')\n", + " \n", + "print_embedding_cost(chunks)" + ] + }, + { + "cell_type": "markdown", + "id": "8012516604037e2f", + "metadata": { + "collapsed": false + }, + "source": [ + "## Use Hugging Face Embeddings Sentence Transformers\n", + "\n", + "* use a self-hosted on-premises model for the embedding and vectorization\n", + "* configure it for the use with the CPU\n", + "\n", + "This model is from the Beijing Academy of Artificial Intelligence\n", + "* https://huggingface.co/BAAI/bge-large-en-v1.5 \n", + "* https://huggingface.co/docs/transformers/model_doc/auto \n", + "\n", + "It will produce embeddings of 1024 dimensions, roughly 500 less than OpenAI." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c1ca979bbc1610bb", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-21T15:19:15.167038Z", + "start_time": "2024-03-21T15:19:15.031139Z" + }, + "collapsed": false + }, + "outputs": [], + "source": [ + "from langchain.embeddings import HuggingFaceEmbeddings\n", + "\n", + "modelPath = \"BAAI/bge-large-en-v1.5\"\n", + "\n", + "# Create a dictionary with model configuration options, specifying to use the CPU for computations\n", + "model_kwargs = {'device':'cpu'}\n", + "\n", + "# Create a dictionary with encoding options, specifically setting 'normalize_embeddings' to False\n", + "encode_kwargs = {'normalize_embeddings': True}" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "3c2b9cd67f161714", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-21T15:42:28.163005Z", + "start_time": "2024-03-21T15:42:26.222594Z" + }, + "collapsed": false + }, + "outputs": [], + "source": [ + "# Initialize an instance of HuggingFaceEmbeddings with the specified parameters\n", + "# this model requires sentence_transformers\n", + "\n", + "embeddings = HuggingFaceEmbeddings(\n", + " model_name=modelPath, # Provide the pre-trained model's path\n", + " model_kwargs=model_kwargs, # Pass the model configuration options\n", + " encode_kwargs=encode_kwargs # Pass the encoding options\n", + " )\n" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "3b9ff8cad49442cf", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-21T16:18:45.930652Z", + "start_time": "2024-03-21T16:18:42.989032Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.02669697254896164, 0.017016947269439697, -0.0252668596804142, 0.027562297880649567, -0.036536093801259995, -0.04702713340520859, -0.008289276622235775, 0.027264799922704697, 0.0193538386374712, 0.09645088016986847, 0.04814787581562996, 0.020076178014278412, 0.04018039628863335, -0.05319904163479805, -0.0018393148202449083, 0.0004135535564273596, 0.0056005921214818954, -0.0007755732513032854, -0.01713593304157257, 0.046697087585926056, 0.02949507348239422, -0.002135329181328416, -0.06421148031949997, -0.0025980528444051743, -0.002175381872802973, -0.016258634626865387, 0.03560303896665573, 0.025036070495843887, 0.03057222068309784, 0.07080159336328506, -0.03819547966122627, -0.009489326737821102, 0.018622957170009613, -0.02314341999590397, -0.01928570494055748, 0.008893653750419617, 0.020412752404808998, -0.0026669444050639868, -0.04702509567141533, -0.07154359668493271, -0.00985659845173359, 0.0010672420030459762, 0.007422462571412325, -0.027616797015070915, -0.037166301161050797, -0.03903781622648239, -0.021067800000309944, 0.023234857246279716, -0.02984745241701603, -0.0003557372256182134, -0.0062873163260519505, 0.017065711319446564, 0.04882030934095383, -0.021840935572981834, 0.012029100209474564, 0.033996764570474625, -0.006590498611330986, 0.026026088744401932, -0.01962001994252205, 0.010742586106061935, 0.038518138229846954, -0.009543508291244507, 0.006120799575001001, -0.04429181292653084, 0.016838695853948593, 0.012138907797634602, -0.05647517368197441, 0.012697356753051281, -0.039533913135528564, 0.01181220356374979, -0.002553032711148262, 0.02627074159681797, -0.003673797706142068, -0.019179729744791985, -0.012743696570396423, 0.017957448959350586, -0.002778472378849983, 0.027680017054080963, -0.04603710398077965, 0.03110506199300289, -0.014483182691037655, 0.0061340732499957085, 0.023356124758720398, -0.027098359540104866, 0.025932958349585533, -0.054804012179374695, 0.021440045908093452, -0.0021313962060958147, 0.008103386498987675, -0.004042080603539944, 0.07958704978227615, 0.04686443880200386, 0.0025805693585425615, -0.024902688339352608, 0.0027323083486407995, 0.012498576194047928, -0.007472028490155935, 0.04842745512723923, -0.009689773432910442, -0.002272476674988866, 0.049017928540706635, 0.009563890285789967, -0.02213067188858986, 0.046894025057554245, -0.016963794827461243, -0.001712314086034894, -0.007016458548605442, 0.027962010353803635, -0.0058366162702441216, -0.03457598388195038, 0.026866907253861427, -0.0060468679293990135, 0.00999391358345747, 0.006039618514478207, -0.01602409966289997, 0.026533283293247223, -0.01798826828598976, 0.024779003113508224, 0.007074084132909775, -0.030575281009078026, 0.007484155241400003, 0.009421328082680702, 0.018538348376750946, -0.008937075734138489, -0.0016853661509230733, -0.037765245884656906, -0.008333210833370686, 0.029538191854953766, -0.05277511849999428, -0.008469143882393837, -0.011122306808829308, -0.013142808340489864, 0.018477508798241615, 0.029102321714162827, -0.050660859793424606, 0.020982826128602028, 0.02953541837632656, 0.009202391840517521, 0.005015721544623375, -0.014471577480435371, 0.005917319096624851, -0.02452758327126503, 0.034311287105083466, 0.06870651245117188, -0.004787039011716843, 0.03030187450349331, 0.02345900796353817, 0.00826261192560196, -0.008425573818385601, 0.019262364134192467, -0.041782982647418976, -0.01021308172494173, 0.020281389355659485, 0.05825428292155266, -0.02157139964401722, -0.004128106404095888, -0.0027353025507181883, 0.03297201544046402, -0.014398119412362576, 0.014553392305970192, 0.03983527049422264, 0.04522328823804855, -0.0227439533919096, 0.0208287313580513, -0.048643942922353745, 0.0009082997567020357, -0.006951106246560812, -0.035037606954574585, 0.01375054381787777, -0.01445818692445755, 0.029134731739759445, -0.022526120766997337, -0.008102713152766228, 0.003899186383932829, 0.041013214737176895, 0.01703835278749466, -0.0017122626304626465, -0.0034106560051441193, 0.004580703563988209, 0.04692504554986954, -0.015334389172494411, -0.04048878699541092, 0.013905854895710945, 0.04545815661549568, 0.02637609839439392, -0.024876520037651062, -0.005942529067397118, -0.035456329584121704, 0.009055763483047485, -0.003815994132310152, 0.03349251672625542, 0.042250510305166245, -0.04088624566793442, 0.036475807428359985, 0.0007867470849305391, 0.05007680505514145, -0.07930241525173187, 0.03347087278962135, 0.03613167628645897, -0.060714807361364365, 0.03500999137759209, -0.014432381838560104, -0.0076517025008797646, 0.009959816001355648, -0.0038949432782828808, -0.01840951293706894, 0.01927584409713745, 0.03663628175854683, -0.012195618823170662, 0.017108391970396042, 0.03935955464839935, 0.010515953414142132, -0.022479452192783356, 0.00810861773788929, 0.02403416484594345, -0.005666147451847792, -0.055953241884708405, 0.014511264860630035, 0.012436958961188793, 0.03502621874213219, -0.004479735158383846, 0.07306241244077682, 0.04001001641154289, 0.04705096036195755, 0.0067836446687579155, -0.004997556563466787, 0.03392943739891052, 0.0458277128636837, -0.02476787008345127, 0.043228670954704285, -0.005533190444111824, 0.02507350966334343, -0.012362728826701641, 0.038104090839624405, -0.0025492957793176174, 0.022532207891345024, 0.06112735718488693, 0.03815532103180885, -0.012957833707332611, 0.017975619062781334, -0.026928512379527092, 0.013103673234581947, -0.018832556903362274, -0.008338217623531818, 0.007081938441842794, -0.04475143924355507, -0.002573468955233693, 0.009175730869174004, -0.030792048200964928, -0.002042366424575448, -0.04541337862610817, 0.062379419803619385, 0.04580432549118996, -0.03932073339819908, -0.05788600444793701, -0.0036043403670191765, 0.025394434109330177, 0.014875992201268673, -0.08662696182727814, -0.01726602204144001, 0.04318573325872421, 0.01600872166454792, -0.044153034687042236, -0.03258882835507393, 0.010971899144351482, 0.03985709697008133, -0.02512078918516636, -0.021587109193205833, -0.04905792325735092, -0.02657529152929783, -0.033135440200567245, -0.041421979665756226, -0.04792818799614906, -0.02431047335267067, -0.01573329046368599, 0.019172240048646927, 0.03384144976735115, -0.08682779967784882, 0.016425080597400665, -0.05333607271313667, 0.0033381932880729437, 0.060447193682193756, 0.017225999385118484, 0.04338442161679268, 0.008887093514204025, -0.011700304225087166, -0.030784783884882927, 0.029799390584230423, -0.03854043781757355, 0.049850620329380035, 0.004930292721837759, -0.01851404272019863, -0.020112883299589157, -0.014539582654833794, -0.01787666045129299, 0.009195232763886452, 0.01050050463527441, 0.03788701444864273, 0.0012937176506966352, -0.02818729355931282, -0.04917585849761963, 0.007781427353620529, 0.0019566104747354984, -0.012814824469387531, -0.004947727080434561, 0.045950356870889664, 0.03646671772003174, 0.002791403094306588, 0.004697783850133419, 0.012815515510737896, -0.01621047966182232, 0.062401182949543, 0.02047150954604149, 0.05026695504784584, -0.03780040517449379, 0.0667409673333168, 0.00224861572496593, 0.010478171519935131, -0.015742754563689232, 0.001655526808463037, -0.04362569749355316, 0.0034662846010178328, -0.005219882819801569, -0.03515452519059181, -0.020455151796340942, 0.047166526317596436, -0.02139909565448761, -0.07183513790369034, 0.046170882880687714, -0.029244720935821533, -0.02688049152493477, 0.014976671896874905, 0.0026486904826015234, 0.03429925814270973, -0.005890225525945425, 0.04202268272638321, -0.018020452931523323, -0.026976708322763443, -0.019771136343479156, -0.01675950177013874, -0.014742839150130749, -0.015525337308645248, -0.0006239615031518042, 0.009381762705743313, -0.008762863464653492, -0.03805861622095108, 0.012787258252501488, -0.015712112188339233, -0.003921184688806534, -0.005539625883102417, -0.005669189151376486, 0.00488162599503994, -0.006071238778531551, -0.03561935946345329, 0.019709182903170586, 0.08087684214115143, -0.06412699073553085, -0.0018153585260733962, -0.010365016758441925, -0.04116988182067871, 0.010356743820011616, 0.0435556024312973, 0.030156446620821953, -0.030642440542578697, -0.012417435646057129, -0.033950094133615494, 0.002666833810508251, 0.01121507491916418, 0.04220520704984665, -0.03539181128144264, 0.03651658818125725, 0.00986762810498476, -0.03320850059390068, 0.021042536944150925, 0.012748521752655506, -0.020613038912415504, 0.01267313864082098, 0.0024715387262403965, 0.0433194562792778, -0.03464338928461075, -0.0238817036151886, -0.0015052399830892682, -0.00813769269734621, 0.04605727642774582, -0.027353445068001747, 0.06496832519769669, -0.03492479398846626, -0.045068010687828064, -0.03321715444326401, -0.015229083597660065, -0.008961583487689495, -0.0526081845164299, 0.005047208163887262, -0.030239446088671684, -0.04611031711101532, -0.039567962288856506, 0.07561783492565155, 0.036560021340847015, 0.01159034762531519, 0.0036433383356779814, 0.024782907217741013, 0.005812737625092268, 0.04545712098479271, 0.027075251564383507, 0.01286619994789362, 0.024930741637945175, -0.0288272462785244, 0.05911048501729965, 0.07540696859359741, 0.010551726445555687, -0.006818344816565514, 0.02673436515033245, -0.019977428019046783, -0.008833578787744045, -0.033249977976083755, -0.016189124435186386, -0.014444072730839252, 0.01637876033782959, -0.005723794922232628, 0.023274188861250877, -0.032903142273426056, -0.045395225286483765, -0.017752068117260933, 0.0721108615398407, 0.049269575625658035, -0.03940099477767944, 0.007023515645414591, -0.0543445460498333, 0.0143172862008214, 0.03877531737089157, 0.026651587337255478, 0.03261725232005119, -0.02641334943473339, -0.03475888818502426, -0.06196092814207077, -0.007730958051979542, 0.02938351035118103, 0.04688352346420288, 0.001492986804805696, -0.052002474665641785, 0.011494527570903301, -0.0059143840335309505, -0.009254072792828083, 0.04071874916553497, -0.01937096193432808, -0.01605319045484066, 0.021356504410505295, 0.010376271791756153, 0.058524928987026215, 0.0370134562253952, 0.03336495906114578, -0.048666149377822876, 0.015760764479637146, -0.02909715287387371, 0.001060734037309885, 0.012889999896287918, 0.032121844589710236, 0.013724256306886673, 0.031370609998703, 0.007055149879306555, -0.02331012301146984, 0.020068591460585594, 0.02982570417225361, -0.01615154929459095, 0.012022043578326702, 0.019594961777329445, 0.004770875908434391, 0.002515221945941448, -0.014973344281315804, 0.03073306567966938, 0.03203507512807846, -0.0029318509623408318, 0.009544199332594872, -0.050643883645534515, 0.002601445419713855, -0.0004585186834447086, 0.0448162779211998, -0.01774679683148861, -0.016735566779971123, -0.02339322306215763, -0.026880457997322083, 0.05137190222740173, 0.029895957559347153, 0.00011596392141655087, 0.011301418766379356, -0.02502586506307125, 0.00284388056024909, 0.0031197925563901663, 0.00524180056527257, 0.0222946610301733, 0.0036125867627561092, -0.012878148816525936, -0.00956246443092823, -0.027970684692263603, -0.011681201867759228, 0.024373246356844902, -0.005530762951821089, -0.05088534951210022, 0.05565162003040314, 0.018190396949648857, 0.018322333693504333, -0.0008641738095320761, -0.016653986647725105, -0.00699530728161335, -0.03933033347129822, -0.003116237698122859, -0.04750656336545944, -0.0035764453932642937, -0.022624090313911438, -0.0008451906032860279, -0.0022958663757890463, 0.05381815508008003, -0.023221293464303017, 0.014970600605010986, 0.0403008870780468, 0.0064455182291567326, 0.06484071165323257, -0.019952522590756416, -0.037979792803525925, 0.061297088861465454, 0.05363653600215912, -0.04460182040929794, -0.010982992127537727, 0.002395677613094449, 0.018435178324580193, 0.02920987270772457, -0.011680102907121181, -0.08589381724596024, -0.029022831469774246, -0.03032723255455494, 0.033892858773469925, -0.03672119975090027, -0.022506827488541603, -0.013491013087332249, -0.016303280368447304, -0.01263154111802578, 0.0426502525806427, -0.008024784736335278, -0.07593175023794174, -0.0127875292673707, -0.02627779170870781, 0.021790960803627968, 0.022001486271619797, 0.04400036484003067, -0.016813144087791443, -0.017746321856975555, 0.014189604669809341, 0.0027446087915450335, -0.03549749404191971, 0.02558237686753273, 0.00542211439460516, 0.019051723182201385, 0.004861325956881046, 0.03930363059043884, -0.04968566447496414, -0.049693383276462555, 0.026898667216300964, 0.009030058979988098, -0.05464783310890198, -0.0030248991679400206, -0.007074778899550438, 0.027226950973272324, -0.045234616845846176, 0.006987966597080231, -0.024752477183938026, -0.02165602706372738, -0.04195421561598778, 0.01698700711131096, 0.009086058475077152, -0.04968562722206116, -0.014020346105098724, 0.019671428948640823, -0.019008539617061615, 0.004943450912833214, 0.03402810916304588, -0.01245468482375145, -0.023897185921669006, -0.04492456093430519, -0.0672251284122467, 0.02267123945057392, 0.020500896498560905, -0.007905700244009495, -0.05864157900214195, -0.017291076481342316, -0.022529250010848045, -0.07144097238779068, 0.03627387434244156, 0.05300053581595421, -0.01996050402522087, 0.026578404009342194, -0.027966128662228584, 0.017535410821437836, 0.003619209863245487, -0.009975985623896122, 0.016709165647625923, 0.006767536047846079, -0.012295933440327644, -0.03252935782074928, -0.0308682881295681, -0.008659521117806435, -0.004427710548043251, -0.016697656363248825, 0.0846182107925415, -0.071721650660038, 0.03372944891452789, 0.010209917090833187, -0.034838251769542694, 0.0033220346085727215, 0.014964933507144451, 0.0036047310568392277, 0.030168497934937477, 0.0021488042548298836, 0.0211726613342762, -0.0097010787576437, -0.019522184506058693, -0.00899591390043497, -0.0331675224006176, -0.04197953641414642, 0.05111600086092949, -0.006391274277120829, -0.012627888470888138, 0.06245993822813034, 0.027174271643161774, -0.00580727681517601, -0.05560539290308952, 0.03141642361879349, 0.009324997663497925, -0.003272688016295433, -0.047126710414886475, 0.024162929505109787, -0.009179646149277687, -0.04455089196562767, 0.0017887114081531763, 0.0033528197091072798, 0.02224148064851761, 0.0030729654245078564, 0.017404256388545036, 0.029646797105669975, -0.005246543325483799, 0.002203059382736683, 0.060110725462436676, 0.028904344886541367, -0.03258912265300751, -0.09100892394781113, -0.018463512882590294, -0.02261725813150406, 0.039159584790468216, 0.05506680905818939, 0.011777144856750965, -0.011479132808744907, 0.01948135904967785, -0.018709277734160423, 0.062444720417261124, -0.028424400836229324, -0.009348088875412941, 0.060308896005153656, -0.04960506036877632, -0.052798304706811905, 0.030832994729280472, -0.023405568674206734, -0.012619088403880596, 0.019418999552726746, -0.04199061542749405, 0.012573529966175556, -0.008077583275735378, 0.03233648091554642, -0.06048568710684776, -0.037223659455776215, -0.006776227615773678, -0.0765281617641449, -0.02046184055507183, -0.028335049748420715, -0.03072420135140419, -0.015347683802247047, 0.00011257602454861626, -0.006173537578433752, -0.06329714506864548, -0.038208477199077606, 0.007293719798326492, 0.016451958566904068, -0.009434198029339314, -0.036277417093515396, 0.031770799309015274, -0.05689932778477669, 0.0050352588295936584, 0.017117278650403023, 0.023538224399089813, -0.017084859311580658, -0.029851967468857765, 0.0034172760788351297, -0.022277364507317543, 0.01787102408707142, 0.044267136603593826, -0.016108497977256775, 0.0018049232894554734, -0.06561078876256943, -0.008170049637556076, 0.020584596320986748, -0.03578933700919151, -0.008622702211141586, 0.0041429148986935616, 0.01321740634739399, 0.005637933500111103, 0.027713214978575706, -0.03736696019768715, -0.012070078402757645, -0.024344071745872498, 0.0038054941687732935, 0.04483693093061447, -0.00929549615830183, -0.06807441264390945, -0.014590064994990826, -0.0012703625252470374, -0.05199921503663063, -0.021045329049229622, 0.0017236988060176373, 0.020581327378749847, 0.00310335261747241, 0.014803273603320122, 0.007082259748131037, 0.018589694052934647, -0.020445356145501137, 0.005138273350894451, 0.04842124134302139, 0.01742020808160305, 0.030288565903902054, -0.0038397167809307575, 0.035734400153160095, 0.005221309140324593, 0.009709448553621769, 0.0009714406332932413, -0.003338858485221863, -0.009880861267447472, -0.0354900136590004, 0.04243701323866844, -0.02065272442996502, -0.033083800226449966, -0.01976737193763256, 0.03881418704986572, -0.015840662643313408, -0.014110976830124855, 0.02787899598479271, 0.015958787873387337, -0.024252016097307205, 0.018708642572164536, -0.05208557844161987, 0.009075745940208435, -0.06176981329917908, 0.0020644953474402428, -0.02534164860844612, -0.009223466739058495, -0.013906687498092651, -0.006282609421759844, -0.033772144466638565, -0.004664893262088299, -0.03690044581890106, 0.014286994934082031, -0.013754536397755146, -0.02677650935947895, -0.004116437863558531, 0.03696655482053757, -0.05480392277240753, 0.0025101948995143175, -0.02389528602361679, -0.002059308346360922, -0.00986967608332634, -0.06474544107913971, 0.002008399460464716, 0.04639190435409546, 0.02575313299894333, -0.03954186290502548, -0.04276818782091141, -0.0003671206359285861, 0.038086578249931335, 0.08546829968690872, 0.002681935206055641, 0.005467512179166079, -0.07309430092573166, 0.03508995473384857, -0.011109807528555393, 0.04884098097681999, -0.015379451215267181, 0.021916523575782776, 0.006058952771127224, 0.025333305820822716, -0.03931069001555443, 0.011501088738441467, 0.08444537222385406, -0.019699491560459137, 0.03001621551811695, 0.04052627459168434, 0.01509734708815813, -0.0036059776321053505, 0.0024216563906520605, -0.03624400123953819, 0.06096984073519707, 0.026573486626148224, 0.028464647009968758, 0.005288115702569485, 0.013628870248794556, 0.03701353818178177, -0.04464303329586983, -0.020769106224179268, 0.0007852627313695848, 0.0073068286292254925, -0.04131774231791496, -0.017183959484100342, 0.00045813480392098427, 0.04228818416595459, 0.00895351730287075, 0.0029041890520602465, 0.0013040080666542053, -0.028432169929146767, -0.03928574174642563, 0.0279998779296875, -0.01892475038766861, 0.03696105256676674, -0.04983842000365257, 0.022238286212086678, -0.00751550542190671, -0.06007396802306175, 0.059541404247283936, 0.03675074875354767, -0.05834772065281868, -0.015122296288609505, 0.02690679021179676, 0.043969638645648956, 0.03015589341521263, 0.01313701830804348, 0.02406138740479946, 0.021920770406723022, -0.045081283897161484, 0.01872667483985424, -0.016369646415114403, 0.03949194774031639, -0.01271951012313366, 0.009316700510680676, -0.06436794996261597, 0.039648935198783875, -0.0453445203602314, -0.015228724107146263, 0.022167755290865898, -0.026275550946593285, -0.015110056847333908, -0.03270441293716431, 0.04136410355567932, 0.014791132882237434, 0.016533788293600082, 0.04523699730634689, 0.005338069051504135, 0.012556244619190693, -0.011820793151855469, -0.02688733860850334, -0.013957234099507332, 0.027324875816702843, 0.0016771637601777911, -0.01908678561449051, 0.0879625678062439, -0.017585109919309616, 0.001506523578427732, 0.014244329184293747, -0.016734294593334198, -0.04028971865773201, -0.011828437447547913, 0.044278573244810104, -0.04623398929834366, -0.015288792550563812, 0.018561312928795815, -0.05677640065550804, 0.03038403019309044, 0.01473618857562542, 0.004557834006845951, -0.010420982725918293, 0.01662040688097477, -0.021740473806858063, -0.02423125132918358, 0.0002266458614030853, 0.03118511661887169, 0.03346552327275276, -0.02155519463121891, -0.046199776232242584, -0.009229421615600586, -0.02052953839302063, -0.030543895438313484, -0.044173769652843475, -0.0064188409596681595, -0.019747091457247734, -0.002618914470076561, -0.03886003792285919, -0.0005130494828335941, -0.03990660607814789, -0.05446924641728401, 0.0008680057944729924, -0.022065455093979836, 0.000695459486451, 0.024503331631422043, 0.02740980125963688, 0.0306197889149189, -0.02932315692305565, 0.035693682730197906, 0.025483516976237297, 0.04890481382608414, -0.023647328838706017, 0.05986616015434265, 0.04637400060892105, 0.015953946858644485, 0.001707101590000093, -0.020600399002432823, 0.013272842392325401, -0.019768258556723595, 0.0003686780692078173, -0.02926027588546276, 0.008464827202260494, -0.055541615933179855, -0.008259587921202183, 0.027637088671326637, 0.04876914620399475, -0.008188378997147083, -0.049882255494594574, -0.0046189576387405396, -0.034740377217531204, -0.06877958029508591, -0.033453308045864105, -0.057299237698316574, 0.04424375668168068, 0.009012886323034763, -0.006461849436163902, 0.004532593302428722, -0.06137078255414963, 0.17926841974258423, 0.04031744226813316, 0.020939242094755173, 0.01988190971314907, 0.0009072233224287629, -0.005762910004705191, 0.03745949640870094, -0.019865624606609344, -0.008318456821143627, -0.04051871597766876, 0.029783369973301888, 0.004821800626814365, 0.007900829426944256, 0.032089006155729294, 0.021734507754445076, 0.01714659295976162, -0.01962159015238285, -0.020563235506415367, 0.03429047018289566, -0.017661085352301598, -0.040097665041685104, 0.00648909155279398, -0.009551159106194973, 0.02434762567281723, 0.012318463996052742, 0.014526142738759518, 0.011561332270503044, -0.03873499855399132, -0.03418339416384697, -0.0007731473306193948, 0.003652141662314534, 0.009530676528811455, 0.027439458295702934, -0.007102441508322954, -0.0400245375931263, 0.03153190389275551, 0.014316375367343426, -0.025393975898623466, 0.01789182424545288, 0.016893461346626282, -0.009018915705382824, -0.008043519221246243, -0.021284257993102074, 0.002061843406409025, -0.0010233575012534857, 0.06653787940740585, 0.008115660399198532, 0.010903468355536461, 0.0010773276444524527, -0.0525977797806263, -0.0018644867232069373, -0.044708263128995895, 0.011509076692163944, -0.0441756471991539, 0.004411631729453802, -0.003872891655191779, 0.02756294049322605, 0.016089696437120438, 0.024755354970693588, -0.01461919117718935, 0.010851399973034859, 0.01563720591366291, -0.026414982974529266, 0.03514556959271431, -0.036658551543951035, -0.008005528710782528, -0.019284449517726898, 0.049641821533441544, 0.005416483618319035, 0.004511935170739889, -0.008117018267512321, -0.023252980783581734, -0.018745051696896553, 0.00846992526203394, 0.012148547917604446, -0.006063555832952261, -0.00444689579308033, -0.019263027235865593, 0.011437769047915936, -0.00979433674365282, -0.019153140485286713, -0.0344361774623394, -0.060506489127874374, -0.03711846098303795, 0.02680795267224312, 0.028888490051031113, 0.004586066119372845, 0.03112998977303505, 0.011415940709412098, 0.0645357221364975, 0.03468457981944084, 0.037274934351444244, -0.019164782017469406, -0.04222643002867699, -0.015291324816644192]\n", + "1024\n" + ] + } + ], + "source": [ + "vector = embeddings.embed_query(chunks[0].page_content)\n", + "print(vector)\n", + "print(len(vector))" + ] + }, + { + "cell_type": "markdown", + "id": "b347fb5ee68daf60", + "metadata": { + "collapsed": false + }, + "source": [ + "## Batch process the embedding\n", + "\n", + "Many data-science tasks require to split a larger processing operation into batch jobs.\n", + "Like in the good old Mainframe days.\n", + "\n", + "The vector DB: https://github.com/asg017/sqlite-vss \n", + "Basis: https://faiss.ai/ - a library for efficient similarity search and clustering of dense vectors.\n", + "\n", + "We add vectors of 1024 dimensions per chunk (sentence, line break delimited) to the DB.\n", + "The processing is done in batches of 50 chunks, using 3 threads." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "b03bfcb6c666db1", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-21T16:04:44.572979Z", + "start_time": "2024-03-21T16:04:43.521107Z" + }, + "collapsed": false + }, + "outputs": [], + "source": [ + "# we can use concurrent processing to speed up the embedding process\n", + "from concurrent.futures import ThreadPoolExecutor, as_completed\n", + "\n", + "from langchain_community.vectorstores import SQLiteVSS\n", + "import os\n", + "from tqdm.notebook import tqdm # Import tqdm for notebook\n", + "from typing import List\n", + "from langchain.schema.document import Document" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "e6ffc345c26298ad", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-21T16:10:22.121211Z", + "start_time": "2024-03-21T16:08:20.585372Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d2afb7310af44a3c85a3b59e58be64e1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Processing batches: 0%| | 0/14477 [00:00 44\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mfuture\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mas_completed\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfutures\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 45\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Each time a future completes, update the progress\u001b[39;49;00m\n\u001b[1;32m 46\u001b[0m \u001b[43m \u001b[49m\u001b[43mprogress_bar\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mupdate\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/llm_langchain/lib/python3.11/concurrent/futures/_base.py:243\u001b[0m, in \u001b[0;36mas_completed\u001b[0;34m(fs, timeout)\u001b[0m\n\u001b[1;32m 239\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTimeoutError\u001b[39;00m(\n\u001b[1;32m 240\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%d\u001b[39;00m\u001b[38;5;124m (of \u001b[39m\u001b[38;5;132;01m%d\u001b[39;00m\u001b[38;5;124m) futures unfinished\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m (\n\u001b[1;32m 241\u001b[0m \u001b[38;5;28mlen\u001b[39m(pending), total_futures))\n\u001b[0;32m--> 243\u001b[0m \u001b[43mwaiter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mevent\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwait\u001b[49m\u001b[43m(\u001b[49m\u001b[43mwait_timeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 245\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m waiter\u001b[38;5;241m.\u001b[39mlock:\n", + "File \u001b[0;32m~/miniconda3/envs/llm_langchain/lib/python3.11/threading.py:629\u001b[0m, in \u001b[0;36mEvent.wait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 628\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m signaled:\n\u001b[0;32m--> 629\u001b[0m signaled \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_cond\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwait\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 630\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m signaled\n", + "File \u001b[0;32m~/miniconda3/envs/llm_langchain/lib/python3.11/threading.py:327\u001b[0m, in \u001b[0;36mCondition.wait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 326\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 327\u001b[0m \u001b[43mwaiter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43macquire\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 328\u001b[0m gotit \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: ", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[38], line 52\u001b[0m\n\u001b[1;32m 48\u001b[0m progress_bar\u001b[38;5;241m.\u001b[39mclose() \u001b[38;5;66;03m# Ensure the progress bar is closed at the end\u001b[39;00m\n\u001b[1;32m 50\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAll texts have been added to the database.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m---> 52\u001b[0m \u001b[43mvectorize_data_in_batches\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchunks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunks\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43membeddings\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43membeddings\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 53\u001b[0m \u001b[38;5;66;03m# todo : documents go to different table. \u001b[39;00m\n\u001b[1;32m 54\u001b[0m \u001b[38;5;66;03m# todo: similarity queries\u001b[39;00m\n", + "Cell \u001b[0;32mIn[38], line 37\u001b[0m, in \u001b[0;36mvectorize_data_in_batches\u001b[0;34m(chunks, embeddings)\u001b[0m\n\u001b[1;32m 33\u001b[0m batch_size \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m50\u001b[39m \u001b[38;5;66;03m# Adjust based on your needs and memory constraints\u001b[39;00m\n\u001b[1;32m 35\u001b[0m batches \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(divide_chunks(chunks, batch_size))\n\u001b[0;32m---> 37\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mThreadPoolExecutor\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmax_workers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnum_workers\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mas\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mexecutor\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 38\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Wrap the 'submit' calls with 'tqdm' for immediate feedback\u001b[39;49;00m\n\u001b[1;32m 39\u001b[0m \u001b[43m \u001b[49m\u001b[43mfutures\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43mexecutor\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msubmit\u001b[49m\u001b[43m(\u001b[49m\u001b[43madd_texts_in_batches\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbatch\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mbatch\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mbatches\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 41\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Setup the tqdm progress bar\u001b[39;49;00m\n", + "File \u001b[0;32m~/miniconda3/envs/llm_langchain/lib/python3.11/concurrent/futures/_base.py:647\u001b[0m, in \u001b[0;36mExecutor.__exit__\u001b[0;34m(self, exc_type, exc_val, exc_tb)\u001b[0m\n\u001b[1;32m 646\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__exit__\u001b[39m(\u001b[38;5;28mself\u001b[39m, exc_type, exc_val, exc_tb):\n\u001b[0;32m--> 647\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mshutdown\u001b[49m\u001b[43m(\u001b[49m\u001b[43mwait\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 648\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/llm_langchain/lib/python3.11/concurrent/futures/thread.py:235\u001b[0m, in \u001b[0;36mThreadPoolExecutor.shutdown\u001b[0;34m(self, wait, cancel_futures)\u001b[0m\n\u001b[1;32m 233\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m wait:\n\u001b[1;32m 234\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_threads:\n\u001b[0;32m--> 235\u001b[0m \u001b[43mt\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/llm_langchain/lib/python3.11/threading.py:1119\u001b[0m, in \u001b[0;36mThread.join\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 1116\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcannot join current thread\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 1118\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1119\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_wait_for_tstate_lock\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1120\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1121\u001b[0m \u001b[38;5;66;03m# the behavior of a negative timeout isn't documented, but\u001b[39;00m\n\u001b[1;32m 1122\u001b[0m \u001b[38;5;66;03m# historically .join(timeout=x) for x<0 has acted as if timeout=0\u001b[39;00m\n\u001b[1;32m 1123\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_wait_for_tstate_lock(timeout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mmax\u001b[39m(timeout, \u001b[38;5;241m0\u001b[39m))\n", + "File \u001b[0;32m~/miniconda3/envs/llm_langchain/lib/python3.11/threading.py:1139\u001b[0m, in \u001b[0;36mThread._wait_for_tstate_lock\u001b[0;34m(self, block, timeout)\u001b[0m\n\u001b[1;32m 1136\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 1138\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1139\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[43mlock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43macquire\u001b[49m\u001b[43m(\u001b[49m\u001b[43mblock\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m:\n\u001b[1;32m 1140\u001b[0m lock\u001b[38;5;241m.\u001b[39mrelease()\n\u001b[1;32m 1141\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_stop()\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "def add_texts_in_batches(batch: List[Document], sqlite_table: str = \"evernote\", embeddings=embeddings) -> None:\n", + " \"\"\"\n", + " Using type hints is a good idea here, because error messages get swallowed by the ThreadPoolExecutor.\n", + " \n", + " The exception handling serves the same purpose. \n", + " \n", + " Create a new connection to the database within each thread,\n", + " then add a batch of texts. This ensures that the SQLite connection\n", + " is used in the thread where it was created.\n", + " \n", + " This needs sqlite-vss . \n", + " \"\"\"\n", + " try:\n", + " # Create a new connection for each batch\n", + " # sqlite isn't thread-safe afaik\n", + " \n", + " connection = SQLiteVSS.create_connection(db_file=\"/home/marius/source/bookworm/evernote.db\")\n", + "\n", + " local_db = SQLiteVSS(\n", + " table=sqlite_table,\n", + " embedding=embeddings,\n", + " connection=connection\n", + " )\n", + " local_db.add_documents(batch)\n", + " # sqlite here doesn't get closed.\n", + "\n", + " except Exception as e:\n", + " print(f\"Exception occurred in add_texts_in_batches: {e}\")\n", + "\n", + "def divide_chunks(chunks, n):\n", + " \"\"\"\n", + " Divide and conquer\n", + " \"\"\"\n", + " for i in range(0, len(chunks), n):\n", + " yield chunks[i:i + n]\n", + "\n", + "def vectorize_data_in_batches(chunks, embeddings):\n", + " num_workers = 3\n", + " batch_size = 50 # Adjust based on your needs and memory constraints\n", + "\n", + " batches = list(divide_chunks(chunks, batch_size))\n", + "\n", + " with ThreadPoolExecutor(max_workers=num_workers) as executor:\n", + " # Wrap the 'submit' calls with 'tqdm' for immediate feedback\n", + " futures = [executor.submit(add_texts_in_batches, batch) for batch in batches]\n", + " \n", + " # Setup the tqdm progress bar\n", + " progress_bar = tqdm(total=len(futures), desc=\"Processing batches\")\n", + " \n", + " for future in as_completed(futures):\n", + " # Each time a future completes, update the progress\n", + " progress_bar.update(1)\n", + " \n", + " progress_bar.close() # Ensure the progress bar is closed at the end\n", + "\n", + " print(\"All texts have been added to the database.\")\n", + " \n", + "vectorize_data_in_batches(chunks=chunks, embeddings=embeddings)" + ] + }, + { + "cell_type": "code", + "id": "5f01a969c4aedac8", + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# todo : documents go to different table. \n", + "# todo: similarity queries" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/requirements.txt b/requirements.txt index 48ab53e..9126008 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,8 +4,18 @@ pinecone-client==3.1.0 python-dotenv==1.0.1 tiktoken==0.6.0 wikipedia==1.4.0 -pypdf==4.0.2 +pypdf[full]==4.0.2 langchain_openai==0.0.8 langchain_experimental==0.0.53 langchainhub==0.1.14 ipywidgets==8.1.2 +cryptography==42.0.5 +pikepdf==8.13.0 +transformers==4.39.0 +torch==2.2.1+cpu +torchvision==0.17.1+cpu +torchaudio==2.2.1+cpu +sentence-transformers==2.5.1 +sqlite-vss==0.1.2 + +