import os import sys sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) print("Python version:", sys.version) print("Python path:", sys.path) import site print("Site packages:", site.getsitepackages()) import streamlit as st # Odstraňte nebo zakomentujte tento řádek # from streamlit_option_menu import option_menu import re from faker import Faker import json import pandas as pd # Odstraňte nebo zakomentujte tyto řádky # from src.czech_anonymization.analyzers import custom_recognizers # from src.czech_anonymization.processors import document_processors # Initialize Faker for Czech fake = Faker('cs_CZ') # Enhanced PII patterns (simplified for brevity) PII_PATTERNS = { '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', 'RODNÉ_ČÍSLO': r'\b\d{6}/\d{3,4}\b', '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', 'TELEFON': r'\b(?:\+420 ?)?(?:(?:\d{3} ?){3}|\d{9})\b', 'EMAIL': r'\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b', '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', 'ČÍSLO_OP': r'\b(?:\d{9}|\d{6} ?\d{3})\b', 'ČÍSLO_PASU': r'\b[A-Z]{2}\d{7}\b', 'BANKOVNÍ_ÚČET': r'\b\d{1,6}-?\d{2,10}/\d{4}\b', 'IČO': r'\b\d{8}\b', 'DIČ': r'\bCZ\d{8,10}\b', 'DATOVÁ_SCHRÁNKA': r'\b[a-zA-Z0-9]{7}\b' } def detect_and_anonymize_pii(text, selected_pii_types, anonymization_method): entities = [] anonymized_text = text for entity_type, pattern in PII_PATTERNS.items(): if entity_type in selected_pii_types: for match in re.finditer(pattern, text): entities.append({ 'start': match.start(), 'end': match.end(), 'text': match.group(), 'type': entity_type }) # Sort entities in reverse order to avoid index issues when replacing entities.sort(key=lambda x: x['start'], reverse=True) for entity in entities: anonymized_value = anonymize_entity(entity, anonymization_method) anonymized_text = anonymized_text[:entity['start']] + anonymized_value + anonymized_text[entity['end']:] return {'original_text': text, 'anonymized_text': anonymized_text, 'entities': entities} def anonymize_entity(entity, method): if method == 'Nahradit X': return 'X' * len(entity['text']) elif method == 'Nahradit [TYP_ÚDAJE]': return f"[{entity['type']}]" elif method == 'Použít falešná data': if entity['type'] == 'JMÉNO': return fake.name() elif entity['type'] == 'RODNÉ_ČÍSLO': return fake.ssn() elif entity['type'] == 'DATUM_NAROZENÍ': return fake.date(pattern='%d.%m.%Y') elif entity['type'] == 'TELEFON': return fake.phone_number() elif entity['type'] == 'EMAIL': return fake.email() elif entity['type'] == 'ADRESA': return fake.address() else: return fake.word() return entity['text'] def main(): st.set_page_config(page_title="Český PII Anotátor a Anonymizátor", layout="wide") st.sidebar.title("Navigace") selected = st.sidebar.selectbox( "Vyberte sekci", ["Hlavní aplikace", "O projektu", "Budoucí vývoj", "Specifikace využití", "Testovací data"] ) st.sidebar.markdown("---") st.sidebar.markdown("[GitHub repozitář](https://github.com/petrsovadina/Anonymiza-n-platforma)") if selected == "Hlavní aplikace": show_main_app() elif selected == "O projektu": show_about_project() elif selected == "Budoucí vývoj": show_future_development() elif selected == "Specifikace využití": show_usage_specifications() elif selected == "Testovací data": show_test_data() def show_main_app(): st.title("Pokročilý Český PII Anotátor a Anonymizátor") text_input = st.text_area("Zadejte český text k analýze:", height=200) selected_pii_types = st.multiselect( "Vyberte typy PII k detekci:", list(PII_PATTERNS.keys()), default=list(PII_PATTERNS.keys()) ) anonymization_method = st.selectbox( "Vyberte metodu anonymizace:", ["Nahradit X", "Nahradit [TYP_ÚDAJE]", "Použít falešná data"] ) if st.button("Analyzovat a Anonymizovat"): if not text_input: st.error("Prosím, zadejte nějaký text k analýze.") elif not selected_pii_types: st.error("Prosím, vyberte alespoň jeden typ PII k detekci.") else: result = detect_and_anonymize_pii(text_input, selected_pii_types, anonymization_method) st.subheader("Výsledky anonymizace") st.write(f"Anonymizace proběhla úspěšně, bylo detekováno a anonymizováno {len(result['entities'])} osobních údajů.") col1, col2 = st.columns(2) with col1: st.subheader("Původní text") st.text_area("", result['original_text'], height=300) with col2: st.subheader("Anonymizovaný text") st.text_area("", result['anonymized_text'], height=300) st.subheader("Detekované PII:") pii_summary = {} for entity in result['entities']: if entity['type'] not in pii_summary: pii_summary[entity['type']] = 1 else: pii_summary[entity['type']] += 1 summary_data = [{"Typ PII": k, "Počet instancí": v, "Úspěšnost": "✅"} for k, v in pii_summary.items()] st.table(pd.DataFrame(summary_data)) if st.button("Stáhnout zprávu"): report = { "original_text": result['original_text'], "anonymized_text": result['anonymized_text'], "pii_summary": pii_summary } st.download_button( label="Stáhnout JSON zprávu", data=json.dumps(report, ensure_ascii=False, indent=2), file_name="anonymization_report.json", mime="application/json" ) st.subheader("Zpětná vazba") feedback = st.radio("Jste spokojeni s výsledkem anonymizace?", ("Ano", "Ne")) comments = st.text_area("Další komentáře:") if st.button("Odeslat zpětnou vazbu"): st.success("Děkujeme za vaši zpětnou vazbu!") def show_about_project(): st.title("O projektu") st.write(""" ## Cíl projektu 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ů. ## Časová osa vývoje ### Dosavadní vývoj (3 dny): 1. **Den 1: Analýza a návrh** - Průzkum existujících řešení - Definice požadavků a rozsahu projektu - Návrh architektury systému 2. **Den 2: Implementace základní funkcionality** - Vývoj modulů pro detekci PII pomocí regulárních výrazů - Implementace metod anonymizace - Začátek vývoje uživatelského rozhraní 3. **Den 3: Dokončení prototypu a testování** - Dokončení uživatelského rozhraní - Implementace generování reportů - Základní testování a ladění ### Plán budoucího vývoje: 4. **Dny 4-5: Rozšíření funkcionality** - Implementace pokročilých metod anonymizace - Rozšíření podpory pro další typy dokumentů - Vylepšení uživatelského rozhraní 5. **Dny 6-8: Implementace NLP modelů** - Výběr vhodných NLP modelů pro detekci českých PII - Příprava trénovacích dat - Implementace a integrace NLP modelů do systému 6. **Dny 9-11: Trénink a ladění NLP modelů** - Trénování NLP modelů na českých datech - Fine-tuning modelů pro přesnou detekci PII - Testování a vyhodnocení přesnosti modelů 7. **Dny 12-13: Optimalizace a škálování** - Optimalizace výkonu systému - Implementace škálovatelného řešení pro zpracování velkých objemů dat - Integrace s externími systémy 8. **Dny 14-15: Finální testování a dokumentace** - Komplexní testování celého systému - Příprava uživatelské a technické dokumentace - Vytvoření demonstračních materiálů 9. **Den 16: Nasazení a školení** - Nasazení systému do produkčního prostředí - Školení uživatelů a administrátorů - Zahájení podpory a údržby Celková odhadovaná pracnost: 16 pracovních dnů ## Klíčové aspekty mého řešení 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. 2. **Flexibilní anonymizace**: Navrhl jsem tři metody anonymizace přizpůsobitelné různým potřebám ochrany soukromí. 3. **Interaktivní rozhraní**: Využil jsem Streamlit pro vytvoření uživatelsky přívětivého webového rozhraní. 4. **Customizace**: Implementoval jsem možnost výběru konkrétních typů PII k detekci a anonymizaci. 5. **Reporting**: Vytvořil jsem systém pro generování přehledných statistik o detekovaných a anonymizovaných údajích. ## Algoritmus flow Pro lepší pochopení procesu detekce a anonymizace PII jsem vytvořil následující diagram, který ilustruje tok dat a klíčové kroky algoritmu: """) st.image("https://utfs.io/f/z2Za8Zqs0Nofbl54P61Phgi3WHO4xLUXal01qvcmesjT8KJp", caption="Diagram algoritmu flow pro detekci a anonymizaci PII") st.write(""" 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. ## Technologie a nástroje Při vývoji tohoto projektu jsem využil následující technologie a knihovny: - **Python**: Hlavní programovací jazyk pro implementaci logiky. - **Streamlit**: Pro vytvoření interaktivního webového rozhraní. - **Regex**: Využití pokročilých regulárních výrazů pro přesnou detekci PII. - **Faker**: Generování realistických falešných dat pro anonymizaci. - **Pandas**: Zpracování a vizualizace statistik o detekovaných PII. 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. ## Využití pro přípravu dat Tento systém hraje klíčovou roli v procesu přípravy dat pro různé účely, včetně: 1. **Ochrana soukromí**: Anonymizace osobních údajů v dokumentech před jejich dalším zpracováním nebo sdílením. 2. **Příprava trénovacích dat**: Bezpečná příprava textových dat pro trénování jazykových modelů nebo chatbotů. 3. **Compliance**: Pomoc při dodržování předpisů o ochraně osobních údajů, jako je GDPR. 4. **Analýza dat**: Umožnění bezpečné analýzy textových dat bez rizika úniku citlivých informací. 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. """) def show_future_development(): st.title("Plán vývoje a nasazení") st.write(""" ## Integrace s chatbotem pomocí FastAPI a LangChain Pro efektivní využití našeho anonymizačního nástroje v systému chatbota implementujeme následující: 1. **FastAPI Endpoints**: - `/anonymize`: POST endpoint pro anonymizaci jednotlivých textů - `/batch-anonymize`: POST endpoint pro dávkové zpracování většího množství dokumentů - `/update-rules`: PUT endpoint pro aktualizaci pravidel anonymizace - `/get-stats`: GET endpoint pro získání statistik o zpracovaných datech 2. **API Dokumentace**: - Využití Swagger UI pro interaktivní API dokumentaci - Detailní popis všech endpointů, včetně vstupních a výstupních schémat - Příklady použití pro každý endpoint 3. **Integrace s LangChain**: - Vytvoření custom LangChain tool pro anonymizaci dat - Implementace LangChain agent, který bude využívat náš anonymizační nástroj - Nastavení workflow pro automatické zpracování dokumentů před jejich použitím v chatbotu 4. **Příklad využití v LangChain**: ```python from langchain.agents import Tool from langchain.agents import initialize_agent from langchain.llms import OpenAI # Definice našeho anonymizačního nástroje anonymization_tool = Tool( name="Anonymization", func=lambda x: requests.post("http://our-api.com/anonymize", json={"text": x}).json()["anonymized_text"], description="Useful for anonymizing text containing personal information" ) # Inicializace agenta llm = OpenAI(temperature=0) agent = initialize_agent([anonymization_tool], llm, agent="zero-shot-react-description", verbose=True) # Použití agenta agent.run("Anonymize this text and then summarize it: 'Jan Novák, born on 15.3.1985, lives at Hlavní 123, Prague.'") ``` ## AI a NLP modely pro detekci PII 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ů: ### Výhody NER modelů pro náš projekt: 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. ### Plánované využití NLP a NER modelů: 1. **Přesnější detekce PII**: Využití pre-trénovaných modelů pro identifikaci širšího spektra osobních údajů. 2. **Kontextová analýza**: Schopnost rozpoznat PII i v méně zřejmých kontextech. 3. **Multijazyčná podpora**: Rozšíření detekce PII na více jazyků. 4. **Adaptivní učení**: Možnost doučování modelů na specifických datech klienta. ### Vhodné modely pro detekci PII: - FacebookAI/xlm-roberta-large-finetuned-conll03-english: Pro multijazyčnou detekci entit. - iiiorg/piiranha-v1-detect-personal-information: Specializovaný model pro detekci osobních informací. - Microsoft Presidio: Framework pro detekci a anonymizaci, který můžeme integrovat do našeho řešení. ### Implementace: 1. Využití Transformers knihovny pro integraci a fine-tuning modelů. 2. Vytvoření pipeline pro kombinaci rule-based přístupu s NER modely. 3. Implementace mechanismu pro pravidelné aktualizace a doučování modelů. 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ů. """) def show_usage_specifications(): st.title("Specifikace využití") st.write(""" ## Způsoby anonymizace Systém nabízí tři hlavní metody anonymizace osobních údajů: 1. **Nahrazení zástupnými znaky**: Osobní údaje jsou nahrazeny řetězcem 'X' stejné délky. 2. **Nahrazení obecnými pojmy**: Osobní údaje jsou nahrazeny obecným označením typu údaje (např. [JMÉNO], [ADRESA]). 3. **Použití falešných dat**: Osobní údaje jsou nahrazeny realisticky vypadajícími, ale fiktivními daty. ## Testování a ověření Pro zajištění správnosti a úplnosti anonymizace systém zahrnuje: 1. **Generování testovacích dat**: Možnost vytvářet fiktivní dokumenty s osobními údaji pro testování. 2. **Statistiky detekce**: Přehled detekovaných a anonymizovaných údajů pro každý dokument. 3. **Vizuální porovnání**: Možnost porovnat původní a anonymizovaný text pro kontrolu. ## Vstupní data Systém je navržen pro zpracování: 1. Libovolného textu zadaného uživatelem. 2. Generovaných falešných dat pro testovací účely. 3. (V budoucnu) Různých formátů dokumentů (TXT, PDF, DOC). ## Zdůvodnění výběru nástrojů 1. **Python**: Široká podpora pro NLP a zpracování textu, rozsáhlý ekosystém knihoven. 2. **Streamlit**: Rychlé vytvoření interaktivního rozhraní pro demonstraci funkčnosti. 3. **Regex**: Efektivní a flexibilní nástroj pro detekci vzorů v textu. 4. **Faker**: Generování realistických falešných dat pro testování a anonymizaci. Tato kombinace nástrojů umožňuje rychlý vývoj, snadnou údržbu a potenciál pro budoucí rozšíření systému. """) def show_test_data(): st.title("Testovací data pro anonymizační platformu") st.header("1. Osobní profily") st.subheader("Profil 1: Jan Novák") st.write(""" - Jméno: Jan Novák - Datum narození: 15.3.1985 - Rodné číslo: 850315/1234 - Adresa: Hlavní 123, 110 00 Praha 1 - E-mail: jan.novak@email.cz - Telefon: +420 601 234 567 - Číslo OP: 123456789 - Číslo účtu: 1234567890/0800 """) st.subheader("Profil 2: Marie Svobodová") st.write(""" - Jméno: Ing. Marie Svobodová, Ph.D. - Datum narození: 22.7.1990 - Rodné číslo: 905722/9876 - Adresa: Nová 456, 602 00 Brno - E-mail: marie.svobodova@gmail.com - Telefon: 00420777888999 - Číslo pasu: 98765432 - IBAN: CZ65 0800 0000 0012 3456 7890 """) st.subheader("Profil 3: Petr Dvořák") st.write(""" - Jméno: MUDr. Petr Dvořák - Datum narození: 1. ledna 1970 - Rodné číslo: 700101/3333 - Adresa: Dlouhá 789, 301 00 Plzeň - E-mail: petr.dvorak@seznam.cz - Telefon: 420 602 111 222 - DIČ: CZ7001013333 - Číslo pojištěnce: 700101/3333 """) st.header("2. Dokumenty") st.subheader("2.1 Životopis - Jan Novák") st.code(""" Jan Novák Hlavní 123, 110 00 Praha 1 Tel: +420 601 234 567 E-mail: jan.novak@email.cz Datum narození: 15.3.1985 Stav: ženatý Vzdělání: 2004-2009: Vysoká škola ekonomická v Praze, obor Finance Pracovní zkušenosti: 2010-současnost: Finanční analytik, ABC Bank, a.s. - Zpracování finančních reportů - Analýza investičních příležitostí 2009-2010: Junior účetní, XYZ s.r.o. - Vedení účetnictví malých a středních podniků Jazykové znalosti: Angličtina - pokročilá úroveň Němčina - středně pokročilá úroveň Reference: Ing. Jiří Zelený, vedoucí oddělení, ABC Bank, a.s. Tel: 420 234 567 890 """) st.subheader("2.2 Lékařská zpráva - Marie Svobodová") st.code(""" Fakultní nemocnice Brno Jihlavská 20, 625 00 Brno IČO: 65269705 LÉKAŘSKÁ ZPRÁVA Pacient: Ing. Marie Svobodová, Ph.D. Datum narození: 22.7.1990 Rodné číslo: 905722/9876 Bydliště: Nová 456, 602 00 Brno Pojišťovna: 111 Anamnéza: 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. Fyzikální vyšetření: TK: 130/80, P: 72/min, TT: 36.8°C Břicho měkké, palpačně citlivé v pravém podžebří, Murphy negativní. Závěr: Suspektní cholecystitis. Doporučeno ultrazvukové vyšetření břicha. Vypracoval: MUDr. Jan Veselý Dne: 15.5.2023 """) st.subheader("2.3 Faktura - Petr Dvořák") st.code(""" XYZ Servis s.r.o. Technická 10, 301 00 Plzeň IČO: 12345678 DIČ: CZ12345678 FAKTURA č. 2023001 Odběratel: MUDr. Petr Dvořák Dlouhá 789 301 00 Plzeň DIČ: CZ7001013333 Datum vystavení: 1.6.2023 Datum splatnosti: 15.6.2023 Forma úhrady: bankovní převod Položka Množství Cena/ks Celkem --------------------------------------------------------- Servis zdravotnického zařízení XY 1 10000 Kč 10000 Kč Náhradní díly 2 2500 Kč 5000 Kč --------------------------------------------------------- Celkem bez DPH 15000 Kč DPH 21% 3150 Kč Celkem s DPH 18150 Kč Číslo účtu pro platbu: 1234567890/0300 Variabilní symbol: 2023001 Děkujeme za Vaši důvěru a těšíme se na další spolupráci. """) st.header("3. E-mailová komunikace") st.subheader("3.1 E-mail od Jana Nováka") st.code(""" Od: jan.novak@email.cz Komu: podpora@banka.cz Předmět: Žádost o změnu osobních údajů Vážení, prosím o změnu mých kontaktních údajů ve Vašem systému. Nové údaje jsou následující: Jméno: Jan Novák Nová adresa: Krátká 456, 120 00 Praha 2 Nový telefon: 702 345 678 Moje identifikační údaje: Datum narození: 15.3.1985 Číslo účtu: 1234567890/0800 Děkuji za vyřízení mé žádosti. S pozdravem, Jan Novák """) st.subheader("3.2 E-mail od Marie Svobodové") st.code(""" Od: marie.svobodova@gmail.com Komu: hr@firma.cz Předmět: Žádost o pracovní pozici Vážená paní / Vážený pane, reaguji na Váš inzerát na pozici "Datový analytik" zveřejněný na pracovním portálu Jobs.cz. 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. Moje kontaktní údaje: Telefon: 777888999 E-mail: marie.svobodova@gmail.com LinkedIn: linkedin.com/in/marie-svobodova 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. S pozdravem, Marie Svobodová """) st.header("4. Příspěvek na sociální síti") st.subheader("4.1 Příspěvek Petra Dvořáka na Facebooku") st.code(""" Petr Dvořák 1. června 2023 v 10:15 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á """) if __name__ == "__main__": main()