def output_query(self, out_file, cntl, topk, query_time_ms): out_file.write("\n") out_file.write("QUERY\t" + self.name + "\t" + str(query_time_ms) + "\n") if len(self.sorted_docs) == 0: # no results? nothing can be output return """ for mquery in self.mqueries: out_file.write("E\t" + mquery.expression + "\n") if self.tquery: for keyword in self.tquery.keywords: out_file.write("P\t" + keyword + "\n") """ d = MathDocument(cntl) min_score = self.sorted_docs[len(self.sorted_docs) - 1].final_score if len(self.sorted_docs) < topk: print("Warning: Query produced less than " + str(topk) + " documents. Results will be repeated", flush=True) # force output topk results for idx in range(topk): doc = self.sorted_docs[idx % len(self.sorted_docs)] positions = self.get_math_pos_with_score(doc) try: exprids = list( map( lambda pos: (d.find_mathml_id(doc.doc_id, pos[0]), pos[1]), positions)) except (IOError): # cannot read ids exprids = positions #out_file.write("R\t" + str(doc.doc_name) + "\t" + str(doc.final_score) + "\t(at: " + str(exprids) + str(self.get_text_pos(doc))+ ")\n") row_elements = [str(idx + 1)] if idx < len(self.sorted_docs): # use original score doc_score = doc.final_score else: doc_score = min_score if isinstance(doc_score, list): row_elements.append(str(doc_score[0])) else: row_elements.append(str(doc_score)) row_elements.append(doc.doc_name) # add formulas *M* for exprid, mscore in exprids: row_elements += ["*M*", str(exprid), str(mscore[0])] # add Keywords *W* if self.tquery: for keyword in self.tquery.keywords: row_elements += ["*W*", keyword, str(doc.tscore[1])] out_file.write("\t".join(row_elements) + "\n")