2011-02-28 17 views
5

पर आधारित मिलान के लिए एल्गोरिदम मान लीजिए कि हमारे पास ऐसे खरीदारों और विक्रेता हैं जो बाजार में एक दूसरे को खोजने की कोशिश कर रहे हैं। खरीदार अपनी जरूरतों को कीवर्ड के साथ टैग कर सकते हैं; विक्रेता जो भी बेच रहे हैं उसके लिए वही कर सकते हैं। मुझे एल्गोरिदम खोजने में दिलचस्पी है कि रैंक ऑर्डर विक्रेताओं को उनके दो कीवर्ड सेट के आधार पर एक विशेष खरीदार के लिए उनकी प्रासंगिकता के संदर्भ में।कीवर्ड छेड़छाड़

buyer_keywords = {"furry", "four legs", "likes catnip", "has claws"} 

और फिर हम दो संभावित विक्रेताओं है कि हम उनकी प्रासंगिकता के संदर्भ में आदेश रैंक करने के लिए की जरूरत है:

seller_keywords[1] = {"furry", "four legs", "arctic circle", "white"} 
seller_keywords[2] = {"likes catnip", "furry", 
         "hates mice", "yarn-lover", "whiskers"} 

हम सिर्फ खोजशब्दों के चौराहे का उपयोग करते हैं

यहाँ एक उदाहरण है , हमें बहुत भेदभाव नहीं मिलता है: दोनों 2 कीवर्ड पर छेड़छाड़ करते हैं। यदि हम सेट यूनियन के आकार से छेड़छाड़ की गणना को विभाजित करते हैं, तो विक्रेता 2 अधिकतर कीवर्ड की वजह से वास्तव में खराब होता है। ऐसा लगता है कि कीवर्ड सेट आकार को सही नहीं करने के लिए किसी भी विधि के लिए स्वचालित जुर्माना पेश करना प्रतीत होता है (और हम निश्चित रूप से कीवर्ड जोड़ने को दंडित नहीं करना चाहते हैं)।

समस्या पर थोड़ा और संरचना में कहें, लगता है हम हम कर सकते थे अब कीवर्ड गुण (प्रत्येक विक्रेता के लिए 1 के लिए योग करने के लिए है जो), उदाहरण के लिए ,:

seller_keywords[1] = {"furry":.05, 
         "four legs":.05, 
         "arctic circle":.8, 
         "white":.1} 

seller_keywords[2] = {"likes catnip":.5, 
         "furry":.4, 
         "hates mice":.02, 
         "yarn-lover":.02, 
         "whiskers":.06} 

की तीव्रता के कुछ सच्चा उपाय है हिट के मूल्य को जोड़ो: तो अब विक्रेता 1 को केवल 1 का स्कोर मिलता है, जबकि विक्रेता 2 का स्कोर 9। अब तक, तो अच्छा है, लेकिन अब हम एक तिहाई विक्रेता एक बहुत ही सीमित, गैर-वर्णनात्मक कीवर्ड सेट के साथ मिल सकता है:

seller_keywords[3] = {"furry":1} 

यह उनका एकमात्र कीवर्ड पर कोई हिट है, जो नहीं है के लिए शीर्ष करने के लिए उन्हें catapults अच्छा।

वैसे भी, मेरा अनुमान (और आशा) यह है कि यह एक सामान्य समस्या है और ज्ञात शक्तियों और सीमाओं के साथ विभिन्न एल्गोरिदमिक समाधान मौजूद हैं। यह शायद सीएस 101 में शामिल कुछ है, इसलिए मुझे लगता है कि इस प्रश्न का एक अच्छा जवाब प्रासंगिक संदर्भों का एक लिंक हो सकता है।

+0

मुझे लगता है कि हमें मिलान किए गए कीवर्ड की संख्या के साथ प्रभावी स्कोर गुणा करना चाहिए। उदाहरण के लिए आपके उदाहरण के दूसरे मामले में हमारे पास केवल 1 मैच है और इसमें 1 का स्कोर प्रभावी स्कोर 1 * 1 = 1. है लेकिन मैं वही मामला जहां दो मैचों पाए जाते हैं, हमारे पास प्रभावी स्कोर 2 * 1 = 2 होगा। इस प्रकार यह चुना जाता है। आप इस दृष्टिकोण के बारे में क्या कहते हैं। – Algorithmist

उत्तर

7

