2

谁能建议我使用soundex 算法程序的数据结构?使用的语言是Java。如果有人以前在 Java 中做过这方面的工作。该程序应具有以下功能: 能够阅读大约 50,000 个单词 应该能够阅读一个单词并返回具有相同 soundex 的相关单词

我不希望程序实现只是关于使用什么数据结构的一些建议。

4

6 回答 6

3

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

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

于 2008-11-06T23:34:44.063 回答
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($_)};
        }
}
于 2008-11-06T23:35:13.750 回答
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 或你有的。某些策略可能是可调的(输出多少字符等)

于 2008-11-07T00:13:18.103 回答
1

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

Google Collections中的 MultiMap 集合接口(及其实现)对您很有用。

于 2008-11-06T23:34:30.320 回答
0

由于 soundex 是一个哈希,我会使用一个哈希表,其中 soundex 作为键。

于 2008-11-06T23:35:18.727 回答
0

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

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

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

于 2009-01-01T15:48:38.760 回答