diff --git a/tenet/scheme/amr_rule/transduction/atomic_individual_extractor.py b/tenet/scheme/amr_rule/transduction/atomic_individual_extractor.py index 54a181a705baf19ebe35ea2784d2783f9f4f64ef..d67bf67b98735e75bebd544fbf6d74766e505e3b 100644 --- a/tenet/scheme/amr_rule/transduction/atomic_individual_extractor.py +++ b/tenet/scheme/amr_rule/transduction/atomic_individual_extractor.py @@ -17,7 +17,7 @@ from transduction.naming_computer import define_composite_naming_1, define_restr #============================================================================== -# Select Pattern: leaf{variable, concept} +# Pattern Search: Leaf{variable, concept} corresponding to individual #============================================================================== def __rule_pattern_query_code(graph): diff --git a/tenet/scheme/amr_rule/transduction/atomic_property_extractor.py b/tenet/scheme/amr_rule/transduction/atomic_property_extractor.py index 1c45787547cabb2edddf6d3073261d43ac7b9ee5..b658a3a9b52ddaaccb73105ccf6ecf39fa2d3a8c 100644 --- a/tenet/scheme/amr_rule/transduction/atomic_property_extractor.py +++ b/tenet/scheme/amr_rule/transduction/atomic_property_extractor.py @@ -12,32 +12,54 @@ from rdflib import Graph import transduction from transduction import net +from transduction import rdfterm_computer from transduction.query_builder import generate_select_query from transduction.naming_computer import define_composite_naming_1, define_restriction_naming #============================================================================== -# Select Pattern: leaf{variable, amrTermConcept} +# Pattern Search: Leaf{variable, amrPrecicateConcept} #============================================================================== def __rule_pattern_query_code(graph): - select_data_list = ['?leaf', '?conceptName'] + select_data_list = ['?baseLeaf', '?predicateLabel'] clause_list = [] - clause_list.append(f'?leaf a amr:AMR_Leaf.') - clause_list.append(f'?leaf amr:hasConcept ?leafConcept.') - clause_list.append(f'?leafConcept rdfs:subClassOf amr:AMR_Term_Concept.') - clause_list.append(f'?leafConcept amr:label ?conceptName.') + clause_list.append(f'?baseLeaf a amr:AMR_Leaf.') + clause_list.append(f'?baseLeaf amr:hasConcept ?leafConcept.') + clause_list.append(f'?leafConcept rdfs:subClassOf amr:AMR_Predicat_Concept.') + clause_list.append(f'?leafConcept amr:label ?predicateLabel.') query_code = generate_select_query(graph, select_data_list, clause_list) return query_code - - + + def __search_pattern(graph): query_code = __rule_pattern_query_code(graph) - rule_pattern_set = graph.query(query_code) - return rule_pattern_set + result_set = graph.query(query_code) + return result_set + + +#============================================================================== +# Useful Additional Search +#============================================================================== + +def __target_argument_pattern_query_code(graph, base_leaf_uri): + select_data_list = ['?argLeaf'] + clause_list = [] + clause_list.append((base_leaf_uri, '?relation', '?argLeaf')) + clause_list.append(f'?relation amr:hasAmrRole ?someArgRole.') + query_code = generate_select_query(graph, select_data_list, clause_list) + return query_code + + +def __search_target_argument(graph, base_leaf_uri): + query_code = __target_argument_pattern_query_code(graph, base_leaf_uri) + result_set = graph.query(query_code) + return result_set + + #============================================================================== # Relation Propagation #============================================================================== @@ -63,32 +85,47 @@ def __propagate_relation(target_net, leaf): # Construct Method(s) #============================================================================== -def __define_naming(todo): - pass + + +def __define_naming(predicate_label): + naming = predicate_label.split('-')[0] + return naming -def __construct_atom_class_net(graph, leaf, concept_name): + +def __construct_atom_property_net(graph, base_leaf, predicate_label): # -- Net Composition - atom_class_net = net.AtomClassNet(graph) + atom_property_net = net.AtomPropertyNet(graph) # -- Data Computation - atom_class_net.base_node = leaf - atom_class_net.node = leaf - atom_class_net.class_name = concept_name - # TODO: atom_class_net.class_name = get_structure(graph) + atom_property_net.base_node = base_leaf + atom_property_net.node = base_leaf + atom_property_net.property_type = 'owl:ObjectProperty' + atom_property_net.core_role = 'true' + # atom_property_net.structure = __get_structure(graph) + + # -- Target Argument + target_argument_set = __search_target_argument(graph, base_leaf) + for data in target_argument_set: + atom_property_net.target_argument_node += [data.argLeaf] # -- Relation Propagation - __propagate_relation(atom_class_net, leaf) + __propagate_relation(atom_property_net, base_leaf) # -- Net Naming - atom_class_net.naming = concept_name + naming = __define_naming(predicate_label) + atom_property_net.naming = naming + atom_property_net.property_name = naming + atom_property_net.property_name01 = f'{naming}ing' + atom_property_net.property_name10 = f'{naming}-by' + atom_property_net.property_name12 = f'{naming}-of' # -- Finalization - atom_class_net.finalize() - triple_definition = atom_class_net.generate_triple_definition() + atom_property_net.finalize() + triple_definition = atom_property_net.generate_triple_definition() - return atom_class_net, triple_definition + return atom_property_net, triple_definition @@ -109,11 +146,10 @@ def extract_atomic_property(graph): for pattern in rule_pattern_set: # -- New Net Construction (from 3 nets) - new_class, triple_list = __construct_atom_class_net( - graph, pattern.leaf, pattern.conceptName) + new_net, triple_list = __construct_atom_property_net( + graph, pattern.baseLeaf, pattern.predicateLabel) # -- Resulting List Update - # class_net_list.append(new_class) rule_triple_list += triple_list return rule_label, rule_triple_list \ No newline at end of file diff --git a/tenet/scheme/amr_rule/transduction/phenomena_or_analyzer_1.py b/tenet/scheme/amr_rule/transduction/phenomena_or_analyzer_1.py index 168f1a36c65316d66d67992c3487f6edbc8faa98..d9132ed2dbb2fc897ef0aa465dec9b0bf3f0b72c 100644 --- a/tenet/scheme/amr_rule/transduction/phenomena_or_analyzer_1.py +++ b/tenet/scheme/amr_rule/transduction/phenomena_or_analyzer_1.py @@ -41,7 +41,7 @@ def __search_pattern(graph): #============================================================================== -# Search for phenomena operators: +# Search for phenomena operators #============================================================================== def __class_op_pattern_query_code(graph, phenomena_net_uri, num): 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 180a9683afd98e2ec5fb03226af33fb3b5b677cf..50faaa362a34b9f8f3c64f30e4b12230d92e4945 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 @@ -192,26 +192,6 @@ ns2:root a owl:AnnotationProperty . :label a owl:AnnotationProperty ; rdfs:subPropertyOf :AMR_AnnotationProperty . -:leaf_bind-01_b a :AMR_Leaf ; - :edge_b_ARG0_g :leaf_gravitation_g ; - :edge_b_ARG1_s :leaf_system_s ; - :hasConcept :concept_bind-01 ; - :hasVariable :variable_b . - -:leaf_hasManner_m9 a :AMR_Leaf ; - :edge_m9_ARG0_o2 :leaf_orbit-01_o2 ; - :edge_m9_ARG1_o3 :leaf_or_o3 ; - :hasConcept :concept_manner ; - :hasVariable :variable_m9 ; - :isReifiedLeaf true . - -:leaf_hasPart_p9 a :AMR_Leaf ; - :edge_p9_ARG0_s :leaf_system_s ; - :edge_p9_ARG1_a :leaf_and_a ; - :hasConcept :concept_part ; - :hasVariable :variable_p9 ; - :isReifiedLeaf true . - :phenomena_degree a owl:Class ; rdfs:subClassOf :AMR_Phenomena ; :hasConceptLink "have-degree-91" ; @@ -428,9 +408,6 @@ cprm:targetOntologyURI a rdf:Property ; <https://tenet.tetras-libre.fr/semantic-net> a owl:Ontology . -net:Atom_Property_Net a owl:Class ; - rdfs:subClassOf net:Property_Net . - net:Composite_Class_Net a owl:Class ; rdfs:subClassOf net:Class_Net . @@ -505,6 +482,81 @@ net:atomOf a owl:AnnotationProperty ; rdfs:label "atom of" ; rdfs:subPropertyOf net:typeProperty . +net:atomProperty_bind_b a net:Atom_Property_Net ; + net:coverBaseNode :leaf_bind-01_b ; + net:coverNode :leaf_bind-01_b ; + net:hasNaming "bind" ; + net:hasPropertyName "bind" ; + net:hasPropertyName01 "binding" ; + net:hasPropertyName10 "bind-by" ; + net:hasPropertyName12 "bind-of" ; + net:hasPropertyType owl:ObjectProperty ; + net:isCoreRoleLinked "true" ; + 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: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:isCoreRoleLinked "true" ; + net:targetArgumentNode :value_negative . + +net:atomProperty_hasManner_m9 a net:Atom_Property_Net ; + net:coverBaseNode :leaf_hasManner_m9 ; + net:coverNode :leaf_hasManner_m9 ; + net:hasNaming "hasManner" ; + net:hasPropertyName "hasManner" ; + net:hasPropertyName01 "hasMannering" ; + net:hasPropertyName10 "hasManner-by" ; + net:hasPropertyName12 "hasManner-of" ; + net:hasPropertyType owl:ObjectProperty ; + net:isCoreRoleLinked "true" ; + net:targetArgumentNode :leaf_or_o3, + :leaf_orbit-01_o2 . + +net:atomProperty_hasPart_p9 a net:Atom_Property_Net ; + net:coverBaseNode :leaf_hasPart_p9 ; + net:coverNode :leaf_hasPart_p9 ; + net:hasNaming "hasPart" ; + net:hasPropertyName "hasPart" ; + net:hasPropertyName01 "hasParting" ; + net:hasPropertyName10 "hasPart-by" ; + net:hasPropertyName12 "hasPart-of" ; + net:hasPropertyType owl:ObjectProperty ; + net:isCoreRoleLinked "true" ; + net:targetArgumentNode :leaf_and_a, + :leaf_system_s . + +net:atomProperty_orbit_o2 a net:Atom_Property_Net ; + net:coverBaseNode :leaf_orbit-01_o2 ; + net:coverNode :leaf_orbit-01_o2 ; + net:hasNaming "orbit" ; + net:hasPropertyName "orbit" ; + net:hasPropertyName01 "orbiting" ; + net:hasPropertyName10 "orbit-by" ; + net:hasPropertyName12 "orbit-of" ; + net:hasPropertyType owl:ObjectProperty ; + net:isCoreRoleLinked "true" ; + net:targetArgumentNode :leaf_object_o, + :leaf_sun_s2 . + net:atomType a owl:AnnotationProperty ; rdfs:label "atom type" ; rdfs:subPropertyOf net:objectType . @@ -753,33 +805,6 @@ ns2:AMR a owl:Class ; :fromAmrLk ns11:sun ; :label "sun" . -: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_direct-02_d a :AMR_Leaf ; - :hasConcept :concept_direct-02 ; - :hasVariable :variable_d . - -:leaf_direct-02_d2 a :AMR_Leaf ; - :edge_d2_polarity_negative :value_negative ; - :hasConcept :concept_direct-02 ; - :hasVariable :variable_d2 . - -: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 ; - :hasConcept :concept_orbit-01 ; - :hasVariable :variable_o2 . - :phenomena_conjunction_and a owl:Class ; rdfs:subClassOf :phenomena_conjunction ; :hasConceptLink "and" ; @@ -809,9 +834,6 @@ ns2:AMR a owl:Class ; :value_SolarSystem a :AMR_Value ; rdfs:label "Solar System" . -:value_negative a :AMR_Value ; - rdfs:label "negative" . - :variable_a a :AMR_Variable ; :fromAmrLk <http://amr.isi.edu/amr_data/SSC-01-01#a> ; :label "a" . @@ -991,6 +1013,38 @@ 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 ; + :hasConcept :concept_bind-01 ; + :hasVariable :variable_b . + +:leaf_hasManner_m9 a :AMR_Leaf ; + :edge_m9_ARG0_o2 :leaf_orbit-01_o2 ; + :edge_m9_ARG1_o3 :leaf_or_o3 ; + :hasConcept :concept_manner ; + :hasVariable :variable_m9 ; + :isReifiedLeaf true . + +:leaf_hasPart_p9 a :AMR_Leaf ; + :edge_p9_ARG0_s :leaf_system_s ; + :edge_p9_ARG1_a :leaf_and_a ; + :hasConcept :concept_part ; + :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", @@ -1006,6 +1060,9 @@ ns2:or a ns2:Concept ; rdfs:subClassOf :AMR_Op_Role ; :label "op2" . +:value_negative a :AMR_Value ; + rdfs:label "negative" . + sys:Out_ObjectProperty a owl:ObjectProperty . net:Class_Net a owl:Class ; @@ -1053,9 +1110,14 @@ ns2:Frame a ns2:Concept, rdfs:range rdfs:Literal ; rdfs:subPropertyOf :AMR_AnnotationProperty . -:leaf_gravitation_g a :AMR_Leaf ; - :hasConcept :concept_gravitation ; - :hasVariable :variable_g . +:leaf_direct-02_d a :AMR_Leaf ; + :hasConcept :concept_direct-02 ; + :hasVariable :variable_d . + +:leaf_direct-02_d2 a :AMR_Leaf ; + :edge_d2_polarity_negative :value_negative ; + :hasConcept :concept_direct-02 ; + :hasVariable :variable_d2 . :toReify a owl:AnnotationProperty ; rdfs:subPropertyOf :AMR_AnnotationProperty . @@ -1080,13 +1142,15 @@ ns3:FrameRole a ns2:Role, :AMR_Term_Concept a owl:Class ; rdfs:subClassOf :AMR_Concept . -:leaf_object_o a :AMR_Leaf ; - :hasConcept :concept_object ; - :hasVariable :variable_o . +:leaf_gravitation_g a :AMR_Leaf ; + :hasConcept :concept_gravitation ; + :hasVariable :variable_g . -:leaf_sun_s2 a :AMR_Leaf ; - :hasConcept :concept_sun ; - :hasVariable :variable_s2 . +:leaf_orbit-01_o2 a :AMR_Leaf ; + :edge_o2_ARG0_o :leaf_object_o ; + :edge_o2_ARG1_s2 :leaf_sun_s2 ; + :hasConcept :concept_orbit-01 ; + :hasVariable :variable_o2 . :role_ARG0 a owl:Class ; rdfs:subClassOf :AMR_Core_Role ; @@ -1108,16 +1172,19 @@ net:typeProperty a owl:AnnotationProperty ; :AMR_Role a owl:Class ; rdfs:subClassOf :AMR_Element . +:leaf_object_o a :AMR_Leaf ; + :hasConcept :concept_object ; + :hasVariable :variable_o . + +:leaf_sun_s2 a :AMR_Leaf ; + :hasConcept :concept_sun ; + :hasVariable :variable_s2 . + :leaf_system_p a :AMR_Leaf ; :edge_p_name_SolarSystem :value_SolarSystem ; :hasConcept :concept_system ; :hasVariable :variable_p . -:leaf_system_s a :AMR_Leaf ; - :edge_s_domain_p :leaf_system_p ; - :hasConcept :concept_system ; - :hasVariable :variable_s . - sys:Out_Structure a owl:Class ; rdfs:label "Output Ontology Structure" . @@ -1135,6 +1202,9 @@ net:netProperty a owl:AnnotationProperty ; cprm:configParamProperty a rdf:Property ; rdfs:label "Config Parameter Property" . +net:Atom_Property_Net a owl:Class ; + rdfs:subClassOf net:Property_Net . + net:Net_Structure a owl:Class ; rdfs:label "Semantic Net Structure" ; rdfs:comment "A semantic net captures a set of nodes, and associates this set with type(s) and value(s)." . @@ -1144,6 +1214,11 @@ rdf:Property a owl:Class . :AMR_Relation a owl:Class ; rdfs:subClassOf :AMR_Structure . +:leaf_system_s a :AMR_Leaf ; + :edge_s_domain_p :leaf_system_p ; + :hasConcept :concept_system ; + :hasVariable :variable_s . + net:Type a owl:Class ; rdfs:label "Semantic Net Type" ; rdfs:subClassOf net:Net_Structure . diff --git a/tests/dev_tests/test_rule_atomic_extractor.py b/tests/dev_tests/test_rule_atomic_extractor.py index af118602b11184121ff64d2ea64abd6d8afecdc6..ae661dd47dba420b39b26fe92d3ce563e6e76942 100644 --- a/tests/dev_tests/test_rule_atomic_extractor.py +++ b/tests/dev_tests/test_rule_atomic_extractor.py @@ -27,6 +27,7 @@ from tenet.transduction import rdfterm_computer, prefix_handle from tenet.transduction import net from tenet.scheme.amr_rule.transduction import atomic_class_extractor as rule_1 from tenet.scheme.amr_rule.transduction import atomic_individual_extractor as rule_2 +from tenet.scheme.amr_rule.transduction import atomic_property_extractor as rule_3 from tenet.scheme import amr_rule @@ -100,6 +101,17 @@ def test_search_pattern_2(graph): result_str += f' {selection.classNet.n3(graph.namespace_manager)}' print(result_str) return pattern_result_set + + +def test_search_pattern_3(graph): + pattern_result_set = rule_3.__search_pattern(graph) + print(f'\n ----- number of selection found: {len(pattern_result_set)}') + for selection in pattern_result_set: + result_str = f'>>> ' + result_str += f'{selection.baseLeaf.n3(graph.namespace_manager)}' + result_str += f' {selection.predicateLabel.n3(graph.namespace_manager)}' + print(result_str) + return pattern_result_set #============================================================================== @@ -150,5 +162,18 @@ if __name__ == '__main__': print('\n *** Unit Test ***') test_rule_application(graph, rule_2.extract_atomic_individual) print('\n \n') + print('\n \n') + + print('\n ///////////////////// Extraction Rule 3') + print('\n *** Step Test ***') + + print('\n -- Step 1: Search Pattern') + pattern_set = test_search_pattern_3(graph) + + print('\n \n') + + print('\n *** Unit Test ***') + test_rule_application(graph, rule_3.extract_atomic_property) + print('\n \n') print('\n *** - ***') \ No newline at end of file