Я пытаюсь реализовать функцию расстояния levenshtein в C++, которая дает различные веса для подстановок и вставок, на основе которых символы заменяются или вставлены.Расстояние Levenshtein с неравномерной стоимостью для вставок и замен:
Стоимость уточняется по расстоянию клавиш на клавиатуре qwerty. Например, в стандартном алгоритме редактирования расстояния расстояние между google, hoogle и zoogle одинаково; 1. То, что я хочу, это разные расстояния для них. Что-то вроде google -> hoogle = 1, google -> zoogle = 4, hoogle -> zoogle = 5.
Я следовал за Wikipedia algorithm, используя матрицу для memoization и реализовал ее на C++. Вот моя функция.
int levDist(string s, string t) {
int i,j,m,n,temp,subsitutionCost, deletionCost, insertionCost, keyDist;
deletionCost = 1;
m = s.length();
n = t.length();
int d[m+1][n+1];
for(i=0;i<=m;i++)
d[i][0] = i;
for(j=0;j<=n;j++)
d[0][j] = j;
for (j=1;j<=n;j++)
{
for(i=1;i<=m;i++)
{
// getKeyboardDist(char a, char b) gives distance b/w the two keys
keyDist = getKeyboardDist(s[i-1],t[j-1]);
subsitutionCost = (s[i-1] == t[j-1]) ? 0 : keyDist;
// this line is the one i think the problem lies in
insertionCost = (i > j) ? getKeyboardDist(s[i-1],t[j-2]) : getKeyboardDist(s[i-2],t[j-1]);
insertionCost = insertionCost ? insertionCost : 1;
d[i][j] = min((d[i-1][j] + deletionCost),
min((d[i][j-1] + insertionCost),
(d[i-1][j-1] + subsitutionCost)));`
}
}
return d[m][n];
}
Теперь подсекции работают правильно, я верю, но проблема заключается в вставках. Я не знаю, как найти, какие символы получить расстояние между вставками. Особенно случаи, когда вставка находится в начале или конце строки.
Я был бы признателен за любую помощь в этом, сообщите мне, если есть какая-либо другая информация.
Заранее спасибо.
привет спасибо за ответ! Я сохранил ключевые координаты в хэш-карте и могу рассчитать расстояния между любыми двумя клавишами. Ваше представление о левом и правом - это то, о чем я думал. Просто не мог окутать голову, как поместить это в код в контексте матрицы подстроки. – KaziJehangir
Я думаю, что вы можете в основном скопировать код из википедии: https://en.wikipedia.org/wiki/Levenshtein_distance и изменить увеличение уменьшения 1 до функции, называемой 'int calcDistance (key1, key2)' – yd1