2013-02-25 52 views
1

說我有一個參考串字符串序列的相似性/差異比在JavaScript和Python

「abcdabcd」

和目標串

「abcdabEd」

有一個簡單的方式在JavaScript和Python獲得字符串序列相似比率?

實施例:

「abcdabcd」,從「abcdabEd」相差的字符「E」,所以相似的比率爲高,但小於1.0

「bcdabcda」不同於「abcdabEd」大大因爲每字符在一個特定的字符串索引是不同的,因此相似比是0.0

注意,相似性比率不相似字符多少在每個字符串,但序列的相似程度彼此

因此,類似的

# python - incorrect for this problem 
difflib.SequenceMatcher(None, "bcdabcda", "abcdabEd").ratio() 

代碼將是錯誤

+1

你有沒有試過?聽起來並不困難。您需要定義它對不同長度的字符串的行爲,但對於長度相同的字符串,它應該很簡單。 – 2013-02-25 21:28:37

+0

http://andrew.hedges.name/experiments/levenshtein/ – bfavaretto 2013-02-25 21:28:48

+0

@bfavaretto:這與Levenshtein距離不一樣。當然,這與模糊有關,但請注意,第二個例子的編輯距離相當小,只有一個刪除和一個插入。但是這個請求會讓它們儘可能地分開。 – 2013-02-25 21:32:20

回答

1

如何回合

float(sum([a==b for a,b in zip(my_string1,my_string2)]))/len(my_string1) 



>>> s1,s2 = "abcdabcd","abcdabEd" 
>>> print float(sum([a==b for a,b in zip(s1,s2)]))/len(s1) 
0.875 
+0

我喜歡這個答案的簡單性,是否有這樣的JavaScript等價物? – Derek 2013-02-25 23:26:00

2

您可以使用此通式,它也適用於字符串或對象數組具有相同或不同的長度

similarity =#common /(sqrt(nx * ny));

其中#common是常見現象(在這種情況下是匹配字符的數量);
nx是對象x(或稱爲x的字符串)數組的長度;
ny是對象y(或稱爲y的字符串)數組的長度。

如果串的長度是相同的,式簡化爲簡單的情況:

相似=#公共/ N;
其中: n = nx = ny。

在蟒蛇這個公式的字符串(考慮字符的順序,只要你想)的相似性可以寫成:

from math import sqrt 

def similarity(x, y): 
    n=min(len(x), len(y)) 
    common=0 
    for i in range(n): 
     if (x[i]==y[i]): 
      common+=1 
    return common/sqrt(len(x)*len(y)) 

,並在JavaScript是類似的。