stdray: (pic#896193)
stdray ([personal profile] stdray) wrote2012-03-30 07:51 pm

metaphone


Наткнулся на хабрастатью, где рассказывается о фонетических алгоритмах. Штука достаточно распространенная, тот же soundex во всяких субд присутствует. Вещь скорее забавная чем полезная, хотя... Например, мною написана небольшая тулза, в которой ведется база наших контрагентов. Таки может и пригодится, поскольку эти чудики любят перерегистрироваться из "Рога и Копыта" в "Рога и Капыты", "Р'Ога и Копыта". В общем, забавы для написал русский алгоритм metaphone. Под катом код на F#, вдруг кому-то из пишущих под .NET понадобится.

let metaphone2 (word: string) = 
    let map = Map.ofList ["Б","П";  "З","С";  "Д","Т";  "В","Ф";  "Г","К"; 
                           "О","А";  "Ы","А";  "Я","А"; 
                           "Е","И";  "Ё","И";  "Э","И";  "Ю","У";
                           "ЙО","И"; "ИО","И"; "ЙЕ","И"; "ИЕ","И"; 
                           "ТС","Ц"; "ДС","Ц"] 
    ["[ЬЪ-]"                              , fun (m:Match) -> String.Empty
     "([БВГДЖЗКЛМНПРСТФХЦЧШЩ])\\1+"       , fun (m:Match) -> m.Value.[0..0];
     "[БЗДВГ][БВГДЖЗКПСТФХЦЧШЩ]|[БЗДВГ]$" , fun (m:Match) -> map.[m.Value.[0..0]] + m.Value.[1..]
     "ЙО|ИО|ЙЕ|ИЕ|ТС|ДС|[ОЫЯЕЁЭ]"         , fun (m:Match) -> map.[m.Value]]
    |> Seq.fold(fun s (p,r) -> Regex.Replace(s,p,r)) (word.ToUpper())


Ну и да. F# с дотнетами отличные. Ничего не делаешь, а все работает.

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting