1. 程式人生 > >計算句子文字相似度-編輯距離計算

計算句子文字相似度-編輯距離計算

本文轉載於:https://juejin.im/post/5b237b45f265da59a90c11d6

編輯距離,英文叫做 Edit Distance,又稱 Levenshtein 距離,是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數,如果它們的距離越大,說明它們越是不同。
許可的編輯操作包括將一個字元替換成另一個字元,插入一個字元,刪除一個字元。
例如我們有兩個字串:string 和 setting,如果我們想要把 string 轉化為 setting,需要這麼兩步:
第一步,在 s 和 t 之間加入字元 e。
第二步,把 r 替換成 t。
所以它們的編輯距離差就是 2,這就對應著二者要進行轉化所要改變(新增、替換、刪除)的最小步數。那麼用 Python 怎樣來實現呢,我們可以直接使用 distance 庫:

import distance

def edit_distance(s1, s2):
    return distance.levenshtein(s1, s2)

s1 = 'string'
s2 = 'setting'
print(edit_distance(s1, s2))

這裡我們直接使用 distance 庫的 levenshtein() 方法,傳入兩個字串,即可獲取兩個字串的編輯距離了。

執行結果如下:

2

這裡的 distance 庫我們可以直接使用 pip3 來安裝:

pip3 install distance

這樣如果我們想要獲取相似的文字的話可以直接設定一個編輯距離的閾值來實現,如設定編輯距離為 2,下面是一個樣例:

import distance

def edit_distance(s1, s2):
    return distance.levenshtein(s1, s2)

strings = [
    '你在幹什麼',
    '你在幹啥子',
    '你在做什麼',
    '你好啊',
    '我喜歡吃香蕉'
]

target = '你在幹啥'
results = list(filter(lambda x: edit_distance(x, target) <= 2, strings))
print(results)

這裡我們定義了一些字串,然後定義了一個目標字串,然後用編輯距離 2 的閾值進行設定,最後得到的結果就是編輯距離在 2 及以內的結果,執行結果如下:

['你在幹什麼', '你在幹啥子']

通過這種方式我們可以大致篩選出類似的句子,但是發現一些句子例如“你在做什麼” 就沒有被識別出來,但他們的意義確實是相差不大的,因此,編輯距離並不是一個好的方式,但是簡單易用。