Moduł Text::Soundex

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa

Moduł Text::Soundex

Wstęp

Moduł ten implementuje algorytm soundex opisany przez Donalda Knuth'a w trzeciej części "The Art of Computer Programming". Algorytm miał haszować słowa (głównie nazwiska) do małych rozmiarów kodów, używając prostego modelu, który przybliżał brzmienie słowa wymawianego przez angielskiego spikera. Każde słowo jest redukowane do czterech znaków, gdzie pierwszy znak jest dużą literą, a pozostałe trzy cyframi.

Szkic algorytmu

  1. Zamieniamy wszystkie litery w słowie na duże i opuszczamy wszelkie znaki interpunkcyjne.
  2. Zachowujemy pierwszą literę słowa.
  3. Zamieniamy wszystkie wystąpienia poniższych liter znakiem .0. (zero): 'A', E', 'I', 'O', 'U', 'H', 'W', 'Y'.
  4. Zamieniamy litery z poniższych zestawów podanymi cyframi:
    • 1 = 'B', 'F', 'P', 'V'
    • 2 = 'C', 'G', 'J', 'K', 'Q', 'S', 'X', 'Z'
    • 3 = 'D','T'
    • 4 = 'L'
    • 5 = 'M','N'
    • 6 = 'R'
  5. Usuwamy wszystkie pary takich samych cyfr, które pojawiły się jedna obok drugiej w łańcuchu powstałym w wyniku kroku (4).
  6. Usuwamy wszystkie zera z łańcucha powstałego po kroku (5) (wstawione w kroku 3)
  7. Wypełniamy zerami końcowymi łańcuch powstały w wyniku kroku 6 i zwracamy tylko pierwsze cztery pozycje otrzymując łańcuch o formie: [duża litera] [cyfra] [cyfra] [cyfra].

Opis

Wartość zwracana dla słów, które nie mają kodu soundex można zdefiniować używając $Text::Soundex::nocode. Domyślną wartością jest undef. W kontekście skalarnym soundex() zwraca kod soundex'a jego pierwszego argumentu. W kontekście listowym, zwracana jest lista, w której każdy element jest kodem soundexowym odpowiadającym każdemu podanemu argumentowi np: @codes = soundex qw(Mike Stok); # w @codes mamy: ('M200', 'S320')

Aby użyć Text::Soundex do wygenerowania kodów, które mogą być użyte do przeszukania jednego z publicznie dostępnych amerykańskich cenzusów (US Censuses) należy użyć poniższego kodu: use Text::Soundex 'soundex_nara'; $code = soundex_nara($name);

Algorytm używany przez amerykański cenzus lekko różni się od tego zdefiniowanego przez Knuth'a i resztę. Można to zaobserwować na poniższym przykładzie: use Text::Soundex qw(soundex soundex_nara); print soundex("Ashcraft"), "\n"; # wypisze: A226 print soundex_nara("Ashcraft"), "\n"; # wypisze: A261

Ograniczenia

Biorąc pod uwagę fakt, że algorytm był używany dawno temu w stanach, dotyczy on głównie angielskiego alfabetu i wymowy. Wszelkie nie-ASCII znaki będą ignorowane. Zalecaną metodą radzenia sobie z nietypowymi znakami z akcentami lub innymi zawartymi w unicode, jest używanie modułu Text::Unidecode: use Text::Soundex; use Text::Unidecode; print soundex(unidecode("Fran\xE7ais")), "\n"; # wypisze: "F652\n" Można też skorzystać z innego sposobu: use Text::Soundex 'soundex_unicode'; print soundex_unicode("Fran\xE7ais"), "\n"; # wypisze "F652\n"

Przykłady

Poniżej mamy przykłady kodów wygenerowanych dla kilku różnych nazwisk. Jak widać podobnie brzmiące nazwiska mają te same kody soundex'owe: Euler, Ellery -> E460 Gauss, Ghosh -> G200 Hilbert, Heilbronn -> H416 Knuth, Kant -> K530 Lloyd, Ladd -> L300 Lukasiewicz, Lissajous -> L222

Z tego mamy: $code = soundex 'Knuth'; # $code zawiera 'K530' @list = soundex qw(Lloyd Gauss); # @list zawiera 'L300', 'G200'

Dokumentacja

Kompletną dokumentację znajdziecie tutaj: http://search.cpan.org/~markm/Text-Soundex-3.02/Soundex.pm.

Uniwersytet Gdański - Instytut Informatyki - Strona domowa - Perl - Wyklady
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.