Moduł Text::Soundex
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaSpis treści
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
- Zamieniamy wszystkie litery w słowie na duże i opuszczamy wszelkie znaki interpunkcyjne.
- Zachowujemy pierwszą literę słowa.
- Zamieniamy wszystkie wystąpienia poniższych liter znakiem .0. (zero): 'A', E', 'I', 'O', 'U', 'H', 'W', 'Y'.
- 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'
- Usuwamy wszystkie pary takich samych cyfr, które pojawiły się jedna obok drugiej w łańcuchu powstałym w wyniku kroku (4).
- Usuwamy wszystkie zera z łańcucha powstałego po kroku (5) (wstawione w kroku 3)
- 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.