//Relevance scores HashMap 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 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 idcg_arr = new ArrayList<>(); Collection temp = docs_and_scores.values(); ArrayList 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; }