diff --git a/tenet/scheme/amr_rule/transduction/atom_phenomena_extractor.py b/tenet/scheme/amr_rule/transduction/atom_phenomena_extractor.py index 7a744ebcc7c14c0093adc62dcd2306831c6f4235..dce87eb68a540f7f38f09619c7fcb430d4e87b44 100644 --- a/tenet/scheme/amr_rule/transduction/atom_phenomena_extractor.py +++ b/tenet/scheme/amr_rule/transduction/atom_phenomena_extractor.py @@ -24,14 +24,10 @@ def __search_pattern(graph): select_data_list = ['?baseLeaf', '?phenomenaLabel', '?relationConceptPhenomena', '?relationConceptLabel'] clause_list = [f'?baseLeaf a amr:AMR_Leaf.', f'?baseLeaf amr:hasConcept ?concept.', - f'?baseLeaf amr:hasVariable ?variable.', - f'?variable amr:label ?varLabel.', f'?concept rdfs:subClassOf amr:AMR_Relation_Concept.', f'?concept amr:hasPhenomenaLink ?relationConceptPhenomena.', f'?concept amr:label ?relationConceptLabel.', - f'?relationConceptPhenomena amr:label ?phenomenaLabel.', - f'?baseLeaf ?relation ?argLeaf.', - f'?relation amr:hasAmrRole ?someArgRole.'] + f'?relationConceptPhenomena amr:label ?phenomenaLabel.'] query_code = generate_select_query(graph, select_data_list, clause_list) result_set = graph.query(query_code) return query_code, result_set @@ -90,20 +86,6 @@ def __get_structure(graph): for row in structure_set: structure = row.sentenceId return structure - - -def __define_naming(value_label): - value_label = value_label.replace(' ', '#') - value_label = value_label.replace('-', '#') - word_set = value_label.split('#') - first = True - for word in word_set: - if first: - naming = word - first = False - else: - naming += word.capitalize() - return naming def __propagate_relation(graph, target_net, base_leaf): @@ -120,30 +102,30 @@ def __propagate_relation(graph, target_net, base_leaf): # Construct Method(s) #============================================================================== -def __construct_individual_net( - graph, base_leaf, concept_name, value_label, mother_class_net): +def __construct_phenomena_net( + graph, base_leaf, phenomena_label, relation_concept_phenomena, relation_concept_label): # -- Net Composition - individual_net = net.IndividualNet(graph) + phenomena_net = net.PhenomenaNet(graph) # -- Data Computation - individual_net.base_node = base_leaf - individual_net.node = base_leaf - individual_net.individual_label = value_label - individual_net.mother_class_net = mother_class_net - individual_net.structure = __get_structure(graph) + phenomena_net.base_node = base_leaf + phenomena_net.node = base_leaf + phenomena_net.phenomena_type = relation_concept_phenomena + phenomena_net.phenomena_ref = relation_concept_label + phenomena_net.structure = __get_structure(graph) # -- Net Naming - individual_net.naming = __define_naming(value_label) + phenomena_net.naming = phenomena_label # -- Relation Propagation - __propagate_relation(graph, individual_net, base_leaf) + __propagate_relation(graph, phenomena_net, base_leaf) # -- Finalization - individual_net.finalize() - triple_definition = individual_net.generate_triple_definition() + phenomena_net.finalize() + triple_definition = phenomena_net.generate_triple_definition() - return individual_net, triple_definition + return phenomena_net, triple_definition @@ -164,8 +146,12 @@ def extract_atom_phenomena(graph): for pattern in pattern_set: # -- New Net Construction (from 3 nets) - new_class, triple_list = __construct_individual_net( - graph, pattern.baseLeaf, pattern.conceptName, pattern.valueLabel, pattern.classNet) + new_class, triple_list = __construct_phenomena_net( + graph, + pattern.baseLeaf, + pattern.phenomenaLabel, + pattern.relationConceptPhenomena, + pattern.relationConceptLabel) # -- Resulting List Update # class_net_list.append(new_class) diff --git a/tests/dev_tests/test_data/atom-extraction-devGraph-1.result.ttl b/tests/dev_tests/test_data/atom-extraction-devGraph-1.result.ttl index 67bb1f9a51f43f11e0beec1ad5699ef506d3f03d..1109e650b2da04b00e0d2ab5bb2c6fd91156dfe3 100644 --- a/tests/dev_tests/test_data/atom-extraction-devGraph-1.result.ttl +++ b/tests/dev_tests/test_data/atom-extraction-devGraph-1.result.ttl @@ -428,9 +428,6 @@ net:Object a owl:Class ; rdfs:label "Object using in semantic net instance" ; rdfs:subClassOf net:Net_Structure . -net:Phenomena_Net a owl:Class ; - rdfs:subClassOf net:Net . - net:Property_Axiom_Net a owl:Class ; rdfs:subClassOf net:Axiom_Net . @@ -468,32 +465,8 @@ net:atomProperty_bind_b a net:Atom_Property_Net ; net:targetArgumentNode :leaf_gravitation_g, :leaf_system_s . -net:atomProperty_direct_d a net:Atom_Property_Net ; - net:coverBaseNode :leaf_direct-02_d ; - net:coverNode :leaf_direct-02_d ; - net:hasNaming "direct" ; - net:hasPropertyName "direct" ; - net:hasPropertyName01 "directing" ; - net:hasPropertyName10 "direct-by" ; - net:hasPropertyName12 "direct-of" ; - net:hasPropertyType owl:ObjectProperty ; - net:hasStructure "SSC-01-01" ; - net:isCoreRoleLinked "true" . - -net:atomProperty_direct_d2 a net:Atom_Property_Net ; - net:coverBaseNode :leaf_direct-02_d2 ; - net:coverNode :leaf_direct-02_d2 ; - net:hasNaming "direct" ; - net:hasPropertyName "direct" ; - net:hasPropertyName01 "directing" ; - net:hasPropertyName10 "direct-by" ; - net:hasPropertyName12 "direct-of" ; - net:hasPropertyType owl:ObjectProperty ; - net:hasStructure "SSC-01-01" ; - net:isCoreRoleLinked "true" ; - net:targetArgumentNode :value_negative . - net:atomProperty_hasManner_m9 a net:Atom_Property_Net ; + :role_ARG1 net:phenomena_conjunction-OR_o3 ; net:coverBaseNode :leaf_hasManner_m9 ; net:coverNode :leaf_hasManner_m9 ; net:hasNaming "hasManner" ; @@ -509,6 +482,7 @@ net:atomProperty_hasManner_m9 a net:Atom_Property_Net ; net:atomProperty_hasPart_p9 a net:Atom_Property_Net ; :role_ARG0 net:atomClass_system_s ; + :role_ARG1 net:phenomena_conjunction-AND_a ; net:coverBaseNode :leaf_hasPart_p9 ; net:coverNode :leaf_hasPart_p9 ; net:hasNaming "hasPart" ; @@ -789,16 +763,6 @@ ns2:AMR a owl:Class ; :fromAmrLk ns11:sun ; :label "sun" . -:phenomena_conjunction_and a owl:Class ; - rdfs:subClassOf :phenomena_conjunction ; - :hasConceptLink "and" ; - :label "conjunction-AND" . - -:phenomena_conjunction_or a owl:Class ; - rdfs:subClassOf :phenomena_conjunction ; - :hasConceptLink "or" ; - :label "conjunction-OR" . - :role_domain a owl:Class, net:Relation ; rdfs:subClassOf :AMR_NonCore_Role ; @@ -901,20 +865,6 @@ net:atomClass_gravitation_g a net:Atom_Class_Net ; net:hasNaming "gravitation" ; net:hasStructure "SSC-01-01" . -net:atomClass_object_o a net:Atom_Class_Net ; - net:coverBaseNode :leaf_object_o ; - net:coverNode :leaf_object_o ; - net:hasClassName "object" ; - net:hasNaming "object" ; - net:hasStructure "SSC-01-01" . - -net:atomClass_sun_s2 a net:Atom_Class_Net ; - net:coverBaseNode :leaf_sun_s2 ; - net:coverNode :leaf_sun_s2 ; - net:hasClassName "sun" ; - net:hasNaming "sun" ; - net:hasStructure "SSC-01-01" . - net:atomClass_system_p a net:Atom_Class_Net ; net:coverBaseNode :leaf_system_p ; net:coverNode :leaf_system_p ; @@ -922,6 +872,31 @@ net:atomClass_system_p a net:Atom_Class_Net ; net:hasNaming "system" ; net:hasStructure "SSC-01-01" . +net:atomProperty_direct_d a net:Atom_Property_Net ; + net:coverBaseNode :leaf_direct-02_d ; + net:coverNode :leaf_direct-02_d ; + net:hasNaming "direct" ; + net:hasPropertyName "direct" ; + net:hasPropertyName01 "directing" ; + net:hasPropertyName10 "direct-by" ; + net:hasPropertyName12 "direct-of" ; + net:hasPropertyType owl:ObjectProperty ; + net:hasStructure "SSC-01-01" ; + net:isCoreRoleLinked "true" . + +net:atomProperty_direct_d2 a net:Atom_Property_Net ; + net:coverBaseNode :leaf_direct-02_d2 ; + net:coverNode :leaf_direct-02_d2 ; + net:hasNaming "direct" ; + net:hasPropertyName "direct" ; + net:hasPropertyName01 "directing" ; + net:hasPropertyName10 "direct-by" ; + net:hasPropertyName12 "direct-of" ; + net:hasPropertyType owl:ObjectProperty ; + net:hasStructure "SSC-01-01" ; + net:isCoreRoleLinked "true" ; + net:targetArgumentNode :value_negative . + net:class_list a owl:Class ; rdfs:label "classList" ; rdfs:subClassOf net:Type . @@ -941,6 +916,26 @@ net:objectType a owl:AnnotationProperty ; rdfs:label "object type" ; rdfs:subPropertyOf net:objectProperty . +net:phenomena_conjunction-AND_a a net:Phenomena_Net ; + :role_op1 net:atomClass_sun_s2 ; + :role_op2 net:atomClass_object_o ; + net:coverBaseNode :leaf_and_a ; + net:coverNode :leaf_and_a ; + net:hasNaming "conjunction-AND" ; + net:hasPhenomenaRef "and" ; + net:hasPhenomenaType :phenomena_conjunction_and ; + net:hasStructure "SSC-01-01" . + +net:phenomena_conjunction-OR_o3 a net:Phenomena_Net ; + :role_op1 net:atomProperty_direct_d ; + :role_op2 net:atomProperty_direct_d2 ; + net:coverBaseNode :leaf_or_o3 ; + net:coverNode :leaf_or_o3 ; + net:hasNaming "conjunction-OR" ; + net:hasPhenomenaRef "or" ; + net:hasPhenomenaType :phenomena_conjunction_or ; + net:hasStructure "SSC-01-01" . + <http://amr.isi.edu/amr_data/SSC-01-01#a> a ns2:and ; ns11:op1 <http://amr.isi.edu/amr_data/SSC-01-01#s2> ; ns11:op2 <http://amr.isi.edu/amr_data/SSC-01-01#o> ; @@ -1028,12 +1023,6 @@ ns2:or a ns2:Concept ; :hasLink a owl:AnnotationProperty ; rdfs:subPropertyOf :AMR_AnnotationProperty . -:leaf_and_a a :AMR_Leaf ; - :edge_a_op1_s2 :leaf_sun_s2 ; - :edge_a_op2_o :leaf_object_o ; - :hasConcept :concept_and ; - :hasVariable :variable_a . - :leaf_bind-01_b a :AMR_Leaf ; :edge_b_ARG0_g :leaf_gravitation_g ; :edge_b_ARG1_s :leaf_system_s ; @@ -1054,12 +1043,6 @@ ns2:or a ns2:Concept ; :hasVariable :variable_p9 ; :isReifiedLeaf true . -:leaf_or_o3 a :AMR_Leaf ; - :edge_o3_op1_d :leaf_direct-02_d ; - :edge_o3_op2_d2 :leaf_direct-02_d2 ; - :hasConcept :concept_or ; - :hasVariable :variable_o3 . - :phenomena_conjunction a owl:Class ; rdfs:subClassOf :AMR_Phenomena ; :hasConceptLink "contrast-01", @@ -1067,11 +1050,23 @@ ns2:or a ns2:Concept ; "neither" ; :label "conjunction" . -:role_op1 a owl:Class ; +:phenomena_conjunction_and a owl:Class ; + rdfs:subClassOf :phenomena_conjunction ; + :hasConceptLink "and" ; + :label "conjunction-AND" . + +:phenomena_conjunction_or a owl:Class ; + rdfs:subClassOf :phenomena_conjunction ; + :hasConceptLink "or" ; + :label "conjunction-OR" . + +:role_op1 a owl:Class, + net:Relation ; rdfs:subClassOf :AMR_Op_Role ; :label "op1" . -:role_op2 a owl:Class ; +:role_op2 a owl:Class, + net:Relation ; rdfs:subClassOf :AMR_Op_Role ; :label "op2" . @@ -1083,12 +1078,29 @@ sys:Out_ObjectProperty a owl:ObjectProperty . net:Class_Net a owl:Class ; rdfs:subClassOf net:Net . +net:Phenomena_Net a owl:Class ; + rdfs:subClassOf net:Net . + net:Property_Net a owl:Class ; rdfs:subClassOf net:Net . net:Value_Net a owl:Class ; rdfs:subClassOf net:Net . +net:atomClass_object_o a net:Atom_Class_Net ; + net:coverBaseNode :leaf_object_o ; + net:coverNode :leaf_object_o ; + net:hasClassName "object" ; + net:hasNaming "object" ; + net:hasStructure "SSC-01-01" . + +net:atomClass_sun_s2 a net:Atom_Class_Net ; + net:coverBaseNode :leaf_sun_s2 ; + net:coverNode :leaf_sun_s2 ; + net:hasClassName "sun" ; + net:hasNaming "sun" ; + net:hasStructure "SSC-01-01" . + net:atomClass_system_s a net:Atom_Class_Net ; :role_domain net:individual_SolarSystem_p ; net:coverBaseNode :leaf_system_s ; @@ -1148,9 +1160,6 @@ ns2:Frame a ns2:Concept, :toReify a owl:AnnotationProperty ; rdfs:subPropertyOf :AMR_AnnotationProperty . -net:Relation a owl:Class ; - rdfs:subClassOf net:Net_Structure . - net:has_relation_value a owl:AnnotationProperty ; rdfs:label "has relation value" ; rdfs:subPropertyOf net:has_object . @@ -1171,10 +1180,22 @@ ns3:FrameRole a ns2:Role, :AMR_Term_Concept a owl:Class ; rdfs:subClassOf :AMR_Concept . +:leaf_and_a a :AMR_Leaf ; + :edge_a_op1_s2 :leaf_sun_s2 ; + :edge_a_op2_o :leaf_object_o ; + :hasConcept :concept_and ; + :hasVariable :variable_a . + :leaf_gravitation_g a :AMR_Leaf ; :hasConcept :concept_gravitation ; :hasVariable :variable_g . +:leaf_or_o3 a :AMR_Leaf ; + :edge_o3_op1_d :leaf_direct-02_d ; + :edge_o3_op2_d2 :leaf_direct-02_d2 ; + :hasConcept :concept_or ; + :hasVariable :variable_o3 . + :leaf_orbit-01_o2 a :AMR_Leaf ; :edge_o2_ARG0_o :leaf_object_o ; :edge_o2_ARG1_s2 :leaf_sun_s2 ; @@ -1222,6 +1243,9 @@ sys:Out_Structure a owl:Class ; net:Atom_Class_Net a owl:Class ; rdfs:subClassOf net:Class_Net . +net:Relation a owl:Class ; + rdfs:subClassOf net:Net_Structure . + net:netProperty a owl:AnnotationProperty ; rdfs:label "netProperty" . diff --git a/tests/dev_tests/test_rule_atomic_extractor.py b/tests/dev_tests/test_rule_atomic_extractor.py index 8fbd3fb5d2ea9c58a0f864900a308d5fdad9ee14..7ef13a90a2a6222b95f435b23558930760edeffe 100644 --- a/tests/dev_tests/test_rule_atomic_extractor.py +++ b/tests/dev_tests/test_rule_atomic_extractor.py @@ -125,6 +125,19 @@ def test_search_pattern_4(graph): return pattern_set +def test_search_pattern_5(graph): + _, pattern_set = rule_5.__search_pattern(graph) + print(f'\n ----- number of selection found: {len(pattern_set)}') + for row in pattern_set: + result_str = f'>>> ' + result_str += f'{row.baseLeaf.n3(graph.namespace_manager)}' + result_str += f' {row.phenomenaLabel.n3(graph.namespace_manager)}' + result_str += f' {row.relationConceptPhenomena.n3(graph.namespace_manager)}' + result_str += f' {row.relationConceptLabel.n3(graph.namespace_manager)}' + print(result_str) + return pattern_set + + def test_search_structure(graph): result_set = rule_3.__search_structure(graph) print(f'\n ----- number of selection found: {len(result_set)}') @@ -165,6 +178,7 @@ if __name__ == '__main__': print('\n -- Step 1: Search Pattern') pattern_set = test_search_pattern_1(graph) + test_search_structure(graph) print('\n \n') @@ -190,7 +204,6 @@ if __name__ == '__main__': print('\n -- Step 1: Search Pattern') pattern_set = test_search_pattern_3(graph) - test_search_structure(graph) print('\n \n') @@ -203,12 +216,23 @@ if __name__ == '__main__': print('\n -- Step 1: Search Pattern') pattern_set = test_search_pattern_4(graph) - test_search_structure(graph) print('\n \n') print('\n *** Unit Test ***') test_rule_application(graph, rule_4.extract_atom_value) print('\n \n') + + print('\n ///////////////////// Extraction Rule 5') + print('\n *** Step Test ***') + + print('\n -- Step 1: Search Pattern') + pattern_set = test_search_pattern_5(graph) + + print('\n \n') + + print('\n *** Unit Test ***') + test_rule_application(graph, rule_5.extract_atom_phenomena) + print('\n \n') print('\n *** - ***') \ No newline at end of file