Skip to content
Snippets Groups Projects
Commit e61ddcd9 authored by Aurélien Lamercerie's avatar Aurélien Lamercerie
Browse files

New AMR Rule: transduction.atomic_individual_extractor

parent 66392de0
No related branches found
No related tags found
No related merge requests found
...@@ -2,6 +2,8 @@ from scheme.amr_rule.preprocessing.amr_reification import * ...@@ -2,6 +2,8 @@ from scheme.amr_rule.preprocessing.amr_reification import *
from scheme.amr_rule.preprocessing.amrld_correcting import * from scheme.amr_rule.preprocessing.amrld_correcting import *
from scheme.amr_rule.transduction.atomic_class_extractor import * from scheme.amr_rule.transduction.atomic_class_extractor import *
from scheme.amr_rule.transduction.atomic_individual_extractor import *
from scheme.amr_rule.transduction.atomic_property_extractor import *
from scheme.amr_rule.transduction.composite_class_extractor_1 import * from scheme.amr_rule.transduction.composite_class_extractor_1 import *
......
#!/usr/bin/python3.10
# -*-coding:Utf-8 -*
#==============================================================================
# TENET: Rule to extract atomic individuals
#------------------------------------------------------------------------------
# Net Expansion AMR rule to extract atomic individuals
# Rule: leaf{variable, concept} => atomicClass
#==============================================================================
from rdflib import Graph
import transduction
from transduction import net
from transduction.query_builder import generate_select_query
from transduction.naming_computer import define_composite_naming_1, define_restriction_naming
#==============================================================================
# Select Pattern: leaf{variable, concept}
#==============================================================================
def __rule_pattern_query_code(graph):
select_data_list = ['?baseLeaf', '?conceptName', '?valueLabel', '?classNet']
clause_list = []
clause_list.append(f'?baseLeaf a amr:AMR_Leaf.')
clause_list.append(f'?baseLeaf amr:hasConcept ?leafConcept.')
clause_list.append(f'?baseLeaf ?edge ?value.')
clause_list.append(f'?edge amr:hasRoleID ?roleID.')
clause_list.append(f'VALUES ?roleID {{"name"}}')
clause_list.append(f'?value a amr:AMR_Value.')
clause_list.append(f'?value rdfs:label ?valueLabel.')
clause_list.append(f'?classNet a [rdfs:subClassOf* net:Class_Net].')
clause_list.append(f'?classNet net:coverBaseNode ?baseLeaf.')
clause_list.append(f'?classNet net:hasClassName ?conceptName.')
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
#==============================================================================
# Relation Propagation
#==============================================================================
def __filter_relation(relation_list):
result_list = []
for relation in relation_list:
check = True
(s, p, o) = relation
if s == o: check = False
if check: result_list.append(relation)
return result_list
def __propagate_relation(target_net, leaf):
# TODO
#target_net.output_relation_list = None
pass
#==============================================================================
# Construct Method(s)
#==============================================================================
def __define_naming(todo):
pass
def __construct_individual_net(
graph, base_leaf, concept_name, value_label, mother_class_net):
# -- Net Composition
individual_net = net.IndividualNet(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
# TODO: individual_net.class_name = get_structure(graph)
# -- Relation Propagation
__propagate_relation(individual_net, base_leaf)
# -- Net Naming
individual_net.naming = concept_name
# -- Finalization
individual_net.finalize()
triple_definition = individual_net.generate_triple_definition()
return individual_net, triple_definition
#==============================================================================
# Main Method
#==============================================================================
def extract_atomic_individual(graph):
# -- Rule Initialization
rule_label = 'extract atomic individuals [ leaf{variable, concept} ]'
# -- Search for patterns
rule_pattern_set = __search_pattern(graph)
# -- Selection Analyzing (1)
rule_triple_list = []
for pattern in rule_pattern_set:
# -- New Net Construction (from 3 nets)
new_class, triple_list = __construct_individual_net(
graph, pattern.baseLeaf, pattern.conceptName, pattern.valueLabel, pattern.classNet)
# -- 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
#!/usr/bin/python3.10
# -*-coding:Utf-8 -*
#==============================================================================
# TENET: Rule to extract atomic properties
#------------------------------------------------------------------------------
# Net Expansion AMR rule to extract atomic properties
# Rule: leaf{variable, amrTermConcept} => atomicProperty
#==============================================================================
from rdflib import Graph
import transduction
from transduction import net
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}
#==============================================================================
def __rule_pattern_query_code(graph):
select_data_list = ['?leaf', '?conceptName']
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.')
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
#==============================================================================
# Relation Propagation
#==============================================================================
def __filter_relation(relation_list):
result_list = []
for relation in relation_list:
check = True
(s, p, o) = relation
if s == o: check = False
if check: result_list.append(relation)
return result_list
def __propagate_relation(target_net, leaf):
# TODO
#target_net.output_relation_list = None
pass
#==============================================================================
# Construct Method(s)
#==============================================================================
def __define_naming(todo):
pass
def __construct_atom_class_net(graph, leaf, concept_name):
# -- Net Composition
atom_class_net = net.AtomClassNet(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)
# -- Relation Propagation
__propagate_relation(atom_class_net, leaf)
# -- Net Naming
atom_class_net.naming = concept_name
# -- Finalization
atom_class_net.finalize()
triple_definition = atom_class_net.generate_triple_definition()
return atom_class_net, triple_definition
#==============================================================================
# Main Method
#==============================================================================
def extract_atomic_property(graph):
# -- Rule Initialization
rule_label = 'extract atomic properties [ leaf{variable, amrTermConcept} ]'
# -- Search for patterns
rule_pattern_set = __search_pattern(graph)
# -- Selection Analyzing (1)
rule_triple_list = []
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)
# -- 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
...@@ -102,8 +102,8 @@ amr_reification_sequence = { ...@@ -102,8 +102,8 @@ amr_reification_sequence = {
# # Transduction Sequences # # Transduction Sequences
# # --------------------------------------------- # # ---------------------------------------------
atomic_extraction_sequence = { old_atomic_extraction_sequence = {
'label': 'atomic-extraction-sequence', 'label': '(old) atomic-extraction-sequence',
'comment': 'creation of atom element nets (class, individual, property)', 'comment': 'creation of atom element nets (class, individual, property)',
'rule_key_list': ['create-atom-class-net', 'rule_key_list': ['create-atom-class-net',
'create-individual-net-1', 'create-individual-net-1',
...@@ -226,6 +226,11 @@ classification_sequence = { ...@@ -226,6 +226,11 @@ classification_sequence = {
'reclassify-deprecated-net'] 'reclassify-deprecated-net']
} }
atomic_extraction_sequence = ['atomic-extraction-sequence',
rule.extract_atomic_class,
rule.extract_atomic_individual,
rule.extract_atomic_property]
phenomena_polarity_analyze_sequence = ['phenomena_polarity_analyze_sequence', phenomena_polarity_analyze_sequence = ['phenomena_polarity_analyze_sequence',
rule.analyze_phenomena_polarity_1] rule.analyze_phenomena_polarity_1]
...@@ -292,8 +297,8 @@ scheme = { ...@@ -292,8 +297,8 @@ scheme = {
atomic_extraction_sequence], atomic_extraction_sequence],
# 'transduction': [transduction_refinement_sequence, # 'transduction': [transduction_refinement_sequence,
# atomic_extraction_sequence, # old_atomic_extraction_sequence,
# atomic_extraction_sequence, # old_atomic_extraction_sequence,
# # phenomena_application_polarity_sequence, # # phenomena_application_polarity_sequence,
# phenomena_polarity_analyze_sequence, # phenomena_polarity_analyze_sequence,
# phenomena_application_mod_sequence, # phenomena_application_mod_sequence,
......
...@@ -440,9 +440,6 @@ net:Composite_Property_Net a owl:Class ; ...@@ -440,9 +440,6 @@ net:Composite_Property_Net a owl:Class ;
net:Deprecated_Net a owl:Class ; net:Deprecated_Net a owl:Class ;
rdfs:subClassOf net:Net . rdfs:subClassOf net:Net .
net:Individual_Net a owl:Class ;
rdfs:subClassOf net:Net .
net:Instance a owl:Class ; net:Instance a owl:Class ;
rdfs:label "Semantic Net Instance" ; rdfs:label "Semantic Net Instance" ;
rdfs:subClassOf net:Net_Structure . rdfs:subClassOf net:Net_Structure .
...@@ -498,12 +495,6 @@ net:atomClass_sun_s2 a net:Atom_Class_Net ; ...@@ -498,12 +495,6 @@ net:atomClass_sun_s2 a net:Atom_Class_Net ;
net:hasClassName "sun" ; net:hasClassName "sun" ;
net:hasNaming "sun" . net:hasNaming "sun" .
net:atomClass_system_p a net:Atom_Class_Net ;
net:coverBaseNode :leaf_system_p ;
net:coverNode :leaf_system_p ;
net:hasClassName "system" ;
net:hasNaming "system" .
net:atomClass_system_s a net:Atom_Class_Net ; net:atomClass_system_s a net:Atom_Class_Net ;
net:coverBaseNode :leaf_system_s ; net:coverBaseNode :leaf_system_s ;
net:coverNode :leaf_system_s ; net:coverNode :leaf_system_s ;
...@@ -637,6 +628,13 @@ net:has_target a owl:AnnotationProperty ; ...@@ -637,6 +628,13 @@ net:has_target a owl:AnnotationProperty ;
rdfs:label "has target" ; rdfs:label "has target" ;
rdfs:subPropertyOf net:has_relation_value . rdfs:subPropertyOf net:has_relation_value .
net:individual_system_p a net:Individual_Net ;
net:coverBaseNode :leaf_system_p ;
net:coverNode :leaf_system_p ;
net:hasIndividualLabel "Solar System" ;
net:hasMotherClassNet net:atomClass_system_p ;
net:hasNaming "system" .
net:inverse_direction a owl:NamedIndividual . net:inverse_direction a owl:NamedIndividual .
net:listBy a owl:AnnotationProperty ; net:listBy a owl:AnnotationProperty ;
...@@ -886,6 +884,15 @@ net:Axiom_Net a owl:Class ; ...@@ -886,6 +884,15 @@ net:Axiom_Net a owl:Class ;
net:Feature a owl:Class ; net:Feature a owl:Class ;
rdfs:subClassOf net:Net_Structure . rdfs:subClassOf net:Net_Structure .
net:Individual_Net a owl:Class ;
rdfs:subClassOf net:Net .
net:atomClass_system_p a net:Atom_Class_Net ;
net:coverBaseNode :leaf_system_p ;
net:coverNode :leaf_system_p ;
net:hasClassName "system" ;
net:hasNaming "system" .
net:class_list a owl:Class ; net:class_list a owl:Class ;
rdfs:label "classList" ; rdfs:label "classList" ;
rdfs:subClassOf net:Type . rdfs:subClassOf net:Type .
...@@ -1050,11 +1057,6 @@ ns2:Frame a ns2:Concept, ...@@ -1050,11 +1057,6 @@ ns2:Frame a ns2:Concept,
:hasConcept :concept_gravitation ; :hasConcept :concept_gravitation ;
:hasVariable :variable_g . :hasVariable :variable_g .
:leaf_system_p a :AMR_Leaf ;
:edge_p_name_SolarSystem :value_SolarSystem ;
:hasConcept :concept_system ;
:hasVariable :variable_p .
:toReify a owl:AnnotationProperty ; :toReify a owl:AnnotationProperty ;
rdfs:subPropertyOf :AMR_AnnotationProperty . rdfs:subPropertyOf :AMR_AnnotationProperty .
...@@ -1106,6 +1108,11 @@ net:typeProperty a owl:AnnotationProperty ; ...@@ -1106,6 +1108,11 @@ net:typeProperty a owl:AnnotationProperty ;
:AMR_Role a owl:Class ; :AMR_Role a owl:Class ;
rdfs:subClassOf :AMR_Element . rdfs:subClassOf :AMR_Element .
:leaf_system_p a :AMR_Leaf ;
:edge_p_name_SolarSystem :value_SolarSystem ;
:hasConcept :concept_system ;
:hasVariable :variable_p .
:leaf_system_s a :AMR_Leaf ; :leaf_system_s a :AMR_Leaf ;
:edge_s_domain_p :leaf_system_p ; :edge_s_domain_p :leaf_system_p ;
:hasConcept :concept_system ; :hasConcept :concept_system ;
......
This diff is collapsed.
...@@ -26,6 +26,7 @@ from tenet.transduction.rdfterm_computer import __update_uri_with_prefix ...@@ -26,6 +26,7 @@ from tenet.transduction.rdfterm_computer import __update_uri_with_prefix
from tenet.transduction import rdfterm_computer, prefix_handle from tenet.transduction import rdfterm_computer, prefix_handle
from tenet.transduction import net 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_class_extractor as rule_1
from tenet.scheme.amr_rule.transduction import atomic_individual_extractor as rule_2
from tenet.scheme import amr_rule from tenet.scheme import amr_rule
...@@ -88,6 +89,19 @@ def test_search_pattern_1(graph): ...@@ -88,6 +89,19 @@ def test_search_pattern_1(graph):
return pattern_result_set return pattern_result_set
def test_search_pattern_2(graph):
pattern_result_set = rule_2.__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.conceptName.n3(graph.namespace_manager)}'
result_str += f' {selection.valueLabel.n3(graph.namespace_manager)}'
result_str += f' {selection.classNet.n3(graph.namespace_manager)}'
print(result_str)
return pattern_result_set
#============================================================================== #==============================================================================
# Unit Test # Unit Test
#============================================================================== #==============================================================================
...@@ -113,6 +127,7 @@ if __name__ == '__main__': ...@@ -113,6 +127,7 @@ if __name__ == '__main__':
graph = load_test_graph() graph = load_test_graph()
print('\n \n') print('\n \n')
print('\n ///////////////////// Extraction Rule 1')
print('\n *** Step Test ***') print('\n *** Step Test ***')
print('\n -- Step 1: Search Pattern') print('\n -- Step 1: Search Pattern')
...@@ -124,4 +139,16 @@ if __name__ == '__main__': ...@@ -124,4 +139,16 @@ if __name__ == '__main__':
test_rule_application(graph, rule_1.extract_atomic_class) test_rule_application(graph, rule_1.extract_atomic_class)
print('\n \n') print('\n \n')
print('\n ///////////////////// Extraction Rule 2')
print('\n *** Step Test ***')
print('\n -- Step 1: Search Pattern')
pattern_set = test_search_pattern_2(graph)
print('\n \n')
print('\n *** Unit Test ***')
test_rule_application(graph, rule_2.extract_atomic_individual)
print('\n \n')
print('\n *** - ***') print('\n *** - ***')
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment