Ejemplo n.º 1
0
    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")