最近要對字串進行聚類,這些字串都是**的輸出,嘗試了幾種字串相似度度量的方法:
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,在改變的過程中我們使用的最少步驟稱之為 編輯距離 二 解析 可能大家覺得有點...