Entry tags:
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# с дотнетами отличные. Ничего не делаешь, а все работает.