soundex算法的数据结构?

时间:2008-11-06 23:28:49

标签: java data-structures soundex

有人可以建议我使用什么数据结构进行soundex algorithm计划吗?要使用的语言是Java。如果有人在Java之前就已经开始研究过了。该程序应具有以下功能:  能够阅读大约50,000个单词  应该能够阅读一个单词并返回具有相同soundex的相关单词

我不希望程序实现对使用什么数据结构的建议很少。

6 个答案:

答案 0 :(得分:3)

提示:如果您使用SQL作为数据包,那么您可以让SQL使用两个sql-functions SOUNDEX和DIFFERENCE来处理它。

也许不是你想要的,但很多人不知道MSsql有这两个功能。

答案 1 :(得分:2)

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($_)};
        }
}

答案 2 :(得分:1)

我相信你只需要将原始字符串转换为soundex键到哈希表中;表中每个条目的值将是映射到该soundex的原始字符串的集合。

Google Collections中的MultiMap集合界面(及其实现)对您有用。

答案 3 :(得分:1)

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,或者你有什么。某些策略可能是可调的(输出多少个字符等)

答案 4 :(得分:0)

由于soundex是一个哈希值,我会使用一个哈希表,以soundex为键。

答案 5 :(得分:0)

你想要一个4字节的整数。

soundex算法总是返回一个4字符的代码,如果你使用ANSI输入,你将得到4字节的代码(表示为4个字母)。

因此,将哈希表中返回的代码存储起来,将您的单词转换为代码并在哈希表中查找。它真的很容易。