metaphone

Mar. 30th, 2012 07:51 pm
stdray: (pic#896193)
[personal profile] stdray

Наткнулся на хабрастатью, где рассказывается о фонетических алгоритмах. Штука достаточно распространенная, тот же 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# с дотнетами отличные. Ничего не делаешь, а все работает.

December 2019

S M T W T F S
1234567
891011121314
15161718192021
222324252627 28
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags