字符串類似度

字符串類似度

http://www.cnblogs.com/tianchi/archive/2013/02/25/2886964.htmlhtml

本身實現文本類似度算法(餘弦定理)

 http://my.oschina.net/BreathL/blog/42477web

餘弦類似度

計算公式爲:算法

  P(A,B) = sqrt(A × B) / (|A| × |B|)spa

設有兩個字符串:.net

  1. ABCDEFGorm

  2. ABCHIJKhtm

其中共有11個字符,爲:blog

  A B C D E F G H I J K字符串

若是,不考慮他們之間的關聯性以及順序等隱私,那麼能夠講這兩個字符串轉換成兩個11維空間中的向量:get

  1. {一、一、一、一、一、一、一、0、0、0、0}

  2. {一、一、一、0、0、0、0、一、一、一、1}

那,計算他們之間的類似度爲:

  P = sqrt(3) / (sqrt(7) × sqrt(7)) = 0.2474358297

矩陣類似度

給定兩個長度相等的字符串,在移動的過程當中比較:

a b c d d a c b c b



a a d a c c b d d c

首先有幾個變量:

  1. n:字符串的長度,此時爲10;

  2. m:相同的字符,此時爲3,包括d、a、c;

  3. r:兩個字符串重疊部分,此時爲8;

那麼給出定義:

  1. 重疊率:L = r / n。

  2. 匹配率:M = m / n。

  3. 類似度:Q = M^2 × L = (m^2 / n^2) × (r / n)。

其實爲何這樣定義也很好理解,將Q變形一下就能夠獲得:

  Q = (m^2 / r^2) × (r / n)

前半部分表示了當前相同的比率,後半部分表示了重疊的比率,而後呢,廢話就很少說了。其實,還有一個要考慮的地方,舉個例子:

  str1:abcabc

  str2:abcdabc

str1str2的類似度是很高的,可是,在移位錯開的過程當中根本沒辦法找到這種匹配。想一想其實緣由也是很是簡單的:把全部的字符都死板地粘合在了一塊兒!那麼,咱們要作的其實就是將他們打散來匹配。首先,根據字符串A和字符串B來構造矩陣R

  Ai和Bi+j相同時,Rij = 1;不然,Rij = 0。

那麼,如今要作的事情就是,在矩陣R中尋找一條路徑,使得這條路徑上的1最多,這個問題和求兩個字符串的最大匹配很像的DP問題,這裏就不囉嗦了。

字符串編輯距離

還有一種衡量兩個字符串之間的差別性的方法是,計算兩個字符串轉換時候須要的最少操做,須要的操做越少說明這兩個字符串越類似。

假設字符串的操做只有三種:

  1. 插入一個字符;

  2. 刪除一個字符;

  3. 替換一個字符;

兩個字符串之間的編輯距離定義爲:從字符串str1str2的最少的操做次數。首先,編輯距離是不會大於str1.length + str2.length的。假設求字符AB的編輯距離,考慮下面幾種狀況:

若是A[i] = B[j],那麼這時候還須要操做嗎?

這個時候的刪除和替換操做只會讓狀況變得更壞,並且插入操做不會使狀況變得更好,因此此時F(i, j) = F(i-1, j-1)

若是A[i] != B[j],怎麼辦呢?

a、從F(i-1, j-1)變過來,這時候只須要把A[i]替換爲B[j]便可;

b、從F(i-1, j)變過來,這時候只須要將A[i]刪除便可;

c、從F(i, j-1)變過來,這時候只須要在A[i]後插入字符B[j]便可;

那麼此時,F(i, j) = min{F(i-1,j-1),F(i-1,j),F(i,j-1)} + 1

注:其中F(i, j)表示A[0..i]和B[0..j]之間的編輯距離。看完這種類似度想起了BFS的入門題目:《聰明的打字員》,囧。

------------

END。

相關文章
相關標籤/搜索