2012-07-18 12 views
11

में स्ट्रिंग तुलना के आधार पर स्कोर 2 तार के बीच तुलना के आधार पर समानता स्कोर आवंटित करने के लिए कोशिश कर रहा हूँ। क्या आर में इसके लिए कोई कार्य है। मुझे एसएएस में स्पीडिस के नाम से इस तरह के एक समारोह के बारे में पता है। कृपया मुझे बताएं कि आरसमानता आर (संपादित दूरी)

+0

आप 'adist' और' agrep' का पता लगाया है? मैं स्पीडिस से परिचित नहीं हूँ। – A5C1D2H2I1M1N2O1R2T1

उत्तर

28

फ़ंक्शन adist फ़ंक्शन Levenshtein edit distance दो तारों के बीच गणना करता है। इसे एक समानता मीट्रिक में 1 के रूप में परिवर्तित किया जा सकता है - (लेवेनशेटिन संपादित दूरी/लंबी स्ट्रिंग लंबाई)।

RecordLinkage पैकेज में फ़ंक्शन यह भी सीधे करता है, और adist से तेज़ हो सकता है।

library(RecordLinkage) 
> levenshteinSim("apple", "apple") 
[1] 1 
> levenshteinSim("apple", "aaple") 
[1] 0.8 
> levenshteinSim("apple", "appled") 
[1] 0.8333333 
> levenshteinSim("appl", "apple") 
[1] 0.8 

ईटीए: दिलचस्प है, RecordLinkage पैकेज में levenshteinDist थोड़ा तेज adist से प्रतीत होता है, जबकि, levenshteinSim या तो की तुलना में काफी धीमी है। rbenchmark पैकेज का उपयोग करना:

> levenshteinSim 
function (str1, str2) 
{ 
    return(1 - (levenshteinDist(str1, str2)/pmax(nchar(str1), 
     nchar(str2)))) 
} 

FYI करें: यदि आप हमेशा वैक्टर के बजाय दो तार की तुलना कर रहे

> benchmark(levenshteinDist("applesauce", "aaplesauce"), replications=100000) 
             test replications elapsed relative 
1 levenshteinDist("applesauce", "aaplesauce")  100000 4.012  1 
    user.self sys.self user.child sys.child 
1  3.583 0.452   0   0 
> benchmark(adist("applesauce", "aaplesauce"), replications=100000) 
           test replications elapsed relative user.self 
1 adist("applesauce", "aaplesauce")  100000 4.277  1  3.707 
    sys.self user.child sys.child 
1 0.461   0   0 
> benchmark(levenshteinSim("applesauce", "aaplesauce"), replications=100000) 
             test replications elapsed relative 
1 levenshteinSim("applesauce", "aaplesauce")  100000 7.206  1 
    user.self sys.self user.child sys.child 
1  6.49 0.743   0   0 

यह ओवरहेड बस levenshteinSim के लिए कोड है, जो सिर्फ एक के आसपास levenshteinDist आवरण है की वजह से है , आप pmax के बजाय max का उपयोग करता है एक नया संस्करण बना सकते हैं और चल रहे समय दाढ़ी ~ 25% कर सकते हैं:

mylevsim = function (str1, str2) 
{ 
    return(1 - (levenshteinDist(str1, str2)/max(nchar(str1), 
     nchar(str2)))) 
} 
> benchmark(mylevsim("applesauce", "aaplesauce"), replications=100000) 
            test replications elapsed relative user.self 
1 mylevsim("applesauce", "aaplesauce")  100000 5.608  1  4.987 
    sys.self user.child sys.child 
1 0.627   0   0 

लंबी कहानी छोटी प्रदर्शन के मामले में adist और levenshteinDist के बीच थोड़ा अंतर है, वहाँ है, हालांकि पूर्व बेहतर है अगर आप पैकेज निर्भरता को जोड़ने के लिए नहीं करना चाहती। आप इसे समानता माप में कैसे बदलते हैं, इसका प्रदर्शन पर थोड़ा असर पड़ता है।

+0

हाय, हां फ़ंक्शन सहायक है। साथ ही, इस फ़ंक्शन का उपयोग सीधे एक एसक्यूएल क्वेरी में करना संभव है। मैं sqldf पैकेज का उपयोग कर रहा एक SQL क्वेरी लिखने और title_score <-sqldf ("a.id mp_id के रूप में चुनते हैं, तो sp_id रूप b.id R.example में एक डेटा फ्रेम करने के लिए अपने परिणाम आवंटित करने के लिए, मामले जब levenshteinSim (क .title, b.title) 0 और 100 के बीच ((100-levenshteinSim (a.title, b.title))/100) * c.weights else 0 endproducts से title_score के रूप में सभी प्रोडक्ट्स बी में शामिल हों। subcategory_id = b.subcategory_id और a.id> b.id में शामिल होने b.subcategory_id = c.subcategory और c.filter_name = 'शीर्षक' ") पर filterweights सी; –

संबंधित मुद्दे