Czasami błędy są naprawdę zabawne

Ludzie uczą się na błędach. Dlatego powinno się je upubliczniać, a nie utajniać.

GLib jest biblioteką narzędziową, zaprojektowaną dla GNOME’a, ale używaną także przez inne projekty. Jedną z wielu funkcji, które dostarcza, jest g_date_set_parse(). Jest to naprawdę prosta i sprytna funkcja. Przyjmuje jako parametr napis do przeanalizowania, ale w przeciwieństwie do wielu innych funkcji analizujących teksty zawierające daty nie wymaga podania formatu daty. Zamiast tego po prostu próbuje znaleźć w tekście liczby i nazwy miesięcy i rozpoznać jaką datę mogą one przedstawiać. Oczywiście, nazwy miesięcy są rozpoznawane zgodnie z biężącymi ustawieniami językowymi.

Przyjrzyjmy się jak to działa w języku polskim. Dla przypomnienia, oto lista miesięcy:

Lp. Nazwa pełna Nazwa skrócona
1. Styczeń Sty
2. Luty Lut
3. Marzec Mar
4. Kwiecień Kwi
5. Maj Maj
6. Czerwiec Cze
7. Lipiec Lip
8. Sierpień Sie
9. Wrzesień Wrz
10. Październik Paź
11. Listopad Lis
12. Grudzień Gru

W implementacji algorytmu pętla przebiega przez wszystkie miesiące i sprawdza czy analizwany napis (ciąg znakowy) zawiera jako podciąg nazwę miesiąca, pełną lub skróconą. Pierwszy miesiąc, którego nazwa zostanie znaleziona, jest uznany za wynik. Przyjrzyjmy się co się stanie, jeśli algorytm dostanie do przeanalizowania napis zawierający słowo wrzesień:

Numer iteracji Nazwa pełna Nazwa skrócona Czy napis wrzesień zawiera go?
1. Styczeń Sty Nie
2. Luty Lut Nie
3. Marzec Mar Nie
4. Kwiecień Kwi Nie
5. Maj Maj Nie
6. Czerwiec Cze Nie
7. Lipiec Lip Nie
8. Sierpień Sie Tak: wrzesień!

Czyli, jak widzimy, napis wrzesień zostanie rozpoznany jako sierpień.

Czy to poważny problem?

Szczerze mówiąc, nie. Błąd wydaje się istnieć od 20 lat i jak dotąd nikomu nie przeszkadzał. Rozpoznawanie dat w językach naturalnych jest niezbyt użyteczne. Jest wiele ważniejszych powodów, dla których w wielu językach ma prawo nie działać, jak np. niekompletne lub błędnie przetłumaczone listy nazw miesięcy, zmieniające się reguły ortografii, aktualizacje dostępnych znaków Unicode itp. Być może nie ma zwykłych aplikacji, które by wymagały tej funkcjonalności.

Mimo to błąd został zgłoszony do Bugzilli GNOME’a i będzie poprawiany.