import logging import os import traceback import pandas as pd import streamlit as st from annotated_text import annotated_text from presidio_helpers import analyzer_engine, anonymize # Konfigurace stránky st.set_page_config( page_title="Anonymizace českých textů", layout="wide", initial_sidebar_state="expanded", menu_items={ "About": "Anonymizace osobních údajů v českých textech pomocí Microsoft Presidio.", }, ) # Nastavení loggeru logger = logging.getLogger("anonymizace-streamlit") # Definice českých entit CZECH_ENTITIES = [ "OSOBA", "ADRESA", "TELEFON", "EMAIL", "DATUM_NAROZENÍ", "RODNÉ_ČÍSLO", "IČO" ] # Sidebar st.sidebar.header("Anonymizace osobních údajů v českých textech") # Výběr metody anonymizace st_operator = st.sidebar.selectbox( "Metoda anonymizace", ["Nahrazení", "Zvýraznění", "Maskování", "Hashování"], index=0, help=""" Vyberte metodu anonymizace osobních údajů: - Nahrazení: Nahrazení obecným termínem, např. - Zvýraznění: Zobrazení původního textu s barevně zvýrazněnými osobními údaji - Maskování: Nahrazení části údajů hvězdičkami - Hashování: Nahrazení hashem osobních údajů """ ) # Nastavení pro maskování st_mask_char = "*" st_number_of_chars = 4 if st_operator == "Maskování": st_number_of_chars = st.sidebar.number_input( "Počet znaků k maskování", value=st_number_of_chars, min_value=0, max_value=100 ) st_mask_char = st.sidebar.text_input( "Znak pro maskování", value=st_mask_char, max_chars=1 ) # Nastavení prahu důvěryhodnosti st_threshold = st.sidebar.slider( label="Práh důvěryhodnosti", min_value=0.0, max_value=1.0, value=0.5, help="Definujte práh pro přijetí detekce jako osobní údaj.", ) # Hlavní panel st.title("Anonymizace českých textů") # Informace o aplikaci with st.expander("O této aplikaci", expanded=False): st.info( """Tato aplikace je anonymizační platforma pro české texty založená na Microsoft Presidio. \n\nHlavní funkce: - Detekce osobních údajů v českém jazyce - Flexibilní metody anonymizace - Podpora textového vstupu \n\n[Zdrojový kód](https://github.com/vas-projekt/anonymizacni-platforma) | [Dokumentace](https://vas-projekt.github.io/anonymizacni-platforma/docs) | [Nahlásit problém](https://github.com/vas-projekt/anonymizacni-platforma/issues)""" ) # Vstupní text st.subheader("Vstupní text") st_text = st.text_area( label="Zadejte text k anonymizaci", value="Jan Novák, narozený 15.3.1980, bydlí na adrese Hlavní 123, Praha 1. Jeho telefonní číslo je +420 123 456 789 a e-mail jan.novak@email.cz. Rodné číslo: 800315/1234, IČO: 12345678.", height=200 ) try: # Výběr entit st_entities_expander = st.sidebar.expander("Vyberte entity, které hledat") selected_entities = st_entities_expander.multiselect( "Vyberte typy entit k anonymizaci:", CZECH_ENTITIES, default=CZECH_ENTITIES ) # Inicializace analyzátoru analyzer = analyzer_engine() # Analýza st_analyze_results = analyzer.analyze( text=st_text, entities=selected_entities, language="cs", score_threshold=st_threshold, ) # Anonymizace a zobrazení výsledků st.subheader("Výsledek anonymizace") if st_operator != "Zvýraznění": st_anonymize_results = anonymize( text=st_text, operator=st_operator, mask_char=st_mask_char, number_of_chars=st_number_of_chars, analyze_results=st_analyze_results, ) st.text_area( label="Anonymizovaný text", value=st_anonymize_results.text, height=200 ) else: annotated_tokens = annotate(text=st_text, analyze_results=st_analyze_results) annotated_text(*annotated_tokens) # Tabulka s výsledky st.subheader("Detekované osobní údaje") if st_analyze_results: df = pd.DataFrame.from_records([r.to_dict() for r in st_analyze_results]) df["text"] = [st_text[res.start : res.end] for res in st_analyze_results] df_subset = df[["entity_type", "text", "start", "end", "score"]].rename( { "entity_type": "Typ entity", "text": "Text", "start": "Začátek", "end": "Konec", "score": "Důvěryhodnost", }, axis=1, ) st.dataframe(df_subset.reset_index(drop=True), use_container_width=True) else: st.info("Žádné osobní údaje nebyly detekovány.") except Exception as e: logger.error(f"Chyba při zpracování: {str(e)}") st.error(f"Došlo k chybě při zpracování textu: {str(e)}") if os.getenv("DEBUG", "False").lower() == "true": st.error(traceback.format_exc())