青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

chenglong7997

字符串相似度算法介紹(整理)(轉(zhuǎn))

最近在做這方面的應(yīng)用,把我找到的資料貼出來,有需要的人可以參考參考。
1.編輯距離(Levenshtein Distance)
編輯距離就是用來計算從原串(s)轉(zhuǎn)換到目標(biāo)串(t)所需要的最少的插入,刪除和替換
的數(shù)目,在NLP中應(yīng)用比較廣泛,如一些評測方法中就用到了(wer,mWer等),同時也常用來計算你對原文本所作的改動數(shù)。編輯距離的算法是首先由俄國科學(xué)家Levenshtein提出的,故又叫Levenshtein Distance。
Levenshtein Distance算法可以看作動態(tài)規(guī)劃。它的思路就是從兩個字符串的左邊開始比較,記錄已經(jīng)比較過的子串相似度(實際上叫做距離),然后進一步得到下一個 字符位置時的相似度。 用下面的例子: GUMBO和GAMBOL。當(dāng)算到矩陣D[3,3]位置時,也就是當(dāng)比較到GUM和GAM時,要從已經(jīng)比較過的3對子串GU-GAM, GUM-GA和GU-GA之中選一個差別最小的來當(dāng)它的值. 所以要從左上到右下構(gòu)造矩陣。
編輯距離的偽算法:
整數(shù) Levenshtein距離(字符 str1[1..lenStr1], 字符 str2[1..lenStr2])
   宣告 int d[0..lenStr1, 0..lenStr2]
   宣告 int i, j, cost
 
   對于 i 等于 由 0 至 lenStr1
       d[i, 0] := i
   對于 j 等于 由 0 至 lenStr2
       d[0, j] := j
   對于 i 等于 由 1 至 lenStr1
       對于 j 等于 由 1 至 lenStr2
           若 str1[i] = str2[j] 則 cost := 0
                                否則 cost := 1
           d[i, j] := 最小值(
                                d[i-1, j  ] + 1,     // 刪除
                                d[i  , j-1] + 1,     // 插入
                                d[i-1, j-1] + cost   // 替換
                            )
返回 d[lenStr1, lenStr2]

double Minimum(double a, double b, double c) 

 double mi; 
 
 mi = a; 
 if (b < mi) { 
  mi = b; 
 } 
 if (c < mi) { 
  mi = c; 
 } 
 return mi; 
}


int* GetCellPointer(int *pOrigin, int col, int row, int nCols) 

 return pOrigin + col + (row * (nCols + 1)); 
}

int GetAt(int *pOrigin, int col, int row, int nCols) 

 int *pCell; 
 
 pCell = GetCellPointer (pOrigin, col, row, nCols); 
 return *pCell; 
}

void PutAt(int *pOrigin, int col, int row, int nCols, double x) 

 int *pCell; 
 pCell = GetCellPointer (pOrigin, col, row, nCols); 
 *pCell = x; 
}

