萊文斯坦距離

萊文斯坦距離,又稱Levenshtein距離蛙粘,編輯距離,俄羅斯科學(xué)家弗拉基米爾·萊文斯坦(畢業(yè)于莫斯科國(guó)立大學(xué)數(shù)學(xué)和力學(xué)系)在1965年提出璃岳,他因?qū)m錯(cuò)碼理論和信息理論的貢獻(xiàn)洁墙,于2006年獲得IEEE Richard W. Hamming獎(jiǎng)?wù)隆?/strong>

定義:萊文斯坦距離也稱編輯距離剿配,指的是將文本 A 編輯成文本 B 需要的最少變動(dòng)次數(shù)(每次只能增加、刪除或修改一個(gè)字)咽斧。

用途:可以用來(lái)計(jì)算字符串的相似度堪置,文本相似度, 拼寫(xiě)糾錯(cuò)和抄襲偵測(cè)等等

優(yōu)點(diǎn):準(zhǔn)確率很高贷洲,編輯距離算出來(lái)很小,文本相似度肯定很高晋柱。

缺點(diǎn):召回率不高优构,由于編輯距離與文本的順序有關(guān)。在文字相同雁竞,文字順序變化很大的情況下钦椭,相似度會(huì)變得很低。比如“正大光明”和“光明正大”其實(shí)是一個(gè)意思碑诉。但編輯距離是4彪腔,完全不匹配

計(jì)算解析:

首先定義的單字符編輯操作有且僅有三種:

插入(Insertion)

刪除(Deletion)

替換(Substitution)

image

我們可以給不同的操作賦予不同代價(jià)值,萊溫斯坦(Levenshtein)定義該編輯距離最簡(jiǎn)單的方式是給每種操作賦予相同的代價(jià)值1进栽。萊溫斯坦另外一種定義只允許插入和刪除操作德挣,不允許替換操作。這樣相當(dāng)于替換用插入和刪除兩種操作實(shí)現(xiàn)快毛,替換的代價(jià)值相當(dāng)于變成2格嗅。

我們這里先用第一種定義將插入,刪除唠帝,替換的三種操作代價(jià)都定為值1

假設(shè)我們把要比較相似度的兩個(gè)字符串做成一個(gè)二維數(shù)組

假如兩個(gè)字符串分別是String A="xyz"和String B="xymn"做成一個(gè)二維數(shù)組 i代表B的序號(hào)[行]屯掖,j代表A的序號(hào)[列],i或者j等于0的時(shí)候代表大家都是空字符串, 我們用lev(i,j)來(lái)代表截止到指定坐標(biāo)點(diǎn)襟衰,字符串要變成一樣所需的編輯距離贴铜。因此,如下圖瀑晒,這里我們要求的值就是右下角(最終編輯距離)位置的值绍坝。

image

1.如果i=0或者j=0,lev(i,j)=j或者i苔悦,這里我們用0代表最前面的空串轩褐,這個(gè)位置的空串要編輯成一樣則不需要操作,lev(i,j) = 0间坐,也就是下面這個(gè)情況

image

2.繼續(xù)用上面的公式(如果i=0或者j=0灾挨,lev(i,j)=j或者i),比如"0”編輯成”0x”只需要增加x一個(gè)操作竹宋。"0”編輯成”0xy”需要增加x和增加y一共兩個(gè)操作劳澄。推導(dǎo)出如下圖:

image

3.如果i&&j>=1 則lev(i,j)=min{lev(i-1,j)+1,lev(i,j-1)+1,lev(i-1,j-1)+h} 如果B[i]=A[j]相等,則h=0蜈七,否則h=1秒拔; min函數(shù)用來(lái)取三個(gè)編輯距離的最小值。我們先由此推導(dǎo)出i=1,j=1位置的值飒硅,lev(1,1) = min(lev(0,1)+1, lev(1,0)+1, lev(0,0)+h); 由于這個(gè)位置B[i]=A[j]相等, 所以h=0砂缩,那么lev(1,1) = min(2, 2, 0) = 0; 也就是”0x”編輯成”0x”的編輯距離為0作谚。

image

4.依上公式繼續(xù)推導(dǎo)

image
image
image

由此可以得出”xyz”和“xymn”的編輯距離為2,那么兩個(gè)文本的相似度為(1 - (2/max(”xyz”字符串的長(zhǎng)度庵芭,“xymn”字符串的長(zhǎng)度))妹懒,(1 - (2/4)) = 0.50, 則相似度為50%.

Java版

public static float levenshtein(String msg, String msg2) {
        //計(jì)算兩個(gè)字符串的長(zhǎng)度。  
        int len1 = msg.length();
        int len2 = msg2.length();
        //建立文中說(shuō)的數(shù)組双吆,比字符長(zhǎng)度大一個(gè)空間  
        int[][] dif = new int[len1 + 1][len2 + 1];
        //賦初值
        for (int a = 0; a <= len1; a++) {
            dif[a][0] = a;
        }
        for (int a = 0; a <= len2; a++) {
            dif[0][a] = a;
        }
        //計(jì)算兩個(gè)字符是否一樣眨唬,計(jì)算左上的值  
        int temp;
        for (int i = 1; i <= len1; i++) {
            for (int j = 1; j <= len2; j++) {
                if (msg.charAt(i - 1) == msg2.charAt(j - 1)) {
                    temp = 0;
                } else {
                    temp = 1;
                }
                //取三個(gè)值中最小的  
                dif[i][j] = min(dif[i - 1][j - 1] + temp, dif[i][j - 1] + 1,
                        dif[i - 1][j] + 1);
            }
        }
        //取數(shù)組右下角的值,不同位置代表不同字符串的比較  
        //計(jì)算相似度  
        float similarity = 1 - (float) dif[len1][len2] / Math.max(len1, len2);
        return similarity * 100.0f;
}

 //得到最小值 
public static int min(int... is) {
        int min = Integer.MAX_VALUE;
        for (int i : is) {
            if (min > i) {
                min = i;
            }
        }
        return min;
}

php版

<?php
$str1 = "正大光明";
$str2 = "正光大";
echo sprintf("%.2f",(1.0 - (levenshtein($str1,$str2) / max(strlen($str1), strlen($str2)))) * 100.0);

是的好乐,你沒(méi)看錯(cuò)匾竿,php為了提高代碼執(zhí)行效率和你的編碼效率把算法封裝到C里面了。
┑( ̄▽  ̄)┍

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蔚万,一起剝皮案震驚了整個(gè)濱河市岭妖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌反璃,老刑警劉巖昵慌,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異版扩,居然都是意外死亡废离,警方通過(guò)查閱死者的電腦和手機(jī)侄泽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)礁芦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人悼尾,你說(shuō)我怎么就攤上這事柿扣。” “怎么了闺魏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵未状,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我析桥,道長(zhǎng)司草,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任泡仗,我火速辦了婚禮埋虹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娩怎。我一直安慰自己搔课,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布截亦。 她就那樣靜靜地躺著爬泥,像睡著了一般柬讨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袍啡,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天踩官,我揣著相機(jī)與錄音,去河邊找鬼境输。 笑死卖鲤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的畴嘶。 我是一名探鬼主播蛋逾,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窗悯!你這毒婦竟也來(lái)了区匣?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蒋院,失蹤者是張志新(化名)和其女友劉穎亏钩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體欺旧,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姑丑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辞友。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栅哀。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖称龙,靈堂內(nèi)的尸體忽然破棺而出留拾,到底是詐尸還是另有隱情,我是刑警寧澤鲫尊,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布痴柔,位于F島的核電站,受9級(jí)特大地震影響疫向,放射性物質(zhì)發(fā)生泄漏咳蔚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一搔驼、第九天 我趴在偏房一處隱蔽的房頂上張望谈火。 院中可真熱鬧,春花似錦匙奴、人聲如沸堆巧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谍肤。三九已至啦租,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荒揣,已是汗流浹背篷角。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留系任,地道東北人恳蹲。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像俩滥,于是被迫代替她去往敵國(guó)和親嘉蕾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 編輯距離:將一個(gè)字符串轉(zhuǎn)化成另一個(gè)字符串霜旧,需要的最少編輯操作次數(shù)(比如增加一個(gè)字符错忱、刪除一個(gè)字符、替換一個(gè)字符)挂据。...
    暮想sun閱讀 548評(píng)論 0 0
  • Leetcode 583.兩個(gè)字符串的刪除操作略微修改了萊文斯坦距離公式以清,題目中只有刪除操作,無(wú)替換 所以 代碼:
    Yanl__閱讀 604評(píng)論 0 0
  • 在C語(yǔ)言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來(lái)閱讀 3,340評(píng)論 0 2
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,380評(píng)論 0 5
  • 是到了一定年齡還是怎么的崎逃,我怕看到這類字眼掷倔,關(guān)于四季更替,春耕秋收的字眼个绍,讀了以后便是兩眼淚汪汪勒葱。 一元復(fù)始,萬(wàn)象...
    小又隨筆閱讀 529評(píng)論 0 0