soundexアルゴリズムプログラムに使用するデータ構造について、誰かが私に提案できますか? 使用言語はJavaです。誰かがJavaでこれに取り組んだことがあるなら。プログラムには次の機能が必要です。
プログラムの実装に、使用するデータ構造に関するいくつかのアドバイスだけは望んでいません。
soundexアルゴリズムプログラムに使用するデータ構造について、誰かが私に提案できますか? 使用言語はJavaです。誰かがJavaでこれに取り組んだことがあるなら。プログラムには次の機能が必要です。
プログラムの実装に、使用するデータ構造に関するいくつかのアドバイスだけは望んでいません。
ヒント: SQL をデータバックエンドとして使用する場合は、2 つの SQL 関数 SOUNDEX と DIFFERENCE を使用して SQL に処理させることができます。
あなたが望んでいたものではないかもしれませんが、多くの人は MSsql にこれら 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($_)};
}
}
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、またはあなたが持っているものである可能性があります。一部の戦略は調整可能である可能性があります(出力する文字数など)
元の文字列をsoundexキーに変換してハッシュテーブルにするだけでよいと思います。テーブル内の各エントリの値は、その soundex にマッピングされた元の文字列のコレクションになります。
Google Collectionsの MultiMap コレクション インターフェース (およびその実装)が役立ちます。
4バイトの整数が必要です。
soundexアルゴリズムは常に4文字のコードを返します。ANSI入力を使用すると、4バイトが返されます(4文字で表されます)。
したがって、返されたコードをハッシュテーブルに保存し、単語をコードに変換して、ハッシュテーブルで検索します。本当に簡単です。
soundex はハッシュであるため、soundex をキーとしてハッシュ テーブルを使用します。