名前のつづりが正しいか(検索中の名前)かどうかを気にせずに検索したい名前ファイルがあります。ファイルやストリームから多数の類似した文字列を検索する機能がかなり多いことを知っていますが、grep
スペルエラーを修正する機能はなく、たとえあったとしてもこれは人の名前なので、標準辞書では見つかりません。
私の名前ファイルを特別な辞書に入れてから、標準のスペルチェックツールを使用できますか?このアプリケーションで特に重要なのは、同様に聞こえる単語を一致させる機能です。
たとえば、"jacob"
返す必要があります"Jakob"
。言語間の類似性も考慮すると一致する必要"miguel"
があります"Michael"
。
これはすでに実装されていますか、それとも直接構築する必要がありますか?
答え1
@manatwork そうですね。 soundexはあなたが探しているツールかもしれません。
CPANを使用してPerl Soundexモジュールをインストールします。
$ sudo cpan Text::Soundex
CPAN: Storable loaded ok (v2.27)
....
Text::Soundex is up to date (3.04).
テストする名前でいっぱいのファイルを作成します。names.txt
jacob
Jakob
miguel
Michael
SoundexモジュールのPerlスクリプトを使用して、soundslike.pl
#!/usr/bin/perl
use Text::Soundex;
open(FH, 'names.txt');
$targetSoundex=soundex($ARGV[0]);
print "Target soundex of $ARGV[0] is $targetSoundex\n";
while(<FH>) {
chomp;
print "Soundex of $_ is ".soundex($_);
if($targetSoundex eq soundex($_)) {
print " (match).\n";
}else {
print " (no match).\n";
}
}
close(FH);
実行可能にし、いくつかの例を実行します。
$ chmod +x soundslike.pl
$ ./soundslike.pl michael
Target soundex of michael is M240
Soundex of jacob is J210 (no match).
Soundex of Jakob is J210 (no match).
Soundex of miguel is M240 (match).
Soundex of Michael is M240 (match).
$ ./soundslike.pl jagub
Target soundex of jagub is J210
Soundex of jacob is J210 (match).
Soundex of Jakob is J210 (match).
Soundex of miguel is M240 (no match).
Soundex of Michael is M240 (no match).