2010-07-08 21 views
6

अगर किसी ने कभी भी digg को एक कहानी सबमिट की है, तो यह जांचता है कि कहानी पहले से सबमिट की गई है या नहीं, मुझे एक अस्पष्ट खोज से लगता है।php (fuzzy) खोज मिलान

मैं कुछ ऐसा ही कार्यान्वित करना चाहता हूं और जानना चाहता हूं कि क्या वे एक PHP वर्ग का उपयोग कर रहे हैं जो ओपन सोर्स है?

Soundex यह कर नहीं है, वाक्य/तार 250chars अप करने के लिए लंबाई में

+1

क्या आप वाकई शीर्षक या यूआरएल से मेल नहीं खाते हैं? .. मुझे लेवेनशेटिन फॉर्मूला के साथ बड़ी सफलता मिली है, लेकिन मुझे यकीन है कि यह बड़े डेटा सेट के साथ विफल होना शुरू कर देगा। – Fosco

+0

अब मैं कोशिश कर रहा हूं, लेकिन मुझे लगता है कि यह किसी भी तरह के कर्षण – chris

उत्तर

0

आप MySQL के प्रतिलिपि प्राप्त खोज का उपयोग करें (अपने डाटासेट के आकार के आधार पर) कर सकता है हो सकता है, और आइटम (रों) के लिए देखो कि एक उच्च राशि स्कोर करें और एक निश्चित समय सीमा के भीतर हैं, और उपयोगकर्ता को यह सुझाव दें।

स्कोर के बारे में यहाँ और अधिक: MySQL Fulltext Search Score Explained

+0

के साथ एक सस्ते होस्टिंग खाता पिघल जाएगा, गणित मेरा मजबूत बिंदु – chris

+0

दुर्भाग्य से, प्रोग्रामिंग गणित के साथ बहुत कुछ करना है। – Pete

5

दुर्भाग्य से, PHP में ऐसा करने महंगे है लेकिन, आप निश्चित रूप से छोटे डेटा सेट करने के लिए एल्गोरिथ्म लागू कर सकते हैं (उच्च CPU और स्मृति उपयोग।)।

विशेष रूप से कैसे आप एक सर्वर मंदी बना सकते हैं पर विस्तार करने के लिए: Levenshtein और similar_text: के अंतर्निहित पीएचपी कार्यों तार के बीच "दूरी" का निर्धारण करेगा जोड़ी।

डमी डेटा: (नाटक वे खबर सुर्खियों रहे हैं)

$titles = <<< EOF 
Apple 
Apples 
Orange 
Oranges 
Banana 
EOF;

$titles = explode("\n", $titles);

इस बिंदु पर, $ खिताब सिर्फ तार की एक सरणी होना चाहिए। अब, एक मैट्रिक्स बनाएं और समानता के लिए प्रत्येक अन्य शीर्षक के विरुद्ध प्रत्येक शीर्षक की तुलना करें। दूसरे शब्दों में, 5 शीर्षकों के लिए, आपको 5 x 5 मैट्रिक्स (25 प्रविष्टियां) मिलेंगी, जहां सीपीयू और मेमोरी सिंक हो जाता है।

यही कारण है कि इस विधि (PHP के माध्यम से) हजारों पर लागू नहीं किया जा सकता है प्रविष्टियों का। लेकिन अगर आप चाहते थे:

$matches = array(); 
foreach($titles as $title) { 
    $matches[$title] = array(); 
    foreach($titles as $compare_to) { 
     $matches[$title][$compare_to] = levenshtein($compare_to, $title); 
    } 
    asort($matches[$title], SORT_NUMERIC ); 
}

इस बिंदु पर आपके मूल रूप से "टेक्स्ट दूरी" के साथ एक मैट्रिक्स है। अवधारणा में (वास्तविक डेटा में नहीं) यह नीचे इस तालिका की तरह दिखता है। ध्यान दें कि 0 मानों का एक सेट कैसे है जो तिरछे हो जाते हैं - इसका मतलब है कि मिलान करने वाले लूप में, दो समान शब्द हैं - ठीक है, समान।

 
     Apple Apples Orange Oranges Banana 
Apple 0  1  5  6  6 
Apples 1  0  6  5  6 
Orange 5  6  0  1  5 
Oranges 6  5  1  0  5 
Banana 6  6  5  5  0 

वास्तविक $ से मेल खाता है सरणी प्रकार का इस तरह दिखता है (छोटा):

Array 
(
    [Apple] => Array 
     (
      [Apple] => 0 
      [Apples] => 1 
      [Orange] => 5 
      [Banana] => 6 
      [Oranges] => 6 
     ) 

    [Apples] => Array 
     (
     ... 

किसी भी तरह, यह आप पर निर्भर करने के लिए (प्रयोगों के द्वारा) का निर्धारण क्या एक अच्छा संख्यात्मक दूरी कटऑफ ज्यादातर मैच हो सकता है है - और फिर इसे लागू करें। अन्यथा, स्फिंक्स-सर्च पर पढ़ें और इसका उपयोग करें - क्योंकि इसमें PHP पुस्तकालय हैं।

ऑरेंज आपको खुशी है कि आपने इसके बारे में पूछा है?

2

मैं उपयोगकर्ताओं को यूआरएल जमा करने और उन्हें कई हिस्सों में संग्रहित करने का सुझाव दूंगा; डोमेन नाम, पथ और क्वेरी स्ट्रिंग। सबमिट किए गए यूआरएल के हिस्सों को प्राप्त करने के लिए PHP parse_url() फ़ंक्शन का उपयोग करें।

कम से कम डोमेन नाम और पथ सूचकांक। फिर, जब कोई नया उपयोगकर्ता URL सबमिट करता है तो आप डोमेन और पथ से मेल खाने वाले रिकॉर्ड के लिए अपना डेटाबेस खोजते हैं। चूंकि स्तंभों को अनुक्रमित किया गया है, इसलिए आप पहले सभी रिकॉर्ड्स को फ़िल्टर कर रहे होंगे जो एक ही डोमेन में नहीं हैं, और फिर शेष रिकॉर्ड्स के माध्यम से खोज रहे हैं। अपने डेटासेट के आधार पर, यह तेज़ी से होना चाहिए जो पूरे यूआरएल को अनुक्रमणित करता है। सुनिश्चित करें कि आपका WHERE क्लॉज सही क्रम में सेटअप है।

यदि यह आपकी आवश्यकताओं को पूरा नहीं करता है तो मैं स्फिंक्स को आजमाने का सुझाव दूंगा। स्फिंक्स एक ओपन सोर्स एसक्यूएल फुल टेक्स्ट सर्च इंजन है जो कि बहुत तेज़ है कि MySQL पूर्ण-पाठ खोज में बनाया गया है। यह stemming और कुछ अन्य अच्छी सुविधाओं का समर्थन करता है।

http://sphinxsearch.com/

तुम भी, उन प्रस्तुत करने के शीर्षक या पाठ सामग्री ले एक समारोह के माध्यम से इसे चलाने कीवर्ड बनाने के लिए, और उन या समान कीवर्ड के साथ मौजूदा रिकॉर्ड के लिए डेटाबेस खोज सकते हैं।

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