2008-09-16 21 views
10

स्टैक ओवरफ्लो/digg/reddit के समान अनुशंसा प्रणाली के साथ वेबसाइट को कैसे कार्यान्वित करें? यानी, उपयोगकर्ता सामग्री जमा करते हैं और वेबसाइट को कितनी लोकप्रिय वस्तु के अनुसार "हॉटनेस" की गणना करने की आवश्यकता होती है। प्रवाह इस प्रकार है:डिग-जैसी एल्गोरिदम को कैसे कार्यान्वित करें?

  • उपयोगकर्ता
  • अन्य उपयोगकर्ताओं को देख सकते हैं और सामग्री पर वोट (90% उपयोगकर्ता मान केवल सामग्री और 10% सक्रिय रूप से ऊपर या नीचे सामग्री पर वोट विचार)
  • सामग्री भेजने नई सामग्री लगातार

मैं एक एल्गोरिदम को कैसे लागू करूं जो सबमिट की गई वस्तु की "हॉटनेस" की गणना करता है, अधिमानतः वास्तविक समय में? क्या कोई सर्वोत्तम अभ्यास या डिजाइन पैटर्न हैं?

मुझे लगता है कि एल्गोरिथ्म को ध्यान में निम्नलिखित लेता है:

  • जब एक आइटम प्रस्तुत की गई थी
  • जब प्रत्येक मतदान किया गया था
  • जब आइटम देखा गया था

जैसे एक आइटम जो निरंतर मतभेद प्राप्त करता है, कुछ हद तक "गर्म" रहता है, जबकि एक आइटम जो पहले सबमिट किए जाने पर वोटों का विस्फोट प्राप्त करता है, "हॉटनेस" सूची के शीर्ष पर कूद जाएगा लेकिन फिर वोट गिरने के बाद गिर जाएगा आने में

(मैं एक MySQL + PHP का उपयोग कर रहा हूं लेकिन मुझे सामान्य डिजाइन पैटर्न में रूचि है)।

+0

संबंधित सवाल है, जो सूत्र दस्तावेजों हम का उपयोग करें: http://meta.stackexchange.com/questions/11602/what-formula-should-be-used-to-determine-hot-questions –

उत्तर

6

आप Reddit algorithm के समान कुछ उपयोग कर सकते हैं - जिसका मूल सिद्धांत आप पोस्ट किए गए समय और स्कोर के आधार पर किसी पोस्ट के लिए मान की गणना करते हैं। रेडडिट एल्गोरिदम के बारे में क्या साफ है कि पोस्ट के स्कोर में परिवर्तन होने पर आपको केवल मूल्य को फिर से लागू करने की आवश्यकता होती है। जब आप अपना फ्रंट पेज प्रदर्शित करना चाहते हैं, तो आप उस स्कोर के आधार पर अपने डेटाबेस से शीर्ष एन पोस्ट प्राप्त करें। जैसे-जैसे स्कोर बढ़ते हैं, स्वाभाविक रूप से बढ़ेगा, इसलिए आपको सामने वाले पृष्ठ से वस्तुओं को हटाने के लिए कोई विशेष प्रसंस्करण करने की आवश्यकता नहीं है।

+1

एक खुदाई कभी भी Reddit एल्गोरिदम का उपयोग नहीं करेगा। कभी। –

4

अपनी साइट पर, मैं प्रत्येक प्रविष्टि को एक monotonically बढ़ती श्रृंखला से एक अद्वितीय पूर्णांक आवंटित करता हूं (नए पदों को उच्च संख्या मिलती है)। प्रत्येक अप वोट एक से संख्या बढ़ाता है, और प्रत्येक नीचे वोट एक से कम हो जाता है (आप निश्चित रूप से इन मानों को ट्विक कर सकते हैं)। फिर, 'सबसे गर्म' प्रविष्टियों को प्रदर्शित करने के लिए संख्या द्वारा क्रमबद्ध करें।

1

मैं एक सामाजिक बुकमार्किंग साइट विकसित की है, Sites Favoritos, और एक जटिल एल्गोरिथ्म इस्तेमाल किया:

  1. पहले, वोट परिमित कर रहे हैं, एक उपयोगकर्ता केवल वोट की एक सीमित संख्या है, और वोटों की संख्या पर निर्भर करता है उपयोगकर्ता अंक अंक अर्जित करने के लिए प्रत्येक उपयोगकर्ता को ऐसे लिंक जोड़ना चाहिए जो सकारात्मक वोट प्राप्त करें।
  2. फिर, उपयोगकर्ता प्रत्येक लिंक के लिए -3, -2, -1,1,2 या 3 वोट वोट दे सकते हैं। चूंकि वोट सीमित हैं, प्रत्येक उपयोगकर्ता केवल उन लिंक पर वोट देगा जिन्हें वे पसंद करते हैं।
  3. उपयोगकर्ता को केवल उसी उपयोगकर्ता के लिंक पर वोट करने के लिए रोकने के लिए, समर्थन समूहों को बनाने के लिए, प्रत्येक वोट को लिंक में जोड़ दिया गया बिंदु वोट वोट के मालिक के लिंक के लिए कुल वोटों और वोटों के बीच एक रासियो पर निर्भर करता है। यदि आप हमेशा एक ही उपयोगकर्ता लिंक पर वोट देते हैं, तो आपके वोट मूल्य खो देंगे।
  4. वोट समय के साथ मूल्य खो देते हैं।
  5. उन उपयोगकर्ताओं के नए लिंक जिनके पास अंक नहीं हैं (नए उपयोगकर्ता) के पास 0 अंक प्रारंभ होंगे। पुराने उपयोगकर्ताओं के नए लिंक उनके अंक के आधार पर अंक होंगे। +3 से अनंत तक। नकारात्मक बिंदु वाले उपयोगकर्ताओं के लिंक नकारात्मक शुरुआती बिंदु होंगे, सकारात्मक अंक वाले उपयोगकर्ताओं के लिंक सकारात्मक प्रारंभिक अंक होंगे।

उपयोगकर्ताओं को उनके लिंक वोट दिए जाने पर यादृच्छिक अंक प्राप्त होंगे। सकारात्मक वोट सकारात्मक अंक देते हैं, नकारात्मक अंक के लिए नकारात्मक वोट देते हैं।

1

पॉल ग्राहम ने developing Hacker News में जो कुछ सीखा, उस पर एक निबंध लिखा। उन लोगों/इंटरैक्शन पर ज़ोर देना अधिक है जो वह एल्गोरिदम प्रति से अधिक आकर्षित करने/बनाने की कोशिश कर रहे थे, लेकिन फिर भी पढ़ने के लायक हैं। उदाहरण के लिए, जब वह नीचे के पृष्ठ (शीर्ष) के शीर्ष (डिग) के विस्फोट के विरुद्ध नीचे (एचएन) कहानियों से बुलबुला कहता है, तो विभिन्न परिणामों पर चर्चा करता है। (हालांकि मैंने एचएन के बारे में जो देखा है, वैसे ही यह कहानियां शीर्ष पर भी विस्फोट की तरह दिखती हैं)।

प्रदर्शन के लिए महत्वपूर्ण लालित्य, नहीं विशेष मामलों की बटालियनों है:

वह इस उद्धरण प्रदान करता है।

जो HN पहले पन्ने पैदा करने के लिए purported algorithm के आलोक में:

(पी - 1)/(टी + 2)^1,5

जहां

पी = एक लेख के अंक और

टी = लेख सबमिट करने से समय

एक अच्छा प्रारंभिक बिंदु हो सकता है।

1

मैं बहुत की तरह एक वीडियो एग्रीगेटर के लिए रेडिट की रैंकिंग एल्गोरिथ्म के एक SQL संस्करण लागू किया:

SELECT id, title 
FROM videos 
ORDER BY 
    LOG10(ABS(cached_votes_total) + 1) * SIGN(cached_votes_total) 
    + (UNIX_TIMESTAMP(created_at)/300000) DESC 
LIMIT 50 

* cached_votes_total * एक ट्रिगर जब भी कोई नया वोट डाली है के द्वारा अद्यतन किया गया है। यह हमारी वर्तमान साइट पर पर्याप्त तेज़ी से चलता है, लेकिन मैं रैंकिंग वैल्यू कॉलम जोड़ने और * cached_votes_total * कॉलम के समान ट्रिगर के साथ इसे अपडेट करने की योजना बना रहा हूं। उस अनुकूलन के बाद, यह किसी भी आकार की साइट के लिए पर्याप्त तेज़ होना चाहिए।

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