文字列を扱うアルゴリズム
また勢いで,全く何かわからないけれど名前が怪しかったのでTextっていうgemを入れてみた.このgem,テキストに関する色んなアルゴリズムを使えるようにしてくれるみたい.そのアルゴリズムは,コレだけある.
- Soundex
- Metaphone
- Double Metaphone
- Figlet
- Porter Stemming
ぶっちゃけ1つも聴いた事がないので,勉強がてら使ってみます.
Soundex
Soundexのアルゴリズム
文字列を英語で発音したときの,音声のグループを数値コードにマッピングするためのアルゴリズムで,例えば与えられた文字列が同じような発音をするかを求めるときに使用するみたい.
>> puts Text::Soundex.soundex(["Smith", "Smythe"]) S530 S530 >> puts Text::Soundex.soundex(["Omochi", "Omche"]) O520 O520
こんな感じ.
たとえばこういうものを書いてみる.requireははしょってます.
def soundex(arr) result = Text::Soundex.soundex(arr) comp = result.shift return result.inject(true) do |r,e| r = comp.eql?(e) ? r : false end end arr = %w{alacritous alacrity alcheringa alcoran algeria algerian algerians} puts soundex(arr) ==> true
結構面白い.
Metaphone
Metaphoneのアルゴリズム
Soundexと同じように発音系なアルゴリズム.
Soundex が取り組まない英語の発音に関する通常のルールを明確にコーディングすることです。例えば、Metaphone のアルゴリズムは、単語の最後にあるb がm の文字の後にある場合にはそのbを切り落とす明確なルールを包括します。
ということで,ただアルファベットの発音に拘るのでなく,英語の"発音のルール"に基づいたアルゴリズムだそうです.
>> puts Text::Metaphone.metaphone("Numb") NM >> puts Text::Metaphone.metaphone("Num") NM
このように,NumbとNumは似たような(あくまでも同じではない.というのも,NembでもNMなので)発音する事がわかりますね.
Double Metaphone
DoubleMetaphone のアルゴリズムはオリジナルの子音のクラスを少々いじり、全ての単語の最初の母音をAとしてエンコードすることによりSoundex のアルゴリズムとの関連を断ち切ります。より根源的に、(同じ単語であるにもかかわらず)複数の方法で発音される単語のために異なるコードを戻すように DoubleMetaphone は作成されました。
ということで,素人なボクはMetaphone強い版とでも解釈しておきます.
>> puts Text::Metaphone.double_metaphone("hegemony") HJMN HKMN >> puts Text::Metaphone.double_metaphone("omochi") AMX AMK
と,二通りのMetaphoneな結果が帰ってくると言う事で,なんかカッコいいですね.
Figlet
http://www.figlet.org/のように,文字をアスキーアートにするためのアルゴリズム(?).一番オモロいかもしれん.利用にはfontのフィアルが必要で,http://www.figlet.org/fontdb.cgiからダウンロードしてくる必要があります.
>> big_font = Text::Figlet::Font.new('big.flf') >> figlet = Text::Figlet::Typesetter.new(big_font) >> puts figlet['Omochi'] ____ _ _ / __ \ | | (_) | | | |_ __ ___ ___ ___| |__ _ | | | | '_ ` _ \ / _ \ / __| '_ \| | | |__| | | | | | | (_) | (__| | | | | \____/|_| |_| |_|\___/ \___|_| |_|_|
うひょーおもしれー.これやべーなー.色々使えそう(遊びに).
Porter Stemming
□いアタマを○くする。(日めくり) 2004 年度カレンダー, Stemming ライブラリ, /efont/ の名刺を作りました - ふぇみにん日記(2003-11-27)にて,ネタ元が紹介されていました.
>> puts Text::PorterStemming.stem("Functional") Function >> puts Text::PorterStemming.stem("Compilation") Compil
挙動が怪しい.
色んなアルゴリズムがあるんだなぁ.面白かった.