So sánh chuỗi mờ hiệu suất cao trong Python, sử dụng Levenshtein hoặc difflib [đã đóng]


127

Tôi đang thực hiện chuẩn hóa thông điệp lâm sàng (kiểm tra chính tả) trong đó tôi kiểm tra từng từ đã cho so với 900.000 từ điển y khoa. Tôi quan tâm nhiều hơn về sự phức tạp thời gian / hiệu suất.

Tôi muốn thực hiện so sánh chuỗi mờ, nhưng tôi không chắc nên sử dụng thư viện nào.

Lựa chọn 1:

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

Result: 0.625

Lựa chọn 2:

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

Result: 0.625

Trong ví dụ này cả hai đưa ra cùng một câu trả lời. Bạn có nghĩ rằng cả hai thực hiện như nhau trong trường hợp này?

Câu trả lời:


152

Trong trường hợp bạn quan tâm đến việc so sánh trực quan nhanh về sự tương đồng của Levenshtein và Difflib, tôi đã tính cả hai cho ~ 2,3 triệu đầu sách:

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

Sau đó tôi đã vẽ kết quả với R:

nhập mô tả hình ảnh ở đây

Nghiêm túc cho sự tò mò, tôi cũng so sánh các giá trị tương tự Difflib, Levenshtein, Sørensen và Jaccard:

library(ggplot2)
require(GGally)

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

ggpairs(difflib)

Kết quả: nhập mô tả hình ảnh ở đây

Sự tương đồng của Difflib / Levenshtein thực sự khá thú vị.

Chỉnh sửa năm 2018: Nếu bạn đang làm việc để xác định các chuỗi tương tự, bạn cũng có thể kiểm tra minhashing - có một tổng quan tuyệt vời ở đây . Minhashing là tuyệt vời trong việc tìm thấy sự tương đồng trong các bộ sưu tập văn bản lớn trong thời gian tuyến tính. Phòng thí nghiệm của tôi kết hợp một ứng dụng phát hiện và trực quan hóa việc sử dụng lại văn bản bằng cách sử dụng minhashing tại đây: https://github.com/YaleDHLab/intertext


2
Điều này là siêu mát mẻ! Bạn đang làm gì trên này sau đó? Có phải Levenshtein chỉ xấu cho chuỗi độ dài tiêu đề?
Ulf Aslak

3
Nó thực sự phụ thuộc vào những gì bạn đang cố gắng ghi lại trong số liệu tương tự của mình ...
duhaime

2
Tôi nghĩ rằng một số bất đồng giữa difflib và levenshtein có thể được giải thích do heuristic tự động được sử dụng bởi difflib. Điều gì xảy ra nếu bạn vô hiệu hóa nó?
Michael

2
Đó là một câu hỏi hay. Bộ lọc tự động chỉ có hiệu lực nếu số lượng quan sát> 200, vì vậy tôi không chắc liệu bộ dữ liệu cụ thể này (tên sách) có bị ảnh hưởng nhiều hay không, nhưng nó đáng để điều tra ...
duhime

2
@duhaime, cảm ơn bạn đã phân tích chi tiết này. Tôi chưa quen với những loại cốt truyện này và không biết làm thế nào để diễn giải chúng. Các lô được gọi là gì, để tôi có thể tra cứu chúng và tìm hiểu về chúng?
Zach Young

104
  • difflib.SequenceMatcher sử dụng thuật toán Ratcliff / Obershelp, nó tính toán số lượng nhân vật trùng khớp gấp đôi chia cho tổng số ký tự trong hai chuỗi.

  • Levenshtein sử dụng thuật toán Levenshtein, nó tính toán số lần chỉnh sửa tối thiểu cần thiết để chuyển đổi một chuỗi thành chuỗi khác

Phức tạp

SequenceMatcher là thời gian bậc hai cho trường hợp xấu nhất và có hành vi trường hợp dự kiến ​​phụ thuộc một cách phức tạp vào việc có bao nhiêu yếu tố mà trình tự có điểm chung. ( từ đây )

Levenshtein là O (m * n), trong đó n và m là độ dài của hai chuỗi đầu vào.

Hiệu suất

Theo mã nguồn của mô-đun Levenshtein: Levenshtein có một số trùng lặp với difflib (SequenceMatcher). Nó chỉ hỗ trợ các chuỗi, không phải các loại chuỗi tùy ý, nhưng mặt khác, nó nhanh hơn nhiều.


Cảm ơn rất nhiều cho các thông tin. Tôi đã thêm chi tiết. đây là: 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.Bạn có nghĩ rằng cả hai thực hiện như nhau trong trường hợp này.
Maggie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.