пятница, 1 августа 2008 г.

Десятый день (string kernel)

ЗАДАЧА
Поставлена задача - сравнение слов, из - за орфографических ошибок или применения различных схем транслитерации незначительно различающихся в написании. Обычно эти слова - имена собственные, например, фамилии и имена индийских программистов / богов.

РЕШЕНИЕ
Есть идея - использовать метрический подход. Меру схожести можно задавать по - разному, но я не буду "изобретать велосипед", а проверю string subsequence kernel.

> library(kernlab)
>  sapply(1:4, function(i) 1 - stringdot(i)("Ivanov", "Ivanova"))
[1] 0.04059678 0.06617810 0.11842085 0.17463783
> sapply(1:4, function(i) 1 - stringdot(i)("Ivanov", "Iwanow"))
[1] 0.5000000 0.5938462 0.7684211 0.9487179
> sapply(1:4, function(i) 1 - stringdot(i)("Ivanov", "Ivanow"))
[1] 0.1339746 0.2118939 0.2947368 0.4358974
> sapply(1:4, function(i) 1 - stringdot(i)("Moscow", "Moscva"))
[1] 0.2783122 0.4298703 0.5800510 0.7948718
> sapply(1:4, function(i) 1 - stringdot(i)("Moscow", "Moskva"))
[1] 0.4226497 0.6327978 0.8320204 1.0000000
> sapply(1:4, function(i) 1 - stringdot(i)("Moscow", "Moskwa"))
[1] 0.2783122 0.5687790 0.7952749 0.9743590
> sapply(1:4, function(i) 1 - stringdot(i)("Vainoopuya", "Vaynopuya"))
[1] 0.1105008 0.2817140 0.4582484 0.5662287
> sapply(1:4, function(i) 1 - stringdot(i)("Vainoopuya", "Vaynoupuya"))
[1] 0.1314010 0.3545168 0.5902365 0.7399516
> sapply(1:4, function(i) 1 - stringdot(i)("Zloy", "Dobriy"))
[1] 0.5917517 0.9734512 1.0000000 1.0000000
Рассматривается несколько ядер, задаваемых подстроками с длинами от 1 до 4.

ВЫВОД
Даже в базовом варианте результаты, как и ожидалось, хорошие. Схожие слова близки - различные далеки. Результаты можно улучшить, используя различные веса (задавая их по статистическим данным или из лингвистических соображений). Кстати, насчёт лингвистики: можно ещё попробовать вероятностные грамматики.

Комментариев нет: