Add files using upload-large-folder tool
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitignore +8 -0
- .idea/.gitignore +3 -0
- .idea/document data retrieval.iml +12 -0
- .idea/inspectionProfiles/profiles_settings.xml +6 -0
- .idea/misc.xml +7 -0
- .idea/modules.xml +8 -0
- .idea/vcs.xml +6 -0
- .idea/workspace.xml +141 -0
- augment_scan_content_balanced_class_counts.py +149 -0
- bing-scrapper-all.py +132 -0
- category/.DS_Store +0 -0
- clean_scans.py +259 -0
- clean_scans_processed.txt +1 -0
- content/.DS_Store +0 -0
- document_type_clasifier/document_type_labels.txt +31 -0
- document_type_clasifier/learn_with_history_visualisation.ipynb +0 -0
- info/.DS_Store +0 -0
- map_scans_to_less_types.py +187 -0
- process_syntethic_content.py +176 -0
- processed_synthetic_scans_contents.txt +1757 -0
- retrieve_multilang.py +263 -0
- scans/.DS_Store +0 -0
- semantic_simillarity/convert_to_tflite_download_vocab.ipynb +419 -0
- semantic_simillarity/vocab.txt +0 -0
- summarizer/.DS_Store +0 -0
- summarizer/compare_model_before_after_conversion_to_tflite.py +130 -0
- summarizer/convert_to_tflite.py +56 -0
- summarizer/lsummarizer_earn_with_history_visualisation.ipynb +0 -0
- summarizer/summarizer_learn.py +121 -0
- summarizer/verify_converted_to_tflite.py +100 -0
- summarizer/verify_summarizer_before_converting_to_tflite.py +124 -0
- summary/.DS_Store +0 -0
- summary/en/contract/b2bContract_12.txt +1 -0
- summary/en/contract/b2bContract_15.txt +1 -0
- summary/en/contract/b2bContract_16.txt +1 -0
- summary/en/contract/b2bContract_18.txt +1 -0
- summary/en/contract/b2bContract_19.txt +1 -0
- summary/en/contract/employmentContract_0.txt +1 -0
- summary/en/contract/employmentContract_1.txt +1 -0
- summary/en/contract/employmentContract_11.txt +1 -0
- summary/en/contract/employmentContract_12.txt +1 -0
- summary/en/contract/employmentContract_13.txt +1 -0
- summary/en/contract/employmentContract_15.txt +1 -0
- summary/en/contract/employmentContract_16.txt +1 -0
- summary/en/contract/employmentContract_17.txt +1 -0
- summary/en/contract/employmentContract_18.txt +1 -0
- summary/en/contract/employmentContract_19.txt +1 -0
- summary/en/contract/employmentContract_2.txt +1 -0
- summary/en/contract/employmentContract_3.txt +1 -0
- summary/en/contract/employmentContract_5.txt +1 -0
.gitignore
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/scan-candidates/
|
| 2 |
+
/scans/
|
| 3 |
+
/document_type_clasifier/document_type_classifier.tflite
|
| 4 |
+
/summarizer/models/
|
| 5 |
+
/summarizer/scans_to_verify_summary/
|
| 6 |
+
/summarizer/tmp_results/
|
| 7 |
+
.DS_Store
|
| 8 |
+
**/.DS_Store
|
.idea/.gitignore
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Default ignored files
|
| 2 |
+
/shelf/
|
| 3 |
+
/workspace.xml
|
.idea/document data retrieval.iml
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<module type="PYTHON_MODULE" version="4">
|
| 3 |
+
<component name="NewModuleRootManager">
|
| 4 |
+
<content url="file://$MODULE_DIR$" />
|
| 5 |
+
<orderEntry type="jdk" jdkName="Python 3.13 virtualenv at ~/Coding/.venv" jdkType="Python SDK" />
|
| 6 |
+
<orderEntry type="sourceFolder" forTests="false" />
|
| 7 |
+
</component>
|
| 8 |
+
<component name="PyDocumentationSettings">
|
| 9 |
+
<option name="format" value="PLAIN" />
|
| 10 |
+
<option name="myDocStringFormat" value="Plain" />
|
| 11 |
+
</component>
|
| 12 |
+
</module>
|
.idea/inspectionProfiles/profiles_settings.xml
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<component name="InspectionProjectProfileManager">
|
| 2 |
+
<settings>
|
| 3 |
+
<option name="USE_PROJECT_PROFILE" value="false" />
|
| 4 |
+
<version value="1.0" />
|
| 5 |
+
</settings>
|
| 6 |
+
</component>
|
.idea/misc.xml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<project version="4">
|
| 3 |
+
<component name="Black">
|
| 4 |
+
<option name="sdkName" value="Python 3.13 virtualenv at ~/Coding/.venv" />
|
| 5 |
+
</component>
|
| 6 |
+
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.13 virtualenv at ~/Coding/.venv" project-jdk-type="Python SDK" />
|
| 7 |
+
</project>
|
.idea/modules.xml
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<project version="4">
|
| 3 |
+
<component name="ProjectModuleManager">
|
| 4 |
+
<modules>
|
| 5 |
+
<module fileurl="file://$PROJECT_DIR$/.idea/document data retrieval.iml" filepath="$PROJECT_DIR$/.idea/document data retrieval.iml" />
|
| 6 |
+
</modules>
|
| 7 |
+
</component>
|
| 8 |
+
</project>
|
.idea/vcs.xml
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<project version="4">
|
| 3 |
+
<component name="VcsDirectoryMappings">
|
| 4 |
+
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
| 5 |
+
</component>
|
| 6 |
+
</project>
|
.idea/workspace.xml
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<project version="4">
|
| 3 |
+
<component name="AutoImportSettings">
|
| 4 |
+
<option name="autoReloadType" value="SELECTIVE" />
|
| 5 |
+
</component>
|
| 6 |
+
<component name="ChangeListManager">
|
| 7 |
+
<list default="true" id="5426c4e8-35e3-4a2b-8bc4-8ee661ab7192" name="Changes" comment="document data retrieval v.1 - automatic using ollama, without checking the data (and verifying them), with instructions to use the language of the document (not flexible, cannot">
|
| 8 |
+
<change afterPath="$PROJECT_DIR$/semantic_simillarity/convert_to_tflite_download_vocab.ipynb" afterDir="false" />
|
| 9 |
+
</list>
|
| 10 |
+
<option name="SHOW_DIALOG" value="false" />
|
| 11 |
+
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
| 12 |
+
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
| 13 |
+
<option name="LAST_RESOLUTION" value="IGNORE" />
|
| 14 |
+
</component>
|
| 15 |
+
<component name="FileTemplateManagerImpl">
|
| 16 |
+
<option name="RECENT_TEMPLATES">
|
| 17 |
+
<list>
|
| 18 |
+
<option value="Python Script" />
|
| 19 |
+
</list>
|
| 20 |
+
</option>
|
| 21 |
+
</component>
|
| 22 |
+
<component name="Git.Settings">
|
| 23 |
+
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
| 24 |
+
</component>
|
| 25 |
+
<component name="GitHubPullRequestSearchHistory">{
|
| 26 |
+
"lastFilter": {
|
| 27 |
+
"state": "OPEN",
|
| 28 |
+
"assignee": "pemix09"
|
| 29 |
+
}
|
| 30 |
+
}</component>
|
| 31 |
+
<component name="GithubPullRequestsUISettings">{
|
| 32 |
+
"selectedUrlAndAccountId": {
|
| 33 |
+
"url": "https://github.com/pemix09/document-data-retrieval.git",
|
| 34 |
+
"accountId": "8a222931-697e-4756-a51a-e6060944a565"
|
| 35 |
+
}
|
| 36 |
+
}</component>
|
| 37 |
+
<component name="ProjectColorInfo">{
|
| 38 |
+
"associatedIndex": 7
|
| 39 |
+
}</component>
|
| 40 |
+
<component name="ProjectId" id="37kAHtnvfEdwNcAdSBtJj0kacny" />
|
| 41 |
+
<component name="ProjectViewState">
|
| 42 |
+
<option name="hideEmptyMiddlePackages" value="true" />
|
| 43 |
+
<option name="showLibraryContents" value="true" />
|
| 44 |
+
</component>
|
| 45 |
+
<component name="PropertiesComponent">{
|
| 46 |
+
"keyToString": {
|
| 47 |
+
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
| 48 |
+
"Python.clean_scans.executor": "Run",
|
| 49 |
+
"Python.compare_model_before_after_conversion_to_tflite.executor": "Run",
|
| 50 |
+
"Python.convert_to_tflite.executor": "Run",
|
| 51 |
+
"Python.document_type_classifierlearn.executor": "Run",
|
| 52 |
+
"Python.map_scans_to_less_types.executor": "Run",
|
| 53 |
+
"Python.process_syntethic_content.executor": "Run",
|
| 54 |
+
"Python.retrieve_multilang.executor": "Run",
|
| 55 |
+
"Python.summarizer_learn.executor": "Run",
|
| 56 |
+
"Python.verify_converted_to_tflite.executor": "Run",
|
| 57 |
+
"Python.verify_summarizer.executor": "Run",
|
| 58 |
+
"RunOnceActivity.ShowReadmeOnStart": "true",
|
| 59 |
+
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager": "true",
|
| 60 |
+
"RunOnceActivity.git.unshallow": "true",
|
| 61 |
+
"git-widget-placeholder": "main",
|
| 62 |
+
"last_opened_file_path": "/Users/przemo/Coding/document data retrieval"
|
| 63 |
+
}
|
| 64 |
+
}</component>
|
| 65 |
+
<component name="RecentsManager">
|
| 66 |
+
<key name="MoveFile.RECENT_KEYS">
|
| 67 |
+
<recent name="$PROJECT_DIR$/scans/courtDocument" />
|
| 68 |
+
<recent name="$PROJECT_DIR$/scans/birthCertificate" />
|
| 69 |
+
<recent name="$PROJECT_DIR$/scans/officialCertificate" />
|
| 70 |
+
<recent name="$PROJECT_DIR$/scans/rentalAgreement" />
|
| 71 |
+
<recent name="$PROJECT_DIR$/scans/educationDocument" />
|
| 72 |
+
</key>
|
| 73 |
+
</component>
|
| 74 |
+
<component name="SharedIndexes">
|
| 75 |
+
<attachedChunks>
|
| 76 |
+
<set>
|
| 77 |
+
<option value="bundled-python-sdk-53e2683a6804-9cdd278e9d02-com.jetbrains.pycharm.community.sharedIndexes.bundled-PC-251.26094.141" />
|
| 78 |
+
</set>
|
| 79 |
+
</attachedChunks>
|
| 80 |
+
</component>
|
| 81 |
+
<component name="TaskManager">
|
| 82 |
+
<task active="true" id="Default" summary="Default task">
|
| 83 |
+
<changelist id="5426c4e8-35e3-4a2b-8bc4-8ee661ab7192" name="Changes" comment="" />
|
| 84 |
+
<created>1767436610679</created>
|
| 85 |
+
<option name="number" value="Default" />
|
| 86 |
+
<option name="presentableId" value="Default" />
|
| 87 |
+
<updated>1767436610679</updated>
|
| 88 |
+
</task>
|
| 89 |
+
<task id="LOCAL-00001" summary="document data retrieval v.1 - automatic using ollama, without checking the data (and verifying them), with instructions to use the language of the document (not flexible, cannot">
|
| 90 |
+
<option name="closed" value="true" />
|
| 91 |
+
<created>1767695912197</created>
|
| 92 |
+
<option name="number" value="00001" />
|
| 93 |
+
<option name="presentableId" value="LOCAL-00001" />
|
| 94 |
+
<option name="project" value="LOCAL" />
|
| 95 |
+
<updated>1767695912197</updated>
|
| 96 |
+
</task>
|
| 97 |
+
<option name="localTasksCounter" value="2" />
|
| 98 |
+
<servers />
|
| 99 |
+
</component>
|
| 100 |
+
<component name="Vcs.Log.Tabs.Properties">
|
| 101 |
+
<option name="TAB_STATES">
|
| 102 |
+
<map>
|
| 103 |
+
<entry key="MAIN">
|
| 104 |
+
<value>
|
| 105 |
+
<State />
|
| 106 |
+
</value>
|
| 107 |
+
</entry>
|
| 108 |
+
</map>
|
| 109 |
+
</option>
|
| 110 |
+
</component>
|
| 111 |
+
<component name="VcsManagerConfiguration">
|
| 112 |
+
<MESSAGE value="document data retrieval v.1 - automatic using ollama, without checking the data (and verifying them), with instructions to use the language of the document (not flexible, cannot" />
|
| 113 |
+
<option name="LAST_COMMIT_MESSAGE" value="document data retrieval v.1 - automatic using ollama, without checking the data (and verifying them), with instructions to use the language of the document (not flexible, cannot" />
|
| 114 |
+
</component>
|
| 115 |
+
<component name="XDebuggerManager">
|
| 116 |
+
<breakpoint-manager>
|
| 117 |
+
<breakpoints>
|
| 118 |
+
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
|
| 119 |
+
<url>file://$PROJECT_DIR$/process_syntethic_content.py</url>
|
| 120 |
+
<line>53</line>
|
| 121 |
+
<option name="timeStamp" value="1" />
|
| 122 |
+
</line-breakpoint>
|
| 123 |
+
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
|
| 124 |
+
<url>file://$PROJECT_DIR$/process_syntethic_content.py</url>
|
| 125 |
+
<line>55</line>
|
| 126 |
+
<option name="timeStamp" value="2" />
|
| 127 |
+
</line-breakpoint>
|
| 128 |
+
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
|
| 129 |
+
<url>file://$PROJECT_DIR$/process_syntethic_content.py</url>
|
| 130 |
+
<line>110</line>
|
| 131 |
+
<option name="timeStamp" value="3" />
|
| 132 |
+
</line-breakpoint>
|
| 133 |
+
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
|
| 134 |
+
<url>file://$PROJECT_DIR$/process_syntethic_content.py</url>
|
| 135 |
+
<line>48</line>
|
| 136 |
+
<option name="timeStamp" value="4" />
|
| 137 |
+
</line-breakpoint>
|
| 138 |
+
</breakpoints>
|
| 139 |
+
</breakpoint-manager>
|
| 140 |
+
</component>
|
| 141 |
+
</project>
|
augment_scan_content_balanced_class_counts.py
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import random
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
from langchain_ollama import OllamaLLM
|
| 5 |
+
|
| 6 |
+
# --- KONFIGURACJA ---
|
| 7 |
+
INPUT_DIR = "content"
|
| 8 |
+
OUTPUT_DIR = "synthetic_content"
|
| 9 |
+
LOG_FILE = "synthetic_processed_files.log" # Plik z historią przetworzonych dokumentów
|
| 10 |
+
MODEL_NAME = "llama3"
|
| 11 |
+
|
| 12 |
+
TARGET_COUNT_PER_TYPE = 60
|
| 13 |
+
MIN_SYNTHETIC_PER_FILE = 1
|
| 14 |
+
|
| 15 |
+
# Ustawienia AI - obniżona temperatura dla stabilności formatu,
|
| 16 |
+
# ale wciąż wystarczająca dla różnorodności
|
| 17 |
+
llm = OllamaLLM(model=MODEL_NAME, temperature=0.7)
|
| 18 |
+
|
| 19 |
+
def load_processed_files():
|
| 20 |
+
"""Wczytuje listę już przetworzonych plików."""
|
| 21 |
+
if not Path(LOG_FILE).exists():
|
| 22 |
+
return set()
|
| 23 |
+
return set(Path(LOG_FILE).read_text(encoding='utf-8').splitlines())
|
| 24 |
+
|
| 25 |
+
def save_to_log(file_path):
|
| 26 |
+
"""Zapisuje ścieżkę pliku do logu."""
|
| 27 |
+
with open(LOG_FILE, "a", encoding="utf-8") as f:
|
| 28 |
+
f.write(f"{file_path}\n")
|
| 29 |
+
|
| 30 |
+
def get_files_by_category(input_path):
|
| 31 |
+
categories = {}
|
| 32 |
+
for item in input_path.iterdir():
|
| 33 |
+
if item.is_dir():
|
| 34 |
+
files = list(item.glob("*.txt"))
|
| 35 |
+
if files:
|
| 36 |
+
categories[item.name] = files
|
| 37 |
+
return categories
|
| 38 |
+
|
| 39 |
+
def calculate_variants_map(files, target_total):
|
| 40 |
+
current_count = len(files)
|
| 41 |
+
assignments = {f: MIN_SYNTHETIC_PER_FILE for f in files}
|
| 42 |
+
current_total_projected = current_count + (current_count * MIN_SYNTHETIC_PER_FILE)
|
| 43 |
+
missing = target_total - current_total_projected
|
| 44 |
+
|
| 45 |
+
if missing <= 0:
|
| 46 |
+
return assignments
|
| 47 |
+
|
| 48 |
+
base_add = missing // current_count
|
| 49 |
+
remainder = missing % current_count
|
| 50 |
+
for f in files:
|
| 51 |
+
assignments[f] += base_add
|
| 52 |
+
for f in random.sample(files, remainder):
|
| 53 |
+
assignments[f] += 1
|
| 54 |
+
return assignments
|
| 55 |
+
|
| 56 |
+
def generate_synthetic_text(text):
|
| 57 |
+
"""Generuje tekst, wymuszając brak komentarzy od AI."""
|
| 58 |
+
prompt = f"""[SYSTEM: You are a raw data generator. Return ONLY the document text. No conversational fillers.]
|
| 59 |
+
SOURCE DOCUMENT TO TRANSFORM:
|
| 60 |
+
{text[:3500]}
|
| 61 |
+
|
| 62 |
+
TASK:
|
| 63 |
+
1. Create a synthetic version of this document.
|
| 64 |
+
2. Fill all placeholders/blanks with realistic Polish data.
|
| 65 |
+
3. Replace all existing names, dates, and numbers with new ones.
|
| 66 |
+
4. Add minor OCR errors (swapped letters, missing spaces).
|
| 67 |
+
5. Output MUST be in Polish.
|
| 68 |
+
|
| 69 |
+
OUTPUT ONLY THE TRANSFORMED TEXT. DO NOT EXPLAIN. DO NOT SAY "HERE IS THE TEXT".
|
| 70 |
+
---
|
| 71 |
+
SYNTHETIC TEXT START:"""
|
| 72 |
+
|
| 73 |
+
try:
|
| 74 |
+
response = llm.invoke(prompt)
|
| 75 |
+
# Czyszczenie techniczne
|
| 76 |
+
clean_text = response.replace("SYNTHETIC TEXT START:", "").strip()
|
| 77 |
+
# Usuwanie ewentualnych bloków kodu markdown
|
| 78 |
+
clean_text = clean_text.replace("```text", "").replace("```", "").strip()
|
| 79 |
+
return clean_text
|
| 80 |
+
except Exception as e:
|
| 81 |
+
print(f" ❌ Błąd AI: {e}")
|
| 82 |
+
return None
|
| 83 |
+
|
| 84 |
+
def main():
|
| 85 |
+
input_path = Path(INPUT_DIR)
|
| 86 |
+
output_path = Path(OUTPUT_DIR)
|
| 87 |
+
processed_files = load_processed_files()
|
| 88 |
+
|
| 89 |
+
if not input_path.exists():
|
| 90 |
+
print(f"❌ Brak folderu {INPUT_DIR}")
|
| 91 |
+
return
|
| 92 |
+
|
| 93 |
+
print("🔍 Analiza struktury i historii...")
|
| 94 |
+
categories = get_files_by_category(input_path)
|
| 95 |
+
if not categories:
|
| 96 |
+
return
|
| 97 |
+
|
| 98 |
+
max_files = max(len(files) for files in categories.values())
|
| 99 |
+
final_target = TARGET_COUNT_PER_TYPE if TARGET_COUNT_PER_TYPE > 0 else max_files
|
| 100 |
+
if final_target < max_files:
|
| 101 |
+
final_target = max_files + (max_files * MIN_SYNTHETIC_PER_FILE)
|
| 102 |
+
|
| 103 |
+
total_generated = 0
|
| 104 |
+
|
| 105 |
+
for cat_name, files in categories.items():
|
| 106 |
+
target_dir = output_path / cat_name
|
| 107 |
+
target_dir.mkdir(parents=True, exist_ok=True)
|
| 108 |
+
|
| 109 |
+
# Filtrowanie plików, które już były przetwarzane
|
| 110 |
+
files_to_process = [f for f in files if str(f) not in processed_files]
|
| 111 |
+
|
| 112 |
+
if not files_to_process:
|
| 113 |
+
print(f"✅ Kategoria [{cat_name}] już w pełni przetworzona.")
|
| 114 |
+
continue
|
| 115 |
+
|
| 116 |
+
augment_plan = calculate_variants_map(files_to_process, final_target)
|
| 117 |
+
print(f"\n📂 Kategoria: [{cat_name}] (Przetwarzanie {len(files_to_process)} nowych plików)")
|
| 118 |
+
|
| 119 |
+
for file_path in files_to_process:
|
| 120 |
+
try:
|
| 121 |
+
original_text = file_path.read_text(encoding='utf-8')
|
| 122 |
+
except:
|
| 123 |
+
continue
|
| 124 |
+
|
| 125 |
+
# Kopiuj oryginał do folderu wyjściowego
|
| 126 |
+
(target_dir / file_path.name).write_text(original_text, encoding='utf-8')
|
| 127 |
+
|
| 128 |
+
num_variants = augment_plan[file_path]
|
| 129 |
+
print(f" 📄 {file_path.name} ({num_variants} wariantów)", end=" ", flush=True)
|
| 130 |
+
|
| 131 |
+
for i in range(1, num_variants + 1):
|
| 132 |
+
new_text = generate_synthetic_text(original_text)
|
| 133 |
+
if new_text:
|
| 134 |
+
new_name = f"{file_path.stem}_synth_{i}.txt"
|
| 135 |
+
(target_dir / new_name).write_text(new_text, encoding='utf-8')
|
| 136 |
+
total_generated += 1
|
| 137 |
+
print(".", end="", flush=True)
|
| 138 |
+
|
| 139 |
+
# Po udanym przetworzeniu wszystkich wariantów dla pliku, zapisz go do logu
|
| 140 |
+
save_to_log(str(file_path))
|
| 141 |
+
print(" Gotowe")
|
| 142 |
+
|
| 143 |
+
print(f"\n✅ Zakończono! Wygenerowano {total_generated} nowych plików.")
|
| 144 |
+
|
| 145 |
+
if __name__ == "__main__":
|
| 146 |
+
try:
|
| 147 |
+
main()
|
| 148 |
+
except KeyboardInterrupt:
|
| 149 |
+
print("\n🛑 Zatrzymano ręcznie.")
|
bing-scrapper-all.py
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import requests
|
| 3 |
+
from bs4 import BeautifulSoup
|
| 4 |
+
import json
|
| 5 |
+
import time
|
| 6 |
+
import random
|
| 7 |
+
|
| 8 |
+
# --- KONFIGURACJA ---
|
| 9 |
+
OUTPUT_DIR = "scan-candidates"
|
| 10 |
+
LIMIT = 20 # Liczba zdjęć na kategorię
|
| 11 |
+
|
| 12 |
+
# Agresywne zapytania nakierowane na wypełnione dokumenty
|
| 13 |
+
CATEGORIES = {
|
| 14 |
+
# --- FINANCIAL ---
|
| 15 |
+
"pit11": "PIT-11 przykład wypełnienia skan",
|
| 16 |
+
"pit37": "PIT-37 wypełniony formularz dane",
|
| 17 |
+
"pit36": "PIT-36 uzupełniony przykład",
|
| 18 |
+
"pit36L": "PIT-36L wypełniony skan",
|
| 19 |
+
"pit28": "PIT-28 wypełniona deklaracja",
|
| 20 |
+
"pit38": "PIT-38 przykład uzupełniony",
|
| 21 |
+
"pit39": "PIT-39 przykładowe dane",
|
| 22 |
+
"pit5": "PIT-5 wypełniony formularz skan",
|
| 23 |
+
"pit8C": "PIT-8C wypełniony dane",
|
| 24 |
+
"vat7": "VAT-7 deklaracja wypełniona przykład",
|
| 25 |
+
"cit8": "CIT-8 uzupełniony formularz",
|
| 26 |
+
"pcc3": "PCC-3 wypełniony przykład",
|
| 27 |
+
"invoice": "faktura vat wypełniona dane skan",
|
| 28 |
+
"proformaInvoice": "faktura proforma uzupełniona dane",
|
| 29 |
+
"receipt": "paragon fiskalny zdjęcie realne",
|
| 30 |
+
"utilityBill": "rachunek za prąd uzupełniony dane",
|
| 31 |
+
"bankStatement": "wyciąg bankowy realny przykład",
|
| 32 |
+
"loanAgreement": "umowa pożyczki wypełniona dane",
|
| 33 |
+
"insurancePolicy": "polisa ubezpieczeniowa wypełniona skan",
|
| 34 |
+
|
| 35 |
+
# --- LEGAL ---
|
| 36 |
+
"notarialDeed": "akt notarialny skan z danymi",
|
| 37 |
+
"courtJudgment": "wyrok sądu wypełniony uzupełniony",
|
| 38 |
+
"powerOfAttorney": "pełnomocnictwo uzupełnione dane",
|
| 39 |
+
"employmentContract": "umowa o pracę wypełniona dane",
|
| 40 |
+
"mandateContract": "umowa zlecenie uzupełniona przykładowa",
|
| 41 |
+
"taskContract": "umowa o dzieło wypełniona skan",
|
| 42 |
+
"b2bContract": "umowa B2B wypełniona dane",
|
| 43 |
+
"nonCompeteAgreement": "zakaz konkurencji uzupełniony przykład",
|
| 44 |
+
"lawsuit": "pozew cywilny wypełniony skan",
|
| 45 |
+
|
| 46 |
+
# --- PERSONAL ---
|
| 47 |
+
"idCard": "dowód osobisty specimen dane polska",
|
| 48 |
+
"passport": "paszport polski specimen dane",
|
| 49 |
+
"birthCertificate": "odpis aktu urodzenia wypełniony",
|
| 50 |
+
"marriageCertificate": "akt małżeństwa uzupełniony dane",
|
| 51 |
+
"deathCertificate": "akt zgonu wypełniony przykład",
|
| 52 |
+
"peselConfirmation": "potwierdzenie nadania PESEL wypełnione",
|
| 53 |
+
"drivingLicense": "prawo jazdy specimen polska",
|
| 54 |
+
"schoolCertificate": "świadectwo szkolne wypełnione dane",
|
| 55 |
+
"universityDiploma": "dyplom ukończenia studiów wypełniony",
|
| 56 |
+
"professionalCertificate": "certyfikat zawodowy uzupełniony",
|
| 57 |
+
"cv": "życiorys CV wypełniony dane",
|
| 58 |
+
|
| 59 |
+
# --- HEALTH ---
|
| 60 |
+
"sickLeave": "zwolnienie lekarskie L4 wypełnione skan",
|
| 61 |
+
"prescription": "recepta lekarska wypisana dane",
|
| 62 |
+
"medicalResults": "wyniki badań laboratoryjnych dane pacjenta",
|
| 63 |
+
"referral": "skierowanie do lekarza uzupełnione",
|
| 64 |
+
"medicalHistory": "karta pacjenta wypełniona skan",
|
| 65 |
+
"vaccinationCard": "karta szczepień uzupełniona",
|
| 66 |
+
"sanitaryBooklet": "książeczka sanepidowska wypełniona",
|
| 67 |
+
|
| 68 |
+
# --- PROPERTY ---
|
| 69 |
+
"propertyDeed": "akt własności nieruchomości uzupełniony",
|
| 70 |
+
"landRegistry": "księga wieczysta odpis przykład",
|
| 71 |
+
"rentalAgreement": "umowa najmu mieszkania wypełniona dane",
|
| 72 |
+
"registrationCertificate": "dowód rejestracyjny pojazdu uzupełniony",
|
| 73 |
+
"vehicleHistory": "raport historii pojazdu dane",
|
| 74 |
+
"landMap": "mapa geodezyjna skan",
|
| 75 |
+
"technicalInspection": "zaświadczenie o badaniu technicznym wypełnione",
|
| 76 |
+
|
| 77 |
+
# --- OTHER ---
|
| 78 |
+
"application": "wniosek urzędowy wypełniony skan",
|
| 79 |
+
"certificate": "zaświadczenie o niekaralności uzupełnione",
|
| 80 |
+
"authorization": "upoważnienie wypełnione dane",
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
HEADERS = {
|
| 84 |
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
|
| 85 |
+
}
|
| 86 |
+
|
| 87 |
+
def download_images(query, folder_name):
|
| 88 |
+
print(f"\n🚀 POBIERANIE WYPEŁNIONYCH: {folder_name.upper()}")
|
| 89 |
+
search_url = f"https://www.bing.com/images/search?q={query.replace(' ', '+')}&form=HDRSC2"
|
| 90 |
+
|
| 91 |
+
try:
|
| 92 |
+
response = requests.get(search_url, headers=HEADERS, timeout=15)
|
| 93 |
+
soup = BeautifulSoup(response.text, 'html.parser')
|
| 94 |
+
|
| 95 |
+
target_path = os.path.join(OUTPUT_DIR, folder_name)
|
| 96 |
+
os.makedirs(target_path, exist_ok=True)
|
| 97 |
+
|
| 98 |
+
links = []
|
| 99 |
+
for a in soup.find_all("a", {"class": "iusc"}):
|
| 100 |
+
if "m" in a.attrs:
|
| 101 |
+
m = json.loads(a["m"])
|
| 102 |
+
links.append(m["murl"])
|
| 103 |
+
|
| 104 |
+
print(f" 🔍 Linki: {len(links)}")
|
| 105 |
+
|
| 106 |
+
downloaded = 0
|
| 107 |
+
for url in links:
|
| 108 |
+
if downloaded >= LIMIT: break
|
| 109 |
+
try:
|
| 110 |
+
if any(ext in url.lower() for ext in [".pdf", ".html", ".php"]): continue
|
| 111 |
+
ext = ".jpg" if ".png" not in url.lower() else ".png"
|
| 112 |
+
|
| 113 |
+
res = requests.get(url, headers=HEADERS, timeout=7)
|
| 114 |
+
if res.status_code == 200 and "text/html" not in res.headers.get('Content-Type', ''):
|
| 115 |
+
file_name = f"{folder_name}_{downloaded}{ext}"
|
| 116 |
+
with open(os.path.join(target_path, file_name), "wb") as f:
|
| 117 |
+
f.write(res.content)
|
| 118 |
+
print(f" ✅ [{downloaded+1}/{LIMIT}] {file_name}")
|
| 119 |
+
downloaded += 1
|
| 120 |
+
if downloaded % 5 == 0: time.sleep(1)
|
| 121 |
+
except: continue
|
| 122 |
+
|
| 123 |
+
except Exception as e:
|
| 124 |
+
print(f" 🚨 Błąd: {e}")
|
| 125 |
+
|
| 126 |
+
if __name__ == "__main__":
|
| 127 |
+
os.makedirs(OUTPUT_DIR, exist_ok=True)
|
| 128 |
+
for i, (folder, query) in enumerate(CATEGORIES.items()):
|
| 129 |
+
download_images(query, folder)
|
| 130 |
+
wait = random.uniform(3, 6)
|
| 131 |
+
print(f"😴 Przerwa {wait:.1f}s... ({i+1}/{len(CATEGORIES)})")
|
| 132 |
+
time.sleep(wait)
|
category/.DS_Store
ADDED
|
Binary file (14.3 kB). View file
|
|
|
clean_scans.py
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import shutil
|
| 3 |
+
import ollama
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
|
| 6 |
+
# --- KONFIGURACJA ---
|
| 7 |
+
ROOT_FOLDER = "scans"
|
| 8 |
+
REJECTED_FOLDER = "_ODRZUCONE"
|
| 9 |
+
HISTORY_FILE = "clean_scans_processed.txt"
|
| 10 |
+
MODEL_NAME = "llama3.2-vision"
|
| 11 |
+
IMAGE_EXTENSIONS = {'.jpg', '.jpeg', '.png', '.bmp', '.webp', '.heic'}
|
| 12 |
+
|
| 13 |
+
# Foldery, których NIE ruszać (bezpieczne)
|
| 14 |
+
SAFE_FOLDERS = {'documentScan', 'other'}
|
| 15 |
+
|
| 16 |
+
# --- SZCZEGÓŁOWE KRYTERIA DLA KAŻDEGO TYPU ---
|
| 17 |
+
# AI otrzyma instrukcję: "Szukaj [Tytuł]. Wymagane cechy: [Cechy]"
|
| 18 |
+
DOCUMENT_TYPES = {
|
| 19 |
+
# --- PODATKI (PIT) - WYMÓG SYMBOLU W NAGŁÓWKU ---
|
| 20 |
+
'pit11': ('Deklaracja PIT-11',
|
| 21 |
+
'Wyraźny symbol "PIT-11" (zazwyczaj lewy górny róg), tabela z przychodami, dane płatnika i podatnika'),
|
| 22 |
+
'pit37': ('Zeznanie PIT-37',
|
| 23 |
+
'Wyraźny symbol "PIT-37" (duży druk w nagłówku/rogu), biało-zielony lub biały formularz, pola na PESEL'),
|
| 24 |
+
'pit36': ('Zeznanie PIT-36', 'Wyraźny symbol "PIT-36" w nagłówku formularza, sekcje działalności gospodarczej'),
|
| 25 |
+
'pit36L': ('Zeznanie PIT-36L', 'Wyraźny symbol "PIT-36L" (podatek liniowy) w nagłówku'),
|
| 26 |
+
'pit28': ('Zeznanie PIT-28', 'Wyraźny symbol "PIT-28" (ryczałt) w nagłówku formularza'),
|
| 27 |
+
'pit38': ('Zeznanie PIT-38', 'Wyraźny symbol "PIT-38" (kapitały pieniężne) w nagłówku'),
|
| 28 |
+
'pit39': ('Zeznanie PIT-39', 'Wyraźny symbol "PIT-39" (nieruchomości) w nagłówku'),
|
| 29 |
+
'pit5': ('Deklaracja PIT-5', 'Symbol "PIT-5" widoczny na formularzu'),
|
| 30 |
+
'pit8C': ('Informacja PIT-8C', 'Symbol "PIT-8C" widoczny w nagłówku formularza'),
|
| 31 |
+
'vat7': ('Deklaracja VAT-7 / JPK', 'Symbol "VAT-7" lub nagłówek JPK_V7, tabela rozliczenia podatku VAT'),
|
| 32 |
+
'cit8': ('Zeznanie CIT-8', 'Symbol "CIT-8" w nagłówku, dotyczy osób prawnych'),
|
| 33 |
+
'pcc3': ('Deklaracja PCC-3', 'Symbol "PCC-3" (podatek od czynności cywilnoprawnych) w nagłówku'),
|
| 34 |
+
|
| 35 |
+
# --- FINANSE ---
|
| 36 |
+
'invoice': ('Faktura VAT',
|
| 37 |
+
'Słowo "Faktura" lub "Invoice", tabela z kolumnami netto/vat/brutto, dane sprzedawcy i nabywcy'),
|
| 38 |
+
'proformaInvoice': ('Faktura Proforma',
|
| 39 |
+
'Wyraźny napis "Proforma" lub "Zamówienie", brak skutków księgowych (wygląda jak faktura)'),
|
| 40 |
+
'receipt': ('Paragon fiskalny',
|
| 41 |
+
'Wąski wydruk z drukarki fiskalnej, logo sklepu na górze, stawki PTU na dole, data i godzina'),
|
| 42 |
+
'utilityBill': ('Rachunek za media',
|
| 43 |
+
'Logo dostawcy (prąd/gaz/woda/internet), wykres zużycia, kwota "do zapłaty", numer konta'),
|
| 44 |
+
'bankStatement': ('Wyciąg bankowy', 'Logo banku, lista operacji z datami i kwotami, saldo początkowe i końcowe'),
|
| 45 |
+
'loanAgreement': ('Umowa kredytowa',
|
| 46 |
+
'Tytuł "Umowa kredytu" lub "Umowa pożyczki", harmonogram spłat, pieczęci banku'),
|
| 47 |
+
'insurancePolicy': ('Polisa ubezpieczeniowa',
|
| 48 |
+
'Tytuł "Polisa", numer polisy, okres ubezpieczenia, przedmiot ubezpieczenia (auto/dom)'),
|
| 49 |
+
|
| 50 |
+
# --- PRAWO ---
|
| 51 |
+
'notarialDeed': ('Akt notarialny',
|
| 52 |
+
'Godło państwowe (orzeł), pieczęć notariusza, charakterystyczny sznurek (repetytorium), tytuł "Akt Notarialny"'),
|
| 53 |
+
'courtJudgment': ('Wyrok sądu',
|
| 54 |
+
'Godło państwowe, nagłówek "Wyrok w imieniu Rzeczypospolitej Polskiej", sygnatura akt'),
|
| 55 |
+
'powerOfAttorney': ('Pełnomocnictwo',
|
| 56 |
+
'Tytuł "Pełnomocnictwo" lub "Upoważnienie", dane mocodawcy i pełnomocnika, podpis'),
|
| 57 |
+
'employmentContract': ('Umowa o pracę',
|
| 58 |
+
'Tytuł "Umowa o pracę", określenie stanowiska, wynagrodzenia, wymiaru etatu'),
|
| 59 |
+
'mandateContract': ('Umowa zlecenie',
|
| 60 |
+
'Tytuł "Umowa zlecenie", określenie czynności do wykonania, stawka godzinowa/miesięczna'),
|
| 61 |
+
'taskContract': ('Umowa o dzieło', 'Tytuł "Umowa o dzieło", określenie konkretnego rezultatu/dzieła'),
|
| 62 |
+
'b2bContract': ('Kontrakt B2B', 'Umowa współpracy biznesowej, dane dwóch firm (NIP), określenie zasad współpracy'),
|
| 63 |
+
'nonCompeteAgreement': ('Zakaz konkurencji',
|
| 64 |
+
'Umowa lub aneks o zakazie konkurencji, określenie kar umownych i okresu obowiązywania'),
|
| 65 |
+
'lawsuit': ('Pozew sądowy', 'Pismo procesowe, nagłówek "Pozew", oznaczenie sądu i stron, uzasadnienie'),
|
| 66 |
+
|
| 67 |
+
# --- OSOBISTE ---
|
| 68 |
+
'idCard': ('Dowód osobisty', 'Plastikowa karta, zdjęcie twarzy, godło, napis "Rzeczpospolita Polska"'),
|
| 69 |
+
'passport': ('Paszport', 'Strona z danymi, zdjęcie, hologramy, dolny pasek maszynowy (<<<)'),
|
| 70 |
+
'birthCertificate': ('Akt urodzenia', 'Odpis aktu stanu cywilnego, godło, pieczęć urzędu stanu cywilnego (USC)'),
|
| 71 |
+
'marriageCertificate': ('Akt małżeństwa', 'Odpis aktu małżeństwa, dane małżonków, pieczęć USC'),
|
| 72 |
+
'deathCertificate': ('Akt zgonu', 'Odpis aktu zgonu, czarna ramka lub standardowy druk USC, pieczęć'),
|
| 73 |
+
'peselConfirmation': ('Zaświadczenie PESEL',
|
| 74 |
+
'Biały druk urzędowy, potwierdzenie nadania numeru PESEL, pieczęć gminy/urzędu'),
|
| 75 |
+
'drivingLicense': ('Prawo jazdy', 'Różowa plastikowa karta, zdjęcie, ikony pojazdów na rewersie'),
|
| 76 |
+
'schoolCertificate': ('Świadectwo szkolne',
|
| 77 |
+
'Gilosz (ozdobne tło), godło, nazwa szkoły, oceny, czerwony pasek (opcjonalnie)'),
|
| 78 |
+
'universityDiploma': ('Dyplom studiów',
|
| 79 |
+
'Ozdobny papier, godło uczelni, tytuł zawodowy (licencjat/magister/inżynier), pieczęć sucha lub tuszowa'),
|
| 80 |
+
'professionalCertificate': ('Certyfikat zawodowy',
|
| 81 |
+
'Nazwa kursu/szkolenia, imię i nazwisko uczestnika, podpis organizatora'),
|
| 82 |
+
'cv': ('CV / Życiorys', 'Układ sekcyjny: Doświadczenie, Edukacja, Umiejętności, często zdjęcie, dane kontaktowe'),
|
| 83 |
+
|
| 84 |
+
# --- ZDROWIE ---
|
| 85 |
+
'sickLeave': ('Zwolnienie L4', 'Formularz ZUS ZLA (zielony/biały) lub wydruk e-ZLA, dane pacjenta i lekarza'),
|
| 86 |
+
'prescription': ('Recepta', 'Kod kreskowy (góra/dół), "Recepta", lista leków, dane świadczeniodawcy'),
|
| 87 |
+
'medicalResults': ('Wyniki badań',
|
| 88 |
+
'Wydruk laboratoryjny, nazwy parametrów (morfologia, glukoza itp.), normy i wyniki'),
|
| 89 |
+
'referral': ('Skierowanie', 'Tytuł "Skierowanie", rozpoznanie (kod ICD-10), pieczęć lekarza kierującego'),
|
| 90 |
+
'medicalHistory': ('Historia choroby/Wypis', 'Karta informacyjna leczenia szpitalnego, epikryza, zalecenia'),
|
| 91 |
+
'vaccinationCard': ('Karta szczepień', 'Książeczka lub karta, tabela z datami szczepień i nazwami preparatów'),
|
| 92 |
+
'sanitaryBooklet': ('Książeczka sanepidowska',
|
| 93 |
+
'Mała książeczka, wpisy badań na nosicielstwo, pieczątki stacji sanitarno-epidemiologicznej'),
|
| 94 |
+
|
| 95 |
+
# --- NIERUCHOMOŚCI / AUTO ---
|
| 96 |
+
'propertyDeed': ('Akt własności', 'Akt notarialny dotyczący przeniesienia własności nieruchomości'),
|
| 97 |
+
'landRegistry': ('Księga wieczysta', 'Wydruk z EKW (Elektroniczne Księgi Wieczyste), działy I-IV'),
|
| 98 |
+
'rentalAgreement': ('Umowa najmu', 'Tytuł "Umowa najmu lokalu", określenie czynszu, kaucji, adres lokalu'),
|
| 99 |
+
'registrationCertificate': ('Dowód rejestracyjny',
|
| 100 |
+
'Składany dokument (błękitno-żółty), hologram, pola z kodami A, B, C'),
|
| 101 |
+
'vehicleHistory': ('Karta pojazdu', 'Czerwona książeczka (stary typ) lub wydruk historii z CEPiK'),
|
| 102 |
+
'landMap': ('Mapa geodezyjna', 'Rysunek techniczny terenu, granice działek, numery działek, pieczęć starostwa'),
|
| 103 |
+
'technicalInspection': ('Przegląd techniczny',
|
| 104 |
+
'Zaświadczenie ze stacji kontroli pojazdów lub pieczątka w dowodzie rejestracyjnym'),
|
| 105 |
+
|
| 106 |
+
# --- INNE ---
|
| 107 |
+
'application': ('Wniosek/Podanie', 'Nagłówek "Wniosek" lub "Podanie", adresat (urząd/firma), prośba, podpis'),
|
| 108 |
+
'certificate': ('Zaświadczenie', 'Tytuł "Zaświadczenie", potwierdzenie faktu przez instytucję, pieczęć'),
|
| 109 |
+
'authorization': ('Upoważnienie', 'Tytuł "Upoważnienie", dane osoby upoważnianej do czynności, podpis')
|
| 110 |
+
}
|
| 111 |
+
|
| 112 |
+
DEFAULT_CRITERIA = "Oficjalny dokument z czytelnym tekstem i pieczęciami."
|
| 113 |
+
|
| 114 |
+
|
| 115 |
+
# --- LOGIKA ---
|
| 116 |
+
|
| 117 |
+
def load_history():
|
| 118 |
+
if not os.path.exists(HISTORY_FILE):
|
| 119 |
+
return set()
|
| 120 |
+
with open(HISTORY_FILE, 'r', encoding='utf-8') as f:
|
| 121 |
+
return set(line.strip() for line in f if line.strip())
|
| 122 |
+
|
| 123 |
+
|
| 124 |
+
def mark_as_done(rel_path):
|
| 125 |
+
with open(HISTORY_FILE, 'a', encoding='utf-8') as f:
|
| 126 |
+
f.write(f"{rel_path}\n")
|
| 127 |
+
|
| 128 |
+
|
| 129 |
+
def check_document_strict(file_path, doc_name, criteria):
|
| 130 |
+
"""
|
| 131 |
+
Wysyła zapytanie do Llama Vision z BARDZO rygorystycznymi wymogami.
|
| 132 |
+
"""
|
| 133 |
+
print(f" (Weryfikacja: {doc_name} -> {criteria[:30]}...)", end="", flush=True)
|
| 134 |
+
|
| 135 |
+
prompt = f"""
|
| 136 |
+
Działaj jako rygorystyczny audytor dokumentów. Twoim zadaniem jest potwierdzenie autentyczności typu dokumentu.
|
| 137 |
+
|
| 138 |
+
OBRAZ: {file_path}
|
| 139 |
+
OCZEKIWANY TYP: {doc_name}
|
| 140 |
+
|
| 141 |
+
KRYTYCZNE WYMAGANIA WIZUALNE (MUST HAVE):
|
| 142 |
+
- {criteria}
|
| 143 |
+
|
| 144 |
+
NATYCHMIASTOWE ODRZUCENIE (REJECT IF):
|
| 145 |
+
1. To jest zrzut ekranu (widać paski przeglądarki, kursor, interfejs telefonu).
|
| 146 |
+
2. To jest zdjęcie ekranu monitora (widać piksele/morę).
|
| 147 |
+
3. Dokument jest nieczytelny, rozmazany lub ucięty w sposób uniemożliwiający identyfikację.
|
| 148 |
+
4. Brakuje kluczowych elementów wymienionych w wymaganiach (np. brak napisu "PIT-11" na rzekomym PIT-11).
|
| 149 |
+
5. To jest zdjęcie przedmiotu, zwierzęcia lub osoby (selfie), a nie skan dokumentu.
|
| 150 |
+
|
| 151 |
+
DECYZJA:
|
| 152 |
+
Czy obraz spełnia wszystkie kryteria dla {doc_name}?
|
| 153 |
+
Odpowiedz TYLKO jednym słowem: TAK lub NIE.
|
| 154 |
+
"""
|
| 155 |
+
|
| 156 |
+
try:
|
| 157 |
+
response = ollama.chat(
|
| 158 |
+
model=MODEL_NAME,
|
| 159 |
+
messages=[{
|
| 160 |
+
'role': 'user',
|
| 161 |
+
'content': prompt,
|
| 162 |
+
'images': [str(file_path)]
|
| 163 |
+
}]
|
| 164 |
+
)
|
| 165 |
+
# Czyszczenie odpowiedzi (np. "TAK." -> "TAK")
|
| 166 |
+
answer = response['message']['content'].strip().upper().replace('.', '')
|
| 167 |
+
|
| 168 |
+
if "TAK" in answer or "YES" in answer:
|
| 169 |
+
return True
|
| 170 |
+
return False
|
| 171 |
+
|
| 172 |
+
except Exception as e:
|
| 173 |
+
print(f" ❌ Błąd API: {e}")
|
| 174 |
+
return None
|
| 175 |
+
|
| 176 |
+
|
| 177 |
+
def main():
|
| 178 |
+
base_path = Path(ROOT_FOLDER)
|
| 179 |
+
rejected_path = base_path / REJECTED_FOLDER
|
| 180 |
+
|
| 181 |
+
if not base_path.exists():
|
| 182 |
+
print(f"❌ Folder '{ROOT_FOLDER}' nie istnieje!")
|
| 183 |
+
return
|
| 184 |
+
|
| 185 |
+
if not rejected_path.exists():
|
| 186 |
+
rejected_path.mkdir()
|
| 187 |
+
|
| 188 |
+
processed_files = load_history()
|
| 189 |
+
print(f"📂 Historia: {len(processed_files)} plików pominiętych.")
|
| 190 |
+
print(f"🚀 Start audytu wizualnego (Model: {MODEL_NAME})...")
|
| 191 |
+
|
| 192 |
+
# Pobieramy listę folderów w katalogu scans
|
| 193 |
+
subdirs = [d for d in base_path.iterdir() if d.is_dir()]
|
| 194 |
+
|
| 195 |
+
for folder in subdirs:
|
| 196 |
+
folder_name = folder.name
|
| 197 |
+
|
| 198 |
+
# 1. Pomijanie folderów specjalnych
|
| 199 |
+
if folder_name == REJECTED_FOLDER:
|
| 200 |
+
continue
|
| 201 |
+
|
| 202 |
+
# 2. Pomijanie folderów "bezpiecznych" (np. documentScan - szybki zrzut)
|
| 203 |
+
if folder_name in SAFE_FOLDERS:
|
| 204 |
+
# print(f"⏩ Pomijam bezpieczny folder: {folder_name}")
|
| 205 |
+
continue
|
| 206 |
+
|
| 207 |
+
# Pobieranie kryteriów z mapy
|
| 208 |
+
if folder_name in DOCUMENT_TYPES:
|
| 209 |
+
doc_name, doc_criteria = DOCUMENT_TYPES[folder_name]
|
| 210 |
+
else:
|
| 211 |
+
# Jeśli folderu nie ma w słowniku, można go pominąć lub użyć domyślnych
|
| 212 |
+
# print(f"⏩ Folder nieznany w systemie: {folder_name} (pomijam)")
|
| 213 |
+
continue
|
| 214 |
+
|
| 215 |
+
files = [f for f in folder.iterdir() if f.suffix.lower() in IMAGE_EXTENSIONS]
|
| 216 |
+
if not files:
|
| 217 |
+
continue
|
| 218 |
+
|
| 219 |
+
print(f"\n📂 Audyt folderu: [{folder_name}]")
|
| 220 |
+
|
| 221 |
+
for file_path in files:
|
| 222 |
+
rel_path_str = str(file_path.relative_to(base_path))
|
| 223 |
+
|
| 224 |
+
# Sprawdzenie historii
|
| 225 |
+
if rel_path_str in processed_files:
|
| 226 |
+
continue
|
| 227 |
+
|
| 228 |
+
print(f" 👁️ Plik: {file_path.name}...", end="", flush=True)
|
| 229 |
+
|
| 230 |
+
is_valid = check_document_strict(file_path, doc_name, doc_criteria)
|
| 231 |
+
|
| 232 |
+
if is_valid is True:
|
| 233 |
+
print(" ✅ OK")
|
| 234 |
+
mark_as_done(rel_path_str)
|
| 235 |
+
|
| 236 |
+
elif is_valid is False:
|
| 237 |
+
print(" 🗑️ ODRZUCONY")
|
| 238 |
+
|
| 239 |
+
# Przenoszenie
|
| 240 |
+
target_dir = rejected_path / folder_name
|
| 241 |
+
if not target_dir.exists():
|
| 242 |
+
target_dir.mkdir(parents=True)
|
| 243 |
+
|
| 244 |
+
try:
|
| 245 |
+
shutil.move(str(file_path), str(target_dir / file_path.name))
|
| 246 |
+
mark_as_done(rel_path_str) # Oznaczamy jako przetworzony (usunięty)
|
| 247 |
+
except Exception as e:
|
| 248 |
+
print(f" [!] Błąd przenoszenia: {e}")
|
| 249 |
+
else:
|
| 250 |
+
print(" ⚠️ Błąd modelu (spróbujemy ponownie).")
|
| 251 |
+
|
| 252 |
+
print("\n✨ Zakończono.")
|
| 253 |
+
|
| 254 |
+
|
| 255 |
+
if __name__ == "__main__":
|
| 256 |
+
try:
|
| 257 |
+
main()
|
| 258 |
+
except KeyboardInterrupt:
|
| 259 |
+
print("\n🛑 Zatrzymano.")
|
clean_scans_processed.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
registrationCertificate/registrationCertificate_16.jpg
|
content/.DS_Store
ADDED
|
Binary file (14.3 kB). View file
|
|
|
document_type_clasifier/document_type_labels.txt
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
application
|
| 2 |
+
bankstatement
|
| 3 |
+
birthcertificate
|
| 4 |
+
contract
|
| 5 |
+
courtdocument
|
| 6 |
+
cv
|
| 7 |
+
deathcertificate
|
| 8 |
+
drivinglicense
|
| 9 |
+
educationdocument
|
| 10 |
+
idcard
|
| 11 |
+
insurancepolicy
|
| 12 |
+
invoice
|
| 13 |
+
loanagreement
|
| 14 |
+
marriagecertificate
|
| 15 |
+
medicaldocument
|
| 16 |
+
notarialdeed
|
| 17 |
+
officialcertificate
|
| 18 |
+
other
|
| 19 |
+
passport
|
| 20 |
+
powerofattorney
|
| 21 |
+
prescription
|
| 22 |
+
propertydeed
|
| 23 |
+
receipt
|
| 24 |
+
referral
|
| 25 |
+
rentalagreement
|
| 26 |
+
sanitarybooklet
|
| 27 |
+
taxdocument
|
| 28 |
+
technicalinspection
|
| 29 |
+
utilitybill
|
| 30 |
+
vaccinationcard
|
| 31 |
+
vehicledocument
|
document_type_clasifier/learn_with_history_visualisation.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
info/.DS_Store
ADDED
|
Binary file (14.3 kB). View file
|
|
|
map_scans_to_less_types.py
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import shutil
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
|
| 5 |
+
# --- KONFIGURACJA ---
|
| 6 |
+
SOURCE_DIR = Path("scans")
|
| 7 |
+
DEST_DIR = Path("scans_less_types")
|
| 8 |
+
|
| 9 |
+
# --- MAPOWANIE (Na podstawie Twojej funkcji fromId) ---
|
| 10 |
+
# Klucz: Stara nazwa folderu (z poprzedniego enuma)
|
| 11 |
+
# Wartość: Nowa nazwa folderu (z nowego enuma)
|
| 12 |
+
|
| 13 |
+
FOLDER_MAPPING = {
|
| 14 |
+
# --- ID 0-11 -> taxDocument ---
|
| 15 |
+
'pit11': 'taxDocument',
|
| 16 |
+
'pit37': 'taxDocument',
|
| 17 |
+
'pit36': 'taxDocument',
|
| 18 |
+
'pit36L': 'taxDocument',
|
| 19 |
+
'pit28': 'taxDocument',
|
| 20 |
+
'pit38': 'taxDocument',
|
| 21 |
+
'pit39': 'taxDocument',
|
| 22 |
+
'pit5': 'taxDocument',
|
| 23 |
+
'pit8C': 'taxDocument',
|
| 24 |
+
'vat7': 'taxDocument',
|
| 25 |
+
'cit8': 'taxDocument',
|
| 26 |
+
'pcc3': 'taxDocument',
|
| 27 |
+
|
| 28 |
+
# --- ID 12-13 -> invoice ---
|
| 29 |
+
'invoice': 'invoice',
|
| 30 |
+
'proformaInvoice': 'invoice',
|
| 31 |
+
|
| 32 |
+
# --- ID 22-26 -> contract ---
|
| 33 |
+
'employmentContract': 'contract',
|
| 34 |
+
'mandateContract': 'contract',
|
| 35 |
+
'taskContract': 'contract',
|
| 36 |
+
'b2bContract': 'contract',
|
| 37 |
+
'nonCompeteAgreement': 'contract',
|
| 38 |
+
|
| 39 |
+
# --- ID 20, 27 -> courtDocument ---
|
| 40 |
+
'courtJudgment': 'courtDocument',
|
| 41 |
+
'lawsuit': 'courtDocument',
|
| 42 |
+
|
| 43 |
+
# --- ID 33 -> officialCertificate ---
|
| 44 |
+
'peselConfirmation': 'officialCertificate',
|
| 45 |
+
|
| 46 |
+
# --- ID 35-37 -> educationDocument ---
|
| 47 |
+
'schoolCertificate': 'educationDocument',
|
| 48 |
+
'universityDiploma': 'educationDocument',
|
| 49 |
+
'professionalCertificate': 'educationDocument',
|
| 50 |
+
|
| 51 |
+
# --- ID 39, 41, 43 -> medicalDocument ---
|
| 52 |
+
'sickLeave': 'medicalDocument',
|
| 53 |
+
'medicalResults': 'medicalDocument',
|
| 54 |
+
'medicalHistory': 'medicalDocument',
|
| 55 |
+
|
| 56 |
+
# --- ID 46, 47, 51 -> propertyDeed ---
|
| 57 |
+
'propertyDeed': 'propertyDeed',
|
| 58 |
+
'landRegistry': 'propertyDeed',
|
| 59 |
+
'landMap': 'propertyDeed',
|
| 60 |
+
|
| 61 |
+
# --- ID 49, 50 -> vehicleDocument ---
|
| 62 |
+
'registrationCertificate': 'vehicleDocument',
|
| 63 |
+
'vehicleHistory': 'vehicleDocument',
|
| 64 |
+
|
| 65 |
+
# --- ID 56 -> other (authorization) ---
|
| 66 |
+
'authorization': 'other',
|
| 67 |
+
|
| 68 |
+
# --- POZOSTAŁE (Bez zmian nazwy lub mapowanie 1:1) ---
|
| 69 |
+
'receipt': 'receipt',
|
| 70 |
+
'utilityBill': 'utilityBill',
|
| 71 |
+
'bankStatement': 'bankStatement',
|
| 72 |
+
'loanAgreement': 'loanAgreement',
|
| 73 |
+
'insurancePolicy': 'insurancePolicy',
|
| 74 |
+
'notarialDeed': 'notarialDeed',
|
| 75 |
+
'powerOfAttorney': 'powerOfAttorney',
|
| 76 |
+
'idCard': 'idCard',
|
| 77 |
+
'passport': 'passport',
|
| 78 |
+
'birthCertificate': 'birthCertificate',
|
| 79 |
+
'marriageCertificate': 'marriageCertificate',
|
| 80 |
+
'deathCertificate': 'deathCertificate',
|
| 81 |
+
'drivingLicense': 'drivingLicense',
|
| 82 |
+
'cv': 'cv',
|
| 83 |
+
'prescription': 'prescription',
|
| 84 |
+
'referral': 'referral',
|
| 85 |
+
'vaccinationCard': 'vaccinationCard',
|
| 86 |
+
'sanitaryBooklet': 'sanitaryBooklet',
|
| 87 |
+
'rentalAgreement': 'rentalAgreement',
|
| 88 |
+
'technicalInspection': 'technicalInspection',
|
| 89 |
+
'documentScan': 'documentScan',
|
| 90 |
+
'application': 'application',
|
| 91 |
+
'certificate': 'certificate',
|
| 92 |
+
'other': 'other'
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
+
|
| 96 |
+
def get_unique_filename(destination_folder, filename):
|
| 97 |
+
"""
|
| 98 |
+
Zwraca unikalną nazwę pliku, jeśli taki już istnieje w folderze docelowym.
|
| 99 |
+
Np. jeśli 'plik.jpg' istnieje, zwróci 'plik_1.jpg'.
|
| 100 |
+
"""
|
| 101 |
+
if not (destination_folder / filename).exists():
|
| 102 |
+
return filename
|
| 103 |
+
|
| 104 |
+
stem = Path(filename).stem
|
| 105 |
+
suffix = Path(filename).suffix
|
| 106 |
+
counter = 1
|
| 107 |
+
|
| 108 |
+
while True:
|
| 109 |
+
new_filename = f"{stem}_{counter}{suffix}"
|
| 110 |
+
if not (destination_folder / new_filename).exists():
|
| 111 |
+
return new_filename
|
| 112 |
+
counter += 1
|
| 113 |
+
|
| 114 |
+
|
| 115 |
+
def main():
|
| 116 |
+
if not SOURCE_DIR.exists():
|
| 117 |
+
print(f"❌ Folder źródłowy '{SOURCE_DIR}' nie istnieje!")
|
| 118 |
+
return
|
| 119 |
+
|
| 120 |
+
# Tworzenie folderu docelowego
|
| 121 |
+
if not DEST_DIR.exists():
|
| 122 |
+
DEST_DIR.mkdir()
|
| 123 |
+
print(f"📂 Utworzono folder docelowy: {DEST_DIR}")
|
| 124 |
+
|
| 125 |
+
print("🚀 Rozpoczynam migrację dokumentów...")
|
| 126 |
+
|
| 127 |
+
moved_count = 0
|
| 128 |
+
folders_processed = 0
|
| 129 |
+
|
| 130 |
+
# Iteracja po starych folderach w scans/
|
| 131 |
+
for old_folder_path in SOURCE_DIR.iterdir():
|
| 132 |
+
if not old_folder_path.is_dir():
|
| 133 |
+
continue
|
| 134 |
+
|
| 135 |
+
old_name = old_folder_path.name
|
| 136 |
+
|
| 137 |
+
# Pomijamy foldery specjalne (np. _ODRZUCONE)
|
| 138 |
+
if old_name.startswith("_"):
|
| 139 |
+
continue
|
| 140 |
+
|
| 141 |
+
# Sprawdzamy czy mamy mapowanie dla tego folderu
|
| 142 |
+
new_name = FOLDER_MAPPING.get(old_name)
|
| 143 |
+
|
| 144 |
+
if not new_name:
|
| 145 |
+
print(f"⚠️ Nieznany typ folderu: '{old_name}' - pomijam.")
|
| 146 |
+
continue
|
| 147 |
+
|
| 148 |
+
# Tworzenie folderu w nowej strukturze
|
| 149 |
+
target_folder = DEST_DIR / new_name
|
| 150 |
+
if not target_folder.exists():
|
| 151 |
+
target_folder.mkdir()
|
| 152 |
+
|
| 153 |
+
# Przenoszenie plików
|
| 154 |
+
files = [f for f in old_folder_path.iterdir() if f.is_file() and f.name != ".DS_Store"]
|
| 155 |
+
|
| 156 |
+
if files:
|
| 157 |
+
print(f"📦 Przenoszę {len(files)} plików z '{old_name}' -> '{new_name}'")
|
| 158 |
+
|
| 159 |
+
for file in files:
|
| 160 |
+
unique_name = get_unique_filename(target_folder, file.name)
|
| 161 |
+
target_path = target_folder / unique_name
|
| 162 |
+
|
| 163 |
+
try:
|
| 164 |
+
# shutil.move przenosi plik (usuwa ze źródła)
|
| 165 |
+
# Jeśli chcesz kopiować, użyj shutil.copy2
|
| 166 |
+
shutil.move(str(file), str(target_path))
|
| 167 |
+
moved_count += 1
|
| 168 |
+
except Exception as e:
|
| 169 |
+
print(f" ❌ Błąd przenoszenia {file.name}: {e}")
|
| 170 |
+
|
| 171 |
+
folders_processed += 1
|
| 172 |
+
|
| 173 |
+
# Opcjonalnie: Usuń stary pusty folder
|
| 174 |
+
try:
|
| 175 |
+
old_folder_path.rmdir()
|
| 176 |
+
except:
|
| 177 |
+
pass # Jeśli folder nie jest pusty (np. pliki ukryte), zostaw go
|
| 178 |
+
|
| 179 |
+
print("-" * 40)
|
| 180 |
+
print(f"✅ Zakończono migrację.")
|
| 181 |
+
print(f"📂 Przetworzono folderów źródłowych: {folders_processed}")
|
| 182 |
+
print(f"📄 Przeniesiono plików: {moved_count}")
|
| 183 |
+
print(f"📍 Nowa lokalizacja: {DEST_DIR.absolute()}")
|
| 184 |
+
|
| 185 |
+
|
| 186 |
+
if __name__ == "__main__":
|
| 187 |
+
main()
|
process_syntethic_content.py
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import json
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
from langchain_ollama import OllamaLLM
|
| 5 |
+
|
| 6 |
+
# --- KONFIGURACJA ---
|
| 7 |
+
INPUT_DIR = "synthetic_content"
|
| 8 |
+
OUTPUT_ROOT = "synthetic_dataset"
|
| 9 |
+
HISTORY_FILE = "processed_synthetic_scans_contents.txt"
|
| 10 |
+
MODEL_NAME = "llama3"
|
| 11 |
+
|
| 12 |
+
# Definicja języków
|
| 13 |
+
TARGET_LANGUAGES = {
|
| 14 |
+
"pl": "Polish",
|
| 15 |
+
"en": "English",
|
| 16 |
+
"de": "German",
|
| 17 |
+
"fr": "French",
|
| 18 |
+
"es": "Spanish",
|
| 19 |
+
"it": "Italian",
|
| 20 |
+
"uk": "Ukrainian"
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
# Inicjalizacja LLM z niską temperaturą dla powtarzalności
|
| 24 |
+
llm = OllamaLLM(model=MODEL_NAME, temperature=0)
|
| 25 |
+
|
| 26 |
+
# --- OBSŁUGA HISTORII (RESUME) ---
|
| 27 |
+
def load_history():
|
| 28 |
+
if not os.path.exists(HISTORY_FILE):
|
| 29 |
+
return set()
|
| 30 |
+
with open(HISTORY_FILE, 'r', encoding='utf-8') as f:
|
| 31 |
+
return set(line.strip() for line in f if line.strip())
|
| 32 |
+
|
| 33 |
+
def mark_as_done(rel_path):
|
| 34 |
+
with open(HISTORY_FILE, 'a', encoding='utf-8') as f:
|
| 35 |
+
f.write(f"{rel_path}\n")
|
| 36 |
+
|
| 37 |
+
# --- PROMPTY LLM ---
|
| 38 |
+
def ask_llm_json(prompt):
|
| 39 |
+
"""Wywołuje LLM w trybie JSON i bezpiecznie parsuje wynik."""
|
| 40 |
+
try:
|
| 41 |
+
# format="json" to kluczowa funkcja Ollama, która wymusza poprawny JSON
|
| 42 |
+
response = llm.invoke(prompt, format="json")
|
| 43 |
+
return json.loads(response)
|
| 44 |
+
except json.JSONDecodeError as e:
|
| 45 |
+
print(f"\n ⚠️ Błąd składni JSON od AI: {e}")
|
| 46 |
+
return None
|
| 47 |
+
except Exception as e:
|
| 48 |
+
print(f"\n ⚠️ Błąd komunikacji z LLM: {e}")
|
| 49 |
+
return None
|
| 50 |
+
|
| 51 |
+
def ask_llm_text(prompt):
|
| 52 |
+
try:
|
| 53 |
+
response = llm.invoke(prompt)
|
| 54 |
+
return response.strip().strip('"').strip("'")
|
| 55 |
+
except Exception:
|
| 56 |
+
return "Translation Error"
|
| 57 |
+
|
| 58 |
+
def get_metadata(text, hinted_type):
|
| 59 |
+
# Prompt z wyraźnymi instrukcjami dla formatu JSON
|
| 60 |
+
prompt = f"""
|
| 61 |
+
Analyze this document text.
|
| 62 |
+
Folder hint: {hinted_type}
|
| 63 |
+
|
| 64 |
+
Return ONLY a JSON object with these keys:
|
| 65 |
+
- "title_base": Factual title in ENGLISH (format: "[Type] - [Entity] - [Date]")
|
| 66 |
+
- "summary_base": Factual summary in ENGLISH (exactly 5 sentences)
|
| 67 |
+
- "category": One of: financial, legal, personal, health, property, other
|
| 68 |
+
- "info": Key details (e.g. document ID or service name)
|
| 69 |
+
|
| 70 |
+
Ensure all quotes inside the text are properly escaped.
|
| 71 |
+
|
| 72 |
+
TEXT:
|
| 73 |
+
{text[:3500]}
|
| 74 |
+
"""
|
| 75 |
+
return ask_llm_json(prompt)
|
| 76 |
+
|
| 77 |
+
def translate_section(text, target_lang, content_type="text"):
|
| 78 |
+
prompt = f"""
|
| 79 |
+
Translate the following {content_type} into {target_lang}.
|
| 80 |
+
Output ONLY the translation. No conversational text or markdown.
|
| 81 |
+
|
| 82 |
+
TEXT TO TRANSLATE:
|
| 83 |
+
{text}
|
| 84 |
+
"""
|
| 85 |
+
return ask_llm_text(prompt)
|
| 86 |
+
|
| 87 |
+
def save_output(root, kind, lang, subdir, filename, content):
|
| 88 |
+
if lang:
|
| 89 |
+
path = Path(root) / kind / lang / subdir
|
| 90 |
+
else:
|
| 91 |
+
path = Path(root) / kind / subdir
|
| 92 |
+
|
| 93 |
+
path.mkdir(parents=True, exist_ok=True)
|
| 94 |
+
with open(path / filename, "w", encoding="utf-8") as f:
|
| 95 |
+
f.write(str(content))
|
| 96 |
+
|
| 97 |
+
# --- GŁÓWNA LOGIKA PLIKU ---
|
| 98 |
+
def process_file(file_path, input_root):
|
| 99 |
+
rel_path = file_path.relative_to(input_root)
|
| 100 |
+
base_filename = rel_path.name
|
| 101 |
+
sub_dir = rel_path.parent
|
| 102 |
+
doc_type = sub_dir.name
|
| 103 |
+
|
| 104 |
+
try:
|
| 105 |
+
raw_text = file_path.read_text(encoding='utf-8')
|
| 106 |
+
except Exception as e:
|
| 107 |
+
print(f" ❌ Błąd odczytu pliku: {e}")
|
| 108 |
+
return
|
| 109 |
+
|
| 110 |
+
# 2. Generowanie metadanych (JSON)
|
| 111 |
+
meta = get_metadata(raw_text, doc_type)
|
| 112 |
+
if not meta or not isinstance(meta, dict):
|
| 113 |
+
print(" ❌ Błąd AI: Nie udało się wygenerować poprawnego JSONa.")
|
| 114 |
+
return
|
| 115 |
+
|
| 116 |
+
# 3. Zapisywanie danych podstawowych
|
| 117 |
+
save_output(OUTPUT_ROOT, "content", None, sub_dir, base_filename, raw_text)
|
| 118 |
+
save_output(OUTPUT_ROOT, "category", None, sub_dir, base_filename, meta.get("category", "other"))
|
| 119 |
+
save_output(OUTPUT_ROOT, "type", None, sub_dir, base_filename, doc_type)
|
| 120 |
+
save_output(OUTPUT_ROOT, "info", None, sub_dir, base_filename, meta.get("info", "none"))
|
| 121 |
+
|
| 122 |
+
base_title = meta.get("title_base", "Document")
|
| 123 |
+
base_summary = meta.get("summary_base", "No summary available.")
|
| 124 |
+
|
| 125 |
+
# 4. Tłumaczenia
|
| 126 |
+
print(f" 🌍 Tłumaczenie na {len(TARGET_LANGUAGES)} języków...", end="", flush=True)
|
| 127 |
+
|
| 128 |
+
for code, lang_name in TARGET_LANGUAGES.items():
|
| 129 |
+
# Tytuły
|
| 130 |
+
if code == "en":
|
| 131 |
+
title = base_title
|
| 132 |
+
else:
|
| 133 |
+
title = translate_section(base_title, lang_name, "title")
|
| 134 |
+
save_output(OUTPUT_ROOT, "titles", code, sub_dir, base_filename, title)
|
| 135 |
+
|
| 136 |
+
# Streszczenia
|
| 137 |
+
if code == "en":
|
| 138 |
+
summary = base_summary
|
| 139 |
+
else:
|
| 140 |
+
summary = translate_section(base_summary, lang_name, "summary")
|
| 141 |
+
save_output(OUTPUT_ROOT, "summary", code, sub_dir, base_filename, summary)
|
| 142 |
+
|
| 143 |
+
print(".", end="", flush=True)
|
| 144 |
+
|
| 145 |
+
print(" OK")
|
| 146 |
+
mark_as_done(str(rel_path))
|
| 147 |
+
|
| 148 |
+
def main():
|
| 149 |
+
input_path = Path(INPUT_DIR)
|
| 150 |
+
if not input_path.exists():
|
| 151 |
+
print(f"❌ Brak folderu wejściowego: {INPUT_DIR}")
|
| 152 |
+
return
|
| 153 |
+
|
| 154 |
+
processed = load_history()
|
| 155 |
+
print(f"📂 Historia: {len(processed)} plików już przetworzonych.")
|
| 156 |
+
|
| 157 |
+
files = list(input_path.rglob("*.txt"))
|
| 158 |
+
print(f"🚀 Start: {len(files)} plików do analizy.")
|
| 159 |
+
|
| 160 |
+
for f in files:
|
| 161 |
+
rel_path = str(f.relative_to(input_path))
|
| 162 |
+
|
| 163 |
+
if rel_path in processed:
|
| 164 |
+
continue
|
| 165 |
+
|
| 166 |
+
print(f"📄 Przetwarzam: {rel_path}")
|
| 167 |
+
try:
|
| 168 |
+
process_file(f, input_path)
|
| 169 |
+
except KeyboardInterrupt:
|
| 170 |
+
print("\n🛑 Przerwano ręcznie. Postęp zapisany.")
|
| 171 |
+
break
|
| 172 |
+
except Exception as e:
|
| 173 |
+
print(f"\n❌ Błąd krytyczny przy pliku {rel_path}: {e}")
|
| 174 |
+
|
| 175 |
+
if __name__ == "__main__":
|
| 176 |
+
main()
|
processed_synthetic_scans_contents.txt
ADDED
|
@@ -0,0 +1,1757 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
taxDocument/pit5_1.txt
|
| 2 |
+
taxDocument/pcc3_8.txt
|
| 3 |
+
taxDocument/pit5_5_synth_1.txt
|
| 4 |
+
taxDocument/cit8_13_synth_1.txt
|
| 5 |
+
taxDocument/pit28_18.txt
|
| 6 |
+
taxDocument/pit8C_7_synth_1.txt
|
| 7 |
+
taxDocument/pcc3_8_synth_1.txt
|
| 8 |
+
taxDocument/pit5_12_synth_1.txt
|
| 9 |
+
taxDocument/pit5_3.txt
|
| 10 |
+
taxDocument/pit5_7.txt
|
| 11 |
+
taxDocument/pit11_18_synth_1.txt
|
| 12 |
+
taxDocument/pit5_18.txt
|
| 13 |
+
taxDocument/pit11_4_synth_1.txt
|
| 14 |
+
taxDocument/cit8_1_synth_1.txt
|
| 15 |
+
taxDocument/cit8_8.txt
|
| 16 |
+
taxDocument/pit5_17_synth_1.txt
|
| 17 |
+
taxDocument/pit5_6.txt
|
| 18 |
+
taxDocument/pit8C_8.txt
|
| 19 |
+
taxDocument/cit8_16_synth_1.txt
|
| 20 |
+
taxDocument/pit5_4.txt
|
| 21 |
+
taxDocument/cit8_8_synth_1.txt
|
| 22 |
+
taxDocument/pit11_11_synth_1.txt
|
| 23 |
+
taxDocument/pit5_5.txt
|
| 24 |
+
taxDocument/pit8C_9.txt
|
| 25 |
+
taxDocument/cit8_13.txt
|
| 26 |
+
taxDocument/cit8_12.txt
|
| 27 |
+
taxDocument/cit8_15_synth_1.txt
|
| 28 |
+
taxDocument/pit5_3_synth_1.txt
|
| 29 |
+
taxDocument/pit8C_14.txt
|
| 30 |
+
taxDocument/pit8C_8_synth_1.txt
|
| 31 |
+
taxDocument/cit8_10.txt
|
| 32 |
+
taxDocument/cit8_11.txt
|
| 33 |
+
taxDocument/cit8_15.txt
|
| 34 |
+
taxDocument/pit28_2_synth_1.txt
|
| 35 |
+
taxDocument/cit8_14.txt
|
| 36 |
+
taxDocument/pit11_11.txt
|
| 37 |
+
taxDocument/pit11_2_synth_1.txt
|
| 38 |
+
taxDocument/cit8_7_synth_1.txt
|
| 39 |
+
taxDocument/pcc3_10_synth_1.txt
|
| 40 |
+
taxDocument/pit5_18_synth_1.txt
|
| 41 |
+
taxDocument/pit8C_12.txt
|
| 42 |
+
taxDocument/cit8_16.txt
|
| 43 |
+
taxDocument/pit5_6_synth_1.txt
|
| 44 |
+
taxDocument/cit8_17.txt
|
| 45 |
+
taxDocument/cit8_10_synth_1.txt
|
| 46 |
+
taxDocument/pit28_2.txt
|
| 47 |
+
taxDocument/pcc3_5_synth_1.txt
|
| 48 |
+
taxDocument/pit11_6.txt
|
| 49 |
+
taxDocument/pit5_1_synth_1.txt
|
| 50 |
+
taxDocument/cit8_17_synth_1.txt
|
| 51 |
+
taxDocument/pit28_3.txt
|
| 52 |
+
taxDocument/pit5_16_synth_1.txt
|
| 53 |
+
taxDocument/pit8C_14_synth_1.txt
|
| 54 |
+
taxDocument/pit5_8_synth_1.txt
|
| 55 |
+
taxDocument/pit11_4.txt
|
| 56 |
+
taxDocument/cit8_0_synth_1.txt
|
| 57 |
+
taxDocument/pit28_0.txt
|
| 58 |
+
taxDocument/pcc3_12_synth_1.txt
|
| 59 |
+
taxDocument/pit11_18.txt
|
| 60 |
+
taxDocument/cit8_5_synth_1.txt
|
| 61 |
+
taxDocument/pit28_0_synth_1.txt
|
| 62 |
+
taxDocument/pcc3_0_synth_1.txt
|
| 63 |
+
taxDocument/pit11_2.txt
|
| 64 |
+
taxDocument/cit8_12_synth_1.txt
|
| 65 |
+
taxDocument/pit28_18_synth_1.txt
|
| 66 |
+
taxDocument/pit5_4_synth_1.txt
|
| 67 |
+
taxDocument/cit8_11_synth_1.txt
|
| 68 |
+
taxDocument/pit5_8.txt
|
| 69 |
+
taxDocument/pit5_7_synth_1.txt
|
| 70 |
+
taxDocument/pit5_17.txt
|
| 71 |
+
taxDocument/pcc3_10.txt
|
| 72 |
+
taxDocument/cit8_7.txt
|
| 73 |
+
taxDocument/pcc3_3_synth_1.txt
|
| 74 |
+
taxDocument/pcc3_11.txt
|
| 75 |
+
taxDocument/pit8C_5_synth_1.txt
|
| 76 |
+
taxDocument/pit5_16.txt
|
| 77 |
+
taxDocument/pcc3_0.txt
|
| 78 |
+
taxDocument/pit8C_5.txt
|
| 79 |
+
taxDocument/pit8C_7.txt
|
| 80 |
+
taxDocument/pit28_3_synth_1.txt
|
| 81 |
+
taxDocument/pcc3_11_synth_1.txt
|
| 82 |
+
taxDocument/cit8_5.txt
|
| 83 |
+
taxDocument/pcc3_12.txt
|
| 84 |
+
taxDocument/pit8C_12_synth_1.txt
|
| 85 |
+
taxDocument/pit5_10_synth_1.txt
|
| 86 |
+
taxDocument/pcc3_3.txt
|
| 87 |
+
taxDocument/pit11_6_synth_1.txt
|
| 88 |
+
taxDocument/cit8_3_synth_1.txt
|
| 89 |
+
taxDocument/pcc3_14_synth_1.txt
|
| 90 |
+
taxDocument/pit36_0_synth_1.txt
|
| 91 |
+
taxDocument/pit36_0.txt
|
| 92 |
+
taxDocument/cit8_1.txt
|
| 93 |
+
taxDocument/cit8_0.txt
|
| 94 |
+
taxDocument/pit5_10.txt
|
| 95 |
+
taxDocument/pit8C_9_synth_1.txt
|
| 96 |
+
taxDocument/pit5_12.txt
|
| 97 |
+
taxDocument/cit8_14_synth_1.txt
|
| 98 |
+
taxDocument/cit8_3.txt
|
| 99 |
+
taxDocument/pcc3_14.txt
|
| 100 |
+
taxDocument/pcc3_5.txt
|
| 101 |
+
taxDocument/pit8C_0_synth_1.txt
|
| 102 |
+
taxDocument/pit8C_0.txt
|
| 103 |
+
vaccinationCard/vaccinationCard_11_synth_4.txt
|
| 104 |
+
vaccinationCard/vaccinationCard_14_synth_1.txt
|
| 105 |
+
vaccinationCard/vaccinationCard_18_synth_4.txt
|
| 106 |
+
vaccinationCard/vaccinationCard_14_synth_2.txt
|
| 107 |
+
vaccinationCard/vaccinationCard_14_synth_3.txt
|
| 108 |
+
vaccinationCard/vaccinationCard_18_synth_1.txt
|
| 109 |
+
vaccinationCard/vaccinationCard_11_synth_2.txt
|
| 110 |
+
vaccinationCard/vaccinationCard_18.txt
|
| 111 |
+
vaccinationCard/vaccinationCard_11_synth_3.txt
|
| 112 |
+
vaccinationCard/vaccinationCard_18_synth_2.txt
|
| 113 |
+
vaccinationCard/vaccinationCard_11_synth_1.txt
|
| 114 |
+
vaccinationCard/vaccinationCard_14_synth_4.txt
|
| 115 |
+
vaccinationCard/vaccinationCard_18_synth_3.txt
|
| 116 |
+
vaccinationCard/vaccinationCard_17_synth_4.txt
|
| 117 |
+
vaccinationCard/vaccinationCard_9_synth_1.txt
|
| 118 |
+
vaccinationCard/vaccinationCard_2.txt
|
| 119 |
+
vaccinationCard/vaccinationCard_9_synth_3.txt
|
| 120 |
+
vaccinationCard/vaccinationCard_9_synth_2.txt
|
| 121 |
+
vaccinationCard/vaccinationCard_1.txt
|
| 122 |
+
vaccinationCard/vaccinationCard_17_synth_3.txt
|
| 123 |
+
vaccinationCard/vaccinationCard_17_synth_2.txt
|
| 124 |
+
vaccinationCard/vaccinationCard_9_synth_4.txt
|
| 125 |
+
vaccinationCard/vaccinationCard_2_synth_3.txt
|
| 126 |
+
vaccinationCard/vaccinationCard_10_synth_1.txt
|
| 127 |
+
vaccinationCard/vaccinationCard_2_synth_2.txt
|
| 128 |
+
vaccinationCard/vaccinationCard_15_synth_4.txt
|
| 129 |
+
vaccinationCard/vaccinationCard_9.txt
|
| 130 |
+
vaccinationCard/vaccinationCard_10_synth_3.txt
|
| 131 |
+
vaccinationCard/vaccinationCard_10_synth_2.txt
|
| 132 |
+
vaccinationCard/vaccinationCard_8.txt
|
| 133 |
+
vaccinationCard/vaccinationCard_2_synth_1.txt
|
| 134 |
+
vaccinationCard/vaccinationCard_15_synth_3.txt
|
| 135 |
+
vaccinationCard/vaccinationCard_2_synth_4.txt
|
| 136 |
+
vaccinationCard/vaccinationCard_15_synth_2.txt
|
| 137 |
+
vaccinationCard/vaccinationCard_10_synth_4.txt
|
| 138 |
+
vaccinationCard/vaccinationCard_15_synth_1.txt
|
| 139 |
+
vaccinationCard/vaccinationCard_8_synth_4.txt
|
| 140 |
+
vaccinationCard/vaccinationCard_16_synth_1.txt
|
| 141 |
+
vaccinationCard/vaccinationCard_13_synth_4.txt
|
| 142 |
+
vaccinationCard/vaccinationCard_16.txt
|
| 143 |
+
vaccinationCard/vaccinationCard_17.txt
|
| 144 |
+
vaccinationCard/vaccinationCard_16_synth_2.txt
|
| 145 |
+
vaccinationCard/vaccinationCard_1_synth_4.txt
|
| 146 |
+
vaccinationCard/vaccinationCard_15.txt
|
| 147 |
+
vaccinationCard/vaccinationCard_14.txt
|
| 148 |
+
vaccinationCard/vaccinationCard_16_synth_3.txt
|
| 149 |
+
vaccinationCard/vaccinationCard_8_synth_2.txt
|
| 150 |
+
vaccinationCard/vaccinationCard_1_synth_1.txt
|
| 151 |
+
vaccinationCard/vaccinationCard_10.txt
|
| 152 |
+
vaccinationCard/vaccinationCard_13_synth_2.txt
|
| 153 |
+
vaccinationCard/vaccinationCard_13_synth_3.txt
|
| 154 |
+
vaccinationCard/vaccinationCard_11.txt
|
| 155 |
+
vaccinationCard/vaccinationCard_8_synth_3.txt
|
| 156 |
+
vaccinationCard/vaccinationCard_8_synth_1.txt
|
| 157 |
+
vaccinationCard/vaccinationCard_16_synth_4.txt
|
| 158 |
+
vaccinationCard/vaccinationCard_1_synth_2.txt
|
| 159 |
+
vaccinationCard/vaccinationCard_13_synth_1.txt
|
| 160 |
+
vaccinationCard/vaccinationCard_13.txt
|
| 161 |
+
vaccinationCard/vaccinationCard_1_synth_3.txt
|
| 162 |
+
contract/taskContract_0_synth_1.txt
|
| 163 |
+
contract/mandateContract_7_synth_1.txt
|
| 164 |
+
contract/mandateContract_18.txt
|
| 165 |
+
contract/taskContract_9_synth_1.txt
|
| 166 |
+
contract/b2bContract_12.txt
|
| 167 |
+
contract/employmentContract_16_synth_1.txt
|
| 168 |
+
contract/employmentContract_6_synth_1.txt
|
| 169 |
+
contract/taskContract_18.txt
|
| 170 |
+
contract/b2bContract_18_synth_1.txt
|
| 171 |
+
contract/employmentContract_13_synth_1.txt
|
| 172 |
+
contract/nonCompeteAgreement_7_synth_1.txt
|
| 173 |
+
contract/mandateContract_16_synth_1.txt
|
| 174 |
+
contract/employmentContract_3_synth_1.txt
|
| 175 |
+
contract/taskContract_19.txt
|
| 176 |
+
contract/taskContract_18_synth_1.txt
|
| 177 |
+
contract/b2bContract_16.txt
|
| 178 |
+
contract/employmentContract_9.txt
|
| 179 |
+
contract/taskContract_5_synth_1.txt
|
| 180 |
+
contract/mandateContract_2_synth_1.txt
|
| 181 |
+
contract/employmentContract_8.txt
|
| 182 |
+
contract/b2bContract_15.txt
|
| 183 |
+
contract/employmentContract_9_synth_1.txt
|
| 184 |
+
contract/taskContract_12_synth_1.txt
|
| 185 |
+
contract/mandateContract_1_synth_1.txt
|
| 186 |
+
contract/taskContract_6.txt
|
| 187 |
+
contract/taskContract_7.txt
|
| 188 |
+
contract/taskContract_6_synth_1.txt
|
| 189 |
+
contract/employmentContract_19_synth_1.txt
|
| 190 |
+
contract/b2bContract_12_synth_1.txt
|
| 191 |
+
contract/mandateContract_15_synth_1.txt
|
| 192 |
+
contract/employmentContract_0_synth_1.txt
|
| 193 |
+
contract/taskContract_5.txt
|
| 194 |
+
contract/mandateContract_8_synth_1.txt
|
| 195 |
+
contract/taskContract_4.txt
|
| 196 |
+
contract/employmentContract_5_synth_1.txt
|
| 197 |
+
contract/taskContract_0.txt
|
| 198 |
+
contract/mandateContract_10_synth_1.txt
|
| 199 |
+
contract/employmentContract_15_synth_1.txt
|
| 200 |
+
contract/taskContract_1.txt
|
| 201 |
+
contract/mandateContract_8.txt
|
| 202 |
+
contract/mandateContract_4_synth_1.txt
|
| 203 |
+
contract/employmentContract_19.txt
|
| 204 |
+
contract/taskContract_17_synth_1.txt
|
| 205 |
+
contract/taskContract_3.txt
|
| 206 |
+
contract/taskContract_2.txt
|
| 207 |
+
contract/employmentContract_18.txt
|
| 208 |
+
contract/mandateContract_9.txt
|
| 209 |
+
contract/taskContract_3_synth_1.txt
|
| 210 |
+
contract/mandateContract_3_synth_1.txt
|
| 211 |
+
contract/mandateContract_4.txt
|
| 212 |
+
contract/employmentContract_15.txt
|
| 213 |
+
contract/nonCompeteAgreement_3.txt
|
| 214 |
+
contract/taskContract_10_synth_1.txt
|
| 215 |
+
contract/mandateContract_5.txt
|
| 216 |
+
contract/taskContract_4_synth_1.txt
|
| 217 |
+
contract/mandateContract_7.txt
|
| 218 |
+
contract/taskContract_19_synth_1.txt
|
| 219 |
+
contract/employmentContract_2_synth_1.txt
|
| 220 |
+
contract/employmentContract_16.txt
|
| 221 |
+
contract/nonCompeteAgreement_0.txt
|
| 222 |
+
contract/nonCompeteAgreement_6_synth_1.txt
|
| 223 |
+
contract/employmentContract_12_synth_1.txt
|
| 224 |
+
contract/b2bContract_19_synth_1.txt
|
| 225 |
+
contract/employmentContract_17.txt
|
| 226 |
+
contract/mandateContract_6.txt
|
| 227 |
+
contract/nonCompeteAgreement_3_synth_1.txt
|
| 228 |
+
contract/mandateContract_2.txt
|
| 229 |
+
contract/employmentContract_13.txt
|
| 230 |
+
contract/nonCompeteAgreement_5.txt
|
| 231 |
+
contract/taskContract_9.txt
|
| 232 |
+
contract/taskContract_8.txt
|
| 233 |
+
contract/employmentContract_12.txt
|
| 234 |
+
contract/taskContract_8_synth_1.txt
|
| 235 |
+
contract/mandateContract_3.txt
|
| 236 |
+
contract/employmentContract_17_synth_1.txt
|
| 237 |
+
contract/taskContract_15_synth_1.txt
|
| 238 |
+
contract/mandateContract_1.txt
|
| 239 |
+
contract/mandateContract_6_synth_1.txt
|
| 240 |
+
contract/nonCompeteAgreement_6.txt
|
| 241 |
+
contract/taskContract_1_synth_1.txt
|
| 242 |
+
contract/nonCompeteAgreement_7.txt
|
| 243 |
+
contract/employmentContract_11.txt
|
| 244 |
+
contract/b2bContract_15_synth_1.txt
|
| 245 |
+
contract/mandateContract_0.txt
|
| 246 |
+
contract/employmentContract_5.txt
|
| 247 |
+
contract/mandateContract_10.txt
|
| 248 |
+
contract/b2bContract_18.txt
|
| 249 |
+
contract/b2bContract_16_synth_1.txt
|
| 250 |
+
contract/taskContract_17.txt
|
| 251 |
+
contract/taskContract_2_synth_1.txt
|
| 252 |
+
contract/mandateContract_5_synth_1.txt
|
| 253 |
+
contract/taskContract_16_synth_1.txt
|
| 254 |
+
contract/taskContract_16.txt
|
| 255 |
+
contract/mandateContract_11.txt
|
| 256 |
+
contract/b2bContract_19.txt
|
| 257 |
+
contract/mandateContract_18_synth_1.txt
|
| 258 |
+
contract/employmentContract_6.txt
|
| 259 |
+
contract/mandateContract_11_synth_1.txt
|
| 260 |
+
contract/nonCompeteAgreement_0_synth_1.txt
|
| 261 |
+
contract/taskContract_15.txt
|
| 262 |
+
contract/employmentContract_3.txt
|
| 263 |
+
contract/mandateContract_16.txt
|
| 264 |
+
contract/employmentContract_11_synth_1.txt
|
| 265 |
+
contract/employmentContract_1_synth_1.txt
|
| 266 |
+
contract/nonCompeteAgreement_5_synth_1.txt
|
| 267 |
+
contract/mandateContract_14_synth_1.txt
|
| 268 |
+
contract/mandateContract_9_synth_1.txt
|
| 269 |
+
contract/employmentContract_2.txt
|
| 270 |
+
contract/taskContract_10.txt
|
| 271 |
+
contract/taskContract_12.txt
|
| 272 |
+
contract/employmentContract_0.txt
|
| 273 |
+
contract/mandateContract_15.txt
|
| 274 |
+
contract/taskContract_7_synth_1.txt
|
| 275 |
+
contract/employmentContract_18_synth_1.txt
|
| 276 |
+
contract/taskContract_13_synth_1.txt
|
| 277 |
+
contract/employmentContract_8_synth_1.txt
|
| 278 |
+
contract/mandateContract_0_synth_1.txt
|
| 279 |
+
contract/mandateContract_14.txt
|
| 280 |
+
contract/employmentContract_1.txt
|
| 281 |
+
contract/taskContract_13.txt
|
| 282 |
+
referral/referral_1_synth_2.txt
|
| 283 |
+
referral/referral_8_synth_1.txt
|
| 284 |
+
referral/referral_11_synth_2.txt
|
| 285 |
+
referral/referral_18_synth_1.txt
|
| 286 |
+
referral/referral_1_synth_1.txt
|
| 287 |
+
referral/referral_8_synth_2.txt
|
| 288 |
+
referral/referral_11_synth_1.txt
|
| 289 |
+
referral/referral_18_synth_2.txt
|
| 290 |
+
referral/referral_8_synth_3.txt
|
| 291 |
+
referral/referral_14_synth_1.txt
|
| 292 |
+
referral/referral_14_synth_2.txt
|
| 293 |
+
referral/referral_17_synth_2.txt
|
| 294 |
+
referral/referral_19.txt
|
| 295 |
+
referral/referral_18.txt
|
| 296 |
+
referral/referral_17_synth_3.txt
|
| 297 |
+
referral/referral_17_synth_1.txt
|
| 298 |
+
referral/referral_12_synth_1.txt
|
| 299 |
+
referral/referral_2_synth_1.txt
|
| 300 |
+
referral/referral_8.txt
|
| 301 |
+
referral/referral_2_synth_3.txt
|
| 302 |
+
referral/referral_12_synth_2.txt
|
| 303 |
+
referral/referral_2_synth_2.txt
|
| 304 |
+
referral/referral_9.txt
|
| 305 |
+
referral/referral_15_synth_2.txt
|
| 306 |
+
referral/referral_10.txt
|
| 307 |
+
referral/referral_11.txt
|
| 308 |
+
referral/referral_15_synth_3.txt
|
| 309 |
+
referral/referral_5_synth_2.txt
|
| 310 |
+
referral/referral_5.txt
|
| 311 |
+
referral/referral_15_synth_1.txt
|
| 312 |
+
referral/referral_13.txt
|
| 313 |
+
referral/referral_12.txt
|
| 314 |
+
referral/referral_5_synth_1.txt
|
| 315 |
+
referral/referral_19_synth_2.txt
|
| 316 |
+
referral/referral_2.txt
|
| 317 |
+
referral/referral_10_synth_1.txt
|
| 318 |
+
referral/referral_16.txt
|
| 319 |
+
referral/referral_9_synth_3.txt
|
| 320 |
+
referral/referral_9_synth_2.txt
|
| 321 |
+
referral/referral_17.txt
|
| 322 |
+
referral/referral_0_synth_1.txt
|
| 323 |
+
referral/referral_3.txt
|
| 324 |
+
referral/referral_19_synth_3.txt
|
| 325 |
+
referral/referral_1.txt
|
| 326 |
+
referral/referral_19_synth_1.txt
|
| 327 |
+
referral/referral_10_synth_2.txt
|
| 328 |
+
referral/referral_0_synth_3.txt
|
| 329 |
+
referral/referral_15.txt
|
| 330 |
+
referral/referral_9_synth_1.txt
|
| 331 |
+
referral/referral_14.txt
|
| 332 |
+
referral/referral_0_synth_2.txt
|
| 333 |
+
referral/referral_0.txt
|
| 334 |
+
referral/referral_3_synth_2.txt
|
| 335 |
+
referral/referral_3_synth_3.txt
|
| 336 |
+
referral/referral_13_synth_2.txt
|
| 337 |
+
referral/referral_3_synth_1.txt
|
| 338 |
+
referral/referral_13_synth_1.txt
|
| 339 |
+
referral/referral_16_synth_1.txt
|
| 340 |
+
referral/referral_16_synth_3.txt
|
| 341 |
+
referral/referral_16_synth_2.txt
|
| 342 |
+
rentalAgreement/rentalAgreement_19_synth_3.txt
|
| 343 |
+
rentalAgreement/loanAgreement_13_synth_2.txt
|
| 344 |
+
rentalAgreement/loanAgreement_13_synth_3.txt
|
| 345 |
+
rentalAgreement/rentalAgreement_15_synth_4.txt
|
| 346 |
+
rentalAgreement/rentalAgreement_19_synth_2.txt
|
| 347 |
+
rentalAgreement/rentalAgreement_10_synth_1.txt
|
| 348 |
+
rentalAgreement/rentalAgreement_10_synth_3.txt
|
| 349 |
+
rentalAgreement/loanAgreement_13_synth_1.txt
|
| 350 |
+
rentalAgreement/rentalAgreement_19_synth_1.txt
|
| 351 |
+
rentalAgreement/rentalAgreement_10_synth_2.txt
|
| 352 |
+
rentalAgreement/rentalAgreement_6_synth_1.txt
|
| 353 |
+
rentalAgreement/rentalAgreement_15_synth_3.txt
|
| 354 |
+
rentalAgreement/rentalAgreement_15_synth_2.txt
|
| 355 |
+
rentalAgreement/rentalAgreement_6_synth_2.txt
|
| 356 |
+
rentalAgreement/rentalAgreement_15_synth_1.txt
|
| 357 |
+
rentalAgreement/rentalAgreement_6_synth_3.txt
|
| 358 |
+
rentalAgreement/rentalAgreement_13_synth_4.txt
|
| 359 |
+
rentalAgreement/rentalAgreement_16_synth_1.txt
|
| 360 |
+
rentalAgreement/rentalAgreement_16_synth_2.txt
|
| 361 |
+
rentalAgreement/rentalAgreement_16_synth_3.txt
|
| 362 |
+
rentalAgreement/rentalAgreement_13_synth_2.txt
|
| 363 |
+
rentalAgreement/rentalAgreement_0_synth_1.txt
|
| 364 |
+
rentalAgreement/rentalAgreement_13_synth_3.txt
|
| 365 |
+
rentalAgreement/rentalAgreement_19.txt
|
| 366 |
+
rentalAgreement/rentalAgreement_13_synth_1.txt
|
| 367 |
+
rentalAgreement/rentalAgreement_0_synth_3.txt
|
| 368 |
+
rentalAgreement/rentalAgreement_0_synth_2.txt
|
| 369 |
+
rentalAgreement/rentalAgreement_17.txt
|
| 370 |
+
rentalAgreement/rentalAgreement_14_synth_1.txt
|
| 371 |
+
rentalAgreement/rentalAgreement_7_synth_3.txt
|
| 372 |
+
rentalAgreement/rentalAgreement_7_synth_2.txt
|
| 373 |
+
rentalAgreement/rentalAgreement_16.txt
|
| 374 |
+
rentalAgreement/rentalAgreement_14.txt
|
| 375 |
+
rentalAgreement/rentalAgreement_14_synth_2.txt
|
| 376 |
+
rentalAgreement/rentalAgreement_7_synth_1.txt
|
| 377 |
+
rentalAgreement/rentalAgreement_14_synth_3.txt
|
| 378 |
+
rentalAgreement/rentalAgreement_15.txt
|
| 379 |
+
rentalAgreement/rentalAgreement_11.txt
|
| 380 |
+
rentalAgreement/rentalAgreement_11_synth_2.txt
|
| 381 |
+
rentalAgreement/rentalAgreement_11_synth_3.txt
|
| 382 |
+
rentalAgreement/rentalAgreement_10.txt
|
| 383 |
+
rentalAgreement/rentalAgreement_11_synth_1.txt
|
| 384 |
+
rentalAgreement/rentalAgreement_13.txt
|
| 385 |
+
rentalAgreement/rentalAgreement_1_synth_2.txt
|
| 386 |
+
rentalAgreement/rentalAgreement_7.txt
|
| 387 |
+
rentalAgreement/rentalAgreement_6.txt
|
| 388 |
+
rentalAgreement/rentalAgreement_1_synth_3.txt
|
| 389 |
+
rentalAgreement/rentalAgreement_17_synth_4.txt
|
| 390 |
+
rentalAgreement/rentalAgreement_1_synth_1.txt
|
| 391 |
+
rentalAgreement/rentalAgreement_4.txt
|
| 392 |
+
rentalAgreement/loanAgreement_13.txt
|
| 393 |
+
rentalAgreement/rentalAgreement_17_synth_3.txt
|
| 394 |
+
rentalAgreement/rentalAgreement_1_synth_4.txt
|
| 395 |
+
rentalAgreement/rentalAgreement_1.txt
|
| 396 |
+
rentalAgreement/rentalAgreement_4_synth_1.txt
|
| 397 |
+
rentalAgreement/rentalAgreement_0.txt
|
| 398 |
+
rentalAgreement/rentalAgreement_17_synth_2.txt
|
| 399 |
+
rentalAgreement/rentalAgreement_4_synth_2.txt
|
| 400 |
+
rentalAgreement/rentalAgreement_4_synth_3.txt
|
| 401 |
+
rentalAgreement/rentalAgreement_17_synth_1.txt
|
| 402 |
+
technicalInspection/technicalInspection_12_synth_4.txt
|
| 403 |
+
technicalInspection/technicalInspection_1_synth_2.txt
|
| 404 |
+
technicalInspection/technicalInspection_17_synth_1.txt
|
| 405 |
+
technicalInspection/technicalInspection_1_synth_3.txt
|
| 406 |
+
technicalInspection/technicalInspection_4_synth_4.txt
|
| 407 |
+
technicalInspection/technicalInspection_1_synth_1.txt
|
| 408 |
+
technicalInspection/technicalInspection_17_synth_2.txt
|
| 409 |
+
technicalInspection/technicalInspection_17_synth_3.txt
|
| 410 |
+
technicalInspection/technicalInspection_17.txt
|
| 411 |
+
technicalInspection/technicalInspection_12_synth_2.txt
|
| 412 |
+
technicalInspection/technicalInspection_4_synth_1.txt
|
| 413 |
+
technicalInspection/technicalInspection_1_synth_4.txt
|
| 414 |
+
technicalInspection/technicalInspection_13.txt
|
| 415 |
+
technicalInspection/technicalInspection_12.txt
|
| 416 |
+
technicalInspection/technicalInspection_12_synth_3.txt
|
| 417 |
+
technicalInspection/technicalInspection_12_synth_1.txt
|
| 418 |
+
technicalInspection/technicalInspection_4_synth_2.txt
|
| 419 |
+
technicalInspection/technicalInspection_10.txt
|
| 420 |
+
technicalInspection/technicalInspection_17_synth_4.txt
|
| 421 |
+
technicalInspection/technicalInspection_11.txt
|
| 422 |
+
technicalInspection/technicalInspection_4_synth_3.txt
|
| 423 |
+
technicalInspection/technicalInspection_11_synth_1.txt
|
| 424 |
+
technicalInspection/technicalInspection_11_synth_3.txt
|
| 425 |
+
technicalInspection/technicalInspection_2_synth_4.txt
|
| 426 |
+
technicalInspection/technicalInspection_11_synth_2.txt
|
| 427 |
+
technicalInspection/technicalInspection_2_synth_1.txt
|
| 428 |
+
technicalInspection/technicalInspection_2_synth_3.txt
|
| 429 |
+
technicalInspection/technicalInspection_2_synth_2.txt
|
| 430 |
+
technicalInspection/technicalInspection_11_synth_4.txt
|
| 431 |
+
technicalInspection/technicalInspection_5_synth_3.txt
|
| 432 |
+
technicalInspection/technicalInspection_5_synth_2.txt
|
| 433 |
+
technicalInspection/technicalInspection_13_synth_1.txt
|
| 434 |
+
technicalInspection/technicalInspection_6.txt
|
| 435 |
+
technicalInspection/technicalInspection_4.txt
|
| 436 |
+
technicalInspection/technicalInspection_13_synth_3.txt
|
| 437 |
+
technicalInspection/technicalInspection_5_synth_1.txt
|
| 438 |
+
technicalInspection/technicalInspection_13_synth_2.txt
|
| 439 |
+
technicalInspection/technicalInspection_5.txt
|
| 440 |
+
technicalInspection/technicalInspection_0_synth_4.txt
|
| 441 |
+
technicalInspection/technicalInspection_1.txt
|
| 442 |
+
technicalInspection/technicalInspection_5_synth_4.txt
|
| 443 |
+
technicalInspection/technicalInspection_0.txt
|
| 444 |
+
technicalInspection/technicalInspection_0_synth_1.txt
|
| 445 |
+
technicalInspection/technicalInspection_0_synth_3.txt
|
| 446 |
+
technicalInspection/technicalInspection_2.txt
|
| 447 |
+
technicalInspection/technicalInspection_13_synth_4.txt
|
| 448 |
+
technicalInspection/technicalInspection_3.txt
|
| 449 |
+
technicalInspection/technicalInspection_0_synth_2.txt
|
| 450 |
+
technicalInspection/technicalInspection_3_synth_2.txt
|
| 451 |
+
technicalInspection/technicalInspection_10_synth_4.txt
|
| 452 |
+
technicalInspection/technicalInspection_3_synth_3.txt
|
| 453 |
+
technicalInspection/technicalInspection_3_synth_1.txt
|
| 454 |
+
technicalInspection/technicalInspection_6_synth_4.txt
|
| 455 |
+
technicalInspection/technicalInspection_3_synth_4.txt
|
| 456 |
+
technicalInspection/technicalInspection_10_synth_2.txt
|
| 457 |
+
technicalInspection/technicalInspection_6_synth_1.txt
|
| 458 |
+
technicalInspection/technicalInspection_10_synth_3.txt
|
| 459 |
+
technicalInspection/technicalInspection_10_synth_1.txt
|
| 460 |
+
technicalInspection/technicalInspection_6_synth_2.txt
|
| 461 |
+
technicalInspection/technicalInspection_6_synth_3.txt
|
| 462 |
+
utilityBill/utilityBill_17_synth_4.txt
|
| 463 |
+
utilityBill/utilityBill_12_synth_1.txt
|
| 464 |
+
utilityBill/utilityBill_17_synth_5.txt
|
| 465 |
+
utilityBill/utilityBill_17_synth_7.txt
|
| 466 |
+
utilityBill/utilityBill_12_synth_2.txt
|
| 467 |
+
utilityBill/utilityBill_12_synth_3.txt
|
| 468 |
+
utilityBill/utilityBill_17_synth_6.txt
|
| 469 |
+
utilityBill/utilityBill_17_synth_2.txt
|
| 470 |
+
utilityBill/utilityBill_12_synth_7.txt
|
| 471 |
+
utilityBill/utilityBill_12_synth_6.txt
|
| 472 |
+
utilityBill/utilityBill_17_synth_3.txt
|
| 473 |
+
utilityBill/utilityBill_17_synth_1.txt
|
| 474 |
+
utilityBill/utilityBill_12_synth_4.txt
|
| 475 |
+
utilityBill/utilityBill_12_synth_5.txt
|
| 476 |
+
utilityBill/utilityBill_11_synth_5.txt
|
| 477 |
+
utilityBill/utilityBill_11_synth_4.txt
|
| 478 |
+
utilityBill/utilityBill_14_synth_1.txt
|
| 479 |
+
utilityBill/utilityBill_14_synth_3.txt
|
| 480 |
+
utilityBill/utilityBill_19.txt
|
| 481 |
+
utilityBill/utilityBill_11_synth_6.txt
|
| 482 |
+
utilityBill/utilityBill_11_synth_7.txt
|
| 483 |
+
utilityBill/utilityBill_14_synth_2.txt
|
| 484 |
+
utilityBill/utilityBill_14_synth_6.txt
|
| 485 |
+
utilityBill/utilityBill_11_synth_3.txt
|
| 486 |
+
utilityBill/utilityBill_11_synth_2.txt
|
| 487 |
+
utilityBill/utilityBill_14_synth_5.txt
|
| 488 |
+
utilityBill/utilityBill_11_synth_1.txt
|
| 489 |
+
utilityBill/utilityBill_14_synth_4.txt
|
| 490 |
+
utilityBill/utilityBill_13_synth_5.txt
|
| 491 |
+
utilityBill/utilityBill_13.txt
|
| 492 |
+
utilityBill/utilityBill_12.txt
|
| 493 |
+
utilityBill/utilityBill_9.txt
|
| 494 |
+
utilityBill/utilityBill_13_synth_4.txt
|
| 495 |
+
utilityBill/utilityBill_13_synth_6.txt
|
| 496 |
+
utilityBill/utilityBill_11.txt
|
| 497 |
+
utilityBill/utilityBill_13_synth_7.txt
|
| 498 |
+
utilityBill/utilityBill_13_synth_3.txt
|
| 499 |
+
utilityBill/utilityBill_15.txt
|
| 500 |
+
utilityBill/utilityBill_14.txt
|
| 501 |
+
utilityBill/utilityBill_13_synth_2.txt
|
| 502 |
+
utilityBill/utilityBill_17.txt
|
| 503 |
+
utilityBill/utilityBill_13_synth_1.txt
|
| 504 |
+
utilityBill/utilityBill_19_synth_2.txt
|
| 505 |
+
utilityBill/utilityBill_9_synth_1.txt
|
| 506 |
+
utilityBill/utilityBill_15_synth_4.txt
|
| 507 |
+
utilityBill/utilityBill_15_synth_5.txt
|
| 508 |
+
utilityBill/utilityBill_19_synth_3.txt
|
| 509 |
+
utilityBill/utilityBill_19_synth_1.txt
|
| 510 |
+
utilityBill/utilityBill_9_synth_2.txt
|
| 511 |
+
utilityBill/utilityBill_15_synth_6.txt
|
| 512 |
+
utilityBill/utilityBill_9_synth_3.txt
|
| 513 |
+
utilityBill/utilityBill_19_synth_4.txt
|
| 514 |
+
utilityBill/utilityBill_15_synth_2.txt
|
| 515 |
+
utilityBill/utilityBill_15_synth_3.txt
|
| 516 |
+
utilityBill/utilityBill_9_synth_6.txt
|
| 517 |
+
utilityBill/utilityBill_19_synth_5.txt
|
| 518 |
+
utilityBill/utilityBill_9_synth_4.txt
|
| 519 |
+
utilityBill/utilityBill_15_synth_1.txt
|
| 520 |
+
utilityBill/utilityBill_9_synth_5.txt
|
| 521 |
+
utilityBill/utilityBill_19_synth_6.txt
|
| 522 |
+
other/other_13_synth_1.txt
|
| 523 |
+
other/other_2_synth_1.txt
|
| 524 |
+
other/authorization_9_synth_1.txt
|
| 525 |
+
other/authorization_12_synth_1.txt
|
| 526 |
+
other/authorization_17_synth_1.txt
|
| 527 |
+
other/other_7_synth_1.txt
|
| 528 |
+
other/other_16_synth_1.txt
|
| 529 |
+
other/other_4_synth_1.txt
|
| 530 |
+
other/other_4.txt
|
| 531 |
+
other/other_5.txt
|
| 532 |
+
other/other_18.txt
|
| 533 |
+
other/other_7.txt
|
| 534 |
+
other/authorization_6_synth_1.txt
|
| 535 |
+
other/authorization_14_synth_1.txt
|
| 536 |
+
other/other_19.txt
|
| 537 |
+
other/authorization_3_synth_1.txt
|
| 538 |
+
other/other_2.txt
|
| 539 |
+
other/other_19_synth_1.txt
|
| 540 |
+
other/other_3.txt
|
| 541 |
+
other/authorization_11_synth_1.txt
|
| 542 |
+
other/authorization_18.txt
|
| 543 |
+
other/other_10_synth_1.txt
|
| 544 |
+
other/authorization_8.txt
|
| 545 |
+
other/authorization_9.txt
|
| 546 |
+
other/authorization_19.txt
|
| 547 |
+
other/authorization_18_synth_1.txt
|
| 548 |
+
other/authorization_14.txt
|
| 549 |
+
other/other_12.txt
|
| 550 |
+
other/authorization_4.txt
|
| 551 |
+
other/other_13.txt
|
| 552 |
+
other/authorization_15.txt
|
| 553 |
+
other/authorization_4_synth_1.txt
|
| 554 |
+
other/authorization_17.txt
|
| 555 |
+
other/other_11.txt
|
| 556 |
+
other/authorization_7.txt
|
| 557 |
+
other/authorization_6.txt
|
| 558 |
+
other/other_10.txt
|
| 559 |
+
other/authorization_12.txt
|
| 560 |
+
other/other_14.txt
|
| 561 |
+
other/authorization_2.txt
|
| 562 |
+
other/authorization_3.txt
|
| 563 |
+
other/authorization_13_synth_1.txt
|
| 564 |
+
other/authorization_13.txt
|
| 565 |
+
other/other_3_synth_1.txt
|
| 566 |
+
other/other_12_synth_1.txt
|
| 567 |
+
other/authorization_11.txt
|
| 568 |
+
other/authorization_8_synth_1.txt
|
| 569 |
+
other/other_9.txt
|
| 570 |
+
other/other_16.txt
|
| 571 |
+
other/authorization_10.txt
|
| 572 |
+
other/authorization_19_synth_1.txt
|
| 573 |
+
other/other_11_synth_1.txt
|
| 574 |
+
other/authorization_10_synth_1.txt
|
| 575 |
+
other/authorization_2_synth_1.txt
|
| 576 |
+
other/other_18_synth_1.txt
|
| 577 |
+
other/other_9_synth_1.txt
|
| 578 |
+
other/authorization_15_synth_1.txt
|
| 579 |
+
other/authorization_7_synth_1.txt
|
| 580 |
+
other/other_14_synth_1.txt
|
| 581 |
+
other/other_5_synth_1.txt
|
| 582 |
+
vehicleDocument/registrationCertificate_15_synth_1.txt
|
| 583 |
+
vehicleDocument/registrationCertificate_9_synth_1.txt
|
| 584 |
+
vehicleDocument/vehicleHistory_13_synth_1.txt
|
| 585 |
+
vehicleDocument/vehicleHistory_9.txt
|
| 586 |
+
vehicleDocument/registrationCertificate_0_synth_1.txt
|
| 587 |
+
vehicleDocument/vehicleHistory_5_synth_1.txt
|
| 588 |
+
vehicleDocument/vehicleHistory_0_synth_1.txt
|
| 589 |
+
vehicleDocument/registrationCertificate_5_synth_1.txt
|
| 590 |
+
vehicleDocument/vehicleHistory_9_synth_1.txt
|
| 591 |
+
vehicleDocument/registrationCertificate_8.txt
|
| 592 |
+
vehicleDocument/registrationCertificate_10_synth_1.txt
|
| 593 |
+
vehicleDocument/vehicleHistory_16_synth_1.txt
|
| 594 |
+
vehicleDocument/registrationCertificate_9.txt
|
| 595 |
+
vehicleDocument/registrationCertificate_17.txt
|
| 596 |
+
vehicleDocument/vehicleHistory_16.txt
|
| 597 |
+
vehicleDocument/registrationCertificate_13_synth_1.txt
|
| 598 |
+
vehicleDocument/vehicleHistory_17.txt
|
| 599 |
+
vehicleDocument/registrationCertificate_14.txt
|
| 600 |
+
vehicleDocument/vehicleHistory_14.txt
|
| 601 |
+
vehicleDocument/vehicleHistory_3_synth_1.txt
|
| 602 |
+
vehicleDocument/registrationCertificate_15.txt
|
| 603 |
+
vehicleDocument/registrationCertificate_6_synth_1.txt
|
| 604 |
+
vehicleDocument/vehicleHistory_10.txt
|
| 605 |
+
vehicleDocument/vehicleHistory_11.txt
|
| 606 |
+
vehicleDocument/registrationCertificate_3_synth_1.txt
|
| 607 |
+
vehicleDocument/vehicleHistory_6_synth_1.txt
|
| 608 |
+
vehicleDocument/registrationCertificate_10.txt
|
| 609 |
+
vehicleDocument/vehicleHistory_10_synth_1.txt
|
| 610 |
+
vehicleDocument/registrationCertificate_12.txt
|
| 611 |
+
vehicleDocument/vehicleHistory_13.txt
|
| 612 |
+
vehicleDocument/vehicleHistory_12.txt
|
| 613 |
+
vehicleDocument/registrationCertificate_13.txt
|
| 614 |
+
vehicleDocument/vehicleHistory_17_synth_1.txt
|
| 615 |
+
vehicleDocument/registrationCertificate_4_synth_1.txt
|
| 616 |
+
vehicleDocument/vehicleHistory_18.txt
|
| 617 |
+
vehicleDocument/vehicleHistory_4_synth_1.txt
|
| 618 |
+
vehicleDocument/registrationCertificate_1_synth_1.txt
|
| 619 |
+
vehicleDocument/vehicleHistory_12_synth_1.txt
|
| 620 |
+
vehicleDocument/registrationCertificate_14_synth_1.txt
|
| 621 |
+
vehicleDocument/registrationCertificate_8_synth_1.txt
|
| 622 |
+
vehicleDocument/vehicleHistory_3.txt
|
| 623 |
+
vehicleDocument/registrationCertificate_4.txt
|
| 624 |
+
vehicleDocument/registrationCertificate_17_synth_1.txt
|
| 625 |
+
vehicleDocument/vehicleHistory_11_synth_1.txt
|
| 626 |
+
vehicleDocument/registrationCertificate_5.txt
|
| 627 |
+
vehicleDocument/vehicleHistory_2.txt
|
| 628 |
+
vehicleDocument/vehicleHistory_0.txt
|
| 629 |
+
vehicleDocument/registrationCertificate_2_synth_1.txt
|
| 630 |
+
vehicleDocument/registrationCertificate_7.txt
|
| 631 |
+
vehicleDocument/vehicleHistory_18_synth_1.txt
|
| 632 |
+
vehicleDocument/registrationCertificate_6.txt
|
| 633 |
+
vehicleDocument/vehicleHistory_1.txt
|
| 634 |
+
vehicleDocument/vehicleHistory_5.txt
|
| 635 |
+
vehicleDocument/registrationCertificate_2.txt
|
| 636 |
+
vehicleDocument/registrationCertificate_7_synth_1.txt
|
| 637 |
+
vehicleDocument/vehicleHistory_2_synth_1.txt
|
| 638 |
+
vehicleDocument/registrationCertificate_3.txt
|
| 639 |
+
vehicleDocument/vehicleHistory_4.txt
|
| 640 |
+
vehicleDocument/vehicleHistory_6.txt
|
| 641 |
+
vehicleDocument/registrationCertificate_12_synth_1.txt
|
| 642 |
+
vehicleDocument/registrationCertificate_1.txt
|
| 643 |
+
vehicleDocument/registrationCertificate_0.txt
|
| 644 |
+
vehicleDocument/vehicleHistory_14_synth_1.txt
|
| 645 |
+
prescription/prescription_5_synth_3.txt
|
| 646 |
+
prescription/prescription_11_synth_4.txt
|
| 647 |
+
prescription/prescription_14_synth_1.txt
|
| 648 |
+
prescription/prescription_9_synth_4.txt
|
| 649 |
+
prescription/prescription_5_synth_2.txt
|
| 650 |
+
prescription/prescription_18_synth_4.txt
|
| 651 |
+
prescription/prescription_9.txt
|
| 652 |
+
prescription/prescription_14_synth_2.txt
|
| 653 |
+
prescription/prescription_0_synth_4.txt
|
| 654 |
+
prescription/prescription_14_synth_3.txt
|
| 655 |
+
prescription/prescription_5_synth_1.txt
|
| 656 |
+
prescription/prescription_11_synth_2.txt
|
| 657 |
+
prescription/prescription_18_synth_1.txt
|
| 658 |
+
prescription/prescription_9_synth_3.txt
|
| 659 |
+
prescription/prescription_0_synth_1.txt
|
| 660 |
+
prescription/prescription_9_synth_2.txt
|
| 661 |
+
prescription/prescription_11_synth_3.txt
|
| 662 |
+
prescription/prescription_5_synth_4.txt
|
| 663 |
+
prescription/prescription_11_synth_1.txt
|
| 664 |
+
prescription/prescription_18_synth_2.txt
|
| 665 |
+
prescription/prescription_18.txt
|
| 666 |
+
prescription/prescription_14_synth_4.txt
|
| 667 |
+
prescription/prescription_0_synth_3.txt
|
| 668 |
+
prescription/prescription_0_synth_2.txt
|
| 669 |
+
prescription/prescription_9_synth_1.txt
|
| 670 |
+
prescription/prescription_18_synth_3.txt
|
| 671 |
+
prescription/prescription_3_synth_2.txt
|
| 672 |
+
prescription/prescription_3_synth_3.txt
|
| 673 |
+
prescription/prescription_6_synth_4.txt
|
| 674 |
+
prescription/prescription_3_synth_1.txt
|
| 675 |
+
prescription/prescription_6_synth_1.txt
|
| 676 |
+
prescription/prescription_3_synth_4.txt
|
| 677 |
+
prescription/prescription_6_synth_2.txt
|
| 678 |
+
prescription/prescription_6_synth_3.txt
|
| 679 |
+
prescription/prescription_4_synth_4.txt
|
| 680 |
+
prescription/prescription_4_synth_1.txt
|
| 681 |
+
prescription/prescription_4_synth_2.txt
|
| 682 |
+
prescription/prescription_4_synth_3.txt
|
| 683 |
+
prescription/prescription_16_synth_1.txt
|
| 684 |
+
prescription/prescription_3.txt
|
| 685 |
+
prescription/prescription_14.txt
|
| 686 |
+
prescription/prescription_7_synth_3.txt
|
| 687 |
+
prescription/prescription_7_synth_2.txt
|
| 688 |
+
prescription/prescription_2.txt
|
| 689 |
+
prescription/prescription_16_synth_2.txt
|
| 690 |
+
prescription/prescription_0.txt
|
| 691 |
+
prescription/prescription_7_synth_1.txt
|
| 692 |
+
prescription/prescription_16.txt
|
| 693 |
+
prescription/prescription_2_synth_4.txt
|
| 694 |
+
prescription/prescription_16_synth_3.txt
|
| 695 |
+
prescription/prescription_5.txt
|
| 696 |
+
prescription/prescription_7_synth_4.txt
|
| 697 |
+
prescription/prescription_4.txt
|
| 698 |
+
prescription/prescription_2_synth_1.txt
|
| 699 |
+
prescription/prescription_16_synth_4.txt
|
| 700 |
+
prescription/prescription_2_synth_3.txt
|
| 701 |
+
prescription/prescription_6.txt
|
| 702 |
+
prescription/prescription_11.txt
|
| 703 |
+
prescription/prescription_7.txt
|
| 704 |
+
prescription/prescription_2_synth_2.txt
|
| 705 |
+
sanitaryBooklet/sanitaryBooklet_16_synth_4.txt
|
| 706 |
+
sanitaryBooklet/sanitaryBooklet_16_synth_5.txt
|
| 707 |
+
sanitaryBooklet/sanitaryBooklet_16_synth_7.txt
|
| 708 |
+
sanitaryBooklet/sanitaryBooklet_18_synth_8.txt
|
| 709 |
+
sanitaryBooklet/sanitaryBooklet_18_synth_9.txt
|
| 710 |
+
sanitaryBooklet/sanitaryBooklet_16_synth_6.txt
|
| 711 |
+
sanitaryBooklet/sanitaryBooklet_16.txt
|
| 712 |
+
sanitaryBooklet/sanitaryBooklet_16_synth_2.txt
|
| 713 |
+
sanitaryBooklet/sanitaryBooklet_12.txt
|
| 714 |
+
sanitaryBooklet/sanitaryBooklet_16_synth_3.txt
|
| 715 |
+
sanitaryBooklet/sanitaryBooklet_16_synth_1.txt
|
| 716 |
+
sanitaryBooklet/sanitaryBooklet_10.txt
|
| 717 |
+
sanitaryBooklet/sanitaryBooklet_10_synth_5.txt
|
| 718 |
+
sanitaryBooklet/sanitaryBooklet_16_synth_11.txt
|
| 719 |
+
sanitaryBooklet/sanitaryBooklet_16_synth_10.txt
|
| 720 |
+
sanitaryBooklet/sanitaryBooklet_10_synth_4.txt
|
| 721 |
+
sanitaryBooklet/sanitaryBooklet_10_synth_6.txt
|
| 722 |
+
sanitaryBooklet/sanitaryBooklet_7_synth_8.txt
|
| 723 |
+
sanitaryBooklet/sanitaryBooklet_10_synth_7.txt
|
| 724 |
+
sanitaryBooklet/sanitaryBooklet_7_synth_9.txt
|
| 725 |
+
sanitaryBooklet/sanitaryBooklet_10_synth_10.txt
|
| 726 |
+
sanitaryBooklet/sanitaryBooklet_10_synth_3.txt
|
| 727 |
+
sanitaryBooklet/sanitaryBooklet_10_synth_2.txt
|
| 728 |
+
sanitaryBooklet/sanitaryBooklet_10_synth_11.txt
|
| 729 |
+
sanitaryBooklet/sanitaryBooklet_12_synth_9.txt
|
| 730 |
+
sanitaryBooklet/sanitaryBooklet_10_synth_1.txt
|
| 731 |
+
sanitaryBooklet/sanitaryBooklet_12_synth_8.txt
|
| 732 |
+
sanitaryBooklet/sanitaryBooklet_7_synth_10.txt
|
| 733 |
+
sanitaryBooklet/sanitaryBooklet_12_synth_5.txt
|
| 734 |
+
sanitaryBooklet/sanitaryBooklet_7_synth_2.txt
|
| 735 |
+
sanitaryBooklet/sanitaryBooklet_7.txt
|
| 736 |
+
sanitaryBooklet/sanitaryBooklet_12_synth_10.txt
|
| 737 |
+
sanitaryBooklet/sanitaryBooklet_12_synth_11.txt
|
| 738 |
+
sanitaryBooklet/sanitaryBooklet_7_synth_3.txt
|
| 739 |
+
sanitaryBooklet/sanitaryBooklet_12_synth_4.txt
|
| 740 |
+
sanitaryBooklet/sanitaryBooklet_7_synth_11.txt
|
| 741 |
+
sanitaryBooklet/sanitaryBooklet_12_synth_6.txt
|
| 742 |
+
sanitaryBooklet/sanitaryBooklet_7_synth_1.txt
|
| 743 |
+
sanitaryBooklet/sanitaryBooklet_12_synth_7.txt
|
| 744 |
+
sanitaryBooklet/sanitaryBooklet_12_synth_3.txt
|
| 745 |
+
sanitaryBooklet/sanitaryBooklet_7_synth_4.txt
|
| 746 |
+
sanitaryBooklet/sanitaryBooklet_7_synth_5.txt
|
| 747 |
+
sanitaryBooklet/sanitaryBooklet_12_synth_2.txt
|
| 748 |
+
sanitaryBooklet/sanitaryBooklet_7_synth_7.txt
|
| 749 |
+
sanitaryBooklet/sanitaryBooklet_10_synth_9.txt
|
| 750 |
+
sanitaryBooklet/sanitaryBooklet_7_synth_6.txt
|
| 751 |
+
sanitaryBooklet/sanitaryBooklet_10_synth_8.txt
|
| 752 |
+
sanitaryBooklet/sanitaryBooklet_12_synth_1.txt
|
| 753 |
+
sanitaryBooklet/sanitaryBooklet_18_synth_2.txt
|
| 754 |
+
sanitaryBooklet/sanitaryBooklet_18_synth_3.txt
|
| 755 |
+
sanitaryBooklet/sanitaryBooklet_18_synth_1.txt
|
| 756 |
+
sanitaryBooklet/sanitaryBooklet_18_synth_4.txt
|
| 757 |
+
sanitaryBooklet/sanitaryBooklet_18_synth_5.txt
|
| 758 |
+
sanitaryBooklet/sanitaryBooklet_18.txt
|
| 759 |
+
sanitaryBooklet/sanitaryBooklet_16_synth_8.txt
|
| 760 |
+
sanitaryBooklet/sanitaryBooklet_18_synth_7.txt
|
| 761 |
+
sanitaryBooklet/sanitaryBooklet_18_synth_11.txt
|
| 762 |
+
sanitaryBooklet/sanitaryBooklet_18_synth_10.txt
|
| 763 |
+
sanitaryBooklet/sanitaryBooklet_18_synth_6.txt
|
| 764 |
+
sanitaryBooklet/sanitaryBooklet_16_synth_9.txt
|
| 765 |
+
deathCertificate/deathCertificate_2.txt
|
| 766 |
+
deathCertificate/deathCertificate_8_synth_3.txt
|
| 767 |
+
deathCertificate/deathCertificate_8_synth_2.txt
|
| 768 |
+
deathCertificate/birthCertificate_15.txt
|
| 769 |
+
deathCertificate/deathCertificate_1_synth_1.txt
|
| 770 |
+
deathCertificate/deathCertificate_4_synth_4.txt
|
| 771 |
+
deathCertificate/deathCertificate_3.txt
|
| 772 |
+
deathCertificate/deathCertificate_1.txt
|
| 773 |
+
deathCertificate/deathCertificate_1_synth_3.txt
|
| 774 |
+
deathCertificate/deathCertificate_8_synth_1.txt
|
| 775 |
+
deathCertificate/deathCertificate_1_synth_2.txt
|
| 776 |
+
deathCertificate/deathCertificate_4.txt
|
| 777 |
+
deathCertificate/deathCertificate_4_synth_3.txt
|
| 778 |
+
deathCertificate/deathCertificate_4_synth_2.txt
|
| 779 |
+
deathCertificate/deathCertificate_7.txt
|
| 780 |
+
deathCertificate/deathCertificate_1_synth_4.txt
|
| 781 |
+
deathCertificate/deathCertificate_4_synth_1.txt
|
| 782 |
+
deathCertificate/deathCertificate_6.txt
|
| 783 |
+
deathCertificate/deathCertificate_7_synth_1.txt
|
| 784 |
+
deathCertificate/deathCertificate_2_synth_4.txt
|
| 785 |
+
deathCertificate/deathCertificate_7_synth_2.txt
|
| 786 |
+
deathCertificate/deathCertificate_7_synth_3.txt
|
| 787 |
+
deathCertificate/birthCertificate_15_synth_3.txt
|
| 788 |
+
deathCertificate/deathCertificate_2_synth_2.txt
|
| 789 |
+
deathCertificate/deathCertificate_2_synth_3.txt
|
| 790 |
+
deathCertificate/birthCertificate_15_synth_2.txt
|
| 791 |
+
deathCertificate/deathCertificate_7_synth_4.txt
|
| 792 |
+
deathCertificate/deathCertificate_2_synth_1.txt
|
| 793 |
+
deathCertificate/birthCertificate_15_synth_1.txt
|
| 794 |
+
deathCertificate/deathCertificate_19.txt
|
| 795 |
+
deathCertificate/deathCertificate_10_synth_4.txt
|
| 796 |
+
deathCertificate/deathCertificate_15_synth_1.txt
|
| 797 |
+
deathCertificate/deathCertificate_15.txt
|
| 798 |
+
deathCertificate/deathCertificate_19_synth_4.txt
|
| 799 |
+
deathCertificate/deathCertificate_15_synth_2.txt
|
| 800 |
+
deathCertificate/deathCertificate_15_synth_3.txt
|
| 801 |
+
deathCertificate/deathCertificate_16.txt
|
| 802 |
+
deathCertificate/deathCertificate_10_synth_2.txt
|
| 803 |
+
deathCertificate/deathCertificate_19_synth_1.txt
|
| 804 |
+
deathCertificate/deathCertificate_9_synth_1.txt
|
| 805 |
+
deathCertificate/deathCertificate_10_synth_3.txt
|
| 806 |
+
deathCertificate/deathCertificate_10_synth_1.txt
|
| 807 |
+
deathCertificate/deathCertificate_19_synth_2.txt
|
| 808 |
+
deathCertificate/deathCertificate_9_synth_2.txt
|
| 809 |
+
deathCertificate/deathCertificate_9_synth_3.txt
|
| 810 |
+
deathCertificate/deathCertificate_10.txt
|
| 811 |
+
deathCertificate/deathCertificate_19_synth_3.txt
|
| 812 |
+
deathCertificate/deathCertificate_6_synth_4.txt
|
| 813 |
+
deathCertificate/deathCertificate_3_synth_1.txt
|
| 814 |
+
deathCertificate/deathCertificate_8.txt
|
| 815 |
+
deathCertificate/deathCertificate_3_synth_3.txt
|
| 816 |
+
deathCertificate/deathCertificate_3_synth_2.txt
|
| 817 |
+
deathCertificate/deathCertificate_9.txt
|
| 818 |
+
deathCertificate/deathCertificate_6_synth_3.txt
|
| 819 |
+
deathCertificate/deathCertificate_16_synth_3.txt
|
| 820 |
+
deathCertificate/deathCertificate_16_synth_2.txt
|
| 821 |
+
deathCertificate/deathCertificate_6_synth_2.txt
|
| 822 |
+
deathCertificate/deathCertificate_16_synth_1.txt
|
| 823 |
+
deathCertificate/deathCertificate_6_synth_1.txt
|
| 824 |
+
deathCertificate/deathCertificate_3_synth_4.txt
|
| 825 |
+
medicalDocument/sickLeave_14.txt
|
| 826 |
+
medicalDocument/sickLeave_15.txt
|
| 827 |
+
medicalDocument/medicalHistory_4.txt
|
| 828 |
+
medicalDocument/medicalHistory_9_synth_1.txt
|
| 829 |
+
medicalDocument/medicalResults_14.txt
|
| 830 |
+
medicalDocument/medicalHistory_0_synth_2.txt
|
| 831 |
+
medicalDocument/sickLeave_6_synth_1.txt
|
| 832 |
+
medicalDocument/medicalHistory_6.txt
|
| 833 |
+
medicalDocument/medicalHistory_7.txt
|
| 834 |
+
medicalDocument/medicalHistory_0_synth_1.txt
|
| 835 |
+
medicalDocument/medicalHistory_3.txt
|
| 836 |
+
medicalDocument/medicalHistory_14_synth_2.txt
|
| 837 |
+
medicalDocument/medicalHistory_0.txt
|
| 838 |
+
medicalDocument/medicalHistory_14_synth_1.txt
|
| 839 |
+
medicalDocument/sickLeave_10.txt
|
| 840 |
+
medicalDocument/medicalResults_5_synth_1.txt
|
| 841 |
+
medicalDocument/medicalHistory_1.txt
|
| 842 |
+
medicalDocument/medicalResults_7.txt
|
| 843 |
+
medicalDocument/medicalResults_6_synth_1.txt
|
| 844 |
+
medicalDocument/sickLeave_0_synth_2.txt
|
| 845 |
+
medicalDocument/sickLeave_15_synth_2.txt
|
| 846 |
+
medicalDocument/medicalResults_6.txt
|
| 847 |
+
medicalDocument/medicalResults_4.txt
|
| 848 |
+
medicalDocument/medicalResults_6_synth_2.txt
|
| 849 |
+
medicalDocument/medicalHistory_6_synth_1.txt
|
| 850 |
+
medicalDocument/sickLeave_0_synth_1.txt
|
| 851 |
+
medicalDocument/sickLeave_15_synth_1.txt
|
| 852 |
+
medicalDocument/medicalResults_5.txt
|
| 853 |
+
medicalDocument/medicalHistory_3_synth_1.txt
|
| 854 |
+
medicalDocument/sickLeave_10_synth_1.txt
|
| 855 |
+
medicalDocument/sickLeave_5_synth_1.txt
|
| 856 |
+
medicalDocument/medicalResults_2.txt
|
| 857 |
+
medicalDocument/medicalResults_4_synth_1.txt
|
| 858 |
+
medicalDocument/medicalHistory_4_synth_2.txt
|
| 859 |
+
medicalDocument/medicalHistory_15_synth_1.txt
|
| 860 |
+
medicalDocument/medicalHistory_4_synth_1.txt
|
| 861 |
+
medicalDocument/sickLeave_2_synth_1.txt
|
| 862 |
+
medicalDocument/medicalResults_8.txt
|
| 863 |
+
medicalDocument/medicalHistory_1_synth_1.txt
|
| 864 |
+
medicalDocument/medicalResults_8_synth_1.txt
|
| 865 |
+
medicalDocument/medicalHistory_8_synth_1.txt
|
| 866 |
+
medicalDocument/medicalHistory_10_synth_1.txt
|
| 867 |
+
medicalDocument/sickLeave_1.txt
|
| 868 |
+
medicalDocument/medicalHistory_16.txt
|
| 869 |
+
medicalDocument/medicalResults_2_synth_1.txt
|
| 870 |
+
medicalDocument/sickLeave_0.txt
|
| 871 |
+
medicalDocument/sickLeave_2.txt
|
| 872 |
+
medicalDocument/medicalHistory_15.txt
|
| 873 |
+
medicalDocument/medicalHistory_14.txt
|
| 874 |
+
medicalDocument/sickLeave_14_synth_1.txt
|
| 875 |
+
medicalDocument/sickLeave_1_synth_1.txt
|
| 876 |
+
medicalDocument/medicalHistory_10.txt
|
| 877 |
+
medicalDocument/medicalHistory_7_synth_1.txt
|
| 878 |
+
medicalDocument/sickLeave_6.txt
|
| 879 |
+
medicalDocument/medicalHistory_16_synth_1.txt
|
| 880 |
+
medicalDocument/medicalHistory_9.txt
|
| 881 |
+
medicalDocument/medicalResults_14_synth_1.txt
|
| 882 |
+
medicalDocument/medicalHistory_8.txt
|
| 883 |
+
medicalDocument/medicalResults_7_synth_1.txt
|
| 884 |
+
medicalDocument/sickLeave_5.txt
|
| 885 |
+
passport/passport_9.txt
|
| 886 |
+
passport/passport_5_synth_3.txt
|
| 887 |
+
passport/passport_9_synth_5.txt
|
| 888 |
+
passport/passport_9_synth_4.txt
|
| 889 |
+
passport/passport_5_synth_2.txt
|
| 890 |
+
passport/passport_8.txt
|
| 891 |
+
passport/passport_10_synth_4.txt
|
| 892 |
+
passport/passport_0_synth_5.txt
|
| 893 |
+
passport/passport_0_synth_4.txt
|
| 894 |
+
passport/passport_5_synth_1.txt
|
| 895 |
+
passport/passport_10_synth_5.txt
|
| 896 |
+
passport/passport_10_synth_1.txt
|
| 897 |
+
passport/passport_5_synth_5.txt
|
| 898 |
+
passport/passport_9_synth_3.txt
|
| 899 |
+
passport/passport_9_synth_2.txt
|
| 900 |
+
passport/passport_0_synth_1.txt
|
| 901 |
+
passport/passport_5_synth_4.txt
|
| 902 |
+
passport/passport_10_synth_2.txt
|
| 903 |
+
passport/passport_0_synth_3.txt
|
| 904 |
+
passport/passport_9_synth_1.txt
|
| 905 |
+
passport/passport_0_synth_2.txt
|
| 906 |
+
passport/passport_10_synth_3.txt
|
| 907 |
+
passport/passport_3_synth_2.txt
|
| 908 |
+
passport/passport_3_synth_3.txt
|
| 909 |
+
passport/passport_3_synth_1.txt
|
| 910 |
+
passport/passport_12.txt
|
| 911 |
+
passport/passport_3_synth_4.txt
|
| 912 |
+
passport/passport_3_synth_5.txt
|
| 913 |
+
passport/passport_11.txt
|
| 914 |
+
passport/passport_10.txt
|
| 915 |
+
passport/passport_1_synth_2.txt
|
| 916 |
+
passport/passport_8_synth_1.txt
|
| 917 |
+
passport/passport_11_synth_3.txt
|
| 918 |
+
passport/passport_11_synth_2.txt
|
| 919 |
+
passport/passport_1_synth_1.txt
|
| 920 |
+
passport/passport_8_synth_2.txt
|
| 921 |
+
passport/passport_11_synth_1.txt
|
| 922 |
+
passport/passport_8_synth_3.txt
|
| 923 |
+
passport/passport_1_synth_4.txt
|
| 924 |
+
passport/passport_11_synth_5.txt
|
| 925 |
+
passport/passport_11_synth_4.txt
|
| 926 |
+
passport/passport_1_synth_5.txt
|
| 927 |
+
passport/passport_8_synth_4.txt
|
| 928 |
+
passport/passport_8_synth_5.txt
|
| 929 |
+
passport/passport_0.txt
|
| 930 |
+
passport/passport_1.txt
|
| 931 |
+
passport/passport_3.txt
|
| 932 |
+
passport/passport_2_synth_5.txt
|
| 933 |
+
passport/passport_12_synth_4.txt
|
| 934 |
+
passport/passport_12_synth_5.txt
|
| 935 |
+
passport/passport_2_synth_4.txt
|
| 936 |
+
passport/passport_2.txt
|
| 937 |
+
passport/passport_12_synth_1.txt
|
| 938 |
+
passport/passport_2_synth_1.txt
|
| 939 |
+
passport/passport_5.txt
|
| 940 |
+
passport/passport_2_synth_3.txt
|
| 941 |
+
passport/passport_12_synth_2.txt
|
| 942 |
+
passport/passport_12_synth_3.txt
|
| 943 |
+
passport/passport_2_synth_2.txt
|
| 944 |
+
officialCertificate/peselConfirmation_11_synth_3.txt
|
| 945 |
+
officialCertificate/peselConfirmation_3_synth_2.txt
|
| 946 |
+
officialCertificate/certificate_12_synth_1.txt
|
| 947 |
+
officialCertificate/peselConfirmation_11_synth_2.txt
|
| 948 |
+
officialCertificate/peselConfirmation_3_synth_1.txt
|
| 949 |
+
officialCertificate/certificate_12_synth_3.txt
|
| 950 |
+
officialCertificate/certificate_12_synth_2.txt
|
| 951 |
+
officialCertificate/peselConfirmation_11_synth_1.txt
|
| 952 |
+
officialCertificate/peselConfirmation_6_synth_1.txt
|
| 953 |
+
officialCertificate/peselConfirmation_14_synth_1.txt
|
| 954 |
+
officialCertificate/authorization_5_synth_1.txt
|
| 955 |
+
officialCertificate/peselConfirmation_6_synth_2.txt
|
| 956 |
+
officialCertificate/authorization_5_synth_3.txt
|
| 957 |
+
officialCertificate/peselConfirmation_14_synth_2.txt
|
| 958 |
+
officialCertificate/authorization_5_synth_2.txt
|
| 959 |
+
officialCertificate/peselConfirmation_17_synth_2.txt
|
| 960 |
+
officialCertificate/peselConfirmation_5_synth_3.txt
|
| 961 |
+
officialCertificate/peselConfirmation_5_synth_2.txt
|
| 962 |
+
officialCertificate/peselConfirmation_17_synth_3.txt
|
| 963 |
+
officialCertificate/peselConfirmation_17_synth_1.txt
|
| 964 |
+
officialCertificate/peselConfirmation_5_synth_1.txt
|
| 965 |
+
officialCertificate/peselConfirmation_19.txt
|
| 966 |
+
officialCertificate/peselConfirmation_9.txt
|
| 967 |
+
officialCertificate/peselConfirmation_8.txt
|
| 968 |
+
officialCertificate/peselConfirmation_9_synth_2.txt
|
| 969 |
+
officialCertificate/peselConfirmation_9_synth_1.txt
|
| 970 |
+
officialCertificate/peselConfirmation_15_synth_2.txt
|
| 971 |
+
officialCertificate/peselConfirmation_6.txt
|
| 972 |
+
officialCertificate/authorization_5.txt
|
| 973 |
+
officialCertificate/peselConfirmation_7.txt
|
| 974 |
+
officialCertificate/peselConfirmation_13.txt
|
| 975 |
+
officialCertificate/peselConfirmation_7_synth_2.txt
|
| 976 |
+
officialCertificate/peselConfirmation_11.txt
|
| 977 |
+
officialCertificate/peselConfirmation_15_synth_1.txt
|
| 978 |
+
officialCertificate/peselConfirmation_5.txt
|
| 979 |
+
officialCertificate/certificate_12.txt
|
| 980 |
+
officialCertificate/peselConfirmation_4.txt
|
| 981 |
+
officialCertificate/peselConfirmation_7_synth_1.txt
|
| 982 |
+
officialCertificate/peselConfirmation_14.txt
|
| 983 |
+
officialCertificate/peselConfirmation_19_synth_2.txt
|
| 984 |
+
officialCertificate/peselConfirmation_2_synth_1.txt
|
| 985 |
+
officialCertificate/peselConfirmation_1.txt
|
| 986 |
+
officialCertificate/peselConfirmation_15.txt
|
| 987 |
+
officialCertificate/peselConfirmation_17.txt
|
| 988 |
+
officialCertificate/peselConfirmation_3.txt
|
| 989 |
+
officialCertificate/peselConfirmation_19_synth_1.txt
|
| 990 |
+
officialCertificate/peselConfirmation_2_synth_2.txt
|
| 991 |
+
officialCertificate/peselConfirmation_2.txt
|
| 992 |
+
officialCertificate/peselConfirmation_1_synth_2.txt
|
| 993 |
+
officialCertificate/peselConfirmation_13_synth_3.txt
|
| 994 |
+
officialCertificate/peselConfirmation_8_synth_1.txt
|
| 995 |
+
officialCertificate/peselConfirmation_13_synth_2.txt
|
| 996 |
+
officialCertificate/peselConfirmation_1_synth_3.txt
|
| 997 |
+
officialCertificate/peselConfirmation_1_synth_1.txt
|
| 998 |
+
officialCertificate/peselConfirmation_8_synth_2.txt
|
| 999 |
+
officialCertificate/peselConfirmation_8_synth_3.txt
|
| 1000 |
+
officialCertificate/peselConfirmation_13_synth_1.txt
|
| 1001 |
+
officialCertificate/peselConfirmation_4_synth_1.txt
|
| 1002 |
+
officialCertificate/peselConfirmation_4_synth_2.txt
|
| 1003 |
+
officialCertificate/peselConfirmation_4_synth_3.txt
|
| 1004 |
+
powerOfAttorney/powerOfAttorney_0.txt
|
| 1005 |
+
powerOfAttorney/powerOfAttorney_5_synth_1.txt
|
| 1006 |
+
powerOfAttorney/powerOfAttorney_1.txt
|
| 1007 |
+
powerOfAttorney/powerOfAttorney_13_synth_4.txt
|
| 1008 |
+
powerOfAttorney/powerOfAttorney_5_synth_3.txt
|
| 1009 |
+
powerOfAttorney/powerOfAttorney_5_synth_2.txt
|
| 1010 |
+
powerOfAttorney/powerOfAttorney_2.txt
|
| 1011 |
+
powerOfAttorney/powerOfAttorney_0_synth_3.txt
|
| 1012 |
+
powerOfAttorney/powerOfAttorney_13_synth_3.txt
|
| 1013 |
+
powerOfAttorney/powerOfAttorney_6.txt
|
| 1014 |
+
powerOfAttorney/powerOfAttorney_7.txt
|
| 1015 |
+
powerOfAttorney/powerOfAttorney_13_synth_2.txt
|
| 1016 |
+
powerOfAttorney/powerOfAttorney_0_synth_2.txt
|
| 1017 |
+
powerOfAttorney/powerOfAttorney_5.txt
|
| 1018 |
+
powerOfAttorney/powerOfAttorney_13_synth_1.txt
|
| 1019 |
+
powerOfAttorney/powerOfAttorney_0_synth_1.txt
|
| 1020 |
+
powerOfAttorney/powerOfAttorney_19_synth_2.txt
|
| 1021 |
+
powerOfAttorney/powerOfAttorney_10_synth_1.txt
|
| 1022 |
+
powerOfAttorney/powerOfAttorney_13.txt
|
| 1023 |
+
powerOfAttorney/powerOfAttorney_19_synth_3.txt
|
| 1024 |
+
powerOfAttorney/powerOfAttorney_19_synth_1.txt
|
| 1025 |
+
powerOfAttorney/powerOfAttorney_10_synth_2.txt
|
| 1026 |
+
powerOfAttorney/powerOfAttorney_11.txt
|
| 1027 |
+
powerOfAttorney/powerOfAttorney_10.txt
|
| 1028 |
+
powerOfAttorney/powerOfAttorney_10_synth_3.txt
|
| 1029 |
+
powerOfAttorney/powerOfAttorney_14.txt
|
| 1030 |
+
powerOfAttorney/powerOfAttorney_6_synth_2.txt
|
| 1031 |
+
powerOfAttorney/powerOfAttorney_15_synth_2.txt
|
| 1032 |
+
powerOfAttorney/powerOfAttorney_15_synth_3.txt
|
| 1033 |
+
powerOfAttorney/powerOfAttorney_6_synth_3.txt
|
| 1034 |
+
powerOfAttorney/powerOfAttorney_15.txt
|
| 1035 |
+
powerOfAttorney/powerOfAttorney_17.txt
|
| 1036 |
+
powerOfAttorney/powerOfAttorney_6_synth_1.txt
|
| 1037 |
+
powerOfAttorney/powerOfAttorney_15_synth_1.txt
|
| 1038 |
+
powerOfAttorney/powerOfAttorney_1_synth_1.txt
|
| 1039 |
+
powerOfAttorney/powerOfAttorney_1_synth_2.txt
|
| 1040 |
+
powerOfAttorney/powerOfAttorney_18.txt
|
| 1041 |
+
powerOfAttorney/powerOfAttorney_19.txt
|
| 1042 |
+
powerOfAttorney/powerOfAttorney_1_synth_3.txt
|
| 1043 |
+
powerOfAttorney/powerOfAttorney_17_synth_2.txt
|
| 1044 |
+
powerOfAttorney/powerOfAttorney_17_synth_3.txt
|
| 1045 |
+
powerOfAttorney/powerOfAttorney_17_synth_1.txt
|
| 1046 |
+
powerOfAttorney/powerOfAttorney_2_synth_4.txt
|
| 1047 |
+
powerOfAttorney/powerOfAttorney_11_synth_4.txt
|
| 1048 |
+
powerOfAttorney/powerOfAttorney_14_synth_1.txt
|
| 1049 |
+
powerOfAttorney/powerOfAttorney_7_synth_1.txt
|
| 1050 |
+
powerOfAttorney/powerOfAttorney_7_synth_3.txt
|
| 1051 |
+
powerOfAttorney/powerOfAttorney_14_synth_3.txt
|
| 1052 |
+
powerOfAttorney/powerOfAttorney_14_synth_2.txt
|
| 1053 |
+
powerOfAttorney/powerOfAttorney_7_synth_2.txt
|
| 1054 |
+
powerOfAttorney/powerOfAttorney_2_synth_3.txt
|
| 1055 |
+
powerOfAttorney/powerOfAttorney_11_synth_3.txt
|
| 1056 |
+
powerOfAttorney/powerOfAttorney_11_synth_2.txt
|
| 1057 |
+
powerOfAttorney/powerOfAttorney_2_synth_2.txt
|
| 1058 |
+
powerOfAttorney/powerOfAttorney_18_synth_1.txt
|
| 1059 |
+
powerOfAttorney/powerOfAttorney_18_synth_3.txt
|
| 1060 |
+
powerOfAttorney/powerOfAttorney_11_synth_1.txt
|
| 1061 |
+
powerOfAttorney/powerOfAttorney_2_synth_1.txt
|
| 1062 |
+
powerOfAttorney/powerOfAttorney_18_synth_2.txt
|
| 1063 |
+
powerOfAttorney/powerOfAttorney_7_synth_4.txt
|
| 1064 |
+
marriageCertificate/marriageCertificate_15_synth_4.txt
|
| 1065 |
+
marriageCertificate/marriageCertificate_1_synth_3.txt
|
| 1066 |
+
marriageCertificate/marriageCertificate_8_synth_1.txt
|
| 1067 |
+
marriageCertificate/marriageCertificate_1_synth_2.txt
|
| 1068 |
+
marriageCertificate/marriageCertificate_15_synth_5.txt
|
| 1069 |
+
marriageCertificate/marriageCertificate_8_synth_3.txt
|
| 1070 |
+
marriageCertificate/marriageCertificate_8_synth_2.txt
|
| 1071 |
+
marriageCertificate/marriageCertificate_1_synth_1.txt
|
| 1072 |
+
marriageCertificate/marriageCertificate_15_synth_6.txt
|
| 1073 |
+
marriageCertificate/marriageCertificate_15_synth_2.txt
|
| 1074 |
+
marriageCertificate/marriageCertificate_1_synth_5.txt
|
| 1075 |
+
marriageCertificate/marriageCertificate_1_synth_4.txt
|
| 1076 |
+
marriageCertificate/marriageCertificate_15_synth_3.txt
|
| 1077 |
+
marriageCertificate/marriageCertificate_15_synth_1.txt
|
| 1078 |
+
marriageCertificate/marriageCertificate_1_synth_6.txt
|
| 1079 |
+
marriageCertificate/marriageCertificate_8_synth_5.txt
|
| 1080 |
+
marriageCertificate/marriageCertificate_8_synth_4.txt
|
| 1081 |
+
marriageCertificate/marriageCertificate_8.txt
|
| 1082 |
+
marriageCertificate/marriageCertificate_15.txt
|
| 1083 |
+
marriageCertificate/marriageCertificate_14.txt
|
| 1084 |
+
marriageCertificate/marriageCertificate_9.txt
|
| 1085 |
+
marriageCertificate/marriageCertificate_2_synth_4.txt
|
| 1086 |
+
marriageCertificate/marriageCertificate_2_synth_5.txt
|
| 1087 |
+
marriageCertificate/marriageCertificate_17.txt
|
| 1088 |
+
marriageCertificate/marriageCertificate_2_synth_1.txt
|
| 1089 |
+
marriageCertificate/marriageCertificate_2_synth_2.txt
|
| 1090 |
+
marriageCertificate/marriageCertificate_2_synth_3.txt
|
| 1091 |
+
marriageCertificate/marriageCertificate_11.txt
|
| 1092 |
+
marriageCertificate/marriageCertificate_1.txt
|
| 1093 |
+
marriageCertificate/marriageCertificate_18_synth_6.txt
|
| 1094 |
+
marriageCertificate/marriageCertificate_11_synth_5.txt
|
| 1095 |
+
marriageCertificate/marriageCertificate_9_synth_4.txt
|
| 1096 |
+
marriageCertificate/marriageCertificate_14_synth_1.txt
|
| 1097 |
+
marriageCertificate/marriageCertificate_9_synth_5.txt
|
| 1098 |
+
marriageCertificate/marriageCertificate_11_synth_4.txt
|
| 1099 |
+
marriageCertificate/marriageCertificate_2.txt
|
| 1100 |
+
marriageCertificate/marriageCertificate_18_synth_5.txt
|
| 1101 |
+
marriageCertificate/marriageCertificate_14_synth_3.txt
|
| 1102 |
+
marriageCertificate/marriageCertificate_14_synth_2.txt
|
| 1103 |
+
marriageCertificate/marriageCertificate_9_synth_6.txt
|
| 1104 |
+
marriageCertificate/marriageCertificate_18_synth_4.txt
|
| 1105 |
+
marriageCertificate/marriageCertificate_9_synth_2.txt
|
| 1106 |
+
marriageCertificate/marriageCertificate_14_synth_6.txt
|
| 1107 |
+
marriageCertificate/marriageCertificate_11_synth_2.txt
|
| 1108 |
+
marriageCertificate/marriageCertificate_9_synth_3.txt
|
| 1109 |
+
marriageCertificate/marriageCertificate_18_synth_1.txt
|
| 1110 |
+
marriageCertificate/marriageCertificate_18_synth_3.txt
|
| 1111 |
+
marriageCertificate/marriageCertificate_9_synth_1.txt
|
| 1112 |
+
marriageCertificate/marriageCertificate_14_synth_5.txt
|
| 1113 |
+
marriageCertificate/marriageCertificate_14_synth_4.txt
|
| 1114 |
+
marriageCertificate/marriageCertificate_11_synth_1.txt
|
| 1115 |
+
marriageCertificate/marriageCertificate_18.txt
|
| 1116 |
+
marriageCertificate/marriageCertificate_18_synth_2.txt
|
| 1117 |
+
marriageCertificate/marriageCertificate_17_synth_4.txt
|
| 1118 |
+
marriageCertificate/marriageCertificate_17_synth_5.txt
|
| 1119 |
+
marriageCertificate/marriageCertificate_17_synth_2.txt
|
| 1120 |
+
marriageCertificate/marriageCertificate_17_synth_3.txt
|
| 1121 |
+
marriageCertificate/marriageCertificate_17_synth_1.txt
|
| 1122 |
+
drivingLicense/drivingLicense_9.txt
|
| 1123 |
+
drivingLicense/drivingLicense_18.txt
|
| 1124 |
+
drivingLicense/drivingLicense_2_synth_6.txt
|
| 1125 |
+
drivingLicense/drivingLicense_2_synth_4.txt
|
| 1126 |
+
drivingLicense/drivingLicense_2_synth_5.txt
|
| 1127 |
+
drivingLicense/drivingLicense_2_synth_1.txt
|
| 1128 |
+
drivingLicense/drivingLicense_2_synth_2.txt
|
| 1129 |
+
drivingLicense/drivingLicense_2_synth_3.txt
|
| 1130 |
+
drivingLicense/drivingLicense_10_synth_4.txt
|
| 1131 |
+
drivingLicense/drivingLicense_10_synth_5.txt
|
| 1132 |
+
drivingLicense/drivingLicense_10_synth_2.txt
|
| 1133 |
+
drivingLicense/drivingLicense_10_synth_3.txt
|
| 1134 |
+
drivingLicense/drivingLicense_10_synth_1.txt
|
| 1135 |
+
drivingLicense/drivingLicense_3_synth_3.txt
|
| 1136 |
+
drivingLicense/drivingLicense_17_synth_1.txt
|
| 1137 |
+
drivingLicense/drivingLicense_12_synth_4.txt
|
| 1138 |
+
drivingLicense/drivingLicense_12_synth_5.txt
|
| 1139 |
+
drivingLicense/drivingLicense_3_synth_2.txt
|
| 1140 |
+
drivingLicense/drivingLicense_17_synth_2.txt
|
| 1141 |
+
drivingLicense/drivingLicense_17_synth_3.txt
|
| 1142 |
+
drivingLicense/drivingLicense_3_synth_1.txt
|
| 1143 |
+
drivingLicense/drivingLicense_3_synth_5.txt
|
| 1144 |
+
drivingLicense/drivingLicense_12_synth_2.txt
|
| 1145 |
+
drivingLicense/drivingLicense_12_synth_3.txt
|
| 1146 |
+
drivingLicense/drivingLicense_3_synth_4.txt
|
| 1147 |
+
drivingLicense/drivingLicense_17_synth_4.txt
|
| 1148 |
+
drivingLicense/drivingLicense_3_synth_6.txt
|
| 1149 |
+
drivingLicense/drivingLicense_12_synth_1.txt
|
| 1150 |
+
drivingLicense/drivingLicense_17_synth_5.txt
|
| 1151 |
+
drivingLicense/drivingLicense_9_synth_4.txt
|
| 1152 |
+
drivingLicense/drivingLicense_10.txt
|
| 1153 |
+
drivingLicense/drivingLicense_18_synth_3.txt
|
| 1154 |
+
drivingLicense/drivingLicense_0.txt
|
| 1155 |
+
drivingLicense/drivingLicense_18_synth_2.txt
|
| 1156 |
+
drivingLicense/drivingLicense_11.txt
|
| 1157 |
+
drivingLicense/drivingLicense_11_synth_1.txt
|
| 1158 |
+
drivingLicense/drivingLicense_0_synth_6.txt
|
| 1159 |
+
drivingLicense/drivingLicense_9_synth_5.txt
|
| 1160 |
+
drivingLicense/drivingLicense_0_synth_4.txt
|
| 1161 |
+
drivingLicense/drivingLicense_11_synth_3.txt
|
| 1162 |
+
drivingLicense/drivingLicense_2.txt
|
| 1163 |
+
drivingLicense/drivingLicense_3.txt
|
| 1164 |
+
drivingLicense/drivingLicense_18_synth_1.txt
|
| 1165 |
+
drivingLicense/drivingLicense_12.txt
|
| 1166 |
+
drivingLicense/drivingLicense_11_synth_2.txt
|
| 1167 |
+
drivingLicense/drivingLicense_0_synth_5.txt
|
| 1168 |
+
drivingLicense/drivingLicense_9_synth_6.txt
|
| 1169 |
+
drivingLicense/drivingLicense_9_synth_2.txt
|
| 1170 |
+
drivingLicense/drivingLicense_0_synth_1.txt
|
| 1171 |
+
drivingLicense/drivingLicense_11_synth_6.txt
|
| 1172 |
+
drivingLicense/drivingLicense_18_synth_5.txt
|
| 1173 |
+
drivingLicense/drivingLicense_18_synth_4.txt
|
| 1174 |
+
drivingLicense/drivingLicense_17.txt
|
| 1175 |
+
drivingLicense/drivingLicense_9_synth_3.txt
|
| 1176 |
+
drivingLicense/drivingLicense_9_synth_1.txt
|
| 1177 |
+
drivingLicense/drivingLicense_0_synth_2.txt
|
| 1178 |
+
drivingLicense/drivingLicense_11_synth_5.txt
|
| 1179 |
+
drivingLicense/drivingLicense_18_synth_6.txt
|
| 1180 |
+
drivingLicense/drivingLicense_11_synth_4.txt
|
| 1181 |
+
drivingLicense/drivingLicense_0_synth_3.txt
|
| 1182 |
+
receipt/receipt_0_synth_1.txt
|
| 1183 |
+
receipt/receipt_10_synth_3.txt
|
| 1184 |
+
receipt/receipt_10_synth_2.txt
|
| 1185 |
+
receipt/receipt_19_synth_1.txt
|
| 1186 |
+
receipt/receipt_19_synth_3.txt
|
| 1187 |
+
receipt/receipt_0_synth_2.txt
|
| 1188 |
+
receipt/receipt_10_synth_1.txt
|
| 1189 |
+
receipt/receipt_0_synth_3.txt
|
| 1190 |
+
receipt/receipt_19_synth_2.txt
|
| 1191 |
+
receipt/receipt_15_synth_1.txt
|
| 1192 |
+
receipt/receipt_10_synth_4.txt
|
| 1193 |
+
receipt/receipt_15_synth_3.txt
|
| 1194 |
+
receipt/receipt_15_synth_2.txt
|
| 1195 |
+
receipt/receipt_16_synth_2.txt
|
| 1196 |
+
receipt/receipt_16_synth_3.txt
|
| 1197 |
+
receipt/receipt_3_synth_4.txt
|
| 1198 |
+
receipt/receipt_16_synth_1.txt
|
| 1199 |
+
receipt/receipt_3_synth_3.txt
|
| 1200 |
+
receipt/receipt_13_synth_1.txt
|
| 1201 |
+
receipt/receipt_18.txt
|
| 1202 |
+
receipt/receipt_16_synth_4.txt
|
| 1203 |
+
receipt/receipt_19.txt
|
| 1204 |
+
receipt/receipt_3_synth_2.txt
|
| 1205 |
+
receipt/receipt_13_synth_2.txt
|
| 1206 |
+
receipt/receipt_13_synth_3.txt
|
| 1207 |
+
receipt/receipt_3_synth_1.txt
|
| 1208 |
+
receipt/receipt_14_synth_2.txt
|
| 1209 |
+
receipt/receipt_17.txt
|
| 1210 |
+
receipt/receipt_16.txt
|
| 1211 |
+
receipt/receipt_14_synth_3.txt
|
| 1212 |
+
receipt/receipt_14_synth_1.txt
|
| 1213 |
+
receipt/receipt_14.txt
|
| 1214 |
+
receipt/receipt_15.txt
|
| 1215 |
+
receipt/receipt_14_synth_4.txt
|
| 1216 |
+
receipt/receipt_18_synth_2.txt
|
| 1217 |
+
receipt/receipt_1_synth_3.txt
|
| 1218 |
+
receipt/receipt_1_synth_2.txt
|
| 1219 |
+
receipt/receipt_10.txt
|
| 1220 |
+
receipt/receipt_18_synth_3.txt
|
| 1221 |
+
receipt/receipt_18_synth_1.txt
|
| 1222 |
+
receipt/receipt_12.txt
|
| 1223 |
+
receipt/receipt_1_synth_1.txt
|
| 1224 |
+
receipt/receipt_13.txt
|
| 1225 |
+
receipt/receipt_12_synth_3.txt
|
| 1226 |
+
receipt/receipt_2_synth_1.txt
|
| 1227 |
+
receipt/receipt_0.txt
|
| 1228 |
+
receipt/receipt_1.txt
|
| 1229 |
+
receipt/receipt_12_synth_2.txt
|
| 1230 |
+
receipt/receipt_2_synth_2.txt
|
| 1231 |
+
receipt/receipt_3.txt
|
| 1232 |
+
receipt/receipt_2.txt
|
| 1233 |
+
receipt/receipt_2_synth_3.txt
|
| 1234 |
+
receipt/receipt_12_synth_1.txt
|
| 1235 |
+
receipt/receipt_7_synth_2.txt
|
| 1236 |
+
receipt/receipt_7.txt
|
| 1237 |
+
receipt/receipt_17_synth_1.txt
|
| 1238 |
+
receipt/receipt_7_synth_3.txt
|
| 1239 |
+
receipt/receipt_7_synth_1.txt
|
| 1240 |
+
receipt/receipt_17_synth_3.txt
|
| 1241 |
+
receipt/receipt_17_synth_2.txt
|
| 1242 |
+
loanAgreement/loanAgreement_16_synth_6.txt
|
| 1243 |
+
loanAgreement/loanAgreement_16_synth_4.txt
|
| 1244 |
+
loanAgreement/loanAgreement_8.txt
|
| 1245 |
+
loanAgreement/loanAgreement_16_synth_5.txt
|
| 1246 |
+
loanAgreement/loanAgreement_16_synth_1.txt
|
| 1247 |
+
loanAgreement/loanAgreement_16_synth_2.txt
|
| 1248 |
+
loanAgreement/loanAgreement_16_synth_3.txt
|
| 1249 |
+
loanAgreement/loanAgreement_15_synth_3.txt
|
| 1250 |
+
loanAgreement/loanAgreement_0_synth_1.txt
|
| 1251 |
+
loanAgreement/loanAgreement_15_synth_2.txt
|
| 1252 |
+
loanAgreement/loanAgreement_0_synth_2.txt
|
| 1253 |
+
loanAgreement/loanAgreement_0_synth_3.txt
|
| 1254 |
+
loanAgreement/loanAgreement_15_synth_1.txt
|
| 1255 |
+
loanAgreement/loanAgreement_15_synth_5.txt
|
| 1256 |
+
loanAgreement/loanAgreement_0_synth_7.txt
|
| 1257 |
+
loanAgreement/loanAgreement_0_synth_6.txt
|
| 1258 |
+
loanAgreement/loanAgreement_15_synth_4.txt
|
| 1259 |
+
loanAgreement/loanAgreement_15_synth_6.txt
|
| 1260 |
+
loanAgreement/loanAgreement_0_synth_4.txt
|
| 1261 |
+
loanAgreement/loanAgreement_0_synth_5.txt
|
| 1262 |
+
loanAgreement/loanAgreement_15_synth_7.txt
|
| 1263 |
+
loanAgreement/loanAgreement_7_synth_4.txt
|
| 1264 |
+
loanAgreement/loanAgreement_7_synth_5.txt
|
| 1265 |
+
loanAgreement/loanAgreement_7_synth_7.txt
|
| 1266 |
+
loanAgreement/loanAgreement_7_synth_6.txt
|
| 1267 |
+
loanAgreement/loanAgreement_7_synth_2.txt
|
| 1268 |
+
loanAgreement/loanAgreement_7_synth_3.txt
|
| 1269 |
+
loanAgreement/loanAgreement_7_synth_1.txt
|
| 1270 |
+
loanAgreement/loanAgreement_1_synth_5.txt
|
| 1271 |
+
loanAgreement/loanAgreement_11_synth_2.txt
|
| 1272 |
+
loanAgreement/loanAgreement_8_synth_6.txt
|
| 1273 |
+
loanAgreement/loanAgreement_11.txt
|
| 1274 |
+
loanAgreement/loanAgreement_14_synth_7.txt
|
| 1275 |
+
loanAgreement/loanAgreement_14_synth_6.txt
|
| 1276 |
+
loanAgreement/loanAgreement_11_synth_3.txt
|
| 1277 |
+
loanAgreement/loanAgreement_1_synth_4.txt
|
| 1278 |
+
loanAgreement/loanAgreement_1_synth_6.txt
|
| 1279 |
+
loanAgreement/loanAgreement_11_synth_1.txt
|
| 1280 |
+
loanAgreement/loanAgreement_8_synth_5.txt
|
| 1281 |
+
loanAgreement/loanAgreement_14_synth_4.txt
|
| 1282 |
+
loanAgreement/loanAgreement_0.txt
|
| 1283 |
+
loanAgreement/loanAgreement_1.txt
|
| 1284 |
+
loanAgreement/loanAgreement_14_synth_5.txt
|
| 1285 |
+
loanAgreement/loanAgreement_8_synth_4.txt
|
| 1286 |
+
loanAgreement/loanAgreement_1_synth_3.txt
|
| 1287 |
+
loanAgreement/loanAgreement_11_synth_4.txt
|
| 1288 |
+
loanAgreement/loanAgreement_14_synth_1.txt
|
| 1289 |
+
loanAgreement/loanAgreement_16.txt
|
| 1290 |
+
loanAgreement/loanAgreement_8_synth_1.txt
|
| 1291 |
+
loanAgreement/loanAgreement_11_synth_5.txt
|
| 1292 |
+
loanAgreement/loanAgreement_1_synth_2.txt
|
| 1293 |
+
loanAgreement/loanAgreement_8_synth_3.txt
|
| 1294 |
+
loanAgreement/loanAgreement_14.txt
|
| 1295 |
+
loanAgreement/loanAgreement_14_synth_2.txt
|
| 1296 |
+
loanAgreement/loanAgreement_14_synth_3.txt
|
| 1297 |
+
loanAgreement/loanAgreement_7.txt
|
| 1298 |
+
loanAgreement/loanAgreement_15.txt
|
| 1299 |
+
loanAgreement/loanAgreement_8_synth_2.txt
|
| 1300 |
+
loanAgreement/loanAgreement_11_synth_6.txt
|
| 1301 |
+
loanAgreement/loanAgreement_1_synth_1.txt
|
| 1302 |
+
educationDocument/universityDiploma_12_synth_1.txt
|
| 1303 |
+
educationDocument/universityDiploma_6_synth_1.txt
|
| 1304 |
+
educationDocument/schoolCertificate_9_synth_1.txt
|
| 1305 |
+
educationDocument/professionalCertificate_4_synth_1.txt
|
| 1306 |
+
educationDocument/universityDiploma_15.txt
|
| 1307 |
+
educationDocument/universityDiploma_8.txt
|
| 1308 |
+
educationDocument/universityDiploma_11.txt
|
| 1309 |
+
educationDocument/professionalCertificate_18_synth_1.txt
|
| 1310 |
+
educationDocument/universityDiploma_10.txt
|
| 1311 |
+
educationDocument/universityDiploma_9.txt
|
| 1312 |
+
educationDocument/professionalCertificate_1_synth_1.txt
|
| 1313 |
+
educationDocument/universityDiploma_12.txt
|
| 1314 |
+
educationDocument/professionalCertificate_11_synth_1.txt
|
| 1315 |
+
educationDocument/universityDiploma_3_synth_1.txt
|
| 1316 |
+
educationDocument/universityDiploma_13.txt
|
| 1317 |
+
educationDocument/schoolCertificate_17_synth_1.txt
|
| 1318 |
+
educationDocument/courtJudgment_5_synth_1.txt
|
| 1319 |
+
educationDocument/universityDiploma_0_synth_1.txt
|
| 1320 |
+
educationDocument/schoolCertificate_17.txt
|
| 1321 |
+
educationDocument/professionalCertificate_5.txt
|
| 1322 |
+
educationDocument/professionalCertificate_4.txt
|
| 1323 |
+
educationDocument/schoolCertificate_16.txt
|
| 1324 |
+
educationDocument/courtJudgment_5.txt
|
| 1325 |
+
educationDocument/professionalCertificate_12_synth_1.txt
|
| 1326 |
+
educationDocument/professionalCertificate_2_synth_1.txt
|
| 1327 |
+
educationDocument/universityDiploma_9_synth_1.txt
|
| 1328 |
+
educationDocument/professionalCertificate_6.txt
|
| 1329 |
+
educationDocument/professionalCertificate_7.txt
|
| 1330 |
+
educationDocument/schoolCertificate_9.txt
|
| 1331 |
+
educationDocument/professionalCertificate_7_synth_1.txt
|
| 1332 |
+
educationDocument/professionalCertificate_3.txt
|
| 1333 |
+
educationDocument/schoolCertificate_10.txt
|
| 1334 |
+
educationDocument/professionalCertificate_2.txt
|
| 1335 |
+
educationDocument/universityDiploma_18_synth_1.txt
|
| 1336 |
+
educationDocument/universityDiploma_5_synth_1.txt
|
| 1337 |
+
educationDocument/professionalCertificate_1.txt
|
| 1338 |
+
educationDocument/universityDiploma_11_synth_1.txt
|
| 1339 |
+
educationDocument/professionalCertificate_18.txt
|
| 1340 |
+
educationDocument/professionalCertificate_17_synth_1.txt
|
| 1341 |
+
educationDocument/universityDiploma_2_synth_1.txt
|
| 1342 |
+
educationDocument/professionalCertificate_15.txt
|
| 1343 |
+
educationDocument/schoolCertificate_16_synth_1.txt
|
| 1344 |
+
educationDocument/professionalCertificate_9_synth_1.txt
|
| 1345 |
+
educationDocument/professionalCertificate_10_synth_1.txt
|
| 1346 |
+
educationDocument/schoolCertificate_4_synth_1.txt
|
| 1347 |
+
educationDocument/professionalCertificate_17.txt
|
| 1348 |
+
educationDocument/schoolCertificate_4.txt
|
| 1349 |
+
educationDocument/professionalCertificate_5_synth_1.txt
|
| 1350 |
+
educationDocument/schoolCertificate_1_synth_1.txt
|
| 1351 |
+
educationDocument/certificate_6_synth_1.txt
|
| 1352 |
+
educationDocument/professionalCertificate_12.txt
|
| 1353 |
+
educationDocument/schoolCertificate_1.txt
|
| 1354 |
+
educationDocument/professionalCertificate_10.txt
|
| 1355 |
+
educationDocument/professionalCertificate_9.txt
|
| 1356 |
+
educationDocument/universityDiploma_7_synth_1.txt
|
| 1357 |
+
educationDocument/universityDiploma_13_synth_1.txt
|
| 1358 |
+
educationDocument/professionalCertificate_15_synth_1.txt
|
| 1359 |
+
educationDocument/professionalCertificate_11.txt
|
| 1360 |
+
educationDocument/schoolCertificate_2.txt
|
| 1361 |
+
educationDocument/universityDiploma_7.txt
|
| 1362 |
+
educationDocument/universityDiploma_10_synth_1.txt
|
| 1363 |
+
educationDocument/lawsuit_13.txt
|
| 1364 |
+
educationDocument/certificate_6.txt
|
| 1365 |
+
educationDocument/universityDiploma_6.txt
|
| 1366 |
+
educationDocument/schoolCertificate_10_synth_1.txt
|
| 1367 |
+
educationDocument/schoolCertificate_2_synth_1.txt
|
| 1368 |
+
educationDocument/professionalCertificate_6_synth_1.txt
|
| 1369 |
+
educationDocument/universityDiploma_5.txt
|
| 1370 |
+
educationDocument/universityDiploma_1.txt
|
| 1371 |
+
educationDocument/universityDiploma_18.txt
|
| 1372 |
+
educationDocument/professionalCertificate_3_synth_1.txt
|
| 1373 |
+
educationDocument/lawsuit_13_synth_1.txt
|
| 1374 |
+
educationDocument/universityDiploma_8_synth_1.txt
|
| 1375 |
+
educationDocument/universityDiploma_0.txt
|
| 1376 |
+
educationDocument/universityDiploma_2.txt
|
| 1377 |
+
educationDocument/universityDiploma_15_synth_1.txt
|
| 1378 |
+
educationDocument/universityDiploma_1_synth_1.txt
|
| 1379 |
+
educationDocument/universityDiploma_3.txt
|
| 1380 |
+
birthCertificate/birthCertificate_9_synth_10.txt
|
| 1381 |
+
birthCertificate/birthCertificate_1_synth_7.txt
|
| 1382 |
+
birthCertificate/birthCertificate_1_synth_6.txt
|
| 1383 |
+
birthCertificate/propertyDeed_16_synth_1.txt
|
| 1384 |
+
birthCertificate/birthCertificate_9_synth_11.txt
|
| 1385 |
+
birthCertificate/birthCertificate_7.txt
|
| 1386 |
+
birthCertificate/propertyDeed_16_synth_3.txt
|
| 1387 |
+
birthCertificate/birthCertificate_1_synth_4.txt
|
| 1388 |
+
birthCertificate/birthCertificate_1_synth_5.txt
|
| 1389 |
+
birthCertificate/propertyDeed_16_synth_2.txt
|
| 1390 |
+
birthCertificate/propertyDeed_16_synth_6.txt
|
| 1391 |
+
birthCertificate/birthCertificate_1_synth_1.txt
|
| 1392 |
+
birthCertificate/propertyDeed_16_synth_7.txt
|
| 1393 |
+
birthCertificate/birthCertificate_1.txt
|
| 1394 |
+
birthCertificate/propertyDeed_16_synth_5.txt
|
| 1395 |
+
birthCertificate/birthCertificate_1_synth_2.txt
|
| 1396 |
+
birthCertificate/birthCertificate_1_synth_3.txt
|
| 1397 |
+
birthCertificate/birthCertificate_10.txt
|
| 1398 |
+
birthCertificate/propertyDeed_16_synth_4.txt
|
| 1399 |
+
birthCertificate/birthCertificate_9_synth_9.txt
|
| 1400 |
+
birthCertificate/birthCertificate_7_synth_6.txt
|
| 1401 |
+
birthCertificate/birthCertificate_7_synth_7.txt
|
| 1402 |
+
birthCertificate/birthCertificate_10_synth_1.txt
|
| 1403 |
+
birthCertificate/birthCertificate_9_synth_8.txt
|
| 1404 |
+
birthCertificate/birthCertificate_7_synth_5.txt
|
| 1405 |
+
birthCertificate/birthCertificate_10_synth_3.txt
|
| 1406 |
+
birthCertificate/birthCertificate_10_synth_2.txt
|
| 1407 |
+
birthCertificate/birthCertificate_7_synth_4.txt
|
| 1408 |
+
birthCertificate/propertyDeed_16.txt
|
| 1409 |
+
birthCertificate/propertyDeed_16_synth_11.txt
|
| 1410 |
+
birthCertificate/birthCertificate_10_synth_6.txt
|
| 1411 |
+
birthCertificate/birthCertificate_10_synth_11.txt
|
| 1412 |
+
birthCertificate/birthCertificate_10_synth_10.txt
|
| 1413 |
+
birthCertificate/birthCertificate_10_synth_7.txt
|
| 1414 |
+
birthCertificate/birthCertificate_7_synth_1.txt
|
| 1415 |
+
birthCertificate/propertyDeed_16_synth_10.txt
|
| 1416 |
+
birthCertificate/birthCertificate_10_synth_5.txt
|
| 1417 |
+
birthCertificate/birthCertificate_7_synth_3.txt
|
| 1418 |
+
birthCertificate/birthCertificate_7_synth_2.txt
|
| 1419 |
+
birthCertificate/birthCertificate_10_synth_4.txt
|
| 1420 |
+
birthCertificate/birthCertificate_10_synth_9.txt
|
| 1421 |
+
birthCertificate/birthCertificate_10_synth_8.txt
|
| 1422 |
+
birthCertificate/birthCertificate_9_synth_1.txt
|
| 1423 |
+
birthCertificate/birthCertificate_9_synth_3.txt
|
| 1424 |
+
birthCertificate/birthCertificate_1_synth_11.txt
|
| 1425 |
+
birthCertificate/birthCertificate_1_synth_10.txt
|
| 1426 |
+
birthCertificate/birthCertificate_9_synth_2.txt
|
| 1427 |
+
birthCertificate/birthCertificate_9_synth_6.txt
|
| 1428 |
+
birthCertificate/birthCertificate_7_synth_9.txt
|
| 1429 |
+
birthCertificate/birthCertificate_7_synth_8.txt
|
| 1430 |
+
birthCertificate/birthCertificate_9_synth_7.txt
|
| 1431 |
+
birthCertificate/birthCertificate_9_synth_5.txt
|
| 1432 |
+
birthCertificate/birthCertificate_7_synth_10.txt
|
| 1433 |
+
birthCertificate/birthCertificate_7_synth_11.txt
|
| 1434 |
+
birthCertificate/birthCertificate_9_synth_4.txt
|
| 1435 |
+
birthCertificate/propertyDeed_16_synth_9.txt
|
| 1436 |
+
birthCertificate/propertyDeed_16_synth_8.txt
|
| 1437 |
+
birthCertificate/birthCertificate_1_synth_8.txt
|
| 1438 |
+
birthCertificate/birthCertificate_1_synth_9.txt
|
| 1439 |
+
birthCertificate/birthCertificate_9.txt
|
| 1440 |
+
propertyDeed/landRegistry_16_synth_2.txt
|
| 1441 |
+
propertyDeed/landRegistry_7.txt
|
| 1442 |
+
propertyDeed/landRegistry_16_synth_1.txt
|
| 1443 |
+
propertyDeed/landRegistry_4.txt
|
| 1444 |
+
propertyDeed/landRegistry_0.txt
|
| 1445 |
+
propertyDeed/landRegistry_16.txt
|
| 1446 |
+
propertyDeed/landRegistry_17.txt
|
| 1447 |
+
propertyDeed/landRegistry_1.txt
|
| 1448 |
+
propertyDeed/landRegistry_14.txt
|
| 1449 |
+
propertyDeed/landRegistry_2.txt
|
| 1450 |
+
propertyDeed/propertyDeed_10_synth_1.txt
|
| 1451 |
+
propertyDeed/propertyDeed_10.txt
|
| 1452 |
+
propertyDeed/propertyDeed_2_synth_1.txt
|
| 1453 |
+
propertyDeed/landRegistry_19_synth_1.txt
|
| 1454 |
+
propertyDeed/propertyDeed_19_synth_2.txt
|
| 1455 |
+
propertyDeed/propertyDeed_19_synth_3.txt
|
| 1456 |
+
propertyDeed/propertyDeed_11.txt
|
| 1457 |
+
propertyDeed/propertyDeed_10_synth_2.txt
|
| 1458 |
+
propertyDeed/propertyDeed_2_synth_2.txt
|
| 1459 |
+
propertyDeed/landRegistry_19_synth_2.txt
|
| 1460 |
+
propertyDeed/propertyDeed_19_synth_1.txt
|
| 1461 |
+
propertyDeed/propertyDeed_6.txt
|
| 1462 |
+
propertyDeed/propertyDeed_7.txt
|
| 1463 |
+
propertyDeed/landRegistry_0_synth_2.txt
|
| 1464 |
+
propertyDeed/propertyDeed_3.txt
|
| 1465 |
+
propertyDeed/propertyDeed_15_synth_2.txt
|
| 1466 |
+
propertyDeed/propertyDeed_7_synth_2.txt
|
| 1467 |
+
propertyDeed/propertyDeed_2.txt
|
| 1468 |
+
propertyDeed/landRegistry_0_synth_3.txt
|
| 1469 |
+
propertyDeed/propertyDeed_17.txt
|
| 1470 |
+
propertyDeed/propertyDeed_15.txt
|
| 1471 |
+
propertyDeed/landRegistry_0_synth_1.txt
|
| 1472 |
+
propertyDeed/propertyDeed_15_synth_1.txt
|
| 1473 |
+
propertyDeed/propertyDeed_7_synth_1.txt
|
| 1474 |
+
propertyDeed/propertyDeed_19.txt
|
| 1475 |
+
propertyDeed/landRegistry_7_synth_1.txt
|
| 1476 |
+
propertyDeed/propertyDeed_18.txt
|
| 1477 |
+
propertyDeed/landRegistry_7_synth_2.txt
|
| 1478 |
+
propertyDeed/propertyDeed_17_synth_2.txt
|
| 1479 |
+
propertyDeed/landRegistry_17_synth_1.txt
|
| 1480 |
+
propertyDeed/landRegistry_2_synth_2.txt
|
| 1481 |
+
propertyDeed/propertyDeed_17_synth_1.txt
|
| 1482 |
+
propertyDeed/landRegistry_17_synth_2.txt
|
| 1483 |
+
propertyDeed/landRegistry_2_synth_1.txt
|
| 1484 |
+
propertyDeed/landRegistry_19.txt
|
| 1485 |
+
propertyDeed/propertyDeed_6_synth_1.txt
|
| 1486 |
+
propertyDeed/landRegistry_1_synth_1.txt
|
| 1487 |
+
propertyDeed/landRegistry_14_synth_2.txt
|
| 1488 |
+
propertyDeed/propertyDeed_6_synth_2.txt
|
| 1489 |
+
propertyDeed/landRegistry_1_synth_2.txt
|
| 1490 |
+
propertyDeed/landRegistry_14_synth_1.txt
|
| 1491 |
+
propertyDeed/propertyDeed_18_synth_1.txt
|
| 1492 |
+
propertyDeed/landRegistry_4_synth_2.txt
|
| 1493 |
+
propertyDeed/propertyDeed_3_synth_2.txt
|
| 1494 |
+
propertyDeed/propertyDeed_11_synth_2.txt
|
| 1495 |
+
propertyDeed/propertyDeed_18_synth_3.txt
|
| 1496 |
+
propertyDeed/propertyDeed_18_synth_2.txt
|
| 1497 |
+
propertyDeed/landRegistry_4_synth_1.txt
|
| 1498 |
+
propertyDeed/propertyDeed_3_synth_1.txt
|
| 1499 |
+
propertyDeed/propertyDeed_11_synth_1.txt
|
| 1500 |
+
cv/cv_16_synth_2.txt
|
| 1501 |
+
cv/cv_13.txt
|
| 1502 |
+
cv/cv_0_synth_1.txt
|
| 1503 |
+
cv/cv_12.txt
|
| 1504 |
+
cv/cv_9_synth_2.txt
|
| 1505 |
+
cv/cv_16_synth_1.txt
|
| 1506 |
+
cv/cv_10.txt
|
| 1507 |
+
cv/cv_0_synth_2.txt
|
| 1508 |
+
cv/cv_11.txt
|
| 1509 |
+
cv/cv_9_synth_1.txt
|
| 1510 |
+
cv/cv_15.txt
|
| 1511 |
+
cv/cv_13_synth_1.txt
|
| 1512 |
+
cv/cv_14.txt
|
| 1513 |
+
cv/cv_16.txt
|
| 1514 |
+
cv/cv_13_synth_2.txt
|
| 1515 |
+
cv/cv_17.txt
|
| 1516 |
+
cv/cv_6_synth_1.txt
|
| 1517 |
+
cv/cv_7.txt
|
| 1518 |
+
cv/cv_6.txt
|
| 1519 |
+
cv/cv_10_synth_2.txt
|
| 1520 |
+
cv/cv_6_synth_2.txt
|
| 1521 |
+
cv/cv_4.txt
|
| 1522 |
+
cv/cv_19_synth_2.txt
|
| 1523 |
+
cv/cv_6_synth_3.txt
|
| 1524 |
+
cv/cv_10_synth_1.txt
|
| 1525 |
+
cv/cv_3_synth_2.txt
|
| 1526 |
+
cv/cv_1.txt
|
| 1527 |
+
cv/cv_0.txt
|
| 1528 |
+
cv/cv_15_synth_1.txt
|
| 1529 |
+
cv/cv_3_synth_3.txt
|
| 1530 |
+
cv/cv_3_synth_1.txt
|
| 1531 |
+
cv/cv_15_synth_3.txt
|
| 1532 |
+
cv/cv_2.txt
|
| 1533 |
+
cv/cv_3.txt
|
| 1534 |
+
cv/cv_15_synth_2.txt
|
| 1535 |
+
cv/cv_4_synth_1.txt
|
| 1536 |
+
cv/cv_12_synth_3.txt
|
| 1537 |
+
cv/cv_12_synth_2.txt
|
| 1538 |
+
cv/cv_4_synth_2.txt
|
| 1539 |
+
cv/cv_12_synth_1.txt
|
| 1540 |
+
cv/cv_1_synth_2.txt
|
| 1541 |
+
cv/cv_9.txt
|
| 1542 |
+
cv/cv_17_synth_1.txt
|
| 1543 |
+
cv/cv_1_synth_1.txt
|
| 1544 |
+
cv/cv_17_synth_2.txt
|
| 1545 |
+
cv/cv_14_synth_2.txt
|
| 1546 |
+
cv/cv_2_synth_1.txt
|
| 1547 |
+
cv/cv_19.txt
|
| 1548 |
+
cv/cv_14_synth_1.txt
|
| 1549 |
+
cv/cv_2_synth_2.txt
|
| 1550 |
+
cv/cv_18.txt
|
| 1551 |
+
cv/cv_11_synth_1.txt
|
| 1552 |
+
cv/cv_7_synth_3.txt
|
| 1553 |
+
cv/cv_18_synth_2.txt
|
| 1554 |
+
cv/cv_7_synth_2.txt
|
| 1555 |
+
cv/cv_11_synth_2.txt
|
| 1556 |
+
cv/cv_18_synth_1.txt
|
| 1557 |
+
cv/cv_7_synth_1.txt
|
| 1558 |
+
cv/cv_11_synth_3.txt
|
| 1559 |
+
bankStatement/bankStatement_3_synth_13.txt
|
| 1560 |
+
bankStatement/bankStatement_3_synth_4.txt
|
| 1561 |
+
bankStatement/bankStatement_19_synth_13.txt
|
| 1562 |
+
bankStatement/bankStatement_19_synth_4.txt
|
| 1563 |
+
bankStatement/bankStatement_19_synth_5.txt
|
| 1564 |
+
bankStatement/bankStatement_19_synth_12.txt
|
| 1565 |
+
bankStatement/bankStatement_3_synth_5.txt
|
| 1566 |
+
bankStatement/bankStatement_3_synth_12.txt
|
| 1567 |
+
bankStatement/bankStatement_3_synth_10.txt
|
| 1568 |
+
bankStatement/bankStatement_19_synth_10.txt
|
| 1569 |
+
bankStatement/bankStatement_19_synth_7.txt
|
| 1570 |
+
bankStatement/bankStatement_19_synth_6.txt
|
| 1571 |
+
bankStatement/bankStatement_19_synth_11.txt
|
| 1572 |
+
bankStatement/bankStatement_3_synth_6.txt
|
| 1573 |
+
bankStatement/bankStatement_3_synth_11.txt
|
| 1574 |
+
bankStatement/bankStatement_13.txt
|
| 1575 |
+
bankStatement/bankStatement_19_synth_2.txt
|
| 1576 |
+
bankStatement/bankStatement_19_synth_3.txt
|
| 1577 |
+
bankStatement/bankStatement_19_synth_14.txt
|
| 1578 |
+
bankStatement/bankStatement_3_synth_3.txt
|
| 1579 |
+
bankStatement/bankStatement_3_synth_14.txt
|
| 1580 |
+
bankStatement/bankStatement_3_synth_1.txt
|
| 1581 |
+
bankStatement/bankStatement_1_synth_8.txt
|
| 1582 |
+
bankStatement/bankStatement_19_synth_1.txt
|
| 1583 |
+
bankStatement/bankStatement_1_synth_9.txt
|
| 1584 |
+
bankStatement/bankStatement_13_synth_3.txt
|
| 1585 |
+
bankStatement/bankStatement_13_synth_2.txt
|
| 1586 |
+
bankStatement/bankStatement_13_synth_14.txt
|
| 1587 |
+
bankStatement/bankStatement_13_synth_1.txt
|
| 1588 |
+
bankStatement/bankStatement_13_synth_11.txt
|
| 1589 |
+
bankStatement/bankStatement_3.txt
|
| 1590 |
+
bankStatement/bankStatement_13_synth_5.txt
|
| 1591 |
+
bankStatement/bankStatement_13_synth_4.txt
|
| 1592 |
+
bankStatement/bankStatement_13_synth_10.txt
|
| 1593 |
+
bankStatement/bankStatement_13_synth_12.txt
|
| 1594 |
+
bankStatement/bankStatement_13_synth_6.txt
|
| 1595 |
+
bankStatement/bankStatement_13_synth_7.txt
|
| 1596 |
+
bankStatement/bankStatement_1.txt
|
| 1597 |
+
bankStatement/bankStatement_13_synth_13.txt
|
| 1598 |
+
bankStatement/bankStatement_13_synth_9.txt
|
| 1599 |
+
bankStatement/bankStatement_13_synth_8.txt
|
| 1600 |
+
bankStatement/bankStatement_1_synth_4.txt
|
| 1601 |
+
bankStatement/bankStatement_1_synth_14.txt
|
| 1602 |
+
bankStatement/bankStatement_1_synth_5.txt
|
| 1603 |
+
bankStatement/bankStatement_1_synth_7.txt
|
| 1604 |
+
bankStatement/bankStatement_1_synth_6.txt
|
| 1605 |
+
bankStatement/bankStatement_1_synth_2.txt
|
| 1606 |
+
bankStatement/bankStatement_1_synth_13.txt
|
| 1607 |
+
bankStatement/bankStatement_1_synth_12.txt
|
| 1608 |
+
bankStatement/bankStatement_1_synth_3.txt
|
| 1609 |
+
bankStatement/bankStatement_3_synth_8.txt
|
| 1610 |
+
bankStatement/bankStatement_19.txt
|
| 1611 |
+
bankStatement/bankStatement_1_synth_1.txt
|
| 1612 |
+
bankStatement/bankStatement_1_synth_10.txt
|
| 1613 |
+
bankStatement/bankStatement_19_synth_8.txt
|
| 1614 |
+
bankStatement/bankStatement_19_synth_9.txt
|
| 1615 |
+
bankStatement/bankStatement_1_synth_11.txt
|
| 1616 |
+
bankStatement/bankStatement_3_synth_9.txt
|
| 1617 |
+
application/certificate_8.txt
|
| 1618 |
+
application/application_11_synth_2.txt
|
| 1619 |
+
application/application_11_synth_3.txt
|
| 1620 |
+
application/application_5_synth_1.txt
|
| 1621 |
+
application/application_5_synth_3.txt
|
| 1622 |
+
application/application_11_synth_1.txt
|
| 1623 |
+
application/application_5_synth_2.txt
|
| 1624 |
+
application/application_5.txt
|
| 1625 |
+
application/application_11.txt
|
| 1626 |
+
application/certificate_19.txt
|
| 1627 |
+
application/certificate_8_synth_1.txt
|
| 1628 |
+
application/certificate_8_synth_3.txt
|
| 1629 |
+
application/application_6.txt
|
| 1630 |
+
application/application_12.txt
|
| 1631 |
+
application/application_13.txt
|
| 1632 |
+
application/certificate_8_synth_2.txt
|
| 1633 |
+
application/application_3.txt
|
| 1634 |
+
application/application_16.txt
|
| 1635 |
+
application/application_0.txt
|
| 1636 |
+
application/application_15.txt
|
| 1637 |
+
application/application_18.txt
|
| 1638 |
+
application/application_19.txt
|
| 1639 |
+
application/application_9.txt
|
| 1640 |
+
application/application_8.txt
|
| 1641 |
+
application/certificate_19_synth_2.txt
|
| 1642 |
+
application/certificate_19_synth_1.txt
|
| 1643 |
+
notarialDeed/notarialDeed_5.txt
|
| 1644 |
+
notarialDeed/notarialDeed_7.txt
|
| 1645 |
+
notarialDeed/notarialDeed_6.txt
|
| 1646 |
+
notarialDeed/notarialDeed_2.txt
|
| 1647 |
+
notarialDeed/notarialDeed_1.txt
|
| 1648 |
+
notarialDeed/notarialDeed_0.txt
|
| 1649 |
+
notarialDeed/notarialDeed_18.txt
|
| 1650 |
+
notarialDeed/notarialDeed_12.txt
|
| 1651 |
+
notarialDeed/notarialDeed_13.txt
|
| 1652 |
+
notarialDeed/notarialDeed_11.txt
|
| 1653 |
+
notarialDeed/notarialDeed_17.txt
|
| 1654 |
+
idCard/idCard_19.txt
|
| 1655 |
+
idCard/idCard_18.txt
|
| 1656 |
+
idCard/idCard_9.txt
|
| 1657 |
+
idCard/idCard_1.txt
|
| 1658 |
+
idCard/idCard_0.txt
|
| 1659 |
+
idCard/idCard_3.txt
|
| 1660 |
+
idCard/idCard_7.txt
|
| 1661 |
+
idCard/idCard_6.txt
|
| 1662 |
+
idCard/idCard_4.txt
|
| 1663 |
+
idCard/idCard_5.txt
|
| 1664 |
+
idCard/idCard_10.txt
|
| 1665 |
+
idCard/idCard_11.txt
|
| 1666 |
+
idCard/idCard_13.txt
|
| 1667 |
+
idCard/idCard_12.txt
|
| 1668 |
+
idCard/idCard_14.txt
|
| 1669 |
+
courtDocument/courtJudgment_17.txt
|
| 1670 |
+
courtDocument/courtJudgment_14.txt
|
| 1671 |
+
courtDocument/courtJudgment_15.txt
|
| 1672 |
+
courtDocument/lawsuit_19.txt
|
| 1673 |
+
courtDocument/courtJudgment_10.txt
|
| 1674 |
+
courtDocument/propertyDeed_13.txt
|
| 1675 |
+
courtDocument/courtJudgment_7.txt
|
| 1676 |
+
courtDocument/courtJudgment_6.txt
|
| 1677 |
+
courtDocument/courtJudgment_3.txt
|
| 1678 |
+
courtDocument/lawsuit_9.txt
|
| 1679 |
+
courtDocument/other_1.txt
|
| 1680 |
+
courtDocument/courtJudgment_0.txt
|
| 1681 |
+
courtDocument/other_0.txt
|
| 1682 |
+
courtDocument/propertyDeed_14.txt
|
| 1683 |
+
courtDocument/lawsuit_5.txt
|
| 1684 |
+
courtDocument/lawsuit_4.txt
|
| 1685 |
+
courtDocument/lawsuit_6.txt
|
| 1686 |
+
courtDocument/lawsuit_3.txt
|
| 1687 |
+
courtDocument/lawsuit_2.txt
|
| 1688 |
+
courtDocument/lawsuit_0.txt
|
| 1689 |
+
courtDocument/other_17.txt
|
| 1690 |
+
courtDocument/lawsuit_12.txt
|
| 1691 |
+
courtDocument/lawsuit_11.txt
|
| 1692 |
+
courtDocument/lawsuit_10.txt
|
| 1693 |
+
courtDocument/lawsuit_14.txt
|
| 1694 |
+
courtDocument/courtJudgment_18.txt
|
| 1695 |
+
courtDocument/lawsuit_17.txt
|
| 1696 |
+
courtDocument/lawsuit_16.txt
|
| 1697 |
+
insurancePolicy/insurancePolicy_3.txt
|
| 1698 |
+
insurancePolicy/insurancePolicy_0.txt
|
| 1699 |
+
insurancePolicy/insurancePolicy_1.txt
|
| 1700 |
+
insurancePolicy/insurancePolicy_5.txt
|
| 1701 |
+
insurancePolicy/insurancePolicy_18.txt
|
| 1702 |
+
insurancePolicy/insurancePolicy_7.txt
|
| 1703 |
+
insurancePolicy/insurancePolicy_14.txt
|
| 1704 |
+
insurancePolicy/insurancePolicy_15.txt
|
| 1705 |
+
insurancePolicy/insurancePolicy_17.txt
|
| 1706 |
+
insurancePolicy/insurancePolicy_9.txt
|
| 1707 |
+
insurancePolicy/insurancePolicy_8.txt
|
| 1708 |
+
insurancePolicy/insurancePolicy_16.txt
|
| 1709 |
+
insurancePolicy/insurancePolicy_13.txt
|
| 1710 |
+
insurancePolicy/insurancePolicy_10.txt
|
| 1711 |
+
invoice/invoice_9.txt
|
| 1712 |
+
invoice/invoice_11.txt
|
| 1713 |
+
invoice/proformaInvoice_4.txt
|
| 1714 |
+
invoice/proformaInvoice_5.txt
|
| 1715 |
+
invoice/invoice_10.txt
|
| 1716 |
+
invoice/proformaInvoice_18.txt
|
| 1717 |
+
invoice/invoice_12.txt
|
| 1718 |
+
invoice/proformaInvoice_7.txt
|
| 1719 |
+
invoice/proformaInvoice_6.txt
|
| 1720 |
+
invoice/invoice_13.txt
|
| 1721 |
+
invoice/proformaInvoice_19.txt
|
| 1722 |
+
invoice/invoice_17.txt
|
| 1723 |
+
invoice/proformaInvoice_2.txt
|
| 1724 |
+
invoice/proformaInvoice_3.txt
|
| 1725 |
+
invoice/invoice_16.txt
|
| 1726 |
+
invoice/proformaInvoice_1.txt
|
| 1727 |
+
invoice/proformaInvoice_0.txt
|
| 1728 |
+
invoice/invoice_15.txt
|
| 1729 |
+
invoice/invoice_18.txt
|
| 1730 |
+
invoice/invoice_0.txt
|
| 1731 |
+
invoice/proformaInvoice_12.txt
|
| 1732 |
+
invoice/proformaInvoice_13.txt
|
| 1733 |
+
invoice/invoice_1.txt
|
| 1734 |
+
invoice/invoice_19.txt
|
| 1735 |
+
invoice/proformaInvoice_11.txt
|
| 1736 |
+
invoice/proformaInvoice_10.txt
|
| 1737 |
+
invoice/invoice_2.txt
|
| 1738 |
+
invoice/proformaInvoice_14.txt
|
| 1739 |
+
invoice/invoice_6.txt
|
| 1740 |
+
invoice/invoice_7.txt
|
| 1741 |
+
invoice/proformaInvoice_15.txt
|
| 1742 |
+
invoice/proformaInvoice_17.txt
|
| 1743 |
+
invoice/invoice_5.txt
|
| 1744 |
+
invoice/proformaInvoice_8.txt
|
| 1745 |
+
invoice/proformaInvoice_9.txt
|
| 1746 |
+
invoice/invoice_4.txt
|
| 1747 |
+
invoice/proformaInvoice_16.txt
|
| 1748 |
+
vaccinationCard/vaccinationCard_17_synth_1.txt
|
| 1749 |
+
vehicleDocument/vehicleHistory_1_synth_1.txt
|
| 1750 |
+
passport/passport_1_synth_3.txt
|
| 1751 |
+
marriageCertificate/marriageCertificate_11_synth_6.txt
|
| 1752 |
+
marriageCertificate/marriageCertificate_11_synth_3.txt
|
| 1753 |
+
cv/cv_19_synth_1.txt
|
| 1754 |
+
bankStatement/bankStatement_3_synth_7.txt
|
| 1755 |
+
bankStatement/bankStatement_3_synth_2.txt
|
| 1756 |
+
courtDocument/courtJudgment_1.txt
|
| 1757 |
+
invoice/invoice_3.txt
|
retrieve_multilang.py
ADDED
|
@@ -0,0 +1,263 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import json
|
| 3 |
+
import pytesseract
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
from PIL import Image
|
| 6 |
+
from pdf2image import convert_from_path
|
| 7 |
+
from langchain_ollama import OllamaLLM
|
| 8 |
+
|
| 9 |
+
# --- KONFIGURACJA ---
|
| 10 |
+
pytesseract.pytesseract.tesseract_cmd = r'/opt/homebrew/bin/tesseract'
|
| 11 |
+
|
| 12 |
+
# Folder wejściowy
|
| 13 |
+
INPUT_DIR = "scans"
|
| 14 |
+
HISTORY_FILE = "processed_real_scans_files.txt" # Plik z listą zrobionych skanów
|
| 15 |
+
MODEL_NAME = "llama3"
|
| 16 |
+
|
| 17 |
+
# Definicja języków
|
| 18 |
+
TARGET_LANGUAGES = {
|
| 19 |
+
"pl": "Polish",
|
| 20 |
+
"en": "English",
|
| 21 |
+
"de": "German",
|
| 22 |
+
"fr": "French",
|
| 23 |
+
"es": "Spanish",
|
| 24 |
+
"it": "Italian",
|
| 25 |
+
"uk": "Ukrainian"
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
llm = OllamaLLM(model=MODEL_NAME, temperature=0)
|
| 29 |
+
|
| 30 |
+
# NOWA, SKONSOLIDOWANA LISTA TYPÓW (zgodna z nowym Enumem)
|
| 31 |
+
ALLOWED_TYPES = [
|
| 32 |
+
# Financial
|
| 33 |
+
"taxDocument", "invoice", "receipt", "utilityBill", "bankStatement",
|
| 34 |
+
"loanAgreement", "insurancePolicy",
|
| 35 |
+
|
| 36 |
+
# Legal
|
| 37 |
+
"notarialDeed", "courtDocument", "powerOfAttorney", "contract",
|
| 38 |
+
|
| 39 |
+
# Personal
|
| 40 |
+
"idCard", "passport", "birthCertificate", "marriageCertificate",
|
| 41 |
+
"deathCertificate", "officialCertificate", "drivingLicense",
|
| 42 |
+
"educationDocument", "cv",
|
| 43 |
+
|
| 44 |
+
# Health
|
| 45 |
+
"medicalDocument", "prescription", "referral", "vaccinationCard",
|
| 46 |
+
"sanitaryBooklet",
|
| 47 |
+
|
| 48 |
+
# Property
|
| 49 |
+
"propertyDeed", "rentalAgreement", "vehicleDocument", "technicalInspection",
|
| 50 |
+
|
| 51 |
+
# Other
|
| 52 |
+
"documentScan", "application", "certificate", "other"
|
| 53 |
+
]
|
| 54 |
+
|
| 55 |
+
|
| 56 |
+
# --- OBSŁUGA HISTORII (RESUME) ---
|
| 57 |
+
def load_history():
|
| 58 |
+
"""Wczytuje listę przetworzonych plików do setu (dla szybkiego wyszukiwania)."""
|
| 59 |
+
if not os.path.exists(HISTORY_FILE):
|
| 60 |
+
return set()
|
| 61 |
+
with open(HISTORY_FILE, 'r', encoding='utf-8') as f:
|
| 62 |
+
return set(line.strip() for line in f if line.strip())
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
def mark_as_done(rel_path):
|
| 66 |
+
"""Dopisuje plik do historii."""
|
| 67 |
+
with open(HISTORY_FILE, 'a', encoding='utf-8') as f:
|
| 68 |
+
f.write(f"{rel_path}\n")
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
# --- OCR I LLM ---
|
| 72 |
+
def perform_ocr(file_path):
|
| 73 |
+
text = ""
|
| 74 |
+
try:
|
| 75 |
+
langs = 'pol+eng'
|
| 76 |
+
if file_path.suffix.lower() == ".pdf":
|
| 77 |
+
pages = convert_from_path(file_path)
|
| 78 |
+
for page in pages:
|
| 79 |
+
text += pytesseract.image_to_string(page, lang=langs)
|
| 80 |
+
else:
|
| 81 |
+
text = pytesseract.image_to_string(Image.open(file_path), lang=langs)
|
| 82 |
+
except Exception as e:
|
| 83 |
+
print(f" [!] Błąd OCR: {file_path.name}: {e}")
|
| 84 |
+
return text
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
def ask_llm_json(prompt):
|
| 88 |
+
try:
|
| 89 |
+
response = llm.invoke(prompt)
|
| 90 |
+
clean = response.replace("```json", "").replace("```", "").strip()
|
| 91 |
+
start, end = clean.find('{'), clean.rfind('}') + 1
|
| 92 |
+
return json.loads(clean[start:end])
|
| 93 |
+
except Exception:
|
| 94 |
+
return None
|
| 95 |
+
|
| 96 |
+
|
| 97 |
+
def ask_llm_text(prompt):
|
| 98 |
+
try:
|
| 99 |
+
response = llm.invoke(prompt)
|
| 100 |
+
return response.strip().strip('"').strip("'")
|
| 101 |
+
except Exception:
|
| 102 |
+
return "Translation Error"
|
| 103 |
+
|
| 104 |
+
|
| 105 |
+
# --- LOGIKA PRZETWARZANIA ---
|
| 106 |
+
def get_core_metadata(text, hinted_type=None):
|
| 107 |
+
print(" 🧠 Analiza struktury dokumentu (Core Metadata)...")
|
| 108 |
+
|
| 109 |
+
# Jeśli folder sugeruje typ, przekaż go jako wskazówkę
|
| 110 |
+
hint_str = ""
|
| 111 |
+
if hinted_type in ALLOWED_TYPES:
|
| 112 |
+
hint_str = f"Strong Hint: The document is likely located in folder '{hinted_type}'."
|
| 113 |
+
|
| 114 |
+
prompt = f"""
|
| 115 |
+
Analyze the following document text.
|
| 116 |
+
{hint_str}
|
| 117 |
+
|
| 118 |
+
Extract structured data.
|
| 119 |
+
RULES:
|
| 120 |
+
1. 'summary_base': Write a factual summary in ENGLISH (5 sentences).
|
| 121 |
+
2. 'title_base': Write a title in ENGLISH format: "[Specific Type] - [Entity] - [Date]".
|
| 122 |
+
(e.g., "Tax Document (PIT-11) - Employer Name - 2023")
|
| 123 |
+
3. 'category': Must be one of: financial, legal, personal, health, property, other.
|
| 124 |
+
4. 'type': Choose the BEST MATCH from this specific list: {", ".join(ALLOWED_TYPES)}.
|
| 125 |
+
5. 'info': Specific details (e.g. "PIT-11", "Umowa o pracę", "Prąd").
|
| 126 |
+
|
| 127 |
+
Return ONLY JSON:
|
| 128 |
+
{{
|
| 129 |
+
"title_base": "...",
|
| 130 |
+
"summary_base": "...",
|
| 131 |
+
"category": "...",
|
| 132 |
+
"type": "...",
|
| 133 |
+
"info": "..."
|
| 134 |
+
}}
|
| 135 |
+
|
| 136 |
+
TEXT:
|
| 137 |
+
{text[:4000]}
|
| 138 |
+
"""
|
| 139 |
+
return ask_llm_json(prompt)
|
| 140 |
+
|
| 141 |
+
|
| 142 |
+
def translate_section(text, target_lang, content_type="text"):
|
| 143 |
+
prompt = f"""
|
| 144 |
+
Translate the following {content_type} into {target_lang}.
|
| 145 |
+
Output ONLY the translation. No explanations. No markdown.
|
| 146 |
+
|
| 147 |
+
TEXT TO TRANSLATE:
|
| 148 |
+
{text}
|
| 149 |
+
"""
|
| 150 |
+
return ask_llm_text(prompt)
|
| 151 |
+
|
| 152 |
+
|
| 153 |
+
def save_file(root_folder, lang_code, sub_dir, filename, content):
|
| 154 |
+
path = Path(root_folder) / lang_code / sub_dir
|
| 155 |
+
path.mkdir(parents=True, exist_ok=True)
|
| 156 |
+
with open(path / filename, "w", encoding="utf-8") as f:
|
| 157 |
+
f.write(str(content))
|
| 158 |
+
|
| 159 |
+
|
| 160 |
+
def save_meta(root_folder, sub_dir, filename, content):
|
| 161 |
+
path = Path(root_folder) / sub_dir
|
| 162 |
+
path.mkdir(parents=True, exist_ok=True)
|
| 163 |
+
with open(path / filename, "w", encoding="utf-8") as f:
|
| 164 |
+
f.write(str(content))
|
| 165 |
+
|
| 166 |
+
|
| 167 |
+
def process_file(file_path, input_root):
|
| 168 |
+
rel_path = file_path.relative_to(input_root)
|
| 169 |
+
rel_path_str = str(rel_path) # Klucz do pliku historii
|
| 170 |
+
|
| 171 |
+
base_filename = rel_path.stem + ".txt"
|
| 172 |
+
sub_dir = rel_path.parent
|
| 173 |
+
hinted_type = sub_dir.name if sub_dir.name != input_root.name else None
|
| 174 |
+
|
| 175 |
+
# 1. OCR
|
| 176 |
+
raw_text = perform_ocr(file_path)
|
| 177 |
+
|
| 178 |
+
if not raw_text.strip():
|
| 179 |
+
print(" ⚠️ Pusty OCR - oznaczam jako przetworzony (bez wyników).")
|
| 180 |
+
mark_as_done(rel_path_str)
|
| 181 |
+
return
|
| 182 |
+
|
| 183 |
+
# Zapisz oryginał (Content) - to zostaje, bo to dane wejściowe
|
| 184 |
+
save_meta("content", sub_dir, base_filename, raw_text)
|
| 185 |
+
|
| 186 |
+
# 2. Analiza podstawowa (Core)
|
| 187 |
+
core_data = get_core_metadata(raw_text, hinted_type)
|
| 188 |
+
|
| 189 |
+
if not core_data:
|
| 190 |
+
print(" ❌ Błąd analizy AI. Przerywam dla tego pliku.")
|
| 191 |
+
return
|
| 192 |
+
|
| 193 |
+
# Zapisz dane niezależne od języka
|
| 194 |
+
save_meta("category", sub_dir, base_filename, core_data.get("category", "other"))
|
| 195 |
+
save_meta("type", sub_dir, base_filename, core_data.get("type", "other"))
|
| 196 |
+
save_meta("info", sub_dir, base_filename, core_data.get("info", "none"))
|
| 197 |
+
|
| 198 |
+
base_title = core_data.get("title_base", "Document")
|
| 199 |
+
base_summary = core_data.get("summary_base", "No summary.")
|
| 200 |
+
|
| 201 |
+
# 3. Pętla Tłumaczeń (TYLKO ETYKIETY)
|
| 202 |
+
print(" 🌍 Rozpoczynam generowanie etykiet (tytuły/podsumowania)...")
|
| 203 |
+
|
| 204 |
+
for code, lang_name in TARGET_LANGUAGES.items():
|
| 205 |
+
print(f" -> [{code.upper()}] {lang_name}...", end="", flush=True)
|
| 206 |
+
|
| 207 |
+
# A. Tytuł
|
| 208 |
+
if code == "en":
|
| 209 |
+
final_title = base_title
|
| 210 |
+
else:
|
| 211 |
+
final_title = translate_section(base_title, lang_name, "title")
|
| 212 |
+
save_file("titles", code, sub_dir, base_filename, final_title)
|
| 213 |
+
|
| 214 |
+
# B. Streszczenie
|
| 215 |
+
if code == "en":
|
| 216 |
+
final_summary = base_summary
|
| 217 |
+
else:
|
| 218 |
+
final_summary = translate_section(base_summary, lang_name, "summary")
|
| 219 |
+
save_file("summary", code, sub_dir, base_filename, final_summary)
|
| 220 |
+
|
| 221 |
+
# C. Pełna treść - USUNIĘTO (Oszczędność czasu i tokenów)
|
| 222 |
+
|
| 223 |
+
print(" OK.")
|
| 224 |
+
|
| 225 |
+
# SUKCES! Dopiero tutaj zapisujemy do historii
|
| 226 |
+
print(f"✅ Zakończono: {file_path.name}")
|
| 227 |
+
mark_as_done(rel_path_str)
|
| 228 |
+
|
| 229 |
+
|
| 230 |
+
def main():
|
| 231 |
+
input_root = Path(INPUT_DIR)
|
| 232 |
+
if not input_root.exists():
|
| 233 |
+
print(f"Brak folderu wejściowego: {INPUT_DIR}")
|
| 234 |
+
return
|
| 235 |
+
|
| 236 |
+
# Wczytaj historię
|
| 237 |
+
processed_files = load_history()
|
| 238 |
+
print(f"📂 Załadowano historię: {len(processed_files)} plików już przetworzonych.")
|
| 239 |
+
|
| 240 |
+
all_files = [f for f in input_root.rglob("*") if
|
| 241 |
+
f.is_file() and f.suffix.lower() in [".pdf", ".jpg", ".png", ".jpeg"]]
|
| 242 |
+
print(f"🚀 Znaleziono łącznie {len(all_files)} plików do analizy.")
|
| 243 |
+
|
| 244 |
+
for f in all_files:
|
| 245 |
+
rel_path_str = str(f.relative_to(input_root))
|
| 246 |
+
|
| 247 |
+
# Sprawdzenie w historii
|
| 248 |
+
if rel_path_str in processed_files:
|
| 249 |
+
print(f"⏩ Pomijam (już w historii): {rel_path_str}")
|
| 250 |
+
continue
|
| 251 |
+
|
| 252 |
+
print(f"\n📄 Przetwarzanie: {rel_path_str}")
|
| 253 |
+
try:
|
| 254 |
+
process_file(f, input_root)
|
| 255 |
+
except KeyboardInterrupt:
|
| 256 |
+
print("\n🛑 Zatrzymano przez użytkownika. Postęp zapisany.")
|
| 257 |
+
break
|
| 258 |
+
except Exception as e:
|
| 259 |
+
print(f"\n❌ Krytyczny błąd dla {rel_path_str}: {e}")
|
| 260 |
+
|
| 261 |
+
|
| 262 |
+
if __name__ == "__main__":
|
| 263 |
+
main()
|
scans/.DS_Store
ADDED
|
Binary file (14.3 kB). View file
|
|
|
semantic_simillarity/convert_to_tflite_download_vocab.ipynb
ADDED
|
@@ -0,0 +1,419 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "2f8fed232ccbd3aa",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [
|
| 9 |
+
{
|
| 10 |
+
"name": "stderr",
|
| 11 |
+
"output_type": "stream",
|
| 12 |
+
"text": [
|
| 13 |
+
"/Users/przemo/Coding/.venv/lib/python3.13/site-packages/keras/src/export/tf2onnx_lib.py:8: FutureWarning: In the future `np.object` will be defined as the corresponding NumPy scalar.\n",
|
| 14 |
+
" if not hasattr(np, \"object\"):\n",
|
| 15 |
+
"/Users/przemo/Coding/.venv/lib/python3.13/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
|
| 16 |
+
" from .autonotebook import tqdm as notebook_tqdm\n"
|
| 17 |
+
]
|
| 18 |
+
},
|
| 19 |
+
{
|
| 20 |
+
"name": "stdout",
|
| 21 |
+
"output_type": "stream",
|
| 22 |
+
"text": [
|
| 23 |
+
"✅ Setup complete.\n"
|
| 24 |
+
]
|
| 25 |
+
}
|
| 26 |
+
],
|
| 27 |
+
"source": [
|
| 28 |
+
"import os\n",
|
| 29 |
+
"import torch\n",
|
| 30 |
+
"import numpy as np\n",
|
| 31 |
+
"import tensorflow as tf\n",
|
| 32 |
+
"import matplotlib.pyplot as plt\n",
|
| 33 |
+
"from sentence_transformers import SentenceTransformer\n",
|
| 34 |
+
"from transformers import AutoTokenizer\n",
|
| 35 |
+
"from pathlib import Path\n",
|
| 36 |
+
"\n",
|
| 37 |
+
"# Konfiguracja\n",
|
| 38 |
+
"MODEL_NAME = 'sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2'\n",
|
| 39 |
+
"MAX_SEQ_LENGTH = 128\n",
|
| 40 |
+
"TEMP_SAVED_MODEL_DIR = \"temp_saved_model\"\n",
|
| 41 |
+
"results = {}\n",
|
| 42 |
+
"\n",
|
| 43 |
+
"print(\"✅ Setup complete.\")"
|
| 44 |
+
]
|
| 45 |
+
},
|
| 46 |
+
{
|
| 47 |
+
"cell_type": "code",
|
| 48 |
+
"execution_count": 2,
|
| 49 |
+
"id": "d907dcce",
|
| 50 |
+
"metadata": {},
|
| 51 |
+
"outputs": [
|
| 52 |
+
{
|
| 53 |
+
"name": "stdout",
|
| 54 |
+
"output_type": "stream",
|
| 55 |
+
"text": [
|
| 56 |
+
"🚀 Loading model: sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2\n",
|
| 57 |
+
"📄 Generated vocab.txt\n"
|
| 58 |
+
]
|
| 59 |
+
}
|
| 60 |
+
],
|
| 61 |
+
"source": [
|
| 62 |
+
"print(f\"🚀 Loading model: {MODEL_NAME}\")\n",
|
| 63 |
+
"model = SentenceTransformer(MODEL_NAME)\n",
|
| 64 |
+
"tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)\n",
|
| 65 |
+
"\n",
|
| 66 |
+
"# Generowanie vocab.txt\n",
|
| 67 |
+
"vocab = tokenizer.get_vocab()\n",
|
| 68 |
+
"sorted_vocab = sorted(vocab.items(), key=lambda x: x[1])\n",
|
| 69 |
+
"\n",
|
| 70 |
+
"with open(\"vocab.txt\", \"w\", encoding=\"utf-8\") as f:\n",
|
| 71 |
+
" for token, token_id in sorted_vocab:\n",
|
| 72 |
+
" f.write(token + \"\\n\")\n",
|
| 73 |
+
"\n",
|
| 74 |
+
"print(\"📄 Generated vocab.txt\")"
|
| 75 |
+
]
|
| 76 |
+
},
|
| 77 |
+
{
|
| 78 |
+
"cell_type": "code",
|
| 79 |
+
"execution_count": 5,
|
| 80 |
+
"id": "ae06133b",
|
| 81 |
+
"metadata": {},
|
| 82 |
+
"outputs": [
|
| 83 |
+
{
|
| 84 |
+
"name": "stdout",
|
| 85 |
+
"output_type": "stream",
|
| 86 |
+
"text": [
|
| 87 |
+
"🏗️ Converting to TensorFlow SavedModel...\n"
|
| 88 |
+
]
|
| 89 |
+
},
|
| 90 |
+
{
|
| 91 |
+
"name": "stderr",
|
| 92 |
+
"output_type": "stream",
|
| 93 |
+
"text": [
|
| 94 |
+
"Some weights of the PyTorch model were not used when initializing the TF 2.0 model TFBertModel: ['embeddings.position_ids']\n",
|
| 95 |
+
"- This IS expected if you are initializing TFBertModel from a PyTorch model trained on another task or with another architecture (e.g. initializing a TFBertForSequenceClassification model from a BertForPreTraining model).\n",
|
| 96 |
+
"- This IS NOT expected if you are initializing TFBertModel from a PyTorch model that you expect to be exactly identical (e.g. initializing a TFBertForSequenceClassification model from a BertForSequenceClassification model).\n",
|
| 97 |
+
"All the weights of TFBertModel were initialized from the PyTorch model.\n",
|
| 98 |
+
"If your task is similar to the task the model of the checkpoint was trained on, you can already use TFBertModel for predictions without further training.\n"
|
| 99 |
+
]
|
| 100 |
+
},
|
| 101 |
+
{
|
| 102 |
+
"name": "stdout",
|
| 103 |
+
"output_type": "stream",
|
| 104 |
+
"text": [
|
| 105 |
+
"INFO:tensorflow:Assets written to: temp_saved_model/assets\n"
|
| 106 |
+
]
|
| 107 |
+
},
|
| 108 |
+
{
|
| 109 |
+
"name": "stderr",
|
| 110 |
+
"output_type": "stream",
|
| 111 |
+
"text": [
|
| 112 |
+
"INFO:tensorflow:Assets written to: temp_saved_model/assets\n"
|
| 113 |
+
]
|
| 114 |
+
},
|
| 115 |
+
{
|
| 116 |
+
"name": "stdout",
|
| 117 |
+
"output_type": "stream",
|
| 118 |
+
"text": [
|
| 119 |
+
"✅ SavedModel ready in: temp_saved_model\n"
|
| 120 |
+
]
|
| 121 |
+
}
|
| 122 |
+
],
|
| 123 |
+
"source": [
|
| 124 |
+
"from transformers import TFAutoModel\n",
|
| 125 |
+
"\n",
|
| 126 |
+
"class TFBertEmbeddingModel(tf.Module):\n",
|
| 127 |
+
" def __init__(self, model_name):\n",
|
| 128 |
+
" super().__init__()\n",
|
| 129 |
+
" # from_pt=True forces the conversion from PyTorch weights\n",
|
| 130 |
+
" # we also explicitly set use_safetensors=False if the default loader fails\n",
|
| 131 |
+
" try:\n",
|
| 132 |
+
" self.transformer = TFAutoModel.from_pretrained(model_name, from_pt=True)\n",
|
| 133 |
+
" except Exception:\n",
|
| 134 |
+
" self.transformer = TFAutoModel.from_pretrained(model_name, from_pt=True, use_safetensors=False)\n",
|
| 135 |
+
"\n",
|
| 136 |
+
" @tf.function(input_signature=[\n",
|
| 137 |
+
" tf.TensorSpec(shape=[1, MAX_SEQ_LENGTH], dtype=tf.int32, name=\"input_ids\")\n",
|
| 138 |
+
" ])\n",
|
| 139 |
+
" def __call__(self, input_ids):\n",
|
| 140 |
+
" # Create attention mask\n",
|
| 141 |
+
" attention_mask = tf.cast(tf.math.not_equal(input_ids, 0), tf.int32)\n",
|
| 142 |
+
" \n",
|
| 143 |
+
" # Inference using the native TF model\n",
|
| 144 |
+
" outputs = self.transformer(input_ids=input_ids, attention_mask=attention_mask)\n",
|
| 145 |
+
" \n",
|
| 146 |
+
" # Return the last_hidden_state (Batch, Sequence, HiddenSize)\n",
|
| 147 |
+
" return outputs.last_hidden_state\n",
|
| 148 |
+
"\n",
|
| 149 |
+
"print(\"🏗️ Converting to TensorFlow SavedModel...\")\n",
|
| 150 |
+
"tf_model = TFBertEmbeddingModel(MODEL_NAME)\n",
|
| 151 |
+
"tf.saved_model.save(tf_model, TEMP_SAVED_MODEL_DIR)\n",
|
| 152 |
+
"print(f\"✅ SavedModel ready in: {TEMP_SAVED_MODEL_DIR}\")"
|
| 153 |
+
]
|
| 154 |
+
},
|
| 155 |
+
{
|
| 156 |
+
"cell_type": "code",
|
| 157 |
+
"execution_count": 6,
|
| 158 |
+
"id": "4e9aa5ca",
|
| 159 |
+
"metadata": {},
|
| 160 |
+
"outputs": [],
|
| 161 |
+
"source": [
|
| 162 |
+
"def convert_and_get_size(converter, name):\n",
|
| 163 |
+
" tflite_model = converter.convert()\n",
|
| 164 |
+
" path = f\"model_{name}.tflite\"\n",
|
| 165 |
+
" with open(path, \"wb\") as f:\n",
|
| 166 |
+
" f.write(tflite_model)\n",
|
| 167 |
+
" size_mb = os.path.getsize(path) / (1024 * 1024)\n",
|
| 168 |
+
" return size_mb, path"
|
| 169 |
+
]
|
| 170 |
+
},
|
| 171 |
+
{
|
| 172 |
+
"cell_type": "code",
|
| 173 |
+
"execution_count": null,
|
| 174 |
+
"id": "3249ce39",
|
| 175 |
+
"metadata": {},
|
| 176 |
+
"outputs": [
|
| 177 |
+
{
|
| 178 |
+
"name": "stdout",
|
| 179 |
+
"output_type": "stream",
|
| 180 |
+
"text": [
|
| 181 |
+
"🧪 Running conversion benchmarks with compatibility fixes...\n"
|
| 182 |
+
]
|
| 183 |
+
},
|
| 184 |
+
{
|
| 185 |
+
"name": "stderr",
|
| 186 |
+
"output_type": "stream",
|
| 187 |
+
"text": [
|
| 188 |
+
"/Users/przemo/Coding/.venv/lib/python3.13/site-packages/keras/src/export/tf2onnx_lib.py:8: FutureWarning: In the future `np.object` will be defined as the corresponding NumPy scalar.\n",
|
| 189 |
+
" if not hasattr(np, \"object\"):\n"
|
| 190 |
+
]
|
| 191 |
+
},
|
| 192 |
+
{
|
| 193 |
+
"ename": "NameError",
|
| 194 |
+
"evalue": "name 'TEMP_SAVED_MODEL_DIR' is not defined",
|
| 195 |
+
"output_type": "error",
|
| 196 |
+
"traceback": [
|
| 197 |
+
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
|
| 198 |
+
"\u001b[31mNameError\u001b[39m Traceback (most recent call last)",
|
| 199 |
+
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[2]\u001b[39m\u001b[32m, line 24\u001b[39m\n\u001b[32m 21\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m converter\n\u001b[32m 23\u001b[39m \u001b[38;5;66;03m# 1. Base Model (Float32) - Najbezpieczniejszy dla precyzji\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m24\u001b[39m converter_f32 = \u001b[43mget_base_converter\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 25\u001b[39m size, _ = convert_and_get_size(converter_f32, \u001b[33m\"\u001b[39m\u001b[33mfloat32\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 26\u001b[39m results[\u001b[33m\"\u001b[39m\u001b[33mFloat32 (Base)\u001b[39m\u001b[33m\"\u001b[39m] = size\n",
|
| 200 |
+
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[2]\u001b[39m\u001b[32m, line 6\u001b[39m, in \u001b[36mget_base_converter\u001b[39m\u001b[34m()\u001b[39m\n\u001b[32m 4\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mget_base_converter\u001b[39m():\n\u001b[32m 5\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Tworzy bazowy konwerter z ustawieniami pod Fluttera.\"\"\"\u001b[39;00m\n\u001b[32m----> \u001b[39m\u001b[32m6\u001b[39m converter = tf.lite.TFLiteConverter.from_saved_model(\u001b[43mTEMP_SAVED_MODEL_DIR\u001b[49m)\n\u001b[32m 8\u001b[39m \u001b[38;5;66;03m# WYMUSZENIE KOMPATYBILNOŚCI WSTECZNEJ:\u001b[39;00m\n\u001b[32m 9\u001b[39m \u001b[38;5;66;03m# Ustawiamy wsparcie dla standardowych opów TFLite oraz dodatkowych TF Ops\u001b[39;00m\n\u001b[32m 10\u001b[39m converter.target_spec.supported_ops = [\n\u001b[32m 11\u001b[39m tf.lite.OpsSet.TFLITE_BUILTINS, \u001b[38;5;66;03m# Standardowe operatory TFLite\u001b[39;00m\n\u001b[32m 12\u001b[39m tf.lite.OpsSet.SELECT_TF_OPS \u001b[38;5;66;03m# Wymagane dla złożonych modeli jak BERT\u001b[39;00m\n\u001b[32m 13\u001b[39m ]\n",
|
| 201 |
+
"\u001b[31mNameError\u001b[39m: name 'TEMP_SAVED_MODEL_DIR' is not defined"
|
| 202 |
+
]
|
| 203 |
+
}
|
| 204 |
+
],
|
| 205 |
+
"source": [
|
| 206 |
+
"print(\"🧪 Running conversion benchmarks with compatibility fixes...\")\n",
|
| 207 |
+
"\n",
|
| 208 |
+
"def get_base_converter():\n",
|
| 209 |
+
" \"\"\"Tworzy bazowy konwerter z ustawieniami pod Fluttera.\"\"\"\n",
|
| 210 |
+
" converter = tf.lite.TFLiteConverter.from_saved_model(TEMP_SAVED_MODEL_DIR)\n",
|
| 211 |
+
" \n",
|
| 212 |
+
" # WYMUSZENIE KOMPATYBILNOŚCI WSTECZNEJ:\n",
|
| 213 |
+
" # Ustawiamy wsparcie dla standardowych opów TFLite oraz dodatkowych TF Ops\n",
|
| 214 |
+
" converter.target_spec.supported_ops = [\n",
|
| 215 |
+
" tf.lite.OpsSet.TFLITE_BUILTINS, # Standardowe operatory TFLite\n",
|
| 216 |
+
" tf.lite.OpsSet.SELECT_TF_OPS # Wymagane dla złożonych modeli jak BERT\n",
|
| 217 |
+
" ]\n",
|
| 218 |
+
" \n",
|
| 219 |
+
" # Wyłączenie konwersji list do nowoczesnych operatorów (zapobiega wersji 12)\n",
|
| 220 |
+
" converter._experimental_lower_tensor_list_ops = True\n",
|
| 221 |
+
" \n",
|
| 222 |
+
" # Wymuszenie formatu float32 dla wejść/wyjść\n",
|
| 223 |
+
" converter.target_spec.supported_types = [tf.float32]\n",
|
| 224 |
+
" \n",
|
| 225 |
+
" return converter\n",
|
| 226 |
+
"\n",
|
| 227 |
+
"# 1. Base Model (Float32) - Najbezpieczniejszy dla precyzji\n",
|
| 228 |
+
"converter_f32 = get_base_converter()\n",
|
| 229 |
+
"size, _ = convert_and_get_size(converter_f32, \"float32\")\n",
|
| 230 |
+
"results[\"Float32 (Base)\"] = size\n",
|
| 231 |
+
"\n",
|
| 232 |
+
"# 2. Dynamic Range Quantization (INT8 Weights) - Najlepszy rozmiar\n",
|
| 233 |
+
"converter_dr = get_base_converter()\n",
|
| 234 |
+
"converter_dr.optimizations = [tf.lite.Optimize.DEFAULT]\n",
|
| 235 |
+
"size, _ = convert_and_get_size(converter_dr, \"dynamic_range\")\n",
|
| 236 |
+
"results[\"Dynamic Range (INT8)\"] = size\n",
|
| 237 |
+
"\n",
|
| 238 |
+
"# 3. Float16 Quantization (GPU Optimized)\n",
|
| 239 |
+
"converter_f16 = get_base_converter()\n",
|
| 240 |
+
"converter_f16.optimizations = [tf.lite.Optimize.DEFAULT]\n",
|
| 241 |
+
"converter_f16.target_spec.supported_types = [tf.float16] \n",
|
| 242 |
+
"size, _ = convert_and_get_size(converter_f16, \"float16\")\n",
|
| 243 |
+
"results[\"Float16\"] = size\n",
|
| 244 |
+
"\n",
|
| 245 |
+
"print(\"✅ All conversions finished with mobile compatibility flags.\")"
|
| 246 |
+
]
|
| 247 |
+
},
|
| 248 |
+
{
|
| 249 |
+
"cell_type": "code",
|
| 250 |
+
"execution_count": null,
|
| 251 |
+
"id": "c69ff94c",
|
| 252 |
+
"metadata": {},
|
| 253 |
+
"outputs": [
|
| 254 |
+
{
|
| 255 |
+
"data": {
|
| 256 |
+
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA+0AAAIQCAYAAAD0PI9gAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAYpJJREFUeJzt3Qm8TdX///HPNc/zlIxFmTKEUCpCkhTR9JWhpBJKSvJNyhC+KqJIg0gzmr5JJA3KnFIiQkLJWObM5/94r+9/n985x7n3nju4d1/39Xw8jnvvPvvss/Y+Z2/7s9ZnrRUXCAQCBgAAAAAAfCdLehcAAAAAAABER9AOAAAAAIBPEbQDAAAAAOBTBO0AAAAAAPgUQTsAAAAAAD5F0A4AAAAAgE8RtAMAAAAA4FME7QAAAAAA+BRBOwAAAAAAPkXQDiDDmzJlisXFxdlvv/1mZ6qU7OPjjz/uXptaVAZtT2VC2qpQoYJ17drV14f96quvtu7du/v2/Pjyyy/duvrp0THVsQ2ldXTuZDRNmjRxD3CcYj1vvv3220TXbdiwoT300EN8rYB0QtAOINXoP/9YHrpZ9gK/aA/dHITeTOfLly/JZZkwYcJpCSp1M6wyVq5cOerzc+fODe7HjBkzLKP56KOP7PLLL7cSJUpYnjx57JxzzrEbb7zRZs+ebX6wfft2e/DBB61KlSqufHnz5rW6devasGHDbM+ePeldvExvwYIF9umnn1r//v1PCZL1eP3116Meo0suucQ9X6NGjVQ7hqfrGnCmOHr0qI0dO9bq1KljBQoUsEKFCln16tXtzjvvtDVr1tiZYPXq1a7i5XRX6J48edKmTp1qDRo0sCJFilj+/PntvPPOs86dO9vixYvtTKBzevz48bZt27b0LgqQKWVL7wIAOHO89tprYX/rJkZBbOTyqlWr2j///ON+v+WWW1zLXKjixYsn6X07depkN998s+XMmTPshr1YsWKnpVUyV65ctn79elu6dKlddNFFYc+98cYb7vnDhw9bRvPUU09Zv379XNA+YMAAFxRrPz/77DN7++237aqrrnLrlS9f3n1+2bNnT9PyLVu2zH1XDhw4YLfeeqsL1kWtRCNHjrT58+e7gPFMtnbtWsuSxb/17U8++aQ1a9bMKlWqdMpzOi/efPNN99mFUkC1cOFC93xqiu8acNlll7nvb44cORJ8vdbJlu3MvU1q3769ffLJJ+4arMyIY8eOuWB95syZdvHFF7uKsTMhaB88eLCrbI3MpEjNa8W9997rAtrrrrvOOnbs6L43Old1fFXxGVoRnVFp31S5o/NqyJAh6V0cINM5c/83ApDmIm/G1cKgoD1yuXgtHxdeeGHU55Mia9as7pFWzj33XDt+/Li99dZbYUG7AvX333/fWrdube+++65lJNqfoUOHWosWLaLezO7YsSP4u1pEUzvASoxa0du1a+c+5++///6UgOKJJ56wl156yc5EgUDAfbdy584dVjHlN/qOfPzxxzZx4sSoz6vC5b///a/t2rXLBdMeBfIlS5Z02St///33aS+nKj1i+f6m9Xc8rSvAFJzrvPn3v/8d9txzzz2XKbJWEqu0SUr2jwJZVXy8+OKLYc8988wztnPnTktLavVXFkVqf3913nTo0MFVxqsiJDW7XAFInH+r6wEgmf1Z1aKyatUq++qrr4JpuaF9PHVD2qdPHytbtqwLgtQq+J///Mfd7MRKrVPvvPNO2GuUWn7o0CGXTh6Ngs1WrVq51gql/KtFMlrqpMp+xRVXuCCtTJkyLvU7vrKpJefSSy91aeJKyVSFgV6fVAqk9u3b59KUo1G6fHx92kPTnyMfka1byS3vCy+8YH/88YeNHj06aguggr6BAweGLdONtNJ99RmXLl3aevbseUowou+FUrJ//PFHl2Gg7AJ9H7yuDfoOKeVVn8X555/vsg6ijRegFkp97vpsixYtavfdd98p2RaTJ092n6uOpcpUrVo1e/7550/ZFx2za665xubMmWP16tVz7639954LbTlW66huoBXw6iZd7924cWNXWRbq888/Dx53pUGr1eznn3+Oui/KrtB7aL2CBQvabbfd5r7XiVHArsqf5s2bR31e76n9nj59ethyBe06dpEVbwmNnZBYf/OErgHR+rRHE/keSTk+aqVX66sqJ/Q9v/baa933N3Kb0frSh75Xcr4/sdiwYYP7Ge181+eg71Eolf32229355neW+fVK6+8EraOd1ynTZvmvpNnn32223cFenv37rUjR464667Kr+ufjpuWpeQc+eabb1zFqb77atFWQOnR9+aGG25wvzdt2jSse1Z8ff91zurYK7Vd2zzrrLPs+uuvDx6vaDZu3Ogq1qIdS71f6LUzKf//KPNJGQ/6LHQNUGZRtC5X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G+yss86yunXrulHg582bF3x+7dq1boo39X0X/Vy5cqXt2LEjuM7cuXNda3m1atXSZR8AAAAAAEgt6drS/uCDD1qbNm1cSvzWrVvtscces6xZs9ott9zipnjr1q2bS2MvUqSIC8R79+7tAnUNQidXXnmlC847depko0aNcv3YBw4c6OZ2j9aSDgAAAABARpKuQfvvv//uAvTdu3e7/uSNGzd207npdxkzZoxLGWjfvr0b7V0jw0+YMCH4egX4M2fOdKPFK5jPmzevdenSxYYMGZKOewUAAAAAQOqICwQCAcvkNBCdWvY1NzwD0QEAAAAA/BKH+qpPOwAAAAAA+D8E7QAAAAAA+BRBOwAAAAAAPkXQDgAAAACATxG0AwAAAADgUwTtAAAAAAD4FEE7AAAAAAA+RdAOAAAAAIBPEbQDAAAAAOBTBO0AAAAAAPgUQTsAAAAAAD5F0A4AAAAAgE8RtAMAAAAA4FME7QAAAAAA+BRBOwAAAAAAPkXQDgAAAACATxG0AwAAAADgUwTtAAAAAAD4FEE7AAAAAAA+RdAOAAAAAIBPEbQDAAAAAOBTBO0AAAAAAPgUQTsAAAAAAD5F0A4AAAAAgE8RtAMAAAAA4FME7QAAAAAA+BRBOwAAAAAAPkXQDgAAAACATxG0I9O68cYbLS4uzj1uvvnmqOvs37/fzj333OB6EydODD7XtWvX4PJoj8RMnz7dLrnkEitWrJjlypXLypYt67a5efPmsPU+++wza9y4seXJk8cKFChgV111lX333XcJbvu3334LK8vo0aPDnp8wYULY82vWrHHLp0yZErY8S5YsVrBgQWvUqJFNmzYt0X0CAAAAkLoI2pEpTZ482QXNienVq5f9+uuvUZ9TMN+gQYOwR968ed1zpUqVSnC7X3zxhd100022cOFCy549u51//vm2detWe/XVV61du3bB9ebMmeOC9AULFliRIkUsZ86cbtmll15qK1eujHl/FaSfPHky+Pdzzz2X6GuqVq1q9erVc69bvHix3XLLLbZ06dKY3xMAAABAyhG0I9PZsGGD3Xvvva71uEyZMvGup5blqVOnuhb5aB599FEXzHqP9957z44dO+ae6927d4JlUBAeCATc7ytWrLAffvjBbr31Vvf3pk2bguv169fPTpw4YQ0bNnSt56pAqFChgh06dMgeeeSRmPZXlQLa508++STYcv/zzz+75YkF+grSvdcpeP/6669jek8AAAAAqYOgHZnK8ePHrWPHji7t+4033rCsWbNGXW/Lli121113Wd26dW3YsGExbXvcuHF29OhR19reo0ePBNdVuruXQl+7dm2rVauWvf7661aiRAl78cUX3fI//vgj2Jp+7bXXWrZs2Sx//vzWokWLYPCtgD4x7du3dz+fffbZsJ8dOnRI9LWqWFi/fn1YdgEAAACAtEPQjkxl8ODBtmTJEteKXLFixajrqEW5U6dOrtX8zTffTLRFWg4cOGAvvPCC+71bt25WuHDhBNdv0qSJS89XgL9t2zb78ccf3fuec845wcBYFQceBfOekiVLup///POP7dy5M9GyXX755XbBBRfYp59+6lLrZ86c6dLxveA/Pk2bNnWVG7fddpv7u0uXLta2bdtE3w8AAABA6iFoR6bx7bff2ogRI1waulrb4zN27Fj76quv3M/zzjsvpm2/9NJLtmfPHtdyf//99ye6vlrQ77nnHtcyP3/+fNu7d69r+VaavfqwKyCPj5dWnxRK19frlOqvygH11U9ssDz1aVc//bPOOsv9rf72r7zySpLfGwAAAEDyEbQj0/jpp59cOvmMGTMsX7587uGN1P7uu++6vxU8q3+53HfffW5Z9erVg9vo06ePXXzxxaek3D/zzDPu9xtuuMH1OU/MyJEjbceOHS4w1qByGhX+X//6l3tOLe+rVq1yo8l7tG7k77lz57bixYvHtO+qpFDr/759+1yKvVrNE6NsBFUiqMVffepl0KBBMb0fAAAAgNRB0I5M5/Dhw3bw4EH38FqtFXiH/i3eOhr0zXPkyJGwv70B67zg/8EHHzzl/TRSe5UqVdzDo8oBb9C5Xbt2BTMBPEqbP/vss61GjRru7//+97+ujJqCbu7cuW5Z8+bN4+2TH0nTxSltXzStnAL3WIW2yOvYAQAAAEg7BO3INBSsKigPfZQvX949p+nX9HehQoXcXOWh62zcuDG4jeeff96N9h7q6aefDvYB18B1kRSUr1271j0iB4dT8F65cmXXmj98+HC37KKLLnIt8DJq1CjXr1wt3mrBV593jSKvVvahQ4cmaf+feOIJ1wf+qaeeiml9pe+rhV0t/np/oU87AAAAkLYI2oEU+Pzzz+27776Lt5U9PhrcTaPXX3LJJW5UeFUMKHjv27evzZo1K7he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",
|
| 257 |
+
"text/plain": [
|
| 258 |
+
"<Figure size 1200x600 with 1 Axes>"
|
| 259 |
+
]
|
| 260 |
+
},
|
| 261 |
+
"metadata": {},
|
| 262 |
+
"output_type": "display_data"
|
| 263 |
+
},
|
| 264 |
+
{
|
| 265 |
+
"name": "stdout",
|
| 266 |
+
"output_type": "stream",
|
| 267 |
+
"text": [
|
| 268 |
+
"\n",
|
| 269 |
+
"📊 Final Report:\n",
|
| 270 |
+
"- Float32 (Base) : 447.80 MB | Reduced by: 0.0%\n",
|
| 271 |
+
"- Dynamic Range (INT8): 112.83 MB | Reduced by: 74.8%\n",
|
| 272 |
+
"- Float16 : 223.98 MB | Reduced by: 50.0%\n"
|
| 273 |
+
]
|
| 274 |
+
}
|
| 275 |
+
],
|
| 276 |
+
"source": [
|
| 277 |
+
"names = list(results.keys())\n",
|
| 278 |
+
"sizes = list(results.values())\n",
|
| 279 |
+
"\n",
|
| 280 |
+
"plt.figure(figsize=(12, 6))\n",
|
| 281 |
+
"bars = plt.bar(names, sizes, color=['#3498db', '#e74c3c', '#2ecc71'])\n",
|
| 282 |
+
"plt.ylabel('Model Size (MB)')\n",
|
| 283 |
+
"plt.title('TFLite Model Size Comparison (Multilingual Semantic Search)')\n",
|
| 284 |
+
"\n",
|
| 285 |
+
"for bar in bars:\n",
|
| 286 |
+
" yval = bar.get_height()\n",
|
| 287 |
+
" plt.text(bar.get_x() + bar.get_width()/2, yval + 0.5, f'{yval:.2f} MB', ha='center', fontweight='bold')\n",
|
| 288 |
+
"\n",
|
| 289 |
+
"plt.ylim(0, max(sizes) * 1.2)\n",
|
| 290 |
+
"plt.grid(axis='y', alpha=0.3)\n",
|
| 291 |
+
"plt.show()\n",
|
| 292 |
+
"\n",
|
| 293 |
+
"print(\"\\n📊 Final Report:\")\n",
|
| 294 |
+
"for name, size in results.items():\n",
|
| 295 |
+
" diff = results[\"Float32 (Base)\"] - size\n",
|
| 296 |
+
" percent = (diff / results[\"Float32 (Base)\"]) * 100\n",
|
| 297 |
+
" print(f\"- {name:20}: {size:6.2f} MB | Reduced by: {percent:5.1f}%\")"
|
| 298 |
+
]
|
| 299 |
+
},
|
| 300 |
+
{
|
| 301 |
+
"cell_type": "code",
|
| 302 |
+
"execution_count": null,
|
| 303 |
+
"id": "cf7757a8",
|
| 304 |
+
"metadata": {},
|
| 305 |
+
"outputs": [
|
| 306 |
+
{
|
| 307 |
+
"name": "stdout",
|
| 308 |
+
"output_type": "stream",
|
| 309 |
+
"text": [
|
| 310 |
+
"Model Version | Pair | Similarity | Speed (ms)\n",
|
| 311 |
+
"-----------------------------------------------------------------\n"
|
| 312 |
+
]
|
| 313 |
+
},
|
| 314 |
+
{
|
| 315 |
+
"name": "stderr",
|
| 316 |
+
"output_type": "stream",
|
| 317 |
+
"text": [
|
| 318 |
+
"/Users/przemo/Coding/.venv/lib/python3.13/site-packages/tensorflow/lite/python/interpreter.py:457: UserWarning: Warning: tf.lite.Interpreter is deprecated and is scheduled for deletion in\n",
|
| 319 |
+
" TF 2.20. Please use the LiteRT interpreter from the ai_edge_litert package.\n",
|
| 320 |
+
" See the [migration guide](https://ai.google.dev/edge/litert/migration)\n",
|
| 321 |
+
" for details.\n",
|
| 322 |
+
" \n",
|
| 323 |
+
" warnings.warn(_INTERPRETER_DELETION_WARNING)\n",
|
| 324 |
+
"INFO: Created TensorFlow Lite XNNPACK delegate for CPU.\n"
|
| 325 |
+
]
|
| 326 |
+
},
|
| 327 |
+
{
|
| 328 |
+
"name": "stdout",
|
| 329 |
+
"output_type": "stream",
|
| 330 |
+
"text": [
|
| 331 |
+
"float32 | Similar | 0.9976 | 178.6ms \n",
|
| 332 |
+
"float32 | Different | 0.9778 | \n",
|
| 333 |
+
"dynamic_range | Similar | 0.9975 | 62.8ms \n",
|
| 334 |
+
"dynamic_range | Different | 0.9755 | \n",
|
| 335 |
+
"float16 | Similar | 0.9976 | 372.9ms \n",
|
| 336 |
+
"float16 | Different | 0.9778 | \n"
|
| 337 |
+
]
|
| 338 |
+
}
|
| 339 |
+
],
|
| 340 |
+
"source": [
|
| 341 |
+
"import time\n",
|
| 342 |
+
"\n",
|
| 343 |
+
"def cosine_similarity(v1, v2):\n",
|
| 344 |
+
" return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))\n",
|
| 345 |
+
"\n",
|
| 346 |
+
"def get_tflite_embedding(model_path, text, tokenizer):\n",
|
| 347 |
+
" # Inicjalizacja interpretera\n",
|
| 348 |
+
" interpreter = tf.lite.Interpreter(model_path=model_path)\n",
|
| 349 |
+
" interpreter.allocate_tensors()\n",
|
| 350 |
+
" \n",
|
| 351 |
+
" input_details = interpreter.get_input_details()\n",
|
| 352 |
+
" output_details = interpreter.get_output_details()\n",
|
| 353 |
+
" \n",
|
| 354 |
+
" # Tokenizacja\n",
|
| 355 |
+
" inputs = tokenizer(text, padding='max_length', max_length=MAX_SEQ_LENGTH, truncation=True, return_tensors=\"np\")\n",
|
| 356 |
+
" input_data = inputs['input_ids'].astype(np.int32)\n",
|
| 357 |
+
" \n",
|
| 358 |
+
" # Uruchomienie modelu\n",
|
| 359 |
+
" interpreter.set_tensor(input_details[0]['index'], input_data)\n",
|
| 360 |
+
" \n",
|
| 361 |
+
" start_time = time.time()\n",
|
| 362 |
+
" interpreter.invoke()\n",
|
| 363 |
+
" inference_time = (time.time() - start_time) * 1000 # ms\n",
|
| 364 |
+
" \n",
|
| 365 |
+
" # Pobranie wyniku (last_hidden_state) i Mean Pooling\n",
|
| 366 |
+
" output_data = interpreter.get_tensor(output_details[0]['index'])[0]\n",
|
| 367 |
+
" mask = (input_data[0] != 0).astype(np.float32).reshape(-1, 1)\n",
|
| 368 |
+
" pooled_embedding = np.sum(output_data * mask, axis=0) / np.sum(mask)\n",
|
| 369 |
+
" \n",
|
| 370 |
+
" return pooled_embedding, inference_time\n",
|
| 371 |
+
"\n",
|
| 372 |
+
"# Dane testowe\n",
|
| 373 |
+
"test_pairs = [\n",
|
| 374 |
+
" (\"Faktura za energię elektryczną\", \"Rachunek za prąd\"), # Podobne\n",
|
| 375 |
+
" (\"Umowa o pracę\", \"Przepis na ciasto marchewkowe\") # Różne\n",
|
| 376 |
+
"]\n",
|
| 377 |
+
"\n",
|
| 378 |
+
"print(f\"{'Model Version':<25} | {'Pair':<10} | {'Similarity':<12} | {'Speed (ms)':<10}\")\n",
|
| 379 |
+
"print(\"-\" * 65)\n",
|
| 380 |
+
"\n",
|
| 381 |
+
"for model_name in [\"float32\", \"dynamic_range\", \"float16\"]:\n",
|
| 382 |
+
" path = f\"model_{model_name}.tflite\"\n",
|
| 383 |
+
" if not os.path.exists(path): continue\n",
|
| 384 |
+
" \n",
|
| 385 |
+
" for i, (txt1, txt2) in enumerate(test_pairs):\n",
|
| 386 |
+
" emb1, t1 = get_tflite_embedding(path, txt1, tokenizer)\n",
|
| 387 |
+
" emb2, t2 = get_tflite_embedding(path, txt2, tokenizer)\n",
|
| 388 |
+
" \n",
|
| 389 |
+
" sim = cosine_similarity(emb1, emb2)\n",
|
| 390 |
+
" pair_label = \"Similar\" if i == 0 else \"Different\"\n",
|
| 391 |
+
" \n",
|
| 392 |
+
" # Wyświetlamy tylko raz czas dla modelu przy pierwszej parze\n",
|
| 393 |
+
" speed_label = f\"{t1+t2:.1f}ms\" if i == 0 else \"\"\n",
|
| 394 |
+
" print(f\"{model_name:<25} | {pair_label:<10} | {sim:12.4f} | {speed_label:<10}\")"
|
| 395 |
+
]
|
| 396 |
+
}
|
| 397 |
+
],
|
| 398 |
+
"metadata": {
|
| 399 |
+
"kernelspec": {
|
| 400 |
+
"display_name": ".venv",
|
| 401 |
+
"language": "python",
|
| 402 |
+
"name": "python3"
|
| 403 |
+
},
|
| 404 |
+
"language_info": {
|
| 405 |
+
"codemirror_mode": {
|
| 406 |
+
"name": "ipython",
|
| 407 |
+
"version": 3
|
| 408 |
+
},
|
| 409 |
+
"file_extension": ".py",
|
| 410 |
+
"mimetype": "text/x-python",
|
| 411 |
+
"name": "python",
|
| 412 |
+
"nbconvert_exporter": "python",
|
| 413 |
+
"pygments_lexer": "ipython3",
|
| 414 |
+
"version": "3.13.7"
|
| 415 |
+
}
|
| 416 |
+
},
|
| 417 |
+
"nbformat": 4,
|
| 418 |
+
"nbformat_minor": 5
|
| 419 |
+
}
|
semantic_simillarity/vocab.txt
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
summarizer/.DS_Store
ADDED
|
Binary file (6.15 kB). View file
|
|
|
summarizer/compare_model_before_after_conversion_to_tflite.py
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import torch
|
| 3 |
+
import numpy as np
|
| 4 |
+
import tensorflow as tf
|
| 5 |
+
import pytesseract
|
| 6 |
+
from pathlib import Path
|
| 7 |
+
from PIL import Image
|
| 8 |
+
from pdf2image import convert_from_path
|
| 9 |
+
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
|
| 10 |
+
|
| 11 |
+
# --- KONFIGURACJA ---
|
| 12 |
+
pytesseract.pytesseract.tesseract_cmd = r'/opt/homebrew/bin/tesseract'
|
| 13 |
+
|
| 14 |
+
SUMMARIZER_DIR = Path(__file__).resolve().parent
|
| 15 |
+
BASE_DIR = SUMMARIZER_DIR.parent
|
| 16 |
+
PT_MODEL_PATH = SUMMARIZER_DIR / "models" / "flan_t5_custom"
|
| 17 |
+
TFLITE_MODEL_PATH = SUMMARIZER_DIR / "models" / "summarizer.tflite"
|
| 18 |
+
VERIFY_DIR = SUMMARIZER_DIR / "scans_to_verify_summary"
|
| 19 |
+
|
| 20 |
+
MAX_LEN = 256 # Musi być zgodne z ostatnią konwersją
|
| 21 |
+
device = "mps" if torch.backends.mps.is_available() else "cpu"
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
# --- ŁADOWANIE ---
|
| 25 |
+
|
| 26 |
+
def load_pt_model():
|
| 27 |
+
print(f"🚀 Ładowanie modelu PyTorch z: {PT_MODEL_PATH}")
|
| 28 |
+
tokenizer = AutoTokenizer.from_pretrained(PT_MODEL_PATH)
|
| 29 |
+
model = AutoModelForSeq2SeqLM.from_pretrained(PT_MODEL_PATH).to(device)
|
| 30 |
+
return tokenizer, model
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
def load_tflite_model():
|
| 34 |
+
print(f"🚀 Ładowanie modelu TFLite z: {TFLITE_MODEL_PATH}")
|
| 35 |
+
interpreter = tf.lite.Interpreter(model_path=str(TFLITE_MODEL_PATH))
|
| 36 |
+
interpreter.allocate_tensors()
|
| 37 |
+
return interpreter
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
# --- GENEROWANIE ---
|
| 41 |
+
|
| 42 |
+
def generate_pytorch(prompt, tokenizer, model):
|
| 43 |
+
inputs = tokenizer(prompt, return_tensors="pt", max_length=MAX_LEN, truncation=True).to(device)
|
| 44 |
+
outputs = model.generate(**inputs, max_new_tokens=128, num_beams=1, do_sample=False) # Greedy dla porównania
|
| 45 |
+
return tokenizer.decode(outputs[0], skip_special_tokens=True)
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
def generate_tflite(prompt, interpreter, tokenizer):
|
| 49 |
+
input_ids = tokenizer.encode(prompt, max_length=MAX_LEN, truncation=True, padding="max_length")
|
| 50 |
+
input_ids = np.array([input_ids], dtype=np.int32)
|
| 51 |
+
decoder_input_ids = np.zeros((1, MAX_LEN), dtype=np.int32)
|
| 52 |
+
output_tokens = [0]
|
| 53 |
+
|
| 54 |
+
input_details = interpreter.get_input_details()
|
| 55 |
+
output_details = interpreter.get_output_details()
|
| 56 |
+
|
| 57 |
+
for i in range(MAX_LEN - 1):
|
| 58 |
+
for j, token in enumerate(output_tokens):
|
| 59 |
+
decoder_input_ids[0, j] = token
|
| 60 |
+
|
| 61 |
+
# Dopasowanie tensorów po nazwach
|
| 62 |
+
for detail in input_details:
|
| 63 |
+
if "input_ids" in detail['name'] and "decoder" not in detail['name']:
|
| 64 |
+
interpreter.set_tensor(detail['index'], input_ids)
|
| 65 |
+
elif "decoder_input_ids" in detail['name']:
|
| 66 |
+
interpreter.set_tensor(detail['index'], decoder_input_ids)
|
| 67 |
+
|
| 68 |
+
interpreter.invoke()
|
| 69 |
+
output_data = interpreter.get_tensor(output_details[0]['index'])
|
| 70 |
+
|
| 71 |
+
# Pobieramy logity dla aktualnej pozycji
|
| 72 |
+
next_token_logits = output_data[0, len(output_tokens) - 1, :]
|
| 73 |
+
next_token = int(np.argmax(next_token_logits))
|
| 74 |
+
|
| 75 |
+
if next_token == 1: break
|
| 76 |
+
output_tokens.append(next_token)
|
| 77 |
+
if len(output_tokens) >= 128: break # Limit bezpieczeństwa
|
| 78 |
+
|
| 79 |
+
return tokenizer.decode(output_tokens, skip_special_tokens=True)
|
| 80 |
+
|
| 81 |
+
|
| 82 |
+
# --- OCR ---
|
| 83 |
+
|
| 84 |
+
def perform_ocr(file_path):
|
| 85 |
+
try:
|
| 86 |
+
if file_path.suffix.lower() == ".pdf":
|
| 87 |
+
pages = convert_from_path(file_path)
|
| 88 |
+
return "".join([pytesseract.image_to_string(p, lang='pol+eng') for p in pages])
|
| 89 |
+
return pytesseract.image_to_string(Image.open(file_path), lang='pol+eng')
|
| 90 |
+
except Exception as e:
|
| 91 |
+
return f"Błąd OCR: {e}"
|
| 92 |
+
|
| 93 |
+
|
| 94 |
+
# --- MAIN ---
|
| 95 |
+
|
| 96 |
+
def main():
|
| 97 |
+
tokenizer, pt_model = load_pt_model()
|
| 98 |
+
tflite_interpreter = load_tflite_model()
|
| 99 |
+
|
| 100 |
+
files = [f for f in VERIFY_DIR.glob("*") if f.suffix.lower() in [".jpg", ".jpeg", ".png", ".pdf"]]
|
| 101 |
+
if not files:
|
| 102 |
+
print(f"ℹ️ Brak plików w {VERIFY_DIR}")
|
| 103 |
+
return
|
| 104 |
+
|
| 105 |
+
for file_path in files:
|
| 106 |
+
print(f"\n" + "█" * 60)
|
| 107 |
+
print(f"📄 PLIK: {file_path.name}")
|
| 108 |
+
ocr_text = perform_ocr(file_path).strip()
|
| 109 |
+
|
| 110 |
+
for task in ["headline", "summarize"]:
|
| 111 |
+
prompt = f"{task}: {ocr_text}"
|
| 112 |
+
print(f"\n🔍 ZADANIE: {task.upper()}")
|
| 113 |
+
|
| 114 |
+
# Wynik PyTorch
|
| 115 |
+
pt_res = generate_pytorch(prompt, tokenizer, pt_model)
|
| 116 |
+
# Wynik TFLite
|
| 117 |
+
tfl_res = generate_tflite(prompt, tflite_interpreter, tokenizer)
|
| 118 |
+
|
| 119 |
+
print(f"{'PyTorch:':<10} {pt_res}")
|
| 120 |
+
print(f"{'TFLite:':<10} {tfl_res}")
|
| 121 |
+
|
| 122 |
+
# Prosta weryfikacja zgodności
|
| 123 |
+
if pt_res.strip() == tfl_res.strip():
|
| 124 |
+
print("✅ ZGODNOŚĆ: 100%")
|
| 125 |
+
else:
|
| 126 |
+
print("⚠️ ROZBIEŻNOŚĆ WYKRYTA")
|
| 127 |
+
|
| 128 |
+
|
| 129 |
+
if __name__ == "__main__":
|
| 130 |
+
main()
|
summarizer/convert_to_tflite.py
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import tensorflow as tf
|
| 3 |
+
from transformers import TFT5ForConditionalGeneration, AutoTokenizer
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
|
| 6 |
+
BASE_DIR = Path(__file__).resolve().parent.parent
|
| 7 |
+
MODEL_INPUT_DIR = BASE_DIR / "summarizer" / "models" / "flan_t5_custom"
|
| 8 |
+
TFLITE_OUTPUT_FILE = BASE_DIR / "summarizer" / "models" / "summarizer.tflite"
|
| 9 |
+
|
| 10 |
+
# USTAWAMY IDENTYCZNE WARTOŚCI - to rozwiązuje błąd "not broadcastable"
|
| 11 |
+
MAX_LEN = 256
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
def convert():
|
| 15 |
+
print(f"🚀 Konwersja z wyrównaniem kształtów do {MAX_LEN}...")
|
| 16 |
+
|
| 17 |
+
model = TFT5ForConditionalGeneration.from_pretrained(MODEL_INPUT_DIR, from_pt=True)
|
| 18 |
+
tokenizer = AutoTokenizer.from_pretrained(MODEL_INPUT_DIR)
|
| 19 |
+
|
| 20 |
+
class T5MergedModel(tf.Module):
|
| 21 |
+
def __init__(self, model):
|
| 22 |
+
super(T5MergedModel, self).__init__()
|
| 23 |
+
self.model = model
|
| 24 |
+
|
| 25 |
+
@tf.function(input_signature=[
|
| 26 |
+
tf.TensorSpec([1, MAX_LEN], tf.int32, name="input_ids"),
|
| 27 |
+
tf.TensorSpec([1, MAX_LEN], tf.int32, name="decoder_input_ids")
|
| 28 |
+
])
|
| 29 |
+
def __call__(self, input_ids, decoder_input_ids):
|
| 30 |
+
# training=False jest kluczowe dla usunięcia węzłów treningowych
|
| 31 |
+
output = self.model(input_ids=input_ids, decoder_input_ids=decoder_input_ids, training=False)
|
| 32 |
+
return output.logits
|
| 33 |
+
|
| 34 |
+
t5_module = T5MergedModel(model)
|
| 35 |
+
converter = tf.lite.TFLiteConverter.from_concrete_functions(
|
| 36 |
+
[t5_module.__call__.get_concrete_function()], t5_module
|
| 37 |
+
)
|
| 38 |
+
|
| 39 |
+
converter.target_spec.supported_ops = [
|
| 40 |
+
tf.lite.OpsSet.TFLITE_BUILTINS,
|
| 41 |
+
tf.lite.OpsSet.SELECT_TF_OPS
|
| 42 |
+
]
|
| 43 |
+
|
| 44 |
+
# Optymalizacja pod kątem rozmiaru i stabilności
|
| 45 |
+
converter.optimizations = [tf.lite.Optimize.DEFAULT]
|
| 46 |
+
converter.target_spec.supported_types = [tf.float32]
|
| 47 |
+
|
| 48 |
+
tflite_model = converter.convert()
|
| 49 |
+
with open(TFLITE_OUTPUT_FILE, "wb") as f:
|
| 50 |
+
f.write(tflite_model)
|
| 51 |
+
|
| 52 |
+
print(f"✨ Model gotowy: {TFLITE_OUTPUT_FILE}")
|
| 53 |
+
|
| 54 |
+
|
| 55 |
+
if __name__ == "__main__":
|
| 56 |
+
convert()
|
summarizer/lsummarizer_earn_with_history_visualisation.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
summarizer/summarizer_learn.py
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import torch
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
from datasets import Dataset
|
| 5 |
+
from transformers import (
|
| 6 |
+
AutoTokenizer,
|
| 7 |
+
AutoModelForSeq2SeqLM,
|
| 8 |
+
DataCollatorForSeq2Seq,
|
| 9 |
+
Seq2SeqTrainingArguments,
|
| 10 |
+
Seq2SeqTrainer
|
| 11 |
+
)
|
| 12 |
+
|
| 13 |
+
# --- KONFIGURACJA ŚCIEŻEK ---
|
| 14 |
+
# Wyjście o jeden poziom wyżej z folderu 'summarizer' do głównego folderu projektu
|
| 15 |
+
BASE_DIR = Path(__file__).resolve().parent.parent
|
| 16 |
+
DATA_ROOT = BASE_DIR / "content"
|
| 17 |
+
TITLE_ROOT = BASE_DIR / "titles"
|
| 18 |
+
SUMMARY_ROOT = BASE_DIR / "summary"
|
| 19 |
+
|
| 20 |
+
MODEL_ID = "google/flan-t5-small"
|
| 21 |
+
OUTPUT_MODEL_DIR = BASE_DIR / "summarizer" / "models" / "flan_t5_custom"
|
| 22 |
+
|
| 23 |
+
MAX_INPUT_LEN = 512
|
| 24 |
+
MAX_TARGET_LEN = 128
|
| 25 |
+
|
| 26 |
+
def load_data():
|
| 27 |
+
"""Wczytuje dane i tworzy pary: Instrukcja + Tekst -> Wynik."""
|
| 28 |
+
dataset_dict = {"input_text": [], "target_text": []}
|
| 29 |
+
|
| 30 |
+
print(f"📂 Szukam danych w: {DATA_ROOT}")
|
| 31 |
+
|
| 32 |
+
# Przeszukujemy foldery rekurencyjnie
|
| 33 |
+
files = list(DATA_ROOT.rglob("*.txt"))
|
| 34 |
+
for txt_file in files:
|
| 35 |
+
rel_path = txt_file.relative_to(DATA_ROOT)
|
| 36 |
+
|
| 37 |
+
# 1. Wczytaj surowy tekst (cecha wejściowa)
|
| 38 |
+
with open(txt_file, "r", encoding="utf-8") as f:
|
| 39 |
+
ocr_content = f.read().strip()
|
| 40 |
+
|
| 41 |
+
if not ocr_content: continue
|
| 42 |
+
|
| 43 |
+
# 2. Dodaj parę dla zadania HEADLINE
|
| 44 |
+
t_file = TITLE_ROOT / rel_path
|
| 45 |
+
if t_file.exists():
|
| 46 |
+
with open(t_file, "r", encoding="utf-8") as f:
|
| 47 |
+
dataset_dict["input_text"].append(f"headline: {ocr_content}")
|
| 48 |
+
dataset_dict["target_text"].append(f.read().strip())
|
| 49 |
+
|
| 50 |
+
# 3. Dodaj parę dla zadania SUMMARIZE
|
| 51 |
+
s_file = SUMMARY_ROOT / rel_path
|
| 52 |
+
if s_file.exists():
|
| 53 |
+
with open(s_file, "r", encoding="utf-8") as f:
|
| 54 |
+
dataset_dict["input_text"].append(f"summarize: {ocr_content}")
|
| 55 |
+
dataset_dict["target_text"].append(f.read().strip())
|
| 56 |
+
|
| 57 |
+
return Dataset.from_dict(dataset_dict)
|
| 58 |
+
|
| 59 |
+
def main():
|
| 60 |
+
# 1. Przygotowanie danych
|
| 61 |
+
raw_dataset = load_data()
|
| 62 |
+
if len(raw_dataset) == 0:
|
| 63 |
+
print("❌ Nie znaleziono plików w content/titles/summary. Sprawdź ścieżki.")
|
| 64 |
+
return
|
| 65 |
+
|
| 66 |
+
dataset = raw_dataset.train_test_split(test_size=0.1)
|
| 67 |
+
|
| 68 |
+
# 2. Tokenizer i Model
|
| 69 |
+
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
|
| 70 |
+
model = AutoModelForSeq2SeqLM.from_pretrained(MODEL_ID)
|
| 71 |
+
|
| 72 |
+
def preprocess(examples):
|
| 73 |
+
inputs = [ex for ex in examples["input_text"]]
|
| 74 |
+
model_inputs = tokenizer(inputs, max_length=MAX_INPUT_LEN, truncation=True, padding="max_length")
|
| 75 |
+
|
| 76 |
+
labels = tokenizer(text_target=examples["target_text"], max_length=MAX_TARGET_LEN, truncation=True, padding="max_length")
|
| 77 |
+
model_inputs["labels"] = labels["input_ids"]
|
| 78 |
+
return model_inputs
|
| 79 |
+
|
| 80 |
+
tokenized_dataset = dataset.map(preprocess, batched=True)
|
| 81 |
+
|
| 82 |
+
# 3. Argumenty treningu
|
| 83 |
+
# 3. Argumenty treningu
|
| 84 |
+
training_args = Seq2SeqTrainingArguments(
|
| 85 |
+
output_dir="./tmp_results",
|
| 86 |
+
eval_strategy="epoch", # <--- Zmieniono z evaluation_strategy
|
| 87 |
+
learning_rate=3e-4,
|
| 88 |
+
per_device_train_batch_size=8,
|
| 89 |
+
per_device_eval_batch_size=8,
|
| 90 |
+
weight_decay=0.01,
|
| 91 |
+
save_total_limit=2,
|
| 92 |
+
num_train_epochs=15,
|
| 93 |
+
predict_with_generate=True,
|
| 94 |
+
fp16=False,
|
| 95 |
+
logging_steps=10,
|
| 96 |
+
# Opcjonalnie dodaj te parametry dla lepszego generowania:
|
| 97 |
+
generation_max_length=MAX_TARGET_LEN,
|
| 98 |
+
generation_num_beams=4,
|
| 99 |
+
)
|
| 100 |
+
|
| 101 |
+
# 4. Trener
|
| 102 |
+
trainer = Seq2SeqTrainer(
|
| 103 |
+
model=model,
|
| 104 |
+
args=training_args,
|
| 105 |
+
train_dataset=tokenized_dataset["train"],
|
| 106 |
+
eval_dataset=tokenized_dataset["test"],
|
| 107 |
+
tokenizer=tokenizer,
|
| 108 |
+
data_collator=DataCollatorForSeq2Seq(tokenizer, model=model),
|
| 109 |
+
)
|
| 110 |
+
|
| 111 |
+
print(f"🚀 Rozpoczynam uczenie na {len(raw_dataset)} przykładach...")
|
| 112 |
+
trainer.train()
|
| 113 |
+
|
| 114 |
+
# 5. Zapisywanie modelu
|
| 115 |
+
os.makedirs(OUTPUT_MODEL_DIR, exist_ok=True)
|
| 116 |
+
model.save_pretrained(OUTPUT_MODEL_DIR)
|
| 117 |
+
tokenizer.save_pretrained(OUTPUT_MODEL_DIR)
|
| 118 |
+
print(f"✨ Model wyuczony i zapisany w: {OUTPUT_MODEL_DIR}")
|
| 119 |
+
|
| 120 |
+
if __name__ == "__main__":
|
| 121 |
+
main()
|
summarizer/verify_converted_to_tflite.py
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import numpy as np
|
| 2 |
+
import tensorflow as tf
|
| 3 |
+
from transformers import AutoTokenizer
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
|
| 6 |
+
# --- KONFIGURACJA ---
|
| 7 |
+
BASE_DIR = Path(__file__).resolve().parent.parent
|
| 8 |
+
MODEL_PATH = BASE_DIR / "summarizer" / "models" / "summarizer.tflite"
|
| 9 |
+
TOKENIZER_DIR = BASE_DIR / "summarizer" / "models" / "flan_t5_custom"
|
| 10 |
+
|
| 11 |
+
# Te wartości muszą być zgodne z tymi, które ustawiliśmy podczas konwersji (256)
|
| 12 |
+
MAX_LEN = 256
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
def generate_tflite(prompt, interpreter, tokenizer):
|
| 16 |
+
# 1. Tokenizacja wejścia (Enkoder)
|
| 17 |
+
input_ids = tokenizer.encode(prompt, max_length=MAX_LEN, truncation=True, padding="max_length")
|
| 18 |
+
input_ids = np.array([input_ids], dtype=np.int32)
|
| 19 |
+
|
| 20 |
+
# 2. Przygotowanie wejścia dla Dekodera (zaczynamy od tokena PAD/START = 0)
|
| 21 |
+
decoder_input_ids = np.zeros((1, MAX_LEN), dtype=np.int32)
|
| 22 |
+
output_tokens = [0]
|
| 23 |
+
|
| 24 |
+
# Pobranie szczegółów tensorów wejściowych i wyjściowych
|
| 25 |
+
input_details = interpreter.get_input_details()
|
| 26 |
+
output_details = interpreter.get_output_details()
|
| 27 |
+
|
| 28 |
+
# Logika generowania (identyczna jak we Flutterze)
|
| 29 |
+
generated_text = ""
|
| 30 |
+
print(f"⏳ Generowanie dla promptu: '{prompt[:30]}...'")
|
| 31 |
+
|
| 32 |
+
for i in range(MAX_LEN - 1):
|
| 33 |
+
# Wypełniamy decoder_input_ids dotychczasowymi tokenami
|
| 34 |
+
for j, token in enumerate(output_tokens):
|
| 35 |
+
decoder_input_ids[0, j] = token
|
| 36 |
+
|
| 37 |
+
# Uruchomienie interpretera
|
| 38 |
+
# Uwaga: kolejność zależy od tego, jak model został zapisany
|
| 39 |
+
# Sprawdzamy nazwy tensorów, aby dopasować dane
|
| 40 |
+
for detail in input_details:
|
| 41 |
+
if "input_ids" in detail['name'] and "decoder" not in detail['name']:
|
| 42 |
+
interpreter.set_tensor(detail['index'], input_ids)
|
| 43 |
+
elif "decoder_input_ids" in detail['name']:
|
| 44 |
+
interpreter.set_tensor(detail['index'], decoder_input_ids)
|
| 45 |
+
|
| 46 |
+
interpreter.invoke()
|
| 47 |
+
|
| 48 |
+
# Pobranie logitów z wyjścia [1, 256, 32128]
|
| 49 |
+
output_data = interpreter.get_tensor(output_details[0]['index'])
|
| 50 |
+
|
| 51 |
+
# Interesuje nas logit dla ostatniego wygenerowanego tokena
|
| 52 |
+
next_token_logits = output_data[0, len(output_tokens) - 1, :]
|
| 53 |
+
|
| 54 |
+
# Greedy Search (wybieramy najlepszy token - Argmax)
|
| 55 |
+
next_token = int(np.argmax(next_token_logits))
|
| 56 |
+
|
| 57 |
+
# Warunki stopu
|
| 58 |
+
if next_token == 1: # 1 to EOS (End of String) w T5
|
| 59 |
+
print("LOG: Otrzymano token EOS (1)")
|
| 60 |
+
break
|
| 61 |
+
|
| 62 |
+
output_tokens.append(next_token)
|
| 63 |
+
|
| 64 |
+
# Dekodowanie na bieżąco
|
| 65 |
+
word = tokenizer.decode([next_token])
|
| 66 |
+
generated_text += word
|
| 67 |
+
print(f" Step {i}: {next_token} -> '{word}'")
|
| 68 |
+
|
| 69 |
+
if len(output_tokens) >= MAX_LEN:
|
| 70 |
+
break
|
| 71 |
+
|
| 72 |
+
return generated_text.strip()
|
| 73 |
+
|
| 74 |
+
|
| 75 |
+
def main():
|
| 76 |
+
if not MODEL_PATH.exists():
|
| 77 |
+
print(f"❌ Nie znaleziono pliku modelu w: {MODEL_PATH}")
|
| 78 |
+
return
|
| 79 |
+
|
| 80 |
+
print(f"🚀 Ładowanie modelu TFLite: {MODEL_PATH}")
|
| 81 |
+
interpreter = tf.lite.Interpreter(model_path=str(MODEL_PATH))
|
| 82 |
+
interpreter.allocate_tensors()
|
| 83 |
+
|
| 84 |
+
print(f"🚀 Ładowanie tokenizera z: {TOKENIZER_DIR}")
|
| 85 |
+
tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_DIR)
|
| 86 |
+
|
| 87 |
+
# Przykładowy test (używamy tekstu, który już znamy)
|
| 88 |
+
sample_text = "Matura 2005 przykład RZECZPOSPOLITA POLSKA ŚWIADECTWO DOJRZAŁOŚCI Janina Kosińska-Iksińska"
|
| 89 |
+
|
| 90 |
+
# Test 1: Tytuł
|
| 91 |
+
title = generate_tflite(f"headline: {sample_text}", interpreter, tokenizer)
|
| 92 |
+
print(f"\n📌 FINALNY TYTUŁ TFLITE: {title}")
|
| 93 |
+
|
| 94 |
+
# Test 2: Podsumowanie
|
| 95 |
+
summary = generate_tflite(f"summarize: {sample_text}", interpreter, tokenizer)
|
| 96 |
+
print(f"\n📝 FINALNE PODSUMOWANIE TFLITE: {summary}")
|
| 97 |
+
|
| 98 |
+
|
| 99 |
+
if __name__ == "__main__":
|
| 100 |
+
main()
|
summarizer/verify_summarizer_before_converting_to_tflite.py
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import torch
|
| 3 |
+
import pytesseract
|
| 4 |
+
import json
|
| 5 |
+
from pathlib import Path
|
| 6 |
+
from PIL import Image
|
| 7 |
+
from pdf2image import convert_from_path
|
| 8 |
+
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
|
| 9 |
+
|
| 10 |
+
# --- KONFIGURACJA ---
|
| 11 |
+
# Ścieżka do Tesseracta (zgodnie z Twoim systemem)
|
| 12 |
+
pytesseract.pytesseract.tesseract_cmd = r'/opt/homebrew/bin/tesseract'
|
| 13 |
+
|
| 14 |
+
# Ścieżki relatywne
|
| 15 |
+
SUMMARIZER_DIR = Path(__file__).resolve().parent
|
| 16 |
+
BASE_DIR = SUMMARIZER_DIR.parent
|
| 17 |
+
MODEL_PATH = SUMMARIZER_DIR / "models" / "flan_t5_custom"
|
| 18 |
+
VERIFY_DIR = SUMMARIZER_DIR / "scans_to_verify_summary"
|
| 19 |
+
|
| 20 |
+
# Urządzenie (wykryte mps w Twoich logach)
|
| 21 |
+
device = "mps" if torch.backends.mps.is_available() else "cpu"
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
def perform_ocr(file_path):
|
| 25 |
+
"""Konwertuje obraz/PDF na tekst."""
|
| 26 |
+
text = ""
|
| 27 |
+
try:
|
| 28 |
+
if file_path.suffix.lower() == ".pdf":
|
| 29 |
+
pages = convert_from_path(file_path)
|
| 30 |
+
for page in pages:
|
| 31 |
+
text += pytesseract.image_to_string(page, lang='pol+eng')
|
| 32 |
+
else:
|
| 33 |
+
text = pytesseract.image_to_string(Image.open(file_path), lang='pol+eng')
|
| 34 |
+
except Exception as e:
|
| 35 |
+
print(f" [!] Błąd OCR dla {file_path.name}: {e}")
|
| 36 |
+
return text
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
def load_model():
|
| 40 |
+
print(f"🚀 Ładowanie modelu z: {MODEL_PATH}...")
|
| 41 |
+
if not MODEL_PATH.exists():
|
| 42 |
+
raise FileNotFoundError(f"❌ Nie znaleziono modelu w {MODEL_PATH}.")
|
| 43 |
+
|
| 44 |
+
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
|
| 45 |
+
model = AutoModelForSeq2SeqLM.from_pretrained(MODEL_PATH).to(device)
|
| 46 |
+
|
| 47 |
+
# --- DEBUG TOKENIZERA ---
|
| 48 |
+
print("\n" + "=" * 40)
|
| 49 |
+
print("🔍 TOKENIZER VERIFICATION (Dla porównania z Flutterem)")
|
| 50 |
+
|
| 51 |
+
for word in ["Janina", "Joanna"]:
|
| 52 |
+
encoded = tokenizer.encode(word, add_special_tokens=False)
|
| 53 |
+
print(f" ID dla słowa '{word}': {encoded}")
|
| 54 |
+
|
| 55 |
+
# Dodatkowy test na dekodowanie
|
| 56 |
+
test_ids = [0, 2664, 15, 1] # Przykładowe ID
|
| 57 |
+
decoded = tokenizer.decode(test_ids)
|
| 58 |
+
print(f" Test dekodowania {test_ids}: '{decoded}'")
|
| 59 |
+
print("=" * 40 + "\n")
|
| 60 |
+
# -----------------------
|
| 61 |
+
|
| 62 |
+
return tokenizer, model
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
def generate_text(prompt, tokenizer, model):
|
| 66 |
+
# Logowanie długości inputu
|
| 67 |
+
inputs = tokenizer(prompt, return_tensors="pt", max_length=512, truncation=True).to(device)
|
| 68 |
+
input_len = inputs['input_ids'].shape[1]
|
| 69 |
+
|
| 70 |
+
outputs = model.generate(
|
| 71 |
+
**inputs,
|
| 72 |
+
max_new_tokens=128,
|
| 73 |
+
num_beams=4,
|
| 74 |
+
early_stopping=True
|
| 75 |
+
)
|
| 76 |
+
|
| 77 |
+
result = tokenizer.decode(outputs[0], skip_special_tokens=True)
|
| 78 |
+
return result, input_len
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
def main():
|
| 82 |
+
tokenizer, model = load_model()
|
| 83 |
+
|
| 84 |
+
if not VERIFY_DIR.exists():
|
| 85 |
+
os.makedirs(VERIFY_DIR)
|
| 86 |
+
print(f"📁 Folder {VERIFY_DIR} był pusty. Wrzuć tam zdjęcia dokumentów i uruchom ponownie.")
|
| 87 |
+
return
|
| 88 |
+
|
| 89 |
+
# Szukamy plików graficznych i PDF
|
| 90 |
+
extensions = [".jpg", ".jpeg", ".png", ".pdf"]
|
| 91 |
+
files = [f for f in VERIFY_DIR.glob("*") if f.suffix.lower() in extensions]
|
| 92 |
+
|
| 93 |
+
if not files:
|
| 94 |
+
print(f"ℹ️ Brak obrazów lub plików PDF w {VERIFY_DIR}.")
|
| 95 |
+
return
|
| 96 |
+
|
| 97 |
+
print(f"🔍 Znaleziono {len(files)} dokumentów do weryfikacji.\n")
|
| 98 |
+
|
| 99 |
+
for file_path in files:
|
| 100 |
+
print(f"📄 PRZETWARZANIE: {file_path.name}")
|
| 101 |
+
print("⏳ Wykonywanie OCR...")
|
| 102 |
+
|
| 103 |
+
ocr_text = perform_ocr(file_path)
|
| 104 |
+
|
| 105 |
+
if not ocr_text.strip():
|
| 106 |
+
print(f"⚠️ Nie udało się odczytać tekstu z {file_path.name}. Pomijam.")
|
| 107 |
+
continue
|
| 108 |
+
|
| 109 |
+
print(f"📊 Długość tekstu OCR: {len(ocr_text)} znaków")
|
| 110 |
+
print(f"📝 Pierwsze 100 znaków OCR: {ocr_text[:100].replace('\n', ' ')}...")
|
| 111 |
+
print("-" * 30)
|
| 112 |
+
|
| 113 |
+
# Zadanie 1: Tytuł
|
| 114 |
+
title, t_len = generate_text(f"headline: {ocr_text}", tokenizer, model)
|
| 115 |
+
print(f"📌 TYTUŁ (Tokeny wejściowe: {t_len}):\n{title}\n")
|
| 116 |
+
|
| 117 |
+
# Zadanie 2: Streszczenie
|
| 118 |
+
summary, s_len = generate_text(f"summarize: {ocr_text}", tokenizer, model)
|
| 119 |
+
print(f"📝 STRESZCZENIE (Tokeny wejściowe: {s_len}):\n{summary}")
|
| 120 |
+
print("=" * 60 + "\n")
|
| 121 |
+
|
| 122 |
+
|
| 123 |
+
if __name__ == "__main__":
|
| 124 |
+
main()
|
summary/.DS_Store
ADDED
|
Binary file (6.15 kB). View file
|
|
|
summary/en/contract/b2bContract_12.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
Cooperation agreement between University of Wrocław and II Liceum Ogólnokształcące w Lubinie for educational and promotional activities.
|
summary/en/contract/b2bContract_15.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
Termination of cooperation agreement. The agreement was terminated by mutual consent, with no disputes or issues.
|
summary/en/contract/b2bContract_16.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
A construction work agreement between an investor and a contractor, outlining the terms and conditions of the project.
|
summary/en/contract/b2bContract_18.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
This is a labor contract between an employer and an employee. The contract outlines the terms of employment, including the duration, duties, and termination procedures.
|
summary/en/contract/b2bContract_19.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
This contract outlines the agreement between the employer and the contractor for the execution of a specific work. The contractor agrees to complete the work within a specified timeframe, and the employer agrees to provide necessary materials and tools.
|
summary/en/contract/employmentContract_0.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
This document appears to be a Polish employment contract, outlining the terms and conditions of an employee's work. The details include the employer's name, location, and other relevant information.
|
summary/en/contract/employmentContract_1.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
This employment contract outlines the terms and conditions of employment between the employer, Paco (also known as Przednwcą), and the employee. The contract covers aspects such as job responsibilities, salary, and benefits.
|
summary/en/contract/employmentContract_11.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
This is a temporary employment agreement between an agency, a temporary worker, and a user. The agreement outlines the terms of employment, including the scope of work, duration, compensation, and other conditions.
|
summary/en/contract/employmentContract_12.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
A contract between Jorn Raklualna (Zleceniodawca) and an unnamed party (Zleceniobiorca) for the performance of certain tasks. The contractor will receive a payment of 52 zł brutto after completing the work.
|
summary/en/contract/employmentContract_13.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
Employment agreement between ABC Sp. z 0.0. and Agata Nowak, effective from March 1, 2021, for a temporary period until the end of justified absence from work.
|
summary/en/contract/employmentContract_15.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
This is a remote work contract between an employer and employee, outlining the terms of employment, including job description, working hours, compensation, and other conditions.
|
summary/en/contract/employmentContract_16.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
This document outlines the employment contract terms, including job type, work location, time commitment, compensation, and duration.
|
summary/en/contract/employmentContract_17.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
A labor contract between an employer and an employee for performing work on a freelance basis. The employee is obligated to perform the work diligently and according to the employer's instructions. The employer guarantees the employee will receive a certain level of remuneration.
|
summary/en/contract/employmentContract_18.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
This employment agreement outlines the terms and conditions of an employment contract between Tamer REGON KOJ and an employee. The agreement specifies the type of work, place of performance, duration of the contract, and other provisions.
|
summary/en/contract/employmentContract_19.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
This is a pre-employment contract between an employer and an employee. The contract outlines the terms of employment, including job description, duration, compensation, and start date.
|
summary/en/contract/employmentContract_2.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
This is a labor contract between an employer and employee, outlining the terms of employment including job type, work location, working hours, salary, and other conditions.
|
summary/en/contract/employmentContract_3.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
This employment agreement outlines the terms and conditions of a remote work arrangement between an employer and employee. The agreement includes provisions for communication, job duties, and compensation.
|
summary/en/contract/employmentContract_5.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
This document is a contract between Przcodzncą and Gama seda akad acy) for employment. It outlines the terms of employment, including working hours, salary, and social benefits.
|