文字列を扱うアルゴリズム

また勢いで,全く何かわからないけれど名前が怪しかったので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

挙動が怪しい.


色んなアルゴリズムがあるんだなぁ.面白かった.