2013-11-26 4 views
6

मेरे पास 50 000 + कंपनियों का डेटाबेस है जो लगातार अद्यतन (200+ प्रति माह) है।एक विशाल सूची में इसी प्रकार के नाम

दोहराया सामग्री के साथ एक बहुत बड़ा मुद्दा है क्योंकि नाम हमेशा सख्त/सही नहीं हैं:
"सुपर 1 स्टोर"
"सुपर एक स्टोर"
"सुपर 1 स्टोर"

एक और उदाहरण .. जो शायद अलग दृष्टिकोण की जरूरत है: संपादित
"एमी पिज्जा" < ---> "एमी द्वारा कार्बनिक पिज्जा और कंपनी"

हमें समान नामों के लिए डेटा स्कैन करने के लिए टूल की आवश्यकता है। मेरे पास Levenshtein Distance और LCS के साथ कुछ अनुभव है लेकिन 2 स्ट्रिंग समान हैं तो तुलना करने के लिए वे अच्छा काम करते हैं ...
यहां मुझे 50 000 नाम स्कैन करना होगा प्रत्येक के साथ-साथ प्रत्येक की गणना कर सकते हैं ... समग्र समानता रेटिंग। ..

मुझे सलाह है कि इस समस्या पर हमला कैसे करें अपेक्षित परिणाम बहुत समान नामों के 10-20 समूहों के साथ एक सूची है, और अधिक परिणामों के लिए संवेदनशीलता को और समायोजित कर सकते हैं।

+1

दिलचस्प! क्या आपने 'similar_text()' [function] (http://php.net/manual/en/function.similar-text.php) की कोशिश की है? – Lan

+0

आसान उत्तर नक्शा/कम करने के बाद पहले सामान्यीकृत होता है, लेकिन मुझे लगता है कि आप कुछ और जटिल खोज रहे हैं। – mcuadros

+1

मैंने कभी इसका इस्तेमाल नहीं किया है, लेकिन कैसे SOUNDEX के बारे में? –

उत्तर

3

मैं एक साल पहले या तो समान समस्या थी, और अगर मैं अच्छी तरह से याद है, मैं similar_text और soundex का उपयोग कर के रूप में अन्य लोगों को टिप्पणी में कहा (कम या ज्यादा) को हल किया। कुछ इस तरह:

<?php 

$str1 = "Store 1 for you"; 
$str2 = "Store One 4 You"; 

similar_text(soundex($str1), soundex($str2), $percent); 

if ($percent >= 66){ 
    echo "Equal"; 
    //Send an email for review 
}else{ 
    echo "Different"; 
    //Proceed to insert in database 
} 
?> 

मेरे मामले में यह निर्धारित करने के लिए कंपनियों को एक ही कर रहे हैं (इस मामले में डेटाबेस में सम्मिलित नहीं करते हैं लेकिन समीक्षा करने के लिए मेरे लिए एक ईमेल भेजने के लिए, और जाँच 66% की एक प्रतिशत का उपयोग करता है, तो सही है)।

इस समाधान के साथ कुछ महीनों के बाद, मैं कंपनियों के लिए किसी प्रकार का अनूठा कोड (मेरे मामले में सीआईएफ क्योंकि स्पेन में कंपनी द्वारा अद्वितीय है) का उपयोग करने का निर्णय लेता हूं।

+0

यह अच्छा लग रहा है विराम चिह्न "" '' 'ध्वनि' में अनदेखा किया गया है? "एमी पिज्जा" <-> "एमी एंड कंपनी द्वारा कार्बनिक पिज्जा" के बारे में क्या ... मुझे लगता है कि यह एक और प्रकार की समस्या है –

+0

हां, यह बहुत सारी कंपनियों के लिए काम करता है लेकिन सभी के लिए नहीं, इसलिए मैं खुद को एक ईमेल भेजता हूं यह जांचने के लिए कि तुलना सही है या नहीं। कभी-कभी मुझे कंपनियों को मैन्युअल रूप से डालना पड़ता है, यही कारण है कि कुछ महीनों के बाद मैं कंपनी के सीआईएफ को सम्मिलित करने के लिए पंजीकरण और बल बदलता हूं, इसलिए मैं बीआईडी ​​में सीआईएफ की तुलना कर सकता हूं और यह सुनिश्चित कर सकता हूं कि कॉमनी समान है या नहीं। – Sal00m

-1

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

तालिका: companies:

|id|base_name 
|1 |Super 1 Store 

तालिका: company_mapping:

|id|company_id|name 
|1 |1   |Super 1 Store 
|2 |1   |Super One Store 
|3 |1   |Super 1 Stores 
+0

क्षमा करें, मुझे नहीं लगता कि हमारे पास ओपी के व्यवसाय के बारे में पर्याप्त जानकारी है ताकि यह निर्धारित किया जा सके कि कंप्यूटर कार्य मैन्युअल रूप से किया जाना चाहिए। जब तक कि व्यवसाय पूर्व-मुद्रित रूपों का उपयोग नहीं कर रहा है, ग्राहक को डेटा लिखने की अनुमति देने से ओपी की स्थिति के अनुसार हमेशा समाप्त हो जाएगा। –

+0

@ user2310289 मैं बस इतना कह रहा हूं कि लेवेनस्टीन और साउंडएक्स शायद कई गलत परिणाम देगा (दो पूरी तरह से अलग-अलग कंपनियां जो केवल 2 अक्षरों से भिन्न होती हैं) जिन्हें अभी भी मैन्युअल क्लीनअप को एक तरफ या किसी अन्य तरीके की आवश्यकता होगी। – silkfire

+0

पत्रिका सदस्यता व्यवसाय की तरह कुछ सोचने के लिए जहां पत्रिका में उपयोगकर्ता को भरने के लिए एक खाली पोस्टकार्ड होता है। जब तक डेटा एंट्री प्रोग्राम में स्मारक नहीं होते हैं, तब लेवेनस्टीन और साउंडएक्स और आपका दृष्टिकोण अभी भी असफल हो जाएगा। यदि आप इसे प्रतिबिंबित करने के लिए अपना उत्तर बदल सकते हैं तो मैं आपको ऊपर उठाऊंगा। –

1

विशुद्ध रूप से यह कितना हम के रूप में इसी तरह के 2 तार पर विचार करने को बर्दाश्त करना चाहिए पर निर्भर करते हैं .. soundex अच्छी तरह से

के रूप में उपयोगी हो सकता है
select soundex('Super One Store') returns S165236 
    select soundex('Super 1 Store'); returns S16236 
    select soundex('Super One Stores') returns S1652362 

S16236 सभी मामलों में आम है, तो आप फ़िल्टर का उपयोग कर सकते हैं नीचे

select * from (
select 'Super One Store' as c 
union 
select 'Super 1 Store' as c 
union 
select 'Super One Stores' as c 
union 
select 'different one' as c 
union 
select 'supers stores' as c 
) tmp 
where soundex(c) like CONCAT('%', soundex('Super store'), '%') 
or soundex(c) like CONCAT('%', soundex('Super one store'), '%') 
संबंधित मुद्दे