找到類似symbolnames,在這些名字通常是文本的數字的組合,如「值1」,「_value2」,「test_5」等萊文斯坦比較字符串不改變我正在尋找一種方法數字
現在找到類似的名字,我嘗試使用Levenshtein距離,但是對於算法,「_value1」和「.value1」之間的區別與「_value1」和「_value8」的區別相同。 有沒有辦法比較字符串而不允許更改數字?
我目前使用的代碼是從http://www.dotnetperls.com/levenshtein
提前感謝!
找到類似symbolnames,在這些名字通常是文本的數字的組合,如「值1」,「_value2」,「test_5」等萊文斯坦比較字符串不改變我正在尋找一種方法數字
現在找到類似的名字,我嘗試使用Levenshtein距離,但是對於算法,「_value1」和「.value1」之間的區別與「_value1」和「_value8」的區別相同。 有沒有辦法比較字符串而不允許更改數字?
我目前使用的代碼是從http://www.dotnetperls.com/levenshtein
提前感謝!
您可以給出任何不相等的比較,包括一個非常高的距離,如200.這將保持「_text1」和「.text1」之間的距離爲1(相似),但距離爲200(非常不相似)在「text1」和「text10」之間。
你會通過改變步驟生成兩個做到這一點...
// Step 2
d[0, 0] = 0;
for (int i = 1; i <= n; i++);
{
if('0' <= s[i - 1] && s[i - 1] <= '9')
d[i, 0] = d[i-1, 0] + 200;
else
d[i, 0] = d[i-1, 0] + 1;
}
for (int j = 1; j <= m; j++)
{
if('0' <= t[j - 1] && t[j - 1] <= '9')
d[0, j] = d[0, j-1] + 200;
else
d[0, j] = d[0, j-1] + 1;
}
...五...
// Step 5
int cost = (t[j - 1] == s[i - 1]) ? 0 : 1;
if(('0' <= t[j - 1] && t[j - 1] <= '9') ||
'0' <= s[i - 1] && s[i - 1] <= '9'))
cost *= 200;
至於Kittsil的答案,這是我的完整解決方案。 我不確定它是否完全正確,但它似乎適用於我。
ushort n = (ushort)s.Length;
ushort m = (ushort)t.Length;
ushort[,] d = new ushort[n + 1, m + 1];
// Step 1
if (n == 0)
{
return m;
}
if (m == 0)
{
return n;
}
// Step 2
d[0, 0] = 0;
for (int i = 1; i <= n; i++)
{
if ('0' <= s[i - 1] && s[i - 1] <= '9')
d[i, 0] = (ushort)(d[i - 1, 0] + 200);
else
d[i, 0] = (ushort)(d[i - 1, 0] + 1);
}
for (int j = 1; j <= m; j++)
{
if ('0' <= t[j - 1] && t[j - 1] <= '9')
d[0, j] = (ushort)(d[0, j - 1] + 200);
else
d[0, j] = (ushort)(d[0, j - 1] + 1);
}
// Step 3
for (int i = 1; i <= n; i++)
{
//Step 4
for (int j = 1; j <= m; j++)
{
// Step 5
bool isIdentical = t[j - 1] == s[i - 1];
bool isNumber = ('0' <= t[j - 1] && t[j - 1] <= '9') || ('0' <= s[i - 1] && s[i - 1] <= '9');
int cost1 = isIdentical ? 0 : (isNumber ? 200 : 1);
int cost2 = isNumber ? 200 : 1;
// Step 6
d[i, j] = (ushort)(Math.Min(Math.Min(d[i - 1, j] + cost2, d[i, j - 1] + cost2), d[i - 1, j - 1] + cost1));
}
}
// Step 7
return d[n, m];
您好Kottsil,感謝您的快速回復!這幾乎是我所尋找的解決方案,除了由於最後一個「Math.Min(...)」之間的最後差異之外。 「var_3」和「var_1」是2,這仍然很低......但我可能可以自己弄清楚。順便說一句:你的第一個「for(int i ...)」需要以「i = 1」開始 – Robin