2016-08-22 15 views
0

找到類似symbolnames,在這些名字通常是文本的數字的組合,如「值1」,「_value2」,「test_5」等萊文斯坦比較字符串不改變我正在尋找一種方法數字

現在找到類似的名字,我嘗試使用Levenshtein距離,但是對於算法,「_value1」和「.value1」之間的區別與「_value1」和「_value8」的區別相同。 有沒有辦法比較字符串而不允許更改數字?

我目前使用的代碼是從http://www.dotnetperls.com/levenshtein

提前感謝!

回答

3

您可以給出任何不相等的比較,包括一個非常高的距離,如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; 
+0

您好Kottsil,感謝您的快速回復!這幾乎是我所尋找的解決方案,除了由於最後一個「Math.Min(...)」之間的最後差異之外。 「var_3」和「var_1」是2,這仍然很低......但我可能可以自己弄清楚。順便說一句:你的第一個「for(int i ...)」需要以「i = 1」開始 – Robin

1

至於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];