Napisaliśmy własny silnik, bo biblioteka do wykrywania danych osobowych odpowiada na inne pytanie niż to, które zadaje użytkownik. Biblioteka podaje, gdzie w tekście pasuje wzorzec, a użytkownik chce wiedzieć, co zakryć na stronie, którą ma przed sobą. Niemal cała praca potrzebna, by przejść od jednego do drugiego, sprowadza się do decyzji, czego nie oznaczać.
Co robi biblioteka
Presidio to dojrzała, starannie utrzymywana biblioteka: projekt powstał w Microsofcie, a dziś rozwija go społeczność. Biblioteka przyjmuje ciąg znaków i zwraca listę wyników: typ danych, początek i koniec fragmentu oraz poziom pewności.
Dla zespołu, który przetwarza strumień wiadomości lub zgłoszeń, to wszystko, czego potrzeba, i biblioteka dobrze się z tego wywiązuje. Pytanie tylko, ile pracy trzeba jeszcze włożyć, żeby z jej wyniku powstał gotowy dokument.
Użytkownik naszego produktu nie ma ciągu znaków, tylko czterdziestostronicową umowę w PDF albo zeskanowany akt notarialny. Dla niego pozycje znaków to dopiero początek pracy.
Od pozycji znaków do obszaru na stronie
PDF nie przechowuje zdań, tylko znaki wraz z ich położeniem na stronie. Żeby zakryć nazwisko, trzeba przełożyć pozycję w tekście na współrzędne prostokąta, a potem znaleźć każde inne wystąpienie tej wartości, także na dalszych stronach.
Samo zakrycie nie wystarcza: czarny prostokąt narysowany na tekście nie usuwa go, tekst zostaje pod spodem i można go skopiować. Zaczernianie musi usunąć treść ze strony.
Dane osobowe są też w miejscach, których na stronie nie widać. Eksport obejmuje teksty alternatywne w PDF ze znacznikami, metadane XMP, dane PieceInfo, nazwane miejsca docelowe oraz wartości pól formularzy razem z ich wyglądem.
Zakodowana wartość dostaje tam swój kod, a zaczerniona neutralny znacznik. Miniatury stron wygenerowane przed zaczernieniem są usuwane, bo w obrazie nie da się wyszukać i zamienić tekstu.
Skany
Zeskanowana strona to obraz, więc biblioteka tekstowa nie ma na niej czego szukać. Nasz silnik renderuje taką stronę w rozdzielczości 300 dpi i uruchamia Tesseract z językiem dokumentu oraz angielskim. Dane osobowe lokalizuje jako obszary obrazu i zakrywa odpowiadające im piksele.
Pod spodem odbudowuje warstwę tekstu, którą można przeszukiwać. Skan odczytany z niewłaściwym pakietem językowym daje tekst pełen błędów, a program w żaden sposób tego nie sygnalizuje. Dlatego język dokumentu warto ustawić przed wykrywaniem.
Najwięcej pracy: czego nie oznaczać
Model wykrywania często uznaje słowa „Prezes Zarządu” za osobę, a słowo „Spółka” na początku zdania oznacza jako firmę. Każde takie trafienie trzeba ręcznie odrzucić, a w długiej umowie są ich setki.
Po wykryciu działa więc kilka filtrów. Lista tytułów i funkcji, takich jak „CEO” czy „Directeur”, ma 208 pozycji w wielu językach. Osobne listy obejmują ogólne nazwy organizacji i nazwy jurysdykcji.
Każdy błąd filtra się powiela, bo silnik przenosi wyniki między stronami. Jeśli słowo „Oddział” zostanie uznane za nazwę firmy, trafi do wyników w całym dokumencie. Listy wyjątków trzeba więc utrzymywać dla każdego języka osobno.
Na to, a nie na wybór modelu, poświęcamy większość pracy. Model podsuwa kandydatów, a filtry decydują, które z nich zobaczy osoba sprawdzająca wyniki.
Warstwy wykrywania
Wzorce znajdują dane o stałym formacie, na przykład numery IBAN. Modele wykrywania nazw, zależnie od języka spaCy, BERT, a w części języków także GLiNER, znajdują nazwiska, firmy i adresy. Opcjonalny model językowy jest domyślnie wyłączony.
Wyniki są łączone i usuwa się z nich powtórzenia, a nazwisko znalezione na pierwszej stronie zostaje oznaczone także na czwartej. Dopiero potem działają filtry.
Żaden lokalny model nie znajduje wszystkich danych. Dlatego aplikacja wymaga przeglądu wyników, zanim plik będzie można pobrać.
Co pokazuje porównanie
W opublikowanym teście porównawczym Presidio w domyślnej konfiguracji zgłosiło na tych samych dokumentach 666 fragmentów, a promptShield 252. Testu nie powtórzono na obecnej wersji silnika. Obie liczby opisują więc stan z dnia pomiaru.
Większość różnicy stanowią fragmenty, które odrzuciłyby nasze filtry. Biblioteka, która zwraca więcej pozycji, po prostu robi to, do czego służy, a filtrowanie zostawia temu, kto ją wdraża.
Inżynier, który rozważa złożenie własnego rozwiązania z gotowych bibliotek, powinien znać tę proporcję: podłączenie modelu zajmuje kilka dni, a filtry, skany i ukryte części PDF zajęły nam wielokrotnie więcej czasu.
Kody i model w przeglądarce
Własny silnik pozwala też kodować wartości w sposób odwracalny. Kod zastępuje wartość, a jego długość jest dopasowana do długości oryginału. Kody są przypisane do folderu: w jednym folderze ta sama wartość dostaje ten sam kod, a w innym folderze inny.
Tylko kod dodany ręcznie w Ustawieniach obowiązuje wszędzie. Bezpłatna aplikacja w przeglądarce tworzy kody w ten sam sposób co aplikacja na komputer, ale z własnym kluczem.
W obu wersjach dokument nie opuszcza komputera. Pracę całkowicie bez sieci, czyli bez sprawdzania licencji i bez raportów o błędach, umożliwia tylko aplikacja na komputer w planie Pro. Mając własny model, mogliśmy też zmniejszyć go na potrzeby przeglądarki.
Najczęstsze pytania
Czy Presidio wystarczy do anonimizacji plików PDF?
Presidio analizuje tekst i zwraca pozycje znaków. Wyodrębnienie tekstu z PDF, zakrycie obszarów na stronie i obsługę skanów trzeba zbudować samodzielnie.
Dlaczego model wykrywania oznacza stanowiska jako osoby?
Tytuł pisany wielką literą wygląda dla modelu jak nazwa własna. Pomaga dopiero lista wyjątków, która w promptShield liczy 208 pozycji.
Czy ta sama wartość zawsze dostaje ten sam kod?
Tylko w obrębie jednego folderu. W innym folderze ta sama wartość dostanie inny kod. Wyjątkiem jest kod dodany ręcznie w Ustawieniach, który obowiązuje wszędzie.
Czy aplikacja w przeglądarce wysyła dokumenty do internetu?
Dokument zostaje na komputerze użytkownika. Bezpłatna aplikacja w przeglądarce wysyła jedynie anonimowy sygnał uruchomienia, dlatego nie nazywamy jej aplikacją offline.