2010-10-21 28 views
14

मैं काम करने की कोशिश कर रहा हूं कि सोलर खोज परिणामों के स्कोरिंग में सुधार कैसे किया जाए। मेरे आवेदन को सोलर परिणामों से स्कोर लेने की आवश्यकता है और परिणाम के परिणामस्वरूप कितने अच्छे हैं इस पर निर्भर करते हुए कई "सितारों" प्रदर्शित करते हैं। 5 सितारे = लगभग 0 सटीक/सटीक 0 सितारों का अर्थ है कि खोज से मेल नहीं खा रहा है, उदा। केवल एक तत्व हिट करता है। हालांकि मुझे 1.4 से 0.8660254 के स्कोर मिल रहे हैं, दोनों परिणाम लौट रहे हैं जो मैं 5 सितारे दूंगा। मुझे ऐसा करने की ज़रूरत है कि किसी भी तरह से इन परिणामों को प्रतिशत में बदल दें ताकि मैं इन परिणामों को सितारों की सही संख्या के साथ चिह्नित कर सकूं।मैं एक सोलर/ल्यूसीन स्कोर को सामान्य कैसे बना सकता हूं?

क्वेरी है कि मैं चला है कि मुझे 1.4 स्कोर देता है:

euallowed: सच और (ग्रेड: "2: 1")

क्वेरी कि मुझे ०.८६६०२५४ स्कोर देता है:

euallowed: सच और (ग्रेड: "2: 1" या ग्रेड: "1")

मैं पहले से ही समानता को नवीनीकृत किया है ताकि tf और आईडीएफ वापसी 1.0 मैं केवल interes हूँ के रूप में यदि किसी दस्तावेज़ में कोई शब्द है, तो दस्तावेज़ में उस शब्द की संख्या नहीं है। कैसे कई "

  1. कैसे इतना है कि मैं काम कर सकते हैं स्कोर को सामान्य का सबसे अच्छा तरीका है:

    import org.apache.lucene.search.Similarity; 
    
    public class StudentSearchSimilarity extends Similarity { 
    
        @Override 
        public float lengthNorm(String fieldName, int numTerms) { 
         return (float) (1.0/Math.sqrt(numTerms)); 
        } 
    
        @Override 
        public float queryNorm(float sumOfSquaredWeights) { 
    
         return (float) (1.0/Math.sqrt(sumOfSquaredWeights)); 
    
        } 
    
        @Override 
        public float sloppyFreq(int distance) { 
         return 1.0f/(distance + 1); 
        } 
    
        @Override 
        public float tf(float freq) { 
         return (float) 1.0; 
        } 
    
        @Override 
        public float idf(int docFreq, int numDocs) { 
    
         //return (float) (Math.log(numDocs/(double) (docFreq + 1)) + 1.0); 
         return (float)1.0; 
    
        } 
    
        @Override 
        public float coord(int overlap, int maxOverlap) { 
         return overlap/(float) maxOverlap; 
        } 
    } 
    

    तो मुझे लगता है कि मेरे सवालों हैं: यह मेरा समानता कोड कैसा दिखाई देता है है सितारों "देने के लिए?

  2. क्या परिणाम स्कोर करने का कोई और तरीका है?

धन्यवाद

अनुदान

उत्तर

15

http://wiki.apache.org/lucene-java/ScoresAsPercentages के शब्दों में:

लोग अक्सर Lucene स्कोर से एक "प्रतिशत" गणना करने के लिए निर्धारित करने के लिए एक "100% सही" मैच बनाम एक "50%" मुकाबला नहीं है क्या चाहते हैं। यह "सामान्यीकृत स्कोर"

नामक कुछ भी नहीं है।

गंभीरता से। अपनी समस्या के बारे में सोचने की कोशिश करना बंद करो, यह अच्छी तरह समाप्त नहीं होगा।

वह पृष्ठ इस बात का एक उदाहरण देता है कि आप सिद्धांत में ऐसा कैसे कर सकते हैं, लेकिन यह बहुत कठिन है।

+1

Humm ... इस के लिए धन्यवाद। यह एक बहुत अच्छा तर्क बनाता है, लेकिन यह सुनिश्चित नहीं है कि जब मैं टीएफ और आईडीएफ ओवरराइड करता हूं तो क्या होता है। मुझे लगता है कि मुझे इसे एक अलग तरीके से देखना पड़ सकता है। भले ही इसका मतलब सितारों द्वारा "स्कोरिंग" न हो। –

0

मैं कुछ भी Solr में इस जटिल करने के लिए मिला है कभी नहीं, तो यह एक प्लगइन के रूप में में हुक करने के लिए एक रास्ता हो सकता है - लेकिन आप में इसे संभाल सकता है क्लाइंट जब परिणाम सेट लौटाया जाता है। यदि आपने प्रासंगिकता से क्रमबद्ध किया है तो यह staightforward होना चाहिए - पहले परिणाम (अधिकतम), और अंतिम (मिनट) की रिलीज प्राप्त करें। फिर साथ प्रासंगिकता एक्स प्रत्येक परिणाम के लिए, आप

normalisedValue = (x - min)/(max - min) 

जो आप सितारों की संख्या प्राप्त करने के लिए 5 और दौर के बीच 0 और 1. गुणा एक मूल्य दे देंगे गणना कर सकते हैं।

0

इसे सामान्यीकृत स्कोर कहा जाता है (Scores As Percentages)।

आपको लगता है कि प्राप्त करने के लिए निम्नलिखित निम्न पैरामीटर का उपयोग कर सकते हैं:

ns = {!func}product(scale(product(query({!type=edismax v=$q}),1),0,1),100) 
fq = {!frange l=20}$ns 

कहाँ 20 अपने 20% सीमा है।

यह भी देखें:

Remove results below a certain score threshold in Solr/Lucene?

http://article.gmane.org/gmane.comp.jakarta.lucene.user/12076 http://article.gmane.org/gmane.comp.jakarta.lucene.user/10810