Beispiel #1
0
    def translate_and_execute_query(self, query, n_top=200):
        """
        Generates candidate answers for the given query.
        :param query: Query to generate answer candidates for.
        :param n_top: The number of top candidates to keep. The top is determined using the provided scorer object.
        :return: A list of TranslationResult objects.
        """

        TranslationResult = collections.namedtuple('TranslationResult',
                                                   ['query_candidate',
                                                    'query_results_str'],
                                                   verbose=False)
        start_time = time.time()
        # Parse query.
        results = []
        queries_candidates = self.generate_candidates(query)
        logger.info("Ranking %s query candidates" % len(queries_candidates))
        ranker = self.get_scorer()
        ranked_candidates = ranker.rank_query_candidates(queries_candidates)
        logger.info("Fetching results for all candidates.")
        n_total_results = 0
        if len(ranked_candidates) > n_top:
            logger.info("Truncating returned candidates to %s." % n_top)
        for query_candidate in ranked_candidates[:n_top]:
            query_results_str = query_candidate.get_results_text()
            n_total_results += len(query_results_str)
            result = TranslationResult(query_candidate, query_results_str)
            results.append(result)
        logger.info("Fetched a total of %s results in %.2f ms." % (n_total_results, (time.time() - start_time)))
        logger.info("Done translating and executing: %s." % query)
        return results
Beispiel #2
0
def rank_candidates(query, ranker):
    """Rerank candidates of single query.

    :rtype query: EvaluationQuery
    :param query:
    :param scorer:
    :return:
    """
    query.eval_candidates = ranker.rank_query_candidates(
        query.eval_candidates, key=lambda x: x.query_candidate)
    return query
Beispiel #3
0
def rank_candidates(query, ranker):
    """Rerank candidates of single query.

    :rtype query: EvaluationQuery
    :param query:
    :param scorer:
    :return:
    """
    query.eval_candidates = ranker.rank_query_candidates(query.eval_candidates,
                                                         key=lambda
                                                           x: x.query_candidate)
    return query
Beispiel #4
0
 def translate_and_execute_query_sq1(self, query, n_top=200):
     """
     Translates the query and returns a list
     of namedtuples of type TranslationResult.
     Answering subquestion 1                          
     :param query:
     :return:
     """
     TranslationResult = collections.namedtuple(
         'TranslationResult', ['query_candidate', 'query_result_rows'],
         verbose=False)
     # Parse query.
     results = []
     num_sparql_queries = self.sparql_backend.num_queries_executed
     sparql_query_time = self.sparql_backend.total_query_time
     queries_candidates = self.translate_query(query)
     translation_time = (self.sparql_backend.total_query_time -
                         sparql_query_time) * 1000
     num_sparql_queries = self.sparql_backend.num_queries_executed - num_sparql_queries
     avg_query_time = translation_time / (num_sparql_queries + 0.001)
     logger.info("Translation executed %s queries in %.2f ms."
                 " Average: %.2f ms." %
                 (num_sparql_queries, translation_time, avg_query_time))
     logger.info("Ranking %s query candidates" % len(queries_candidates))
     ranker = self.scorer
     ranked_candidates = ranker.rank_query_candidates(queries_candidates)
     logger.info("Fetching results for all candidates.")
     sparql_query_time = self.sparql_backend.total_query_time
     n_total_results = 0
     if len(ranked_candidates) > n_top:
         logger.info("Truncating returned candidates to %s." % n_top)
     for query_candidate in ranked_candidates[:n_top]:
         query_result = query_candidate.get_result_sq1(include_name=True)
         logger.info("query_candidate: %s." % query_candidate)
         logger.info("query_result: %s." % query_result)
         n_total_results += sum([len(rows) for rows in query_result])
         result = TranslationResult(query_candidate, query_result)
         results.append(result)
     # This assumes that each query candidate uses the same SPARQL backend
     # instance which should be the case at the moment.
     result_fetch_time = (self.sparql_backend.total_query_time -
                          sparql_query_time) * 1000
     avg_result_fetch_time = result_fetch_time / (len(results) + 0.001)
     logger.info("Fetched a total of %s results in %s queries in %.2f ms."
                 " Avg per query: %.2f ms." %
                 (n_total_results, len(results), result_fetch_time,
                  avg_result_fetch_time))
     logger.info("Done translating and executing: %s." % query)
     return results
Beispiel #5
0
 def translate_and_execute_query(self, query, n_top = 200):
     """
     Translates the query and returns a list
     of namedtuples of type TranslationResult.
     :param query:
     :return:
     """
     TranslationResult = collections.namedtuple('TranslationResult',
                                                ['query_candidate',
                                                 'query_result_rows'],
                                                verbose = False)
     # Parse query.
     results = []
     num_sparql_queries = self.sparql_backend.num_queries_executed
     sparql_query_time = self.sparql_backend.total_query_time
     queries_candidates = self.translate_query(query)
     translation_time = (self.sparql_backend.total_query_time - sparql_query_time) * 1000
     num_sparql_queries = self.sparql_backend.num_queries_executed - num_sparql_queries
     avg_query_time = translation_time / (num_sparql_queries + 0.001)
     logger.info("Translation executed %s queries in %.2f ms."
                 " Average: %.2f ms." % (num_sparql_queries,
                                         translation_time, avg_query_time))
     logger.info("Ranking %s query candidates" % len(queries_candidates))
     ranker = self.scorer
     ranked_candidates = ranker.rank_query_candidates(queries_candidates)
     logger.info("Fetching results for all candidates.")
     sparql_query_time = self.sparql_backend.total_query_time
     n_total_results = 0
     if len(ranked_candidates) > n_top:
         logger.info("Truncating returned candidates to %s." % n_top)
     for query_candidate in ranked_candidates[:n_top]:
         query_result = query_candidate.get_result(include_name = True)
         n_total_results += sum([len(rows) for rows in query_result])
         result = TranslationResult(query_candidate, query_result)
         results.append(result)
     # This assumes that each query candidate uses the same SPARQL backend
     # instance which should be the case at the moment.
     result_fetch_time = (self.sparql_backend.total_query_time - sparql_query_time) * 1000
     avg_result_fetch_time = result_fetch_time / (len(results) + 0.001)
     logger.info("Fetched a total of %s results in %s queries in %.2f ms."
                 " Avg per query: %.2f ms." % (n_total_results, len(results),
                                               result_fetch_time, avg_result_fetch_time))
     logger.info("Done translating and executing: %s." % query)
     return results