Структура данных для алгоритма Soundex? - PullRequest
2 голосов
/ 07 ноября 2008

Может кто-нибудь подсказать, какую структуру данных использовать для алгоритма soundex программы? Используемый язык - Java. Если кто-то работал над этим раньше в Java. Программа должна иметь следующие функции: быть в состоянии прочитать около 50000 слов должен уметь читать слово и возвращать связанные слова, имеющие одинаковый soundex

Я не хочу, чтобы в реализации программы было несколько советов о том, какую структуру данных использовать.

Ответы [ 6 ]

3 голосов
/ 07 ноября 2008

СОВЕТ: Если вы используете SQL в качестве пакета данных, вы можете позволить SQL обрабатывать его с помощью двух функций sql SOUNDEX и DIFFERENCE.

Может быть, не то, что вы хотели, но многие люди не знают, что MSsql имеет эти две функции.

2 голосов
/ 07 ноября 2008

Ну, 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($_)};
        }
}
1 голос
/ 07 ноября 2008
class SpellChecker
{

  interface Hash {
    String hash(String);
  }

  private final Hash hash;

  private final Map<String, Set<String>> collisions;

  SpellChecker(Hash hash) {
    this.hash = hash;
    collisions = new TreeSet<String, Set<String>>();
  }

  boolean addWord(String word) {
    String key = hash.hash(word);
    Set<String> similar = collisions.get(key);
    if (similar == null)
      collisions.put(key, similar = new TreeSet<String>());
    return similar.add(word);
  }

  Set<String> similar(String word) {
    Set<String> similar = collisions.get(hash.hash(word));
    if (similar == null)
      return Collections.emptySet();
    else
      return Collections.unmodifiableSet(similar);
  }

}

Стратегией хеширования может быть Soundex, Metaphone или что-то еще. Некоторые стратегии могут быть настраиваемыми (сколько символов он выводит и т. Д.)

1 голос
/ 07 ноября 2008

Полагаю, вам просто нужно преобразовать исходные строки в ключи soundex в хеш-таблицу; значение для каждой записи в таблице будет представлять собой коллекцию исходных строк, сопоставляемых с этим soundex.

Интерфейс коллекции MultiMap (и его реализации) в Коллекции Google будет вам полезен.

0 голосов
/ 01 января 2009

Вы хотите 4-байтовое целое число.

Алгоритм soundex всегда возвращает 4-символьный код, если вы используете входные данные ANSI, вы получите обратно 4 байта (представленные в виде 4 букв).

Сохраните коды, возвращенные в хеш-таблице, преобразуйте свое слово в код и найдите его в хеш-таблице. Это действительно так просто.

0 голосов
/ 07 ноября 2008

Поскольку soundex - это хеш, я бы использовал хеш-таблицу с soundex в качестве ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...