//編輯距離
LD(const char *s, const char *t)
{
 int *d; // pointer to matrix
 int n; // length of s
 int m; // length of t
 int i; // iterates through s
 int j; // iterates through t
 char s_i1; // ith character of s
 char s_i2; // ith character of s
 char t_j1; // jth character of t
 char t_j2; // jth character of t
 int *cost; // cost代價矩陣
 int result; // result
 int cell; // contents of target cell
 int above; // contents of cell immediately above
 int left; // contents of cell immediately to left
 int diag; // contents of cell immediately above and to left
 int sz; // number of cells in matrix

 // Step 1

 n = strlen (s);
 m = strlen (t);
 if (n == 0) 
 {
  return m;
 }
 if (m == 0) 
 {
  return n;
 }
 sz = (n+1) * (m+1) * sizeof (int);
 d = (int *) malloc (sz);
 cost = (int *) malloc (sz);

 // Step 2

 for (i = 0; i <= n; i++) 
 {
  PutAt (d, i, 0, n, i);
 }

 for (j = 0; j <= m; j++)
 {
  PutAt (d, 0, j, n, j);
 }
 for (int g=0;g<=m;g++)//把代價距離矩陣全部初始化為同一個值,以后可根據(jù)此值判斷相應(yīng)的方格是否被賦過值
 {
  for(int h=0;h<=n;h++)
  {
   PutAt(cost,h,g,n,2);
  }
 }
 // Step 3

 for (i = 1; i <= n; i++) 
 {

  s_i1 = s[i-1];
  s_i2 = s[i];
  bool sbd=false;
  bool tbd=false;
  if(s_i1>=' '&&s_i1<='@'||s_i1>='A'&&s_i1<='~' )
  {//s為標(biāo)點符號或其他非中文符號和數(shù)字
  sbd=true;
  }
  // Step 4

  for (j = 1; j <= m; j++) 
  {

   tbd=false;
   t_j1 = t[j-1];
   t_j2 = t[j];
   // Step 5
   if(t_j1>=' '&&t_j1<='@'||t_j1>='A'&&t_j1<='~' )
   {//t也為標(biāo)點符號
    tbd=true;
   }
   if(!sbd)
   {//s為漢字
    if(!tbd)
    {//t也為漢字
     if (s_i1 == t_j1&&s_i2 == t_j2) 
     {
      bool tt=false;
      int temp=GetAt(cost,i,j,n);
      if(temp==2)
      {
       PutAt(cost,i,j,n,0);
       tt=true;
      }
      if(tt)
      {//因為st全市漢字,所以把代價矩陣他相鄰的未賦過值的三個格賦值
       int temp1=GetAt(cost,i+1,j,n);
       if(temp1==2)
       {
        PutAt(cost,i+1,j,n,0);
       }
       int temp2=GetAt(cost,i,j+1,n);
       if(temp2==2)
       {
        PutAt(cost,i,j+1,n,0);
       }
       int temp3=GetAt(cost,i+1,j+1,n);
       if(temp3==2)
       {
        PutAt(cost,i+1,j+1,n,0);
       }
      }
     }
     else 
     {
      bool tt=false;
      int temp=GetAt(cost,i,j,n);
      if(temp==2)
      {
       PutAt(cost,i,j,n,1);
       tt=true;
      }
      if(tt)
      {
       int temp1=GetAt(cost,i+1,j,n);
       if(temp1==2)
       {
        PutAt(cost,i+1,j,n,1);
       }
       int temp2=GetAt(cost,i,j+1,n);
       if(temp2==2)
       {
        PutAt(cost,i,j+1,n,1);
       }
       int temp3=GetAt(cost,i+1,j+1,n);
       if(temp3==2)
       {
        PutAt(cost,i+1,j+1,n,1);
       }
      }
     }
    }
    else
    {//t為符號
     bool tt=false;
     int temp=GetAt(cost,i,j,n);
     if(temp==2)
     {
      PutAt(cost,i,j,n,1);
      tt=true;
     }
     if(tt)
     {
      int temp1=GetAt(cost,i+1,j,n);
      if(temp1==2)
      {
       PutAt(cost,i+1,j,n,1);
      }
     }
    
    }

   }
   else
   {//s為符號
    if(!tbd)
    {//t為漢字 
     bool tt=false;
     int temp=GetAt(cost,i,j,n);
     if(temp==2)
     {
      PutAt(cost,i,j,n,1);
      tt=true;
     }
     if(tt)
     {
      int temp1=GetAt(cost,i,j+1,n);
      if(temp1==2)
      {
       PutAt(cost,i,j+1,n,1);
      }
     }
    }
    else
    {
     if(s_i1==t_j1)
     {
      int temp=GetAt(cost,i,j,n);
      if(temp==2)
      {
       PutAt(cost,i,j,n,0);
      }
     }
     else
     {
      int temp=GetAt(cost,i,j,n);
      if(temp==2)
      {
       PutAt(cost,i,j,n,1);
      }
     }
    }

   }

    // Step 6

   above = GetAt (d,i-1,j, n);
   left = GetAt (d,i, j-1, n);
   diag = GetAt (d, i-1,j-1, n);
   int curcost=GetAt(cost,i,j,n);
   cell = Minimum (above + 1, left + 1, diag + curcost);
   PutAt (d, i, j, n, cell);
  }
 }

  // Step 7

  result = GetAt (d, n, m, n);
  free (d);
  return result;

}

