Spaces:
Sleeping
Sleeping
Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,586 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import sys
|
| 3 |
+
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
| 4 |
+
print("Python version:", sys.version)
|
| 5 |
+
print("Python path:", sys.path)
|
| 6 |
+
import site
|
| 7 |
+
print("Site packages:", site.getsitepackages())
|
| 8 |
+
|
| 9 |
+
import streamlit as st
|
| 10 |
+
# Odstraňte nebo zakomentujte tento řádek
|
| 11 |
+
# from streamlit_option_menu import option_menu
|
| 12 |
+
import re
|
| 13 |
+
from faker import Faker
|
| 14 |
+
import json
|
| 15 |
+
import pandas as pd
|
| 16 |
+
|
| 17 |
+
# Odstraňte nebo zakomentujte tyto řádky
|
| 18 |
+
# from src.czech_anonymization.analyzers import custom_recognizers
|
| 19 |
+
# from src.czech_anonymization.processors import document_processors
|
| 20 |
+
|
| 21 |
+
# Initialize Faker for Czech
|
| 22 |
+
fake = Faker('cs_CZ')
|
| 23 |
+
|
| 24 |
+
# Enhanced PII patterns (simplified for brevity)
|
| 25 |
+
PII_PATTERNS = {
|
| 26 |
+
'JMÉNO': r'\b(?:(?:Ing\.|Mgr\.|JUDr\.|MUDr\.|PhDr\.|RNDr\.|doc\.|prof\.|Dr\.) )?[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ][a-záčďéěíňóřšťúůýž]+(?:[ -][A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ][a-záčďéěíňóřšťúůýž]+)*(?:(,? (?:CSc\.|DrSc\.|Ph\.D\.))?)\b',
|
| 27 |
+
'RODNÉ_ČÍSLO': r'\b\d{6}/\d{3,4}\b',
|
| 28 |
+
'DATUM_NAROZENÍ': r'\b(?:\d{1,2}\.? )?(?:\d{1,2}\.? )?(?:\d{4}|(?:led(?:na|en)|únor(?:a)?|břez(?:na|en)|dub(?:na|en)|květ(?:na|en)|červ(?:na|en)(?:ec)?|srp(?:na|en)|září|říj(?:na|en)|listopa(?:du|d)|prosine(?:c|e)) ?\d{4})\b',
|
| 29 |
+
'TELEFON': r'\b(?:\+420 ?)?(?:(?:\d{3} ?){3}|\d{9})\b',
|
| 30 |
+
'EMAIL': r'\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b',
|
| 31 |
+
'ADRESA': r'\b[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ][a-záčďéěíňóřšťúůýž]+(?:[ -][A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ][a-záčďéěíňóřšťúůýž]+)* \d+(?:/\d+[a-zA-Z]?)?,?\s*\d{3} ?\d{2} [A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ][a-záčďéěíňóřšťúůýž]+(?:[ -][A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ][a-záčďéěíňóřšťúůýž]+)*\b',
|
| 32 |
+
'ČÍSLO_OP': r'\b(?:\d{9}|\d{6} ?\d{3})\b',
|
| 33 |
+
'ČÍSLO_PASU': r'\b[A-Z]{2}\d{7}\b',
|
| 34 |
+
'BANKOVNÍ_ÚČET': r'\b\d{1,6}-?\d{2,10}/\d{4}\b',
|
| 35 |
+
'IČO': r'\b\d{8}\b',
|
| 36 |
+
'DIČ': r'\bCZ\d{8,10}\b',
|
| 37 |
+
'DATOVÁ_SCHRÁNKA': r'\b[a-zA-Z0-9]{7}\b'
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
def detect_and_anonymize_pii(text, selected_pii_types, anonymization_method):
|
| 41 |
+
entities = []
|
| 42 |
+
anonymized_text = text
|
| 43 |
+
|
| 44 |
+
for entity_type, pattern in PII_PATTERNS.items():
|
| 45 |
+
if entity_type in selected_pii_types:
|
| 46 |
+
for match in re.finditer(pattern, text):
|
| 47 |
+
entities.append({
|
| 48 |
+
'start': match.start(),
|
| 49 |
+
'end': match.end(),
|
| 50 |
+
'text': match.group(),
|
| 51 |
+
'type': entity_type
|
| 52 |
+
})
|
| 53 |
+
|
| 54 |
+
# Sort entities in reverse order to avoid index issues when replacing
|
| 55 |
+
entities.sort(key=lambda x: x['start'], reverse=True)
|
| 56 |
+
|
| 57 |
+
for entity in entities:
|
| 58 |
+
anonymized_value = anonymize_entity(entity, anonymization_method)
|
| 59 |
+
anonymized_text = anonymized_text[:entity['start']] + anonymized_value + anonymized_text[entity['end']:]
|
| 60 |
+
|
| 61 |
+
return {'original_text': text, 'anonymized_text': anonymized_text, 'entities': entities}
|
| 62 |
+
|
| 63 |
+
def anonymize_entity(entity, method):
|
| 64 |
+
if method == 'Nahradit X':
|
| 65 |
+
return 'X' * len(entity['text'])
|
| 66 |
+
elif method == 'Nahradit [TYP_ÚDAJE]':
|
| 67 |
+
return f"[{entity['type']}]"
|
| 68 |
+
elif method == 'Použít falešná data':
|
| 69 |
+
if entity['type'] == 'JMÉNO':
|
| 70 |
+
return fake.name()
|
| 71 |
+
elif entity['type'] == 'RODNÉ_ČÍSLO':
|
| 72 |
+
return fake.ssn()
|
| 73 |
+
elif entity['type'] == 'DATUM_NAROZENÍ':
|
| 74 |
+
return fake.date(pattern='%d.%m.%Y')
|
| 75 |
+
elif entity['type'] == 'TELEFON':
|
| 76 |
+
return fake.phone_number()
|
| 77 |
+
elif entity['type'] == 'EMAIL':
|
| 78 |
+
return fake.email()
|
| 79 |
+
elif entity['type'] == 'ADRESA':
|
| 80 |
+
return fake.address()
|
| 81 |
+
else:
|
| 82 |
+
return fake.word()
|
| 83 |
+
return entity['text']
|
| 84 |
+
|
| 85 |
+
def main():
|
| 86 |
+
st.set_page_config(page_title="Český PII Anotátor a Anonymizátor", layout="wide")
|
| 87 |
+
|
| 88 |
+
st.sidebar.title("Navigace")
|
| 89 |
+
selected = st.sidebar.selectbox(
|
| 90 |
+
"Vyberte sekci",
|
| 91 |
+
["Hlavní aplikace", "O projektu", "Budoucí vývoj", "Specifikace využití", "Testovací data"]
|
| 92 |
+
)
|
| 93 |
+
|
| 94 |
+
st.sidebar.markdown("---")
|
| 95 |
+
st.sidebar.markdown("[GitHub repozitář](https://github.com/petrsovadina/Anonymiza-n-platforma)")
|
| 96 |
+
|
| 97 |
+
if selected == "Hlavní aplikace":
|
| 98 |
+
show_main_app()
|
| 99 |
+
elif selected == "O projektu":
|
| 100 |
+
show_about_project()
|
| 101 |
+
elif selected == "Budoucí vývoj":
|
| 102 |
+
show_future_development()
|
| 103 |
+
elif selected == "Specifikace využití":
|
| 104 |
+
show_usage_specifications()
|
| 105 |
+
elif selected == "Testovací data":
|
| 106 |
+
show_test_data()
|
| 107 |
+
|
| 108 |
+
def show_main_app():
|
| 109 |
+
st.title("Pokročilý Český PII Anotátor a Anonymizátor")
|
| 110 |
+
|
| 111 |
+
text_input = st.text_area("Zadejte český text k analýze:", height=200)
|
| 112 |
+
|
| 113 |
+
selected_pii_types = st.multiselect(
|
| 114 |
+
"Vyberte typy PII k detekci:",
|
| 115 |
+
list(PII_PATTERNS.keys()),
|
| 116 |
+
default=list(PII_PATTERNS.keys())
|
| 117 |
+
)
|
| 118 |
+
|
| 119 |
+
anonymization_method = st.selectbox(
|
| 120 |
+
"Vyberte metodu anonymizace:",
|
| 121 |
+
["Nahradit X", "Nahradit [TYP_ÚDAJE]", "Použít falešná data"]
|
| 122 |
+
)
|
| 123 |
+
|
| 124 |
+
if st.button("Analyzovat a Anonymizovat"):
|
| 125 |
+
if not text_input:
|
| 126 |
+
st.error("Prosím, zadejte nějaký text k analýze.")
|
| 127 |
+
elif not selected_pii_types:
|
| 128 |
+
st.error("Prosím, vyberte alespoň jeden typ PII k detekci.")
|
| 129 |
+
else:
|
| 130 |
+
result = detect_and_anonymize_pii(text_input, selected_pii_types, anonymization_method)
|
| 131 |
+
|
| 132 |
+
st.subheader("Výsledky anonymizace")
|
| 133 |
+
st.write(f"Anonymizace proběhla úspěšně, bylo detekováno a anonymizováno {len(result['entities'])} osobních údajů.")
|
| 134 |
+
|
| 135 |
+
col1, col2 = st.columns(2)
|
| 136 |
+
with col1:
|
| 137 |
+
st.subheader("Původní text")
|
| 138 |
+
st.text_area("", result['original_text'], height=300)
|
| 139 |
+
with col2:
|
| 140 |
+
st.subheader("Anonymizovaný text")
|
| 141 |
+
st.text_area("", result['anonymized_text'], height=300)
|
| 142 |
+
|
| 143 |
+
st.subheader("Detekované PII:")
|
| 144 |
+
pii_summary = {}
|
| 145 |
+
for entity in result['entities']:
|
| 146 |
+
if entity['type'] not in pii_summary:
|
| 147 |
+
pii_summary[entity['type']] = 1
|
| 148 |
+
else:
|
| 149 |
+
pii_summary[entity['type']] += 1
|
| 150 |
+
|
| 151 |
+
summary_data = [{"Typ PII": k, "Počet instancí": v, "Úspěšnost": "✅"} for k, v in pii_summary.items()]
|
| 152 |
+
st.table(pd.DataFrame(summary_data))
|
| 153 |
+
|
| 154 |
+
if st.button("Stáhnout zprávu"):
|
| 155 |
+
report = {
|
| 156 |
+
"original_text": result['original_text'],
|
| 157 |
+
"anonymized_text": result['anonymized_text'],
|
| 158 |
+
"pii_summary": pii_summary
|
| 159 |
+
}
|
| 160 |
+
st.download_button(
|
| 161 |
+
label="Stáhnout JSON zprávu",
|
| 162 |
+
data=json.dumps(report, ensure_ascii=False, indent=2),
|
| 163 |
+
file_name="anonymization_report.json",
|
| 164 |
+
mime="application/json"
|
| 165 |
+
)
|
| 166 |
+
|
| 167 |
+
st.subheader("Zpětná vazba")
|
| 168 |
+
feedback = st.radio("Jste spokojeni s výsledkem anonymizace?", ("Ano", "Ne"))
|
| 169 |
+
comments = st.text_area("Další komentáře:")
|
| 170 |
+
if st.button("Odeslat zpětnou vazbu"):
|
| 171 |
+
st.success("Děkujeme za vaši zpětnou vazbu!")
|
| 172 |
+
|
| 173 |
+
def show_about_project():
|
| 174 |
+
st.title("O projektu")
|
| 175 |
+
st.write("""
|
| 176 |
+
## Cíl projektu
|
| 177 |
+
|
| 178 |
+
Jako AI Developer jsem navrhl a implementoval systém pro automatickou detekci a anonymizaci osobních údajů (PII) v českém textu. Tento nástroj jsem vytvořil s cílem pomoci organizacím chránit soukromí jednotlivců při zpracování textových dat, což je klíčové při přípravě dat pro trénování jazykových modelů nebo chatbotů.
|
| 179 |
+
|
| 180 |
+
## Časová osa vývoje
|
| 181 |
+
|
| 182 |
+
### Dosavadní vývoj (3 dny):
|
| 183 |
+
|
| 184 |
+
1. **Den 1: Analýza a návrh**
|
| 185 |
+
- Průzkum existujících řešení
|
| 186 |
+
- Definice požadavků a rozsahu projektu
|
| 187 |
+
- Návrh architektury systému
|
| 188 |
+
|
| 189 |
+
2. **Den 2: Implementace základní funkcionality**
|
| 190 |
+
- Vývoj modulů pro detekci PII pomocí regulárních výrazů
|
| 191 |
+
- Implementace metod anonymizace
|
| 192 |
+
- Začátek vývoje uživatelského rozhraní
|
| 193 |
+
|
| 194 |
+
3. **Den 3: Dokončení prototypu a testování**
|
| 195 |
+
- Dokončení uživatelského rozhraní
|
| 196 |
+
- Implementace generování reportů
|
| 197 |
+
- Základní testování a ladění
|
| 198 |
+
|
| 199 |
+
### Plán budoucího vývoje:
|
| 200 |
+
|
| 201 |
+
4. **Dny 4-5: Rozšíření funkcionality**
|
| 202 |
+
- Implementace pokročilých metod anonymizace
|
| 203 |
+
- Rozšíření podpory pro další typy dokumentů
|
| 204 |
+
- Vylepšení uživatelského rozhraní
|
| 205 |
+
|
| 206 |
+
5. **Dny 6-8: Implementace NLP modelů**
|
| 207 |
+
- Výběr vhodných NLP modelů pro detekci českých PII
|
| 208 |
+
- Příprava trénovacích dat
|
| 209 |
+
- Implementace a integrace NLP modelů do systému
|
| 210 |
+
|
| 211 |
+
6. **Dny 9-11: Trénink a ladění NLP modelů**
|
| 212 |
+
- Trénování NLP modelů na českých datech
|
| 213 |
+
- Fine-tuning modelů pro přesnou detekci PII
|
| 214 |
+
- Testování a vyhodnocení přesnosti modelů
|
| 215 |
+
|
| 216 |
+
7. **Dny 12-13: Optimalizace a škálování**
|
| 217 |
+
- Optimalizace výkonu systému
|
| 218 |
+
- Implementace škálovatelného řešení pro zpracování velkých objemů dat
|
| 219 |
+
- Integrace s externími systémy
|
| 220 |
+
|
| 221 |
+
8. **Dny 14-15: Finální testování a dokumentace**
|
| 222 |
+
- Komplexní testování celého systému
|
| 223 |
+
- Příprava uživatelské a technické dokumentace
|
| 224 |
+
- Vytvoření demonstračních materiálů
|
| 225 |
+
|
| 226 |
+
9. **Den 16: Nasazení a školení**
|
| 227 |
+
- Nasazení systému do produkčního prostředí
|
| 228 |
+
- Školení uživatelů a administrátorů
|
| 229 |
+
- Zahájení podpory a údržby
|
| 230 |
+
|
| 231 |
+
Celková odhadovaná pracnost: 16 pracovních dnů
|
| 232 |
+
|
| 233 |
+
## Klíčové aspekty mého řešení
|
| 234 |
+
|
| 235 |
+
1. **Pokročilá detekce PII**: Implementoval jsem sofistikované regulární výrazy pro detekci různých typů osobních údajů specifických pro český kontext.
|
| 236 |
+
|
| 237 |
+
2. **Flexibilní anonymizace**: Navrhl jsem tři metody anonymizace přizpůsobitelné různým potřebám ochrany soukromí.
|
| 238 |
+
|
| 239 |
+
3. **Interaktivní rozhraní**: Využil jsem Streamlit pro vytvoření uživatelsky přívětivého webového rozhraní.
|
| 240 |
+
|
| 241 |
+
4. **Customizace**: Implementoval jsem možnost výběru konkrétních typů PII k detekci a anonymizaci.
|
| 242 |
+
|
| 243 |
+
5. **Reporting**: Vytvořil jsem systém pro generování přehledných statistik o detekovaných a anonymizovaných údajích.
|
| 244 |
+
|
| 245 |
+
## Algoritmus flow
|
| 246 |
+
|
| 247 |
+
Pro lepší pochopení procesu detekce a anonymizace PII jsem vytvořil následující diagram, který ilustruje tok dat a klíčové kroky algoritmu:
|
| 248 |
+
""")
|
| 249 |
+
|
| 250 |
+
st.image("https://utfs.io/f/z2Za8Zqs0Nofbl54P61Phgi3WHO4xLUXal01qvcmesjT8KJp", caption="Diagram algoritmu flow pro detekci a anonymizaci PII")
|
| 251 |
+
|
| 252 |
+
st.write("""
|
| 253 |
+
Tento diagram ukazuje hlavní komponenty systému a jejich vzájemné interakce, od vstupu textu přes detekci PII až po výstup anonymizovaného textu a generování reportu.
|
| 254 |
+
|
| 255 |
+
## Technologie a nástroje
|
| 256 |
+
|
| 257 |
+
Při vývoji tohoto projektu jsem využil následující technologie a knihovny:
|
| 258 |
+
|
| 259 |
+
- **Python**: Hlavní programovací jazyk pro implementaci logiky.
|
| 260 |
+
- **Streamlit**: Pro vytvoření interaktivního webového rozhraní.
|
| 261 |
+
- **Regex**: Využití pokročilých regulárních výrazů pro přesnou detekci PII.
|
| 262 |
+
- **Faker**: Generování realistických falešných dat pro anonymizaci.
|
| 263 |
+
- **Pandas**: Zpracování a vizualizace statistik o detekovaných PII.
|
| 264 |
+
|
| 265 |
+
V budoucích fázích projektu plánuji integraci pokročilých NLP modelů pro ještě přesnější detekci českých PII.
|
| 266 |
+
|
| 267 |
+
## Využití pro přípravu dat
|
| 268 |
+
|
| 269 |
+
Tento systém hraje klíčovou roli v procesu přípravy dat pro různé účely, včetně:
|
| 270 |
+
|
| 271 |
+
1. **Ochrana soukromí**: Anonymizace osobních údajů v dokumentech před jejich dalším zpracováním nebo sdílením.
|
| 272 |
+
2. **Příprava trénovacích dat**: Bezpečná příprava textových dat pro trénování jazykových modelů nebo chatbotů.
|
| 273 |
+
3. **Compliance**: Pomoc při dodržování předpisů o ochraně osobních údajů, jako je GDPR.
|
| 274 |
+
4. **Analýza dat**: Umožnění bezpečné analýzy textových dat bez rizika úniku citlivých informací.
|
| 275 |
+
|
| 276 |
+
Tento projekt demonstruje mou schopnost navrhnout a implementovat komplexní řešení pro ochranu osobních údajů s důrazem na praktické využití v reálném světě, zejména v kontextu zpracování a analýzy textových dat v českém jazyce.
|
| 277 |
+
""")
|
| 278 |
+
|
| 279 |
+
def show_future_development():
|
| 280 |
+
st.title("Plán vývoje a nasazení")
|
| 281 |
+
st.write("""
|
| 282 |
+
## Integrace s chatbotem pomocí FastAPI a LangChain
|
| 283 |
+
|
| 284 |
+
Pro efektivní využití našeho anonymizačního nástroje v systému chatbota implementujeme následující:
|
| 285 |
+
|
| 286 |
+
1. **FastAPI Endpoints**:
|
| 287 |
+
- `/anonymize`: POST endpoint pro anonymizaci jednotlivých textů
|
| 288 |
+
- `/batch-anonymize`: POST endpoint pro dávkové zpracování většího množství dokumentů
|
| 289 |
+
- `/update-rules`: PUT endpoint pro aktualizaci pravidel anonymizace
|
| 290 |
+
- `/get-stats`: GET endpoint pro získání statistik o zpracovaných datech
|
| 291 |
+
|
| 292 |
+
2. **API Dokumentace**:
|
| 293 |
+
- Využití Swagger UI pro interaktivní API dokumentaci
|
| 294 |
+
- Detailní popis všech endpointů, včetně vstupních a výstupních schémat
|
| 295 |
+
- Příklady použití pro každý endpoint
|
| 296 |
+
|
| 297 |
+
3. **Integrace s LangChain**:
|
| 298 |
+
- Vytvoření custom LangChain tool pro anonymizaci dat
|
| 299 |
+
- Implementace LangChain agent, který bude využívat náš anonymizační nástroj
|
| 300 |
+
- Nastavení workflow pro automatické zpracování dokumentů před jejich použitím v chatbotu
|
| 301 |
+
|
| 302 |
+
4. **Příklad využití v LangChain**:
|
| 303 |
+
```python
|
| 304 |
+
from langchain.agents import Tool
|
| 305 |
+
from langchain.agents import initialize_agent
|
| 306 |
+
from langchain.llms import OpenAI
|
| 307 |
+
|
| 308 |
+
# Definice našeho anonymizačního nástroje
|
| 309 |
+
anonymization_tool = Tool(
|
| 310 |
+
name="Anonymization",
|
| 311 |
+
func=lambda x: requests.post("http://our-api.com/anonymize", json={"text": x}).json()["anonymized_text"],
|
| 312 |
+
description="Useful for anonymizing text containing personal information"
|
| 313 |
+
)
|
| 314 |
+
|
| 315 |
+
# Inicializace agenta
|
| 316 |
+
llm = OpenAI(temperature=0)
|
| 317 |
+
agent = initialize_agent([anonymization_tool], llm, agent="zero-shot-react-description", verbose=True)
|
| 318 |
+
|
| 319 |
+
# Použití agenta
|
| 320 |
+
agent.run("Anonymize this text and then summarize it: 'Jan Novák, born on 15.3.1985, lives at Hlavní 123, Prague.'")
|
| 321 |
+
```
|
| 322 |
+
|
| 323 |
+
## AI a NLP modely pro detekci PII
|
| 324 |
+
|
| 325 |
+
V budoucím vývoji plánujeme integraci pokročilých NLP a NER (Named Entity Recognition) modelů pro zlepšení detekce osobních údajů:
|
| 326 |
+
|
| 327 |
+
### Výhody NER modelů pro náš projekt:
|
| 328 |
+
|
| 329 |
+
NER modely jsou ideální pro klasifikaci a anonymizaci textu díky své schopnosti přesně identifikovat pojmenované entity a strukturovaně kategorizovat citlivé údaje. Oproti jiným AI modelům poskytují přesnější výsledky při detekci citlivých informací, což je zásadní pro zajištění ochrany osobních údajů a správnou kategorizaci textů podle jejich obsahu.
|
| 330 |
+
|
| 331 |
+
### Plánované využití NLP a NER modelů:
|
| 332 |
+
|
| 333 |
+
1. **Přesnější detekce PII**: Využití pre-trénovaných modelů pro identifikaci širšího spektra osobních údajů.
|
| 334 |
+
2. **Kontextová analýza**: Schopnost rozpoznat PII i v méně zřejmých kontextech.
|
| 335 |
+
3. **Multijazyčná podpora**: Rozšíření detekce PII na více jazyků.
|
| 336 |
+
4. **Adaptivní učení**: Možnost doučování modelů na specifických datech klienta.
|
| 337 |
+
|
| 338 |
+
### Vhodné modely pro detekci PII:
|
| 339 |
+
|
| 340 |
+
- FacebookAI/xlm-roberta-large-finetuned-conll03-english: Pro multijazyčnou detekci entit.
|
| 341 |
+
- iiiorg/piiranha-v1-detect-personal-information: Specializovaný model pro detekci osobních informací.
|
| 342 |
+
- Microsoft Presidio: Framework pro detekci a anonymizaci, který můžeme integrovat do našeho řešení.
|
| 343 |
+
|
| 344 |
+
### Implementace:
|
| 345 |
+
|
| 346 |
+
1. Využití Transformers knihovny pro integraci a fine-tuning modelů.
|
| 347 |
+
2. Vytvoření pipeline pro kombinaci rule-based přístupu s NER modely.
|
| 348 |
+
3. Implementace mechanismu pro pravidelné aktualizace a doučování modelů.
|
| 349 |
+
|
| 350 |
+
Integrace těchto pokročilých NLP a NER modelů významně zvýší přesnost a robustnost našeho anonymizačního nástroje, což umožní jeho využití i v náročnějších scénářích a pro komplexnější typy dokumentů.
|
| 351 |
+
""")
|
| 352 |
+
|
| 353 |
+
def show_usage_specifications():
|
| 354 |
+
st.title("Specifikace využití")
|
| 355 |
+
st.write("""
|
| 356 |
+
## Způsoby anonymizace
|
| 357 |
+
|
| 358 |
+
Systém nabízí tři hlavní metody anonymizace osobních údajů:
|
| 359 |
+
|
| 360 |
+
1. **Nahrazení zástupnými znaky**: Osobní údaje jsou nahrazeny řetězcem 'X' stejné délky.
|
| 361 |
+
2. **Nahrazení obecnými pojmy**: Osobní údaje jsou nahrazeny obecným označením typu údaje (např. [JMÉNO], [ADRESA]).
|
| 362 |
+
3. **Použití falešných dat**: Osobní údaje jsou nahrazeny realisticky vypadajícími, ale fiktivními daty.
|
| 363 |
+
|
| 364 |
+
## Testování a ověření
|
| 365 |
+
|
| 366 |
+
Pro zajištění správnosti a úplnosti anonymizace systém zahrnuje:
|
| 367 |
+
|
| 368 |
+
1. **Generování testovacích dat**: Možnost vytvářet fiktivní dokumenty s osobními údaji pro testování.
|
| 369 |
+
2. **Statistiky detekce**: Přehled detekovaných a anonymizovaných údajů pro každý dokument.
|
| 370 |
+
3. **Vizuální porovnání**: Možnost porovnat původní a anonymizovaný text pro kontrolu.
|
| 371 |
+
|
| 372 |
+
## Vstupní data
|
| 373 |
+
|
| 374 |
+
Systém je navržen pro zpracování:
|
| 375 |
+
|
| 376 |
+
1. Libovolného textu zadaného uživatelem.
|
| 377 |
+
2. Generovaných falešných dat pro testovací účely.
|
| 378 |
+
3. (V budoucnu) Různých formátů dokumentů (TXT, PDF, DOC).
|
| 379 |
+
|
| 380 |
+
## Zdůvodnění výběru nástrojů
|
| 381 |
+
|
| 382 |
+
1. **Python**: Široká podpora pro NLP a zpracování textu, rozsáhlý ekosystém knihoven.
|
| 383 |
+
2. **Streamlit**: Rychlé vytvoření interaktivního rozhraní pro demonstraci funkčnosti.
|
| 384 |
+
3. **Regex**: Efektivní a flexibilní nástroj pro detekci vzorů v textu.
|
| 385 |
+
4. **Faker**: Generování realistických falešných dat pro testování a anonymizaci.
|
| 386 |
+
|
| 387 |
+
Tato kombinace nástrojů umožňuje rychlý vývoj, snadnou údržbu a potenciál pro budoucí rozšíření systému.
|
| 388 |
+
""")
|
| 389 |
+
|
| 390 |
+
def show_test_data():
|
| 391 |
+
st.title("Testovací data pro anonymizační platformu")
|
| 392 |
+
|
| 393 |
+
st.header("1. Osobní profily")
|
| 394 |
+
|
| 395 |
+
st.subheader("Profil 1: Jan Novák")
|
| 396 |
+
st.write("""
|
| 397 |
+
- Jméno: Jan Novák
|
| 398 |
+
- Datum narození: 15.3.1985
|
| 399 |
+
- Rodné číslo: 850315/1234
|
| 400 |
+
- Adresa: Hlavní 123, 110 00 Praha 1
|
| 401 |
+
- E-mail: jan.novak@email.cz
|
| 402 |
+
- Telefon: +420 601 234 567
|
| 403 |
+
- Číslo OP: 123456789
|
| 404 |
+
- Číslo účtu: 1234567890/0800
|
| 405 |
+
""")
|
| 406 |
+
|
| 407 |
+
st.subheader("Profil 2: Marie Svobodová")
|
| 408 |
+
st.write("""
|
| 409 |
+
- Jméno: Ing. Marie Svobodová, Ph.D.
|
| 410 |
+
- Datum narození: 22.7.1990
|
| 411 |
+
- Rodné číslo: 905722/9876
|
| 412 |
+
- Adresa: Nová 456, 602 00 Brno
|
| 413 |
+
- E-mail: marie.svobodova@gmail.com
|
| 414 |
+
- Telefon: 00420777888999
|
| 415 |
+
- Číslo pasu: 98765432
|
| 416 |
+
- IBAN: CZ65 0800 0000 0012 3456 7890
|
| 417 |
+
""")
|
| 418 |
+
|
| 419 |
+
st.subheader("Profil 3: Petr Dvořák")
|
| 420 |
+
st.write("""
|
| 421 |
+
- Jméno: MUDr. Petr Dvořák
|
| 422 |
+
- Datum narození: 1. ledna 1970
|
| 423 |
+
- Rodné číslo: 700101/3333
|
| 424 |
+
- Adresa: Dlouhá 789, 301 00 Plzeň
|
| 425 |
+
- E-mail: petr.dvorak@seznam.cz
|
| 426 |
+
- Telefon: 420 602 111 222
|
| 427 |
+
- DIČ: CZ7001013333
|
| 428 |
+
- Číslo pojištěnce: 700101/3333
|
| 429 |
+
""")
|
| 430 |
+
|
| 431 |
+
st.header("2. Dokumenty")
|
| 432 |
+
|
| 433 |
+
st.subheader("2.1 Životopis - Jan Novák")
|
| 434 |
+
st.code("""
|
| 435 |
+
Jan Novák
|
| 436 |
+
Hlavní 123, 110 00 Praha 1
|
| 437 |
+
Tel: +420 601 234 567
|
| 438 |
+
E-mail: jan.novak@email.cz
|
| 439 |
+
|
| 440 |
+
Datum narození: 15.3.1985
|
| 441 |
+
Stav: ženatý
|
| 442 |
+
|
| 443 |
+
Vzdělání:
|
| 444 |
+
2004-2009: Vysoká škola ekonomická v Praze, obor Finance
|
| 445 |
+
|
| 446 |
+
Pracovní zkušenosti:
|
| 447 |
+
2010-současnost: Finanční analytik, ABC Bank, a.s.
|
| 448 |
+
- Zpracování finančních reportů
|
| 449 |
+
- Analýza investičních příležitostí
|
| 450 |
+
|
| 451 |
+
2009-2010: Junior účetní, XYZ s.r.o.
|
| 452 |
+
- Vedení účetnictví malých a středních podniků
|
| 453 |
+
|
| 454 |
+
Jazykové znalosti:
|
| 455 |
+
Angličtina - pokročilá úroveň
|
| 456 |
+
Němčina - středně pokročilá úroveň
|
| 457 |
+
|
| 458 |
+
Reference:
|
| 459 |
+
Ing. Jiří Zelený, vedoucí oddělení, ABC Bank, a.s.
|
| 460 |
+
Tel: 420 234 567 890
|
| 461 |
+
""")
|
| 462 |
+
|
| 463 |
+
st.subheader("2.2 Lékařská zpráva - Marie Svobodová")
|
| 464 |
+
st.code("""
|
| 465 |
+
Fakultní nemocnice Brno
|
| 466 |
+
Jihlavská 20, 625 00 Brno
|
| 467 |
+
IČO: 65269705
|
| 468 |
+
|
| 469 |
+
LÉKAŘSKÁ ZPRÁVA
|
| 470 |
+
|
| 471 |
+
Pacient: Ing. Marie Svobodová, Ph.D.
|
| 472 |
+
Datum narození: 22.7.1990
|
| 473 |
+
Rodné číslo: 905722/9876
|
| 474 |
+
Bydliště: Nová 456, 602 00 Brno
|
| 475 |
+
Pojišťovna: 111
|
| 476 |
+
|
| 477 |
+
Anamnéza:
|
| 478 |
+
Pacientka přichází s bolestí v pravém podžebří trvající 3 dny. Neudává horečku ani zvracení. V osobní anamnéze hypertenze na medikaci.
|
| 479 |
+
|
| 480 |
+
Fyzikální vyšetření:
|
| 481 |
+
TK: 130/80, P: 72/min, TT: 36.8°C
|
| 482 |
+
Břicho měkké, palpačně citlivé v pravém podžebří, Murphy negativní.
|
| 483 |
+
|
| 484 |
+
Závěr:
|
| 485 |
+
Suspektní cholecystitis. Doporučeno ultrazvukové vyšetření břicha.
|
| 486 |
+
|
| 487 |
+
Vypracoval: MUDr. Jan Veselý
|
| 488 |
+
Dne: 15.5.2023
|
| 489 |
+
""")
|
| 490 |
+
|
| 491 |
+
st.subheader("2.3 Faktura - Petr Dvořák")
|
| 492 |
+
st.code("""
|
| 493 |
+
XYZ Servis s.r.o.
|
| 494 |
+
Technická 10, 301 00 Plzeň
|
| 495 |
+
IČO: 12345678
|
| 496 |
+
DIČ: CZ12345678
|
| 497 |
+
|
| 498 |
+
FAKTURA č. 2023001
|
| 499 |
+
|
| 500 |
+
Odběratel:
|
| 501 |
+
MUDr. Petr Dvořák
|
| 502 |
+
Dlouhá 789
|
| 503 |
+
301 00 Plzeň
|
| 504 |
+
DIČ: CZ7001013333
|
| 505 |
+
|
| 506 |
+
Datum vystavení: 1.6.2023
|
| 507 |
+
Datum splatnosti: 15.6.2023
|
| 508 |
+
Forma úhrady: bankovní převod
|
| 509 |
+
|
| 510 |
+
Položka Množství Cena/ks Celkem
|
| 511 |
+
---------------------------------------------------------
|
| 512 |
+
Servis zdravotnického
|
| 513 |
+
zařízení XY 1 10000 Kč 10000 Kč
|
| 514 |
+
Náhradní díly 2 2500 Kč 5000 Kč
|
| 515 |
+
---------------------------------------------------------
|
| 516 |
+
Celkem bez DPH 15000 Kč
|
| 517 |
+
DPH 21% 3150 Kč
|
| 518 |
+
Celkem s DPH 18150 Kč
|
| 519 |
+
|
| 520 |
+
Číslo účtu pro platbu: 1234567890/0300
|
| 521 |
+
Variabilní symbol: 2023001
|
| 522 |
+
|
| 523 |
+
Děkujeme za Vaši důvěru a těšíme se na další spolupráci.
|
| 524 |
+
""")
|
| 525 |
+
|
| 526 |
+
st.header("3. E-mailová komunikace")
|
| 527 |
+
|
| 528 |
+
st.subheader("3.1 E-mail od Jana Nováka")
|
| 529 |
+
st.code("""
|
| 530 |
+
Od: jan.novak@email.cz
|
| 531 |
+
Komu: podpora@banka.cz
|
| 532 |
+
Předmět: Žádost o změnu osobních údajů
|
| 533 |
+
|
| 534 |
+
Vážení,
|
| 535 |
+
|
| 536 |
+
prosím o změnu mých kontaktních údajů ve Vašem systému. Nové údaje jsou následující:
|
| 537 |
+
|
| 538 |
+
Jméno: Jan Novák
|
| 539 |
+
Nová adresa: Krátká 456, 120 00 Praha 2
|
| 540 |
+
Nový telefon: 702 345 678
|
| 541 |
+
|
| 542 |
+
Moje identifikační údaje:
|
| 543 |
+
Datum narození: 15.3.1985
|
| 544 |
+
Číslo účtu: 1234567890/0800
|
| 545 |
+
|
| 546 |
+
Děkuji za vyřízení mé žádosti.
|
| 547 |
+
|
| 548 |
+
S pozdravem,
|
| 549 |
+
Jan Novák
|
| 550 |
+
""")
|
| 551 |
+
|
| 552 |
+
st.subheader("3.2 E-mail od Marie Svobodové")
|
| 553 |
+
st.code("""
|
| 554 |
+
Od: marie.svobodova@gmail.com
|
| 555 |
+
Komu: hr@firma.cz
|
| 556 |
+
Předmět: Žádost o pracovní pozici
|
| 557 |
+
|
| 558 |
+
Vážená paní / Vážený pane,
|
| 559 |
+
|
| 560 |
+
reaguji na Váš inzerát na pozici "Datový analytik" zveřejněný na pracovním portálu Jobs.cz.
|
| 561 |
+
|
| 562 |
+
Jmenuji se Ing. Marie Svobodová, Ph.D. a mám pětiletou zkušenost v oblasti datové analýzy. Absolvovala jsem doktorské studium na Masarykově univerzitě v Brně, obor Aplikovaná informatika.
|
| 563 |
+
|
| 564 |
+
Moje kontaktní údaje:
|
| 565 |
+
Telefon: 777888999
|
| 566 |
+
E-mail: marie.svobodova@gmail.com
|
| 567 |
+
LinkedIn: linkedin.com/in/marie-svobodova
|
| 568 |
+
|
| 569 |
+
V příloze naleznete můj životopis a motivační dopis. Budu ráda za zpětnou vazbu a případné pozvání na osobní pohovor.
|
| 570 |
+
|
| 571 |
+
S pozdravem,
|
| 572 |
+
Marie Svobodová
|
| 573 |
+
""")
|
| 574 |
+
|
| 575 |
+
st.header("4. Příspěvek na sociální síti")
|
| 576 |
+
|
| 577 |
+
st.subheader("4.1 Příspěvek Petra Dvořáka na Facebooku")
|
| 578 |
+
st.code("""
|
| 579 |
+
Petr Dvořák
|
| 580 |
+
1. června 2023 v 10:15
|
| 581 |
+
|
| 582 |
+
Ahoj přátelé! Právě jsem se vrátil z úžasné dovolené v Chorvatsku. Pokud budete chtít nějaké tipy na ubytování nebo restaurace v oblasti Splitu, dejte vědět. Můžete mi zavolat na 602 111 222 nebo napsat na petr.dvorak@seznam.cz. Pojede: Ivan Máchal, Pavel Miško, Rutha Tomanová, Zdislava Novotná
|
| 583 |
+
""")
|
| 584 |
+
|
| 585 |
+
if __name__ == "__main__":
|
| 586 |
+
main()
|