7

मेरे पास लगभग 700k उपयोगकर्ताओं का डेटाबेस है जो उन्होंने देखा/सुना/पढ़ा/खरीदा/आदि के साथ देखा है। मैं एक अनुशंसा इंजन बनाना चाहता हूं जो कि चीजों में समान स्वाद वाले उपयोगकर्ताओं के आधार पर नई वस्तुओं की सिफारिश करता है, साथ ही वास्तव में लोगों को ढूंढने के लिए उपयोगकर्ता जो सोशल नेटवर्क पर निर्माण कर रहा हूं, उसके साथ दोस्त बनना चाहता हूं (इसी तरह आखरीएफएम)।समान वस्तुओं और उपयोगकर्ताओं को खोजने के लिए अनुशंसा एल्गोरिदम (और कार्यान्वयन)

  • "उन" मेरे डेटाबेस में से अधिकांश वास्तव में मेरे वेबसाइट के उपयोगकर्ताओं नहीं हैं:

    मेरे आवश्यकताओं इस प्रकार हैं। वे तीसरे पक्ष के स्रोतों से खनन डेटा रहे हैं। हालांकि, उपयोगकर्ताओं की सिफारिश करते समय, मैं उन लोगों को खोज सीमित करना चाहता हूं जो मेरी वेबसाइट के सदस्य हैं (जबकि अभी भी बड़े डेटा सेट का लाभ उठा रहे हैं)।

  • मुझे एकाधिक वस्तुओं को ध्यान में रखना होगा। नहीं "वे लोग जो आपको पसंद करते हैं ..." लेकिन "वे लोग जो आपको पसंद करते हैं ..."।
  • मुझे उपयोगकर्ताओं के बीच समानता की गणना करने और उनकी प्रोफ़ाइल (स्वाद-ओ-मीटर) देखने पर उन्हें दिखाने की आवश्यकता है।
  • कुछ आइटम रेट किए गए हैं, अन्य नहीं हैं। रेटिंग 1-10 से हैं, बुलियन मूल्य नहीं। ज्यादातर मामलों में यदि यह मौजूद नहीं है तो अन्य आंकड़ों से रेटिंग मूल्य घटा देना संभव होगा (उदा। यदि उपयोगकर्ता ने किसी आइटम को पसंद किया है, लेकिन इसे रेट नहीं किया है, तो मैं 9 की रेटिंग मान सकता हूं)।
  • इसे पाइथन कोड के साथ एक या दूसरे तरीके से बातचीत करना है। अधिमानतः, इसे एक अलग (संभवतः नोएसक्यूएल) डेटाबेस का उपयोग करना चाहिए और मेरे वेब बैक-एंड में उपयोग करने के लिए एक एपीआई का पर्दाफाश करना चाहिए। मैं जिस परियोजना को बना रहा हूं वह पिरामिड और स्क्लाक्लेमी का उपयोग करता है।
  • मैं आइटम शैलियों को ध्यान में रखना चाहता हूं।
  • मैं अपनी शैली (संभवतः टैग) दोनों के आधार पर आइटम पृष्ठों पर समान आइटम प्रदर्शित करना चाहता हूं और किस उपयोगकर्ता ने आइटम का आनंद लिया (जैसे अमेज़ॅन के "लोग जिन्होंने यह आइटम खरीदा" और Last.fm कलाकार पृष्ठ)। विभिन्न शैलियों के आइटम अभी भी दिखाए जाने चाहिए, लेकिन कम समानता मान है।
  • मैं कुछ उदाहरणों के साथ एक एल्गोरिदम का एक अच्छी तरह से प्रलेखित कार्यान्वयन पसंद करूंगा।

कृपया "pysuggest या mahout का उपयोग करें" जैसे उत्तर न दें, क्योंकि एल्गोरिदम का एक बड़ा हिस्सा लागू होता है और मैं अपने डेटा/उपयोग के लिए सबसे उपयुक्त है। मुझे नियो 4j में दिलचस्पी है और यह सब उपयोगकर्ताओं और वस्तुओं के बीच कनेक्शन के ग्राफ के रूप में कैसे व्यक्त किया जा सकता है।

उत्तर

4

वास्तव में यह Neo4j जैसे ग्राफ डेटाबेस के मिठाई में से एक है।