मुझे लगता है कि आप cosine similarity उपयोग करने के लिए देख रहे हैं; यह एक मूल तकनीक है जो आपको पहले हैक के रूप में बहुत दूर ले जाती है।

terms[0] --> aardvark 
terms[1] --> anteater 
... 
terms[N] --> zuckerberg 

तो फिर तुम प्रत्येक व्यक्ति के लिए इस क्षेत्र में वैक्टर बनाने: intuitively, आप एक वेक्टर जहां हर टैग के बारे में आप जानते हैं कि एक विशेष सूचकांक है बनाने

person1[0] = 0  # this person doesn't care about aardvarks 
person1[1] = 0.05 # this person cares a bit about anteaters 
... 
person1[N] = 0 

प्रत्येक व्यक्ति अब इस में एक वेक्टर है एन-आयामी अंतरिक्ष। फिर आप उनमें से जोड़े के बीच समानता की गणना करने के लिए कोसाइन समानता का उपयोग कर सकते हैं। गणनात्मक रूप से, यह मूल रूप से दो वैक्टरों के बीच कोण के लिए पूछने जैसा ही है। आप एक कोसाइन 1 के करीब चाहते हैं, जिसका मतलब है कि वेक्टर मोटे तौर पर कॉललाइनर हैं - कि उनके पास अधिकांश आयामों के समान मूल्य हैं।

इस मीट्रिक को बेहतर बनाने के लिए, आप tf-idf अपने वेक्टर के तत्वों पर वज़न का उपयोग करना चाह सकते हैं। टीएफ-आईडीएफ लोकप्रिय शर्तों (जैसे, 'आईफोन') के महत्व को कम करेगा और गैर-लोकप्रिय शर्तों के महत्व को बढ़ावा देगा जो इस व्यक्ति को विशेष रूप से जुड़े हुए हैं।

टीएफ-आईडीएफ भारोत्तोलन और कोसाइन समानता संयोजन इस तरह के अधिकांश अनुप्रयोगों के लिए अच्छा है।

+2

कोसाइन समानता '{" furry ": 1}' के साथ अंतिम समस्या को हल नहीं करती है, लेकिन शायद ऐसा करने के बजाय (यानी दो सामान्यीकृत वैक्टरों के डॉट उत्पाद को लेना), आप वास्तविक डॉट उत्पाद का उपयोग कर सकते हैं। खरीदार को सामान्य करने में विफलता कोई फर्क नहीं पड़ता, क्योंकि यह सभी परिणामों के लिए समान पैमाने पर कारक लागू करता है और वे अभी भी वही रैंक करते हैं। विक्रेता को सामान्य करने में विफल होने का मतलब है कि आप वजन विक्रेताओं को कुछ अन्य मानदंडों के अनुसार कर सकते हैं, न कि उनकी कीवर्ड सूची पर ध्यान केंद्रित किया गया है। एक साधारण उदाहरण के लिए आप किसी एक कीवर्ड की ताकत को कैप कर सकते हैं, इसलिए विक्रेता जो केवल एक कीवर्ड सूचीबद्ध करते हैं, परिमाण <1 है। –

0

जो आप खोज रहे हैं उसे वर्गीकरण कहा जाता है। सामग्री को टैग करना और प्रासंगिकता के क्रम में उन्हें ऑर्डर करना।

आपको कुछ तैयार-जाने-जाने-एल्गोरिदम नहीं मिल सकता है लेकिन आप एक व्यावहारिक मामले से शुरू कर सकते हैं: Drupal documentation for taxonomy कुछ दिशानिर्देश प्रदान करता है, और search module के स्रोतों की जांच करता है।

असल में, रैंक शब्द की आवृत्ति पर आधारित है। यदि किसी उत्पाद को टैग की एक छोटी संख्या के साथ परिभाषित किया गया है, तो उनके पास अधिक वजन होगा। एक टैग जो केवल कुछ उत्पादों के पृष्ठ पर दिखाई देता है, इसका मतलब है कि यह बहुत विशिष्ट है। आपको अपने शब्दों की तीव्रता को स्थैतिक तरीके से परिभाषित नहीं करना चाहिए; लेकिन उनके संदर्भ में उन्हें जांचता है।

सादर

+0

यह समस्या को हल करने के लिए एल्गोरिदम या गणितीय ढांचे की बजाय समस्या को हल करने के लिए एक विशिष्ट पुस्तकालय की तरह लगता है। – templatetypedef

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