def string_matching_type_relation_contains_word_entity_generation(
        current_uid: int,
        question_template: Dict[str, Any],
        generated_questions: List[Dict[str, Any]],
        old_entities_ids: List[str] = None,
        old_entities: List[str] = None) -> Dict[str, Any]:
    generated_template = deepcopy(question_template)
    if old_entities_ids is None:
        sparql_query = generated_template['sparql_wikidata']
        old_entities_ids = questions_generator.get_elements_from_query(
            sparql_query, [0, 1])
    questions_generator.entity_generation_common_part(current_uid,
                                                      generated_template,
                                                      generated_questions,
                                                      old_entities_ids,
                                                      old_entities)
    string_matching_type_relation_contains_word_nnqt_question_construction(
        generated_template)
    return generated_template
Esempio n. 2
0
def unknown_2_relation_3_generation(current_uid: int, question_template: Dict[str, Any], generated_questions: List[Dict[str, Any]]) -> Dict[str, Any]:
    generated_template = deepcopy(question_template)
    sparql_query = generated_template['sparql_wikidata']
    old_entities_ids = questions_generator.get_elements_from_query(sparql_query, [0, 1])
    # The first entity is used for the last two properties
    old_entities_ids.reverse()
    old_entities_ids.append(old_entities_ids[0])
    old_properties_ids = questions_generator.get_specific_elements_from_query(sparql_query, [0], "p", "P")
    old_properties_ids += questions_generator.get_specific_elements_from_query(sparql_query, [0, 1], "pq", "P")
    # Answers are inverted
    old_answers = iter(questions_generator.get_sparql_query_results(sparql_query)['results']['bindings'][0].values())
    old_answer_2 = next(old_answers)['value'].split("/")[-1]
    old_answer_1 = next(old_answers)['value'].split("/")[-1]
    # Find answers filter and type
    old_answer_1_filter, element_type_1 = questions_generator.get_filter_from_element(old_answer_1, "obj", "s")
    old_answer_2_filter, element_type_2 = questions_generator.get_filter_from_element(old_answer_2, "obj", "s")
    # These two queries are identical except for the associated property and the answer filter
    if element_type_1 == questions_generator.ElementType.entity:
        second_query = "select distinct ?ans where {?sbj ?rel ?s . ?s ?ans wd:" + old_answer_1 + " . ?sbj wdt:|rel_entity_type| wd:|entity_type| . FILTER (" + \
            old_answer_1_filter + " && ?ans not in (pq:|old_property_id|))} LIMIT 20"
    else:
        # If the answer is not an entity, in this case the queries results link the known entity to a value of the same type of the original one: the type is
        # defined through the corresponding filter
        second_query = "SELECT distinct ?ans WHERE {?sbj ?rel ?s . ?s ?ans ?obj . ?sbj wdt:|rel_entity_type| wd:|entity_type| . FILTER (" + old_answer_1_filter + \
            " && ?ans not in (pq:|old_property_id|))} LIMIT 10"
    if element_type_2 == questions_generator.ElementType.entity:
        third_query = "select distinct ?ans where {?sbj ?rel ?s . ?s ?ans wd:" + old_answer_2 + " . ?sbj wdt:|rel_entity_type| wd:|entity_type| . FILTER (" + \
            old_answer_2_filter + " && ?ans not in (pq:|old_property_id|))} LIMIT 20"
    else:
        # If the answer is not an entity, in this case the queries results link the known entity to a value of the same type of the original one: the type is
        # defined through the corresponding filter
        third_query = "SELECT distinct ?ans WHERE {?sbj ?rel ?s . ?s ?ans ?obj . ?sbj wdt:|rel_entity_type| wd:|entity_type| . FILTER (" + old_answer_2_filter + \
            " && ?ans not in (pq:|old_property_id|))} LIMIT 10"
    # The second query accepts only properties that are "qualifiers", so that are represented with the "pq" prefix
    found, old_properties = questions_generator.relation_3_generation_common_part(current_uid, generated_template, generated_questions, old_entities_ids, old_properties_ids, \
        ["select distinct ?ans where {wd:" + old_entities_ids[1] + " ?ans ?s . ?s ?rel2 ?obj . ?obj wdt:|rel_entity_type| wd:|entity_type| . FILTER " + \
            "(REGEX(STR(?s), \"Q(\\\\d+)-\") && ?ans not in (p:|old_property_id|))} LIMIT 20", second_query, third_query], ["", "pq", "pq"])
    if not found:
        # There aren't valid candidates, so try with "relation_2" function
        return unknown_2_relation_2_generation(current_uid, generated_template, generated_questions, old_properties_ids, old_properties)
    else:
        unknown_2_nnqt_question_construction(generated_template)
        return generated_template