2.最長公共子串 (LCS)
LCS問題就是求兩個字符串最長公共子串的問題。解法就是用一個矩陣來記錄兩個字符
串中所有位置的兩個字符之間的匹配情況,若是匹配則為1,否則為0。然后求出對角線最長的1序列,其對應(yīng)的位置就是最長匹配子串的位置.
下面是字符串21232523311324和字符串312123223445的匹配矩陣,前者為X方向的,
后者為Y方向的。不難找到,紅色部分是最長的匹配子串。通過查找位置我們得到最長的匹配子串為:21232
    0 0 0 1 0 0 0 1 1 0 0 1 0 0 0
  0 1 0 0 0 0 0 0 0 1 1 0 0 0 0
  1 0 1 0 1 0 1 0 0 0 0 0 1 0 0
  0 1 0 0 0 0 0 0 0 1 1 0 0 0 0
  1 0 1 0 1 0 1 0 0 0 0 0 1 0 0
  0 0 0 1 0 0 0 1 1 0 0 1 0 0 0
  1 0 1 0 1 0 1 0 0 0 0 0 1 0 0
  1 0 1 0 1 0 1 0 0 0 0 0 1 0 0
  0 0 0 1 0 0 0 1 1 0 0 1 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
  0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
但是在0和1的矩陣中找最長的1對角線序列又要花去一定的時間。通過改進矩陣的生成方式和設(shè)置標(biāo)記變量,可以省去這部分時間。下面是新的矩陣生成方式:
    0 0 0 1 0 0 0 1 1 0 0 1 0 0 0
  0 1 0 0 0 0 0 0 0 2 1 0 0 0 0
  1 0 2 0 1 0 1 0 0 0 0 0 1 0 0
  0 2 0 0 0 0 0 0 0 1 1 0 0 0 0
  1 0 3 0 1 0 1 0 0 0 0 0 1 0 0
  0 0 0 4 0 0 0 2 1 0 0 1 0 0 0
  1 0 1 0 5 0 1 0 0 0 0 0 2 0 0
  1 0 1 0 1 0 1 0 0 0 0 0 1 0 0
  0 0 0 2 0 0 0 2 1 0 0 1 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
  0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
當(dāng) 字符匹配的時候,我們并不是簡單的給相應(yīng)元素賦上1,而是賦上其左上角元素的值加一。我們用兩個標(biāo)記變量來標(biāo)記矩陣中值最大的元素的位置,在矩陣生成的過 程中來判斷當(dāng)前生成的元素的值是不是最大的,據(jù)此來改變標(biāo)記變量的值,那么到矩陣完成的時候,最長匹配子串的位置和長度就已經(jīng)出來了。

//最長公共子串
char* LCS(char*left,char* right){
 int lenLeft,lenRight;
 lenLeft = strlen(left);
 lenRight = strlen(right);
 int *c = new int[lenRight];
 int start,end,len;
 end = len = 0;
 for(int i = 0; i < lenLeft; i++){
  for(int j = lenRight-1; j >= 0; j--){
   if(left[i] == right[j]){
    if(i == 0 || j == 0)
     c[j] = 1;
    else
     c[j] = c[j-1]+1;
   }
   else
    c[j] = 0;
   if(c[j] > len){
    len = c[j];
    end = j;
   }
  }
 }
 char *p = new char[len+1];
 start = end - len + 1;
 for(i = start; i <= end; i++)
  p[i - start] = right[i];
 p[len] = '/0';
 return p;
}
3. 余弦定理 (向量空間算法)
余弦定理古老而廣泛的數(shù)學(xué)概念,在各個學(xué)科及實踐中都得到了大量的應(yīng)用,這里簡單的介紹下其在判斷兩個字符串相似度的應(yīng)用。
在余弦定理中基本的公式為:

