Ну, soundex может быть реализован простым проходом по строке, так что не требуется ничего особенного.
После этого 4-символьный код можно рассматривать как целочисленную клавишу.
Затем просто создайте словарь, в котором хранятся наборы слов, проиндексированные этим целочисленным ключом. 50 000 слов должны легко поместиться в память, поэтому ничего особенного не требуется.
Затем пройдитесь по словарю, и каждое ведро представляет собой группу похожих звучащих слов.
На самом деле, вот вся программа на Perl:
#!/usr/bin/perl
use Text::Soundex;
use Data::Dumper;
open(DICT,"</usr/share/dict/linux.words");
my %dictionary = ();
while (<DICT>) {
chomp();
chomp();
push @{$dictionary{soundex($_)}},$_;
}
close(DICT);
while (<>) {
my @words = split / +/;
foreach (@words) {
print Dumper $dictionary{soundex($_)};
}
}