字串相似度

2021-07-14 02:04:14 字數 2576 閱讀 4034

最近要對字串進行聚類,這些字串都是**的輸出,嘗試了幾種字串相似度度量的方法:

levenshtein距離

字串核函式

lcs/max(len(str1,str2))

其中相似度用公式distance=1.0/similarity-1轉換為距離.使用層次聚類方法.

下面是要聚類的字串

points = ['aabbccdd', 'aaddccbb', 'aaaaccbb', 'bbbbccdd',

'eeeebbccdd', 'aaeebbeeccdd',

'aaaaaaaa', 'aabbbbdd', 'bbccdd', 'aabbdd',

'aabb', 'aadd', 'bbdd', 'aa', 'bb',

'aabaaabaabaabaaaaba', 'abaaabaaabaabaaaab']

下面看一下使用levenshtein距離聚類的過程的前幾部:

['aabbccdd', 'bbbbccdd'] aabbccdd

['aaddccbb', 'aaaaccbb'] aaddccbb

['aabbbbdd', 'aabbdd'] aabbbbdd

['bbccdd', 'bbdd'] bbccdd

['aabb', 'aadd'] aabb

['aa', 'bb'] aa

這裡出現了有疑問的地方,aa和bb應該被分到一類麼?

他們的levenshtein距離比較小,但是他們是完全不同的.levenshtein距離容易把短小的串認為是相近的.

最後的結果是

[[15, 16], [[4, 5], [6, [[[10, 11], [13, 14]], [[1, 2], [[8, 12], [[0, 3], [7, 9]]]]]]]]

下面看看使用lcs聚類的過程的前幾部:

['aabaaabaabaabaaaaba', 'abaaabaaabaabaaaab'] aabaaabaabaabaaaaba

['aabbccdd', 'bbbbccdd'] aabbccdd

['aaddccbb', 'aaaaccbb'] aaddccbb

['aabbbbdd', 'aabbdd'] aabbbbdd

['bbccdd', 'aabbccdd', 'bbbbccdd'] bbccdd

['eeeebbccdd', 'aaeebbeeccdd'] eeeebbccdd

['bbdd', 'bbccdd', 'aabbccdd', 'bbbbccdd'] bbccdd

['eeeebbccdd', 'aaeebbeeccdd', 'bbdd', 'bbccdd', 'aabbccdd', 'bbbbccdd'] bbccdd

['aabb', 'aadd'] aabb

['aa', 'aabb', 'aadd'] aa

可以看到,首先就把兩個最長的聚到一起了,lcs認為他倆最相似.

lcs當然不會出現levenshtein距離把aa和bb聚到一起的問題.

最後的結果是

[[6, [15, 16]], [[14, [[4, 5], [12, [8, [0, 3]]]]], [[13, [10, 11]], [[1, 2], [7, 9]]]]]

這裡把6和15,16聚到一起了

使用字串核函式方法聚類,兩個引數分別為,n=2,lambda=0.8

下面是使用字串核函式聚類的過程的前幾部:

['aaaaaaaa', 'aa'] aaaaaaaa

['aabaaabaabaabaaaaba', 'abaaabaaabaabaaaab'] abaaabaaabaabaaaab

['aabbbbdd', 'aabbdd'] aabbbbdd

['bbbbccdd', 'bbccdd'] bbbbccdd

['aaaaaaaa', 'aa', 'aabaaabaabaabaaaaba', 'abaaabaaabaabaaaab'] aabaaabaabaabaaaaba

['eeeebbccdd', 'aaeebbeeccdd'] eeeebbccdd

這裡首先把aaaaaaaa和aa聚到一起了,反映出字串核函式也不是很完美

字串核函式是計算兩個字串的長度為n的公共子串行有多少,lambda用來使大跨度子串的貢獻呈指數遞減.

最後的結果是

[[[4, 5], [0, [3, 8]]], [[1, 11], [[2, [[6, 13], [15, 16]]], [14, [12, [10, [7, 9]]]]]]]

字串核函式能考慮到子串的跨度問題,這個是直接使用lcs不能做到的.

但是字串核函式要計算長度為n的公共字串,成了乙個大問題,

對**的輸出進行聚類,很明顯,levenshtein距離是不適合的.

字串核函式因為n的限制,也有點問題.

反而是用lcs效果還不錯.

字串相似度

這個演算法 於網上,但忘記了出處,對其使使用了 issame封裝,然後用在了自己的網頁資料抓取 中。求解兩個字串的相似度int calculatestringdistance const string stra,const string strb intret c lena 1 lenb 1 for...

字串相似度

最近在做演算法作業,需要比較兩個字串的相似度,並且返回相同的元素所佔的百分比。如果讓我自己做的話,思路是把兩個字串分別轉化為列表,然後在列表中解決掉。python view plain copy new i fori,j inzip a,b ifi j ratio 2.0 len new len a...

字串相似度

這篇我們看看最長公共子串行的另乙個版本,求字串相似度 編輯距離 我也說過了,這是乙個非常實用的演算法,在dna對比,網 頁聚類等方面都有用武之地。一 概念 對於兩個字串a和b,通過基本的增刪改將字串a改成b,或者將b改成a,在改變的過程中我們使用的最少步驟稱之為 編輯距離 二 解析 可能大家覺得有點...