dawrehxyz icon

NDCG

dawrehxyz | PRO | 04/30/20 10:23:54 PM UTC | 0 ⭐ | 799 👁️ | Never ⏰ | []
Java |

4.49 KB

|

None

|

0 👍

/

0 👎

    //Relevance scores
    HashMap<String, Double> doc_relevance_scores = new HashMap<>();
    Integer even_odd = 0;
    
    /** Constructor */
    public Searcher(Index index, KGramIndex kgIndex)
    {
        this.index = index;
        this.kgIndex = kgIndex;
        hits_ranker = new HITSRanker(file_path_linksDavis, file_path_davisTitles, index);
    }
 
    private double log2(double x)
    {
        return (Math.log(x) / Math.log(2));
    }
 
    public void Caluclate_NDCG(PostingsList query_postings_list)
    {
        //DCG
        double dcg = 0.0;
        ArrayList<Double> dcg_arr = new ArrayList<>();
        System.err.println("");
        for(int a = 1; a <= 50; a++)
        {
            int query_doc_id = query_postings_list.get(a - 1).docID;
            String query_doc_name = getFileName(Index.docNames.get(query_doc_id));
            //if(query_doc_name.equals("Mathematics.f") && even_odd % 2 == 0) continue;
            if(doc_relevance_scores.containsKey(query_doc_name))
            {
                double rel_score = doc_relevance_scores.get(query_doc_name);
                double dcgp = rel_score / log2(a + 1);
                dcg_arr.add(dcgp);
                dcg += dcgp;
            }
            else
            {
                System.err.println("Key not found: " + query_doc_name);
            }
        }
        System.err.println("");
        System.err.println("\n" + "dcg: " + Double.toString(dcg));
 
        //IDCG
        double idcg = 0.0;
        ArrayList<Double> idcg_arr = new ArrayList<>();
        Collection<Double> temp = docs_and_scores.values();
        ArrayList<Double> sorted_relevance_scores = new ArrayList<>(temp);
        Collections.sort(sorted_relevance_scores, Collections.reverseOrder());
        for(int a = 1; a <= 50; a++)
        {
            double rel_score = sorted_relevance_scores.get(a);
            double idcgp = rel_score / log2(a + 1);
            idcg_arr.add(idcgp);
            idcg += idcgp;
        }
        System.err.println("idcg: " + Double.toString(idcg));
 
        //NDCG
        double ndcg = 0.0;
        for(int a = 0; a < 50; a++)
        {
            ndcg += dcg_arr.get(a) / idcg_arr.get(a);
        }
        System.err.println("ndcg: " + Double.toString(ndcg));
        System.err.println("even_odd: " + Integer.toString(even_odd) + "\n");
        //even_odd = (even_odd + 1) % 2;
    }
 
    public void Load_Relevance_Scores()
    {
        try {
            File file = new File("./ir/average_relevance.txt");
            FileReader fileReader = new FileReader(file);
            BufferedReader bufferedReader = new BufferedReader(fileReader);
            String readLine = "-1";
            while((readLine = bufferedReader.readLine()) != null)
            {
                String[] doc_score = readLine.split(" ");
                String doc_name = doc_score[0];
                double relevance_score = Integer.parseInt(doc_score[1]);
                doc_relevance_scores.put(doc_name, relevance_score);
            }
            bufferedReader.close();
            fileReader.close();
        } catch(Exception e){
            e.printStackTrace();
        }
    }
 
    /**
     *  Searches the index for postings matching the query.
     *  @return A postings list representing the result of the query.
     */
    public PostingsList search(Query query, QueryType queryType, RankingType rankingType, NormalizationType normType)
    {
        if (query.queryterm == null) return null;
        else if(query.queryterm.size() == 0) return null;
        else if(queryType == QueryType.INTERSECTION_QUERY) return IntersectionAlgorithm(query);
        else if(queryType == QueryType.PHRASE_QUERY) return PhraseAlgorithm(query);
        else if(queryType == QueryType.RANKED_QUERY)
        {
            if(rankingType == RankingType.TF_IDF)
            {
                PostingsList postings_list = TF_IDF_Algorithm(query, false, normType);
                boolean ndcg = true;
                if(ndcg == true) Caluclate_NDCG(postings_list);
                return postings_list;
            }
            else if(rankingType == RankingType.PAGERANK) return PAGERANK_Algorithm(query, false);
            else if(rankingType == RankingType.COMBINATION) return COMBINATION_Algorithm(query, normType);
            else if(rankingType == RankingType.HITSRANKER) return HITSRanker_Algorithm(query);
            else return null;
        }
        else return null;
    }

Comments