def rank_entity_2_generation(current_uid: int,
                             question_template: Dict[str, Any],
                             generated_questions: List[Dict[str, Any]],
                             old_entities_ids: List[str] = None,
                             old_entities: List[str] = None) -> Dict[str, Any]:
    generated_template = deepcopy(question_template)
    if old_entities_ids is None:
        sparql_query = generated_template['sparql_wikidata']
        old_entities_ids = questions_generator.get_elements_from_query(
            sparql_query, [0])
    found, old_entities = questions_generator.entity_2_generation_common_part(
        current_uid, generated_template, generated_questions, old_entities_ids,
        old_entities)
    if not found:
        # There aren't valid candidates, so try with a random entity
        return rank_entity_generation(current_uid, question_template,
                                      generated_questions, old_entities_ids,
                                      old_entities)
    else:
        rank_nnqt_question_construction(generated_template)
        return generated_template
def rank_entity_3_generation(
        current_uid: int, question_template: Dict[str, Any],
        generated_questions: List[Dict[str, Any]]) -> Dict[str, Any]:
    generated_template = deepcopy(question_template)
    sparql_query = generated_template['sparql_wikidata']
    old_entities_ids = questions_generator.get_elements_from_query(
        sparql_query, [0])
    old_answer_id = next(
        iter(
            questions_generator.get_sparql_query_results(sparql_query)
            ['results']['bindings'][0].values()))['value'].split("/")[-1]
    found, old_entities = questions_generator.entity_3_generation_common_part(current_uid, generated_template, generated_questions, old_entities_ids, [
        "select ?ans ?ansLabel where {wd:" + old_answer_id + " ?rel ?ans . ?ans wdt:|rel_entity_type| wd:|entity_type| . ?ans rdfs:label ?ansLabel . " + \
            "FILTER (LANG(?ansLabel) = \"en\" && ?ans not in (wd:|old_entity_id|))} LIMIT 20"])
    if not found:
        # There aren't valid candidates, so try with a random entity of the same type or class
        return rank_entity_2_generation(current_uid, question_template,
                                        generated_questions, old_entities_ids,
                                        old_entities)
    else:
        rank_nnqt_question_construction(generated_template)
        return generated_template
def right_subgraph_2_entity_3_generation(current_uid: int, question_template: Dict[str, Any], generated_questions: List[Dict[str, Any]]) -> Dict[str, Any]:
    generated_template = deepcopy(question_template)
    sparql_query = generated_template['sparql_wikidata']
    old_entities_ids = questions_generator.get_elements_from_query(sparql_query, [0])
    answer_var_name = re.findall(r'SELECT (\?\w*) WHERE', sparql_query, re.IGNORECASE)[0]
    entity_var_name = re.findall(r'. (\?\w*) wdt:', sparql_query)[0]
    modified_sparql_query = sparql_query.replace(answer_var_name, entity_var_name, 1)
    modified_answer_entity = questions_generator.get_sparql_query_results(modified_sparql_query)['results']['bindings'][0][entity_var_name[1:]]['value'].split("/")[-1]
    modified_answer_filter, _ = questions_generator.get_filter_from_element(modified_answer_entity, "obj", "", False)
    if modified_answer_filter:
        query = "select ?ans ?ansLabel where {?ans ?rel ?obj . ?ans wdt:|rel_entity_type| wd:|entity_type| . ?ans rdfs:label ?ansLabel . " + \
            "FILTER (" + modified_answer_filter + "LANG(?ansLabel) = \"en\" && ?ans not in (wd:|old_entity_id|))} LIMIT 20"
    else:
        query = "select ?ans ?ansLabel where {?ans ?rel wd:" + modified_answer_entity + " . ?ans wdt:|rel_entity_type| wd:|entity_type| . ?ans rdfs:label ?ansLabel . " + \
            "FILTER (LANG(?ansLabel) = \"en\" && ?ans not in (wd:|old_entity_id|))} LIMIT 20"
    found, old_entities = questions_generator.entity_3_generation_common_part(current_uid, generated_template, generated_questions, old_entities_ids, [query])
    if not found:
        # There aren't valid candidates, so try with a random entity of the same type or class
        return right_subgraph_2_entity_2_generation(current_uid, question_template, generated_questions, old_entities_ids, old_entities)
    else:
        right_subgraph_2_nnqt_question_construction(generated_template)
        return generated_template
Esempio n. 6
0
def two_intentions_right_subgraph_relation_2_generation(
        current_uid: int,
        question_template: Dict[str, Any],
        generated_questions: List[Dict[str, Any]],
        old_properties_ids: List[str] = None,
        old_properties: List[str] = None) -> Dict[str, Any]:
    generated_template = deepcopy(question_template)
    if old_properties_ids is None:
        sparql_query = generated_template['sparql_wikidata']
        old_properties_ids = questions_generator.get_elements_from_query(
            sparql_query, [0, 1], True)
    found, old_properties = questions_generator.relation_2_generation_common_part(
        current_uid, generated_template, generated_questions,
        old_properties_ids, old_properties)
    if not found:
        # There aren't valid candidates, so try with a random property
        return two_intentions_right_subgraph_relation_generation(
            current_uid, question_template, generated_questions,
            old_properties_ids, old_properties)
    else:
        two_intentions_right_subgraph_nnqt_question_construction(
            generated_template)
        return generated_template