假如字符串s1與s2,比較兩個字符串的相似度,sim(s1,s2),假設(shè)s1,s2中含有n個不同的字符,其分別為c1,c2,...cn,判 斷字符串的相似度轉(zhuǎn)換為兩個字符串對應(yīng)的向量v1,v2之間夾角大小的判斷,余弦值越大其向量之間的夾角越小,s1與S2的相似度越大。
向量空間算法的介紹:
在 向量空間模型中,文本泛指各種機器可讀的記錄。用D(Document)表示,特征項(Term,用t表示)是指出現(xiàn)在文檔D中且能夠代表該文檔內(nèi)容的基 本語言單位,主要是由詞或者短語構(gòu)成,文本可以用特征項集表示為D(T1,T2,…,Tn),其中Tk是特征項,1<=k<=N。例如一篇文 檔中有a、b、c、d四個特征項,那么這篇文檔就可以表示為D(a,b,c,d)。對含有n個特征項的文本而言,通常會給每個特征項賦予一定的權(quán)重表示其 重要程度。即D=D(T1,W1;T2,W2;…,Tn,Wn),簡記為D=D(W1,W2,…,Wn),我們把它叫做文本D的向量表示。其中Wk是Tk 的權(quán)重,1<=k<=N。在上面那個例子中,假設(shè)a、b、c、d的權(quán)重分別為30,20,20,10,那么該文本的向量表示為 D(30,20,20,10)。在向量空間模型中,兩個文本D1和D2之間的內(nèi)容相關(guān)度Sim(D1,D2)常用向量之間夾角的余弦值表示,公式為:  

 
其中,W1k、W2k分別表示文本D1和D2第K個特征項的權(quán)值,1<=k<=N。我們可以利用類似的方法來計算兩個字符串的相關(guān)度。    
這個算法網(wǎng)上沒找到,雖然我寫過,但是沒什么通用性,就不貼出來。很簡單的,有興趣的可以自己寫一個。

posted on 2012-04-01 07:52 Snape 閱讀(656) 評論(0)  編輯 收藏 引用 所屬分類: C++ 轉(zhuǎn)載

導(dǎo)航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統(tǒng)計

常用鏈接

留言簿

隨筆分類

隨筆檔案

文章分類

文章檔案

my

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩视频免费观看| 欧美看片网站| 久久精品视频va| 欧美在线亚洲在线| 亚洲少妇自拍| 欧美一区二区观看视频| 欧美一区二区三区精品| 久久久7777| 麻豆亚洲精品| 亚洲第一黄网| 欧美国产日本在线| 亚洲国产日韩在线| 亚洲香蕉网站| 久久久激情视频| 欧美国产日韩一区二区| 欧美视频日韩视频在线观看| 国产精品一区二区久久久| 国产亚洲成av人在线观看导航| 国产亚洲一区二区在线观看| 亚洲国产一区二区三区青草影视| 99re66热这里只有精品4| 亚洲影视九九影院在线观看| 久久久久五月天| 亚洲免费观看高清在线观看 | 欧美在线播放视频| 亚洲国产精品第一区二区三区| 精品成人国产| 亚洲午夜av电影| 麻豆精品一区二区av白丝在线| 亚洲免费精彩视频| 久久久www成人免费无遮挡大片| 欧美成人精品在线| 欧美日韩一级黄| 久久精品久久99精品久久| 欧美日韩在线一区| 久久精品二区亚洲w码| 久久久国产成人精品| 久久亚洲国产成人| 亚洲福利视频免费观看| 羞羞色国产精品| 欧美色区777第一页| 亚洲激情成人网| 久久国产免费看| 一区二区三区视频在线看| 蜜臀av一级做a爰片久久| 国产亚洲精品一区二555| 一区二区激情视频| 亚洲黄色性网站| 欧美国产精品劲爆| 在线日韩av片| 能在线观看的日韩av| 久久精品亚洲乱码伦伦中文| 国产精品网站在线| 亚洲一区一卡| 99国产精品视频免费观看一公开| 欧美不卡福利| 亚洲国产欧美一区| 欧美18av| 欧美成人亚洲成人日韩成人| 亚洲成色777777女色窝| 久久久久久亚洲综合影院红桃 | 欧美黑人一区二区三区| 亚洲国产一区二区三区高清| 美女被久久久| 美国三级日本三级久久99| 亚洲黄色在线视频| 亚洲片国产一区一级在线观看| 麻豆精品国产91久久久久久| 亚洲第一精品夜夜躁人人爽| 亚洲第一网站| 欧美亚州一区二区三区 | 久久精品一区二区三区中文字幕| 国产三级精品在线不卡| 久久另类ts人妖一区二区 | 一本一本a久久| 一区二区高清在线| 欧美午夜视频网站| 午夜视频在线观看一区| 99亚洲精品| 日韩一二在线观看| 国产精品视频一区二区三区 | 亚洲欧洲一区二区在线观看 | 老司机aⅴ在线精品导航| 伊人久久大香线蕉av超碰演员| 欧美成人自拍视频| 欧美日韩一区二区三区视频| 亚欧美中日韩视频| 久久婷婷av| 亚洲主播在线播放| 午夜在线视频一区二区区别 | 欧美区日韩区| 亚洲欧美成人一区二区三区| 亚洲欧美日韩国产一区二区三区| 国模 一区 二区 三区| 免费观看成人| 欧美日韩国产一区| 久久噜噜亚洲综合| 女人天堂亚洲aⅴ在线观看| 亚洲图片在区色| 久久久国际精品| 亚洲在线一区| 欧美精品日韩综合在线| 久久躁狠狠躁夜夜爽| 欧美日韩精品久久久| 久久久久久午夜| 国产精品高潮呻吟久久av黑人| 美国十次成人| 国产婷婷色一区二区三区在线| 欧美激情一区在线| 国产亚洲综合在线| 日韩亚洲在线| 日韩视频三区| 久久久午夜电影| 欧美在线观看一区二区三区| 欧美韩日一区二区三区| 六月婷婷久久| 国内精品久久久久久| 亚洲一区二区三区精品在线观看 | 中国成人亚色综合网站| 精品成人国产| 亚洲性感激情| 亚洲视频碰碰| 欧美日韩一区二区三区在线| 欧美成人午夜激情视频| 国产午夜精品久久久| 亚洲人被黑人高潮完整版| 国产婷婷97碰碰久久人人蜜臀| 日韩视频在线观看| 蜜臀99久久精品久久久久久软件| 欧美日韩一区二区视频在线| 久久影视精品| 国产亚洲毛片在线| 欧美一区二区三区在线观看视频| 亚洲一区二区三区高清| 欧美精品一区二区久久婷婷| 亚洲国产女人aaa毛片在线| 国产一区二区三区在线观看免费 | 亚洲国产欧美在线| 午夜亚洲性色视频| 亚洲欧美在线观看| 国产精品美女久久久浪潮软件 | 先锋影音网一区二区| 国产精品久久精品日日| 一区二区三区精品视频在线观看| 一本色道久久88亚洲综合88 | 国产日韩在线不卡| 午夜在线视频观看日韩17c| 亚洲女优在线| 国产欧美91| 欧美亚洲在线| 久久精品夜色噜噜亚洲aⅴ| 国产精品有限公司| 久久久av毛片精品| 牛人盗摄一区二区三区视频| 在线精品国精品国产尤物884a| 久久精品在线| 欧美sm视频| 一本久久综合亚洲鲁鲁| 国产精品成人午夜| 午夜电影亚洲| 欧美成人精品在线播放| 欧美主播一区二区三区美女 久久精品人| 国产精品视频福利| 欧美在线视频不卡| 欧美国产一区视频在线观看| 亚洲第一福利在线观看| 久久综合伊人77777蜜臀| 99热这里只有精品8| 香蕉久久a毛片| 精品999日本| 欧美大胆人体视频| 99精品国产高清一区二区| 欧美一区=区| 在线观看一区视频| 欧美理论在线| 亚洲伊人久久综合| 欧美一级大片在线观看| 在线免费观看日本欧美| 欧美日韩国产电影| 欧美亚洲免费在线| 亚洲国产视频直播| 久久久久久一区| 中国日韩欧美久久久久久久久| 国产精品丝袜白浆摸在线| 另类亚洲自拍| 亚洲一区精品在线| 男女精品网站| 午夜精品在线| 亚洲国产综合91精品麻豆| 亚洲人成网站777色婷婷| 99视频精品全部免费在线| 国产精品视频第一区| 欧美国产日韩在线| 欧美一区二区在线免费播放| 亚洲高清资源| 久久久久九九九九| 欧美一区二区视频97| 日韩视频在线观看一区二区| 国产亚洲成av人片在线观看桃| 欧美日韩影院|