में स्ट्रिंग तुलना के आधार पर स्कोर 2 तार के बीच तुलना के आधार पर समानता स्कोर आवंटित करने के लिए कोशिश कर रहा हूँ। क्या आर में इसके लिए कोई कार्य है। मुझे एसएएस में स्पीडिस के नाम से इस तरह के एक समारोह के बारे में पता है। कृपया मुझे बताएं कि आरसमानता आर (संपादित दूरी)
उत्तर
फ़ंक्शन 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
के बीच थोड़ा अंतर है, वहाँ है, हालांकि पूर्व बेहतर है अगर आप पैकेज निर्भरता को जोड़ने के लिए नहीं करना चाहती। आप इसे समानता माप में कैसे बदलते हैं, इसका प्रदर्शन पर थोड़ा असर पड़ता है।
हाय, हां फ़ंक्शन सहायक है। साथ ही, इस फ़ंक्शन का उपयोग सीधे एक एसक्यूएल क्वेरी में करना संभव है। मैं 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 सी; –
आप 'adist' और' agrep' का पता लगाया है? मैं स्पीडिस से परिचित नहीं हूँ। – A5C1D2H2I1M1N2O1R2T1