sql रचन कैसे एक Digg- तरह एल्गोरिथ्म को लागू करने के लिए?




व्हाट इस फ्लोचार्ट (4)

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

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

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

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

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

  • जब एक आइटम सबमिट किया गया था
  • जब प्रत्येक वोट डाली गया था
  • जब आइटम देखा गया था

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

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


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

वह यह बोली प्रदान करता है:

प्रदर्शन की चाबी सुंदरता है, विशेष मामलों की बटालियन नहीं।

जो एचएन फ्रंट पेज बनाने के लिए कथित एल्गोरिदम के प्रकाश में है:

(पी -1) / (टी + 2) ^ 1.5

कहा पे

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

लेख प्रस्तुत करने से टी = समय

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


मैंने एक सामाजिक बुकमार्किंग साइट विकसित की, साइट्स फैविएटोस , और एक जटिल एल्गोरिदम का इस्तेमाल किया:

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

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


मैंने एक वीडियो एग्रीगेटर के लिए Reddit के रैंकिंग एल्गोरिदम का एक एसक्यूएल संस्करण लागू किया है:

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 * column के समान ट्रिगर के साथ अपडेट करने की योजना बना रहा हूं। उस ऑप्टिमाइज़ेशन के बाद, यह किसी भी आकार साइट के लिए तेजी से पर्याप्त होना चाहिए।







digg