पायथन में उच्च प्रदर्शन फजी स्ट्रिंग तुलना, लेवेंशेटिन या डिफ्लिब का उपयोग करें [बंद]


128

मैं क्लिनिकल मैसेज नॉर्मलाइजेशन (वर्तनी जांच) कर रहा हूं जिसमें मैं प्रत्येक शब्द को 900,000 शब्द मेडिकल डिक्शनरी के खिलाफ जांचता हूं। मैं समय जटिलता / प्रदर्शन के बारे में अधिक चिंतित हूं।

मैं फजी स्ट्रिंग तुलना करना चाहता हूं, लेकिन मुझे यकीन नहीं है कि किस लाइब्रेरी का उपयोग करना है।

विकल्प 1:

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

Result: 0.625

विकल्प 2:

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

Result: 0.625

इस उदाहरण में दोनों एक ही उत्तर देते हैं। क्या आपको लगता है कि इस मामले में दोनों एक जैसे हैं?

जवाबों:


152

यदि आप लेवेंसहेटिन और डिफ्लिब समानता की एक त्वरित दृश्य तुलना में रुचि रखते हैं, तो मैंने दोनों ~ 2.3 मिलियन पुस्तक शीर्षक के लिए गणना की:

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

मैंने तब आर के साथ परिणाम प्लॉट किए:

यहाँ छवि विवरण दर्ज करें

जिज्ञासु के लिए कड़ाई से, मैंने डिफ्लिब, लेवेन्शेटिन, सोरेंसन और जैकार्ड समानता मूल्यों की तुलना भी की:

library(ggplot2)
require(GGally)

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

ggpairs(difflib)

परिणाम: यहाँ छवि विवरण दर्ज करें

डिफ्लिब / लेवेन्सहाइट समानता वास्तव में काफी दिलचस्प है।

2018 संपादित करें: यदि आप समान स्ट्रिंग्स की पहचान करने पर काम कर रहे हैं, तो आप मिनशिंग की जाँच भी कर सकते हैं - यहाँ एक महान अवलोकन है । रैखिक समय में बड़े पाठ संग्रहों में समानता खोजने में मिनहाशिंग अद्भुत है। मेरी लैब ने एक ऐप को एक साथ रखा है जो कि मिनहाशिंग का उपयोग करते हुए पाठ के पुन: उपयोग का पता लगाता है और कल्पना करता है: https://github.com/YaleDHLab/intertext


2
यह सुपर कूल है! इस पर आपका क्या लेना है? क्या शीर्षक-लंबाई के तार के लिए लेवेंसहाइट सिर्फ बुरा है?
उल्फ असलाक

3
यह वास्तव में निर्भर करता है कि आप अपनी समानता मीट्रिक में कब्जा करने की कोशिश कर रहे हैं ...
18

2
मुझे लगता है कि डिफ्लिब और लेवेन्शेटिन के बीच असहमति को कुछ समझाया जा सकता है क्योंकि डिफ्लिब द्वारा इस्तेमाल किए जाने वाले ऑटोजंक ह्यूरिस्टिक हैं। यदि आप इसे अक्षम करते हैं तो क्या होता है?
माइकल

2
यह एक अच्छा सवाल है। ऑटोजंक फ़िल्टर केवल तभी प्रभावी होता है जब टिप्पणियों की संख्या> 200 होती है, इसलिए मुझे यकीन नहीं है कि अगर यह विशेष डेटासेट (पुस्तक शीर्षक) बहुत प्रभावित होता, लेकिन यह जांच के लायक है ...
duhaime

2
@duhaime, इस विस्तृत विश्लेषण के लिए धन्यवाद। मैं इस प्रकार के भूखंडों के लिए नया हूँ और इनकी व्याख्या करने का कोई तरीका नहीं है। भूखंडों को क्या कहा जाता है, ताकि मैं उन्हें देखूं और उनके बारे में जान सकूं?
जच यंग

104
  • difflib.SequenceMatcher Ratcliff / Obershelp एल्गोरिथ्म का उपयोग करता है जो दो तारों में वर्णों की कुल संख्या से विभाजित मिलान वर्णों की दोगुनी संख्या की गणना करता है।

  • Levenshtein Levenshtein एल्गोरिथ्म का उपयोग करता है यह एक स्ट्रिंग को दूसरे में बदलने के लिए आवश्यक संपादन की न्यूनतम संख्या की गणना करता है

जटिलता

SequenceMatcher सबसे खराब स्थिति के लिए द्विघात समय है और इसमें कई मामलों में एक जटिल तरीके से आश्रित व्यवहार होता है, जिसमें कितने तत्व हैं। ( यहां से )

लेवेन्शिन हे (m * n) है, जहां n और m दो इनपुट स्ट्रिंग्स की लंबाई है।

प्रदर्शन

Levenshtein मॉड्यूल के स्रोत कोड के अनुसार : Levenshtein difflib (SequenceMatcher) के साथ कुछ ओवरलैप है। यह केवल तार का समर्थन करता है, मनमाने ढंग से अनुक्रम प्रकार नहीं, लेकिन दूसरी ओर यह बहुत तेज है।


जानकारी के लिए बहुत शुक्रिया। मैंने और विवरण जोड़ दिए हैं। यहाँ यह है: 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.क्या आपको लगता है कि दोनों इस मामले में एक जैसे हैं।
मैगी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.