pemix09 commited on
Commit
8fd4eb2
·
verified ·
1 Parent(s): 3ce7eca

Add files using upload-large-folder tool

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitignore +8 -0
  2. .idea/.gitignore +3 -0
  3. .idea/document data retrieval.iml +12 -0
  4. .idea/inspectionProfiles/profiles_settings.xml +6 -0
  5. .idea/misc.xml +7 -0
  6. .idea/modules.xml +8 -0
  7. .idea/vcs.xml +6 -0
  8. .idea/workspace.xml +141 -0
  9. augment_scan_content_balanced_class_counts.py +149 -0
  10. bing-scrapper-all.py +132 -0
  11. category/.DS_Store +0 -0
  12. clean_scans.py +259 -0
  13. clean_scans_processed.txt +1 -0
  14. content/.DS_Store +0 -0
  15. document_type_clasifier/document_type_labels.txt +31 -0
  16. document_type_clasifier/learn_with_history_visualisation.ipynb +0 -0
  17. info/.DS_Store +0 -0
  18. map_scans_to_less_types.py +187 -0
  19. process_syntethic_content.py +176 -0
  20. processed_synthetic_scans_contents.txt +1757 -0
  21. retrieve_multilang.py +263 -0
  22. scans/.DS_Store +0 -0
  23. semantic_simillarity/convert_to_tflite_download_vocab.ipynb +419 -0
  24. semantic_simillarity/vocab.txt +0 -0
  25. summarizer/.DS_Store +0 -0
  26. summarizer/compare_model_before_after_conversion_to_tflite.py +130 -0
  27. summarizer/convert_to_tflite.py +56 -0
  28. summarizer/lsummarizer_earn_with_history_visualisation.ipynb +0 -0
  29. summarizer/summarizer_learn.py +121 -0
  30. summarizer/verify_converted_to_tflite.py +100 -0
  31. summarizer/verify_summarizer_before_converting_to_tflite.py +124 -0
  32. summary/.DS_Store +0 -0
  33. summary/en/contract/b2bContract_12.txt +1 -0
  34. summary/en/contract/b2bContract_15.txt +1 -0
  35. summary/en/contract/b2bContract_16.txt +1 -0
  36. summary/en/contract/b2bContract_18.txt +1 -0
  37. summary/en/contract/b2bContract_19.txt +1 -0
  38. summary/en/contract/employmentContract_0.txt +1 -0
  39. summary/en/contract/employmentContract_1.txt +1 -0
  40. summary/en/contract/employmentContract_11.txt +1 -0
  41. summary/en/contract/employmentContract_12.txt +1 -0
  42. summary/en/contract/employmentContract_13.txt +1 -0
  43. summary/en/contract/employmentContract_15.txt +1 -0
  44. summary/en/contract/employmentContract_16.txt +1 -0
  45. summary/en/contract/employmentContract_17.txt +1 -0
  46. summary/en/contract/employmentContract_18.txt +1 -0
  47. summary/en/contract/employmentContract_19.txt +1 -0
  48. summary/en/contract/employmentContract_2.txt +1 -0
  49. summary/en/contract/employmentContract_3.txt +1 -0
  50. 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
+ &quot;lastFilter&quot;: {
27
+ &quot;state&quot;: &quot;OPEN&quot;,
28
+ &quot;assignee&quot;: &quot;pemix09&quot;
29
+ }
30
+ }</component>
31
+ <component name="GithubPullRequestsUISettings">{
32
+ &quot;selectedUrlAndAccountId&quot;: {
33
+ &quot;url&quot;: &quot;https://github.com/pemix09/document-data-retrieval.git&quot;,
34
+ &quot;accountId&quot;: &quot;8a222931-697e-4756-a51a-e6060944a565&quot;
35
+ }
36
+ }</component>
37
+ <component name="ProjectColorInfo">{
38
+ &quot;associatedIndex&quot;: 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
+ &quot;keyToString&quot;: {
47
+ &quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;,
48
+ &quot;Python.clean_scans.executor&quot;: &quot;Run&quot;,
49
+ &quot;Python.compare_model_before_after_conversion_to_tflite.executor&quot;: &quot;Run&quot;,
50
+ &quot;Python.convert_to_tflite.executor&quot;: &quot;Run&quot;,
51
+ &quot;Python.document_type_classifierlearn.executor&quot;: &quot;Run&quot;,
52
+ &quot;Python.map_scans_to_less_types.executor&quot;: &quot;Run&quot;,
53
+ &quot;Python.process_syntethic_content.executor&quot;: &quot;Run&quot;,
54
+ &quot;Python.retrieve_multilang.executor&quot;: &quot;Run&quot;,
55
+ &quot;Python.summarizer_learn.executor&quot;: &quot;Run&quot;,
56
+ &quot;Python.verify_converted_to_tflite.executor&quot;: &quot;Run&quot;,
57
+ &quot;Python.verify_summarizer.executor&quot;: &quot;Run&quot;,
58
+ &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
59
+ &quot;RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager&quot;: &quot;true&quot;,
60
+ &quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
61
+ &quot;git-widget-placeholder&quot;: &quot;main&quot;,
62
+ &quot;last_opened_file_path&quot;: &quot;/Users/przemo/Coding/document data retrieval&quot;
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.