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
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
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