1. 程式人生 > >Python “編輯距離”(Levenshtein distance)函式的比較

Python “編輯距離”(Levenshtein distance)函式的比較

本文蒐集了網上比較常用的幾種計算Levenshtein distance的函式,

其中函式(1)為呼叫數學工具包Numpy, 函式(2)和(1)演算法類似,都是採用DP, (3)來自wiki(4)是直接呼叫python的第三方庫Levenshtein

原始碼和結果如下:

import time
from functools import wraps
import cProfile
import numpy
import Levenshtein


def fn_timer(function):
    @wraps(function)
    def function_timer(*args, **kwargs):
        t0 = time.time()
        result = function(*args, **kwargs)
        t1 = time.time()
        print ("Total time running %s: %s seconds" %
                (function.func_name, str(t1-t0))
                )
        return result
    return function_timer


def levenshtein1(source, target):
    if len(source) < len(target):
        return levenshtein1(target, source)
 
    # So now we have len(source) >= len(target).
    if len(target) == 0:
        return len(source)
 
    # We call tuple() to force strings to be used as sequences
    # ('c', 'a', 't', 's') - numpy uses them as values by default.
    source = numpy.array(tuple(source))
    target = numpy.array(tuple(target))
 
    # We use a dynamic programming algorithm, but with the
    # added optimization that we only need the last two rows
    # of the matrix.
    previous_row = numpy.arange(target.size + 1)
    for s in source:
        # Insertion (target grows longer than source):
        current_row = previous_row + 1
 
        # Substitution or matching:
        # Target and source items are aligned, and either
        # are different (cost of 1), or are the same (cost of 0).
        current_row[1:] = numpy.minimum(
                current_row[1:],
                numpy.add(previous_row[:-1], target != s))
 
        # Deletion (target grows shorter than source):
        current_row[1:] = numpy.minimum(
                current_row[1:],
                current_row[0:-1] + 1)
 
        previous_row = current_row
 
    return previous_row[-1]


def levenshtein2(s1, s2):
    if len(s1) < len(s2):
        return levenshtein2(s2, s1)
 
    # len(s1) >= len(s2)
    if len(s2) == 0:
        return len(s1)
 
    previous_row = range(len(s2) + 1)
    for i, c1 in enumerate(s1):
        current_row = [i + 1]
        for j, c2 in enumerate(s2):
            insertions = previous_row[j + 1] + 1 # j+1 instead of j since previous_row and current_row are one character longer
            deletions = current_row[j] + 1       # than s2
            substitutions = previous_row[j] + (c1 != c2)
            current_row.append(min(insertions, deletions, substitutions))
        previous_row = current_row
 
    return previous_row[-1]


def levenshtein3(s, t):
        ''' From Wikipedia article; Iterative with two matrix rows. '''
        if s == t: return 0
        elif len(s) == 0: return len(t)
        elif len(t) == 0: return len(s)
        v0 = [None] * (len(t) + 1)
        v1 = [None] * (len(t) + 1)
        for i in range(len(v0)):
            v0[i] = i
        for i in range(len(s)):
            v1[0] = i + 1
            for j in range(len(t)):
                cost = 0 if s[i] == t[j] else 1
                v1[j + 1] = min(v1[j] + 1, v0[j + 1] + 1, v0[j] + cost)
            for j in range(len(v0)):
                v0[j] = v1[j]
 
        return v1[len(t)]

@fn_timer
def calllevenshtein1(s,t,n):
    for i in range(n):
        levenshtein3(s,t)

@fn_timer
def calllevenshtein2(s,t,n):
    for i in range(n):
        levenshtein3(s,t)

@fn_timer
def calllevenshtein3(s,t,n):
    for i in range(n):
        levenshtein3(s,t)

@fn_timer
def calllevenshtein4(s,t,n):
    for i in range(n):
        Levenshtein.distance(s,t)
 
if __name__ == "__main__":
    n = 50000
    a = 'abddcdefdgbd22svb'
    b = 'bcdefg34rdyvdfsd'
    calllevenshtein1(a, b, n)
    calllevenshtein2(a, b, n)
    calllevenshtein3(a, b, n)
    calllevenshtein4(a, b, n)

結果:

Total time running calllevenshtein1: 16.0750000477 seconds
Total time running calllevenshtein2: 16.4990000725 seconds
Total time running calllevenshtein3: 16.2939999104 seconds
Total time running calllevenshtein4: 0.0629999637604 seconds

從結果來看,呼叫python第三方包效率最高,原因是其內部呼叫c庫,優化了演算法結構

相關推薦

Python編輯距離”(Levenshtein distance)函式比較

本文蒐集了網上比較常用的幾種計算Levenshtein distance的函式, 其中函式(1)為呼叫數學工具包Numpy, 函式(2)和(1)演算法類似,都是採用DP, (3)來自wiki(4)是直接呼叫python的第三方庫Levenshtein 原始碼和結果如下:

編輯距離Edit Distance——動態規劃

add 最小 base 編輯 cpp style 進行 sel 等於 題目描寫敘述: 給定一個源串和目標串。可以對源串進行例如以下操作: 1. 在給定位置上插入一個字符 2. 替換隨意字符 3. 刪除隨意字符 寫一個程序。返回最小操作數,使得對源串進行這些操

[Leetcode 72]編輯距離 Edit Distance

【題目】 Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2. You have th

編輯距離Edit Distance

編輯距離,又稱Levenshtein距離(萊文斯坦距離也叫做Edit Distance),是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數,如果它們的距離越大,說明它們越是不同。許可的編輯操作包括將一個字元替換成另一個字元,插入一個字元,刪除一個字元。 先建立一個矩

最短編輯距離演算法(字串比較

一、編輯距離 1、從字串a變為字串b所需要的元操作有3種: 增加一個字元刪除一個字元變化一個字元2、編輯距離:從字串a變為b所需要的最少操作步驟。 二、最短編輯距離(動態規劃) 首先定義一個函式——s

[python]My Unique JsonDiff演算法——如何計算2個json串之間的差距並Diff出來(一):編輯距離Levenshtein)演算法

    啊啊,年底忙著簽證什麼的,好久沒寫日誌啦。。。。新年到來,整點乾貨出來給大家~~順便為自己考試和申請學校攢點人品~~     之前實習的時候,因為實習公司的業務需求,需要一個比對json字串差異的演算法,然而我在網上查了很久的資料,發現竟然沒有現成

編輯距離演算法詳解:Levenshtein Distance演算法——動態規劃問題

目錄 背景: 求編輯距離演算法: 圖解過程: C++程式碼如下: 總結: 背景: 我們在使用詞典app時,有沒有發現即使輸錯幾個字母,app依然能給我們推薦出想要的單詞,非常智慧。它是怎麼找出我們想要的單詞的呢?這裡就需要BK樹來解決這個問題了。在使用BK樹

編輯距離Levenshtein Distance演算法

題目連結:https://cn.vjudge.net/problem/51Nod-1183  Levenshtein距離是一種計算兩個字串間的差異程度的字串度量(string metric)。我們可以認為Levenshtein距離就是從一個字串修改到另一個字串時,其中編輯單個字元(比如修改、插入

編輯距離演算法詳解:Levenshtein Distance演算法

轉自: 編輯距離,又稱Levenshtein距離(也叫做Edit Distance),是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字元替換成另一個字元,插入一個字元,刪除一個字元。   演算法基本原理:假設我們可以使用d[ i ,

字串相似度演算法(編輯距離演算法 Levenshtein Distance

在搞驗證碼識別的時候需要比較字元程式碼的相似度用到“編輯距離演算法”,關於原理和C#實現做個記錄。 據百度百科介紹: 編輯距離,又稱Levenshtein距離(也叫做Edit Distance),是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數,如果它們的距離越大,說明它們越是不同。許可

Levenshtein distance編輯距離

基本介紹 Levenshtein distance是一種度量兩個序列(字串)差異大小的方法。 該方法定義如下: 兩個序列(以單詞為例,這裡序列也可以表示一個句子)的Levenshtein distance是在使用一個單詞修改為另一個單詞時,通過編輯單個字元(如插入,刪除,修改)所需要

資料對齊-編輯距離演算法詳解(Levenshtein distance

目錄 一:簡介 二:演算法定義 1:定義 2:a small case 3:演算法的上下界限 三:應用場景 1:資料對齊 2:拼寫糾錯 四:其他的編輯距離演算法 五:演算

最短編輯距離問題 : Levenshtein Distance

個人覺得只要你能明白edit陣列的含義就可以理解狀態轉移方程了。/* 可以用來表示字串的相似度? */ #include <bits/stdc++.h> using namespace s

Levenshtein Distance Levenshtein 編輯距離——一種相似度的計算方法

/********************************************* Levenshtein Distance Algorithm *******************************/ /********************

LeetCode--Edit Distance(字串編輯距離Python

題目: 給定兩個字串。計算這兩個字串的編輯距離。可編輯方式包含3種:插入、刪除、替換。 解題思路: 考慮使用動態規劃來解題。用output[i][j]來儲存word1[0:i]和word2[0:j]的編輯距離。則output[i][j]可以由output[i-1][j],o

python使用BeautifulSoup的prettify功能來處理HTML文件,之後使用Levenshtein編輯距離計算文件間的相似度

    字串的處理可謂是一個老生常談的話題了,處理的方法也是有很多的積累的,利用字串的匹配來計算文件整體之間的相似度是一個慣用的方法,但裡面還有很多具體的細節需要注意,今天在使用Levenshtein距離的時候遇到了一個問題,不太知道該如何衡量了,這裡先說一下做的事情:  

C++實現兩個字串之間的Levenshtein Distance(編輯距離)

1.什麼是Levenshtein Distance Levenshtein Distance,又稱編輯距離,指的是兩個字串之間,由一個轉換成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字元替

Levenshtein distance最小編輯距離演算法實現

Levenshtein distance,中文名為最小編輯距離,其目的是找出兩個字串之間需要改動多少個字元後變成一致。該演算法使用了動態規劃的演算法策略,該問題具備最優子結構,最小編輯距離包含子最小編輯距離,有下列的公式。 其中d[i-1,j]+1代表字串s2插入一個字母

[LeetCode] 72. Edit Distance 編輯距離 @python

Description Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2. You have

Levenshtein Distance編輯距離)演算法與使用場景

## 前提 已經很久沒深入研究過演算法相關的東西,畢竟日常少用,就算死記硬背也是沒有實施場景導致容易淡忘。最近在做一個脫敏資料和明文資料匹配的需求的時候,用到了一個演算法叫`Levenshtein Distance Algorithm`,本文對此演算法原理做簡單的分析,並且用此演算法解決幾個常見的場景。