तो अपने डाटा मॉडल इस तरह दिखता है:

start user = node:users(id="doctorkohaku") 
match user -[r:LIKE]->item<-[r2:LIKE]-other-[r3:LIKE]->rec_item 
where r.stars > 2 and r2.stars > 2 and r3.stars > 2 
return rec_item.name, count(*) as cnt, avg(r3.stars) as rating 
order by rating desc, cnt desc limit 10 

यह भी Neo4j उपयोग किया जा सकता:

user -[:LIKE|:BOUGHT]-> item 

आप आसानी से इस तरह की एक बीजलेख बयान के साथ एक उपयोगकर्ता के लिए सुझाव प्राप्त कर सकते हैं कोर-एपीआई या ट्रैवर्सल-एपीआई।

नियो 4j में Python API है जो साइफर प्रश्नों को चलाने में भी सक्षम है।

अस्वीकरण: मैं Neo4j

के लिए काम वहाँ भी Marko Rodriguez से कुछ दिलचस्प लेख सहयोगी को छानने के बारे में।

+0

शैलियों के लिए मैं शैलियों श्रेणी नोड्स की अनुशंसा करता हूं कि आइटम जुड़े हुए हैं और आप उन्हें मैच क्लॉज –

+1

में खाते में ले जा सकते हैं, वास्तव में बहुत आसान है, पोस्ट किया गया लिंक ग्राफ़ होने के विपरीत ग्राफ-डीबी में जानकारी संग्रहीत कर रहा है सिफारिश के लिए आधारित दृष्टिकोण। – Steve

+0

धन्यवाद! मैंने कुछ और पढ़ा है, Neo4j दस्तावेज में साइफर कुकबुक पर एक नज़र डाली है और यह वही करता है जो मुझे करने की ज़रूरत है। मैंने अपने अनुशंसा इंजन के लिए ग्राफ डेटाबेस दृष्टिकोण के साथ जाने का फैसला किया है। – vomitcuddle

4

उपयोगकर्ता के बीच समानता निर्धारित करने के लिए आप उपयोगकर्ता वेक्टर में कोसाइन या मोती समानता (मेटआउट में पाया गया और नेट पर हर जगह!) चला सकते हैं। तो अपने डेटा प्रतिनिधित्व की तरह

u1 [1,2,3,4,5,6] 
u2 [35,24,3,4,5,6] 
u1 [35,3,9,2,1,11] 

कुछ दिखना चाहिए बिंदु है जहां आप एक से अधिक आइटम को ध्यान में आप यह निर्धारित करने के लिए कैसे समान किसी के प्रोफाइल से ऊपर का उपयोग कर सकते लेने के लिए चाहते हैं। जितना अधिक सहसंबंध स्कोर उतना ही अधिक होता है जितना उनके पास समान सामान होते हैं। आप थ्रेसहोल्ड सेट कर सकते हैं ताकि .75 समानता वाले किसी व्यक्ति के पास उनके प्रोफ़ाइल में आइटमों का एक समान सेट हो।

जहां आप मूल्य खो रहे हैं, आप निश्चित रूप से अपना खुद का मूल्य बना सकते हैं। मैं उन्हें बाइनरी रखूंगा और विभिन्न अलग-अलग एल्गोरिदम को मिश्रित करने की कोशिश करूंगा। इसे एक पहनावा कहा जाता है।

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

समान उपयोगकर्ताओं को खोजने का प्रयास करते समय आप अपने उपयोगकर्ता वैक्टर में कुछ प्रकार की समानता मीट्रिक कर सकते हैं।

अजगर के बारे में, सामूहिक खुफिया में किताब बुलाया प्रोग्रामिंग देता है अजगर में अपने सभी नमूनों इसलिए 1.

एक प्रति लेने जाने के लिए और अध्याय पढ़ एक ग्राफ के रूप में यह सब का प्रतिनिधित्व करते हुए अपने अमर प्रतिनिधित्व के रूप में कुछ हद तक problamatic हो जाएगा एक Bipartile Graph है। वहां बहुत सारी सिफारिशें हैं जो ग्राफ आधारित दृष्टिकोण का उपयोग करती हैं लेकिन आमतौर पर यह सर्वोत्तम प्रदर्शन करने वाला दृष्टिकोण नहीं है।

1

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