Python'da yüksek performanslı bulanık dize karşılaştırması, Levenshtein veya difflib [kapalı] kullanın


130

Her bir kelimeyi 900.000 kelimelik tıbbi sözlüğe karşı kontrol ettiğim klinik mesaj normalleştirme (yazım denetimi) yapıyorum. Zaman karmaşıklığı / performansı konusunda daha çok endişeliyim.

Bulanık dizge karşılaştırması yapmak istiyorum, ancak hangi kitaplığı kullanacağımdan emin değilim.

Seçenek 1:

import Levenshtein
Levenshtein.ratio('hello world', 'hello')

Result: 0.625

Seçenek 2:

import difflib
difflib.SequenceMatcher(None, 'hello world', 'hello').ratio()

Result: 0.625

Bu örnekte ikisi de aynı cevabı veriyor. Bu durumda ikisinin de benzer performans gösterdiğini düşünüyor musunuz?

Yanıtlar:


154

Levenshtein ve Difflib benzerliğinin hızlı bir görsel karşılaştırmasıyla ilgileniyorsanız, her ikisini de ~ 2.3 milyon kitap başlığı için hesapladım:

import codecs, difflib, Levenshtein, distance

with codecs.open("titles.tsv","r","utf-8") as f:
    title_list = f.read().split("\n")[:-1]

    for row in title_list:

        sr      = row.lower().split("\t")

        diffl   = difflib.SequenceMatcher(None, sr[3], sr[4]).ratio()
        lev     = Levenshtein.ratio(sr[3], sr[4]) 
        sor     = 1 - distance.sorensen(sr[3], sr[4])
        jac     = 1 - distance.jaccard(sr[3], sr[4])

        print diffl, lev, sor, jac

Daha sonra sonuçları R ile çizdim:

görüntü açıklamasını buraya girin

Kesinlikle merak edenler için Difflib, Levenshtein, Sørensen ve Jaccard benzerlik değerlerini de karşılaştırdım:

library(ggplot2)
require(GGally)

difflib <- read.table("similarity_measures.txt", sep = " ")
colnames(difflib) <- c("difflib", "levenshtein", "sorensen", "jaccard")

ggpairs(difflib)

Sonuç: görüntü açıklamasını buraya girin

Difflib / Levenshtein benzerliği gerçekten oldukça ilginç.

2018 düzenlemesi: Benzer dizeleri belirlemeye çalışıyorsanız, minhashing'e de göz atabilirsiniz - burada harika bir genel bakış var . Minhashing, doğrusal zamanda büyük metin koleksiyonlarında benzerlikler bulmakta harika. Laboratuvarım, burada minhashing kullanarak metnin yeniden kullanımını algılayan ve görselleştiren bir uygulama oluşturdu: https://github.com/YaleDHLab/intertext


2
Bu çok havalı! Bu konuda ne düşünüyorsunuz? Levenshtein başlık uzunluğundaki dizeler için kötü mü?
Ulf Aslak

3
Bu gerçekten benzerlik
ölçünüzde neyi

2
Diflib ve levenshtein arasındaki bazı anlaşmazlıkların, difflib tarafından kullanılan otomatik çöp sezgiselliği nedeniyle açıklanabileceğini düşünüyorum. Devre dışı bırakırsanız ne olur?
Michael

2
Bu iyi bir soru. Otomatik çöp filtresi yalnızca gözlem sayısı> 200 ise etkili olur, bu nedenle bu belirli veri kümesinin (kitap başlıkları) büyük ölçüde etkilenip etkilenmeyeceğinden emin değilim, ancak araştırmaya değer ...
duhaime

2
@duhaime, bu detaylı analiz için teşekkür ederim. Bu tür olay örgülerinde yeniyim ve onları nasıl yorumlayacağımı bilmiyorum. Arazilere bakıp onlar hakkında bilgi edinebilmem için arsalara ne denir?
Zach Young

104
  • difflib.SequenceMatcher, Ratcliff / Obershelp algoritmasını kullanır ve eşleşen karakterlerin iki katına bölünerek iki dizedeki toplam karakter sayısına bölünmesini hesaplar.

  • Levenshtein, bir dizeyi diğerine dönüştürmek için gereken minimum düzenleme sayısını hesaplayan Levenshtein algoritmasını kullanır.

karmaşa

SequenceMatcher, en kötü durum için ikinci dereceden bir zamandır ve beklenen durum davranışına, dizilerin ortak kaç öğeye sahip olduğuna karmaşık bir şekilde bağımlıdır. ( buradan )

Levenshtein, O (m * n) 'dir, burada n ve m, iki giriş dizesinin uzunluğudur.

Verim

Levenshtein modülünün kaynak koduna göre : Levenshtein, difflib (SequenceMatcher) ile biraz örtüşmektedir. Yalnızca dizeleri destekler, rastgele sıra türlerini değil, diğer yandan çok daha hızlıdır.


Bilgi için çok teşekkürler. Daha fazla ayrıntı ekledim. işte burada: I am doing clinical message normalization (spell check) in which I check each given word against 900,000 word medical dictionary. I am more concern about the time complexity/performance.Sizce bu durumda her ikisi de aynı performans gösteriyor mu?
Maggie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.