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

New AMR Rule: transduction.property_class_classifier

parent f7b358a0
No related branches found
No related tags found
No related merge requests found
Showing
with 4111 additions and 1475 deletions
...@@ -14,6 +14,7 @@ from scheme.amr_clara_rule.transduction.composite_class_extractor_1 import * ...@@ -14,6 +14,7 @@ from scheme.amr_clara_rule.transduction.composite_class_extractor_1 import *
from scheme.amr_clara_rule.transduction.composite_class_extractor_2 import * from scheme.amr_clara_rule.transduction.composite_class_extractor_2 import *
from scheme.amr_clara_rule.transduction.phenomena_modality_classifier import * from scheme.amr_clara_rule.transduction.phenomena_modality_classifier import *
from scheme.amr_clara_rule.transduction.property_class_classifier import *
from scheme.amr_clara_rule.transduction.phenomena_polarity_analyzer_1 import * from scheme.amr_clara_rule.transduction.phenomena_polarity_analyzer_1 import *
from scheme.amr_clara_rule.transduction.phenomena_polarity_analyzer_2 import * from scheme.amr_clara_rule.transduction.phenomena_polarity_analyzer_2 import *
......
...@@ -140,12 +140,8 @@ def extract_atom_class(graph): ...@@ -140,12 +140,8 @@ def extract_atom_class(graph):
rule_triple_list = [] rule_triple_list = []
for pattern in pattern_set: for pattern in pattern_set:
# -- New Net Construction (from 3 nets) # -- New Net Construction
new_class, triple_list = __construct_atom_class_net( new_class, triple_list = __construct_atom_class_net(graph, pattern.leaf, pattern.conceptName)
graph, pattern.leaf, pattern.conceptName)
# -- Resulting List Update
# class_net_list.append(new_class)
rule_triple_list += triple_list rule_triple_list += triple_list
return rule_label, rule_triple_list return rule_label, rule_triple_list
\ No newline at end of file
#!/usr/bin/python3.10
# -*-coding:Utf-8 -*
#==============================================================================
# TENET: Rule to modality phenomena classification
#------------------------------------------------------------------------------
# AMR rule to classify modality phenomena
# Rule: modality_phenomena classification
#==============================================================================
from rdflib import Graph
import transduction
from transduction import net
from transduction.query_builder import generate_select_query
from transduction.rdfterm_computer import produce_uriref, produce_literal
#==============================================================================
# Pattern Search: modality_phenomena
#==============================================================================
def __search_pattern(graph):
query_code = ''
result_set = []
for arg_relation in ['amr:role_ARG0', 'amr:role_ARG1', 'amr:role_ARG2']:
select_data_list = ['?property_net']
clause_list = [f'?left_property_net a [rdfs:subClassOf* net:Property_Net].',
f'?property_net a [rdfs:subClassOf* net:Atom_Property_Net].',
f'?left_property_net {arg_relation} ?property_net.']
query_code = generate_select_query(graph, select_data_list, clause_list)
result_set += graph.query(query_code)
return query_code, result_set
#==============================================================================
# Useful Computation Method(s)
#==============================================================================
def __propagate_relation(target_net, base_net):
target_net.input_relation_list = base_net.input_relation_list
target_net.output_relation_list = base_net.output_relation_list
#==============================================================================
# Construct Method(s)
#==============================================================================
def __construct_atom_class_net(graph, property_net):
# -- Net Composition
atom_class_net = net.AtomClassNet(graph)
atom_class_net.compose(property_net)
# -- Data Computation
atom_class_net.class_name = property_net.naming
# -- Net Naming
atom_class_net.naming = property_net.naming
# -- Relation Propagation
__propagate_relation(atom_class_net, property_net)
# -- Finalization
atom_class_net.finalize()
triple_definition = atom_class_net.generate_triple_definition()
return atom_class_net, triple_definition
#==============================================================================
# Main Method
#==============================================================================
def reclassify_argument_property_to_class(graph):
# -- Rule Initialization
rule_label = 'reclassify argument property to class'
rule_triple_list = []
# -- Search for patterns
_, pattern_set = __search_pattern(graph)
# -- Pattern Analysis
for pattern in pattern_set:
atom_property_net = net.AtomPropertyNet(graph, uri=pattern.property_net)
_, triple_list = __construct_atom_class_net(graph, atom_property_net)
rule_triple_list += triple_list
rule_triple_list += atom_property_net.deprecate()
return rule_label, rule_triple_list
\ No newline at end of file
...@@ -104,74 +104,6 @@ amr_reification_sequence = { ...@@ -104,74 +104,6 @@ amr_reification_sequence = {
# # Transduction Sequences # # Transduction Sequences
# # --------------------------------------------- # # ---------------------------------------------
phenomena_application_and_sequence = {
'label': 'phenomena-application-and-sequence',
'comment': 'Application of phenomena',
'rule_key_list': ['and-conjunction-phenomena-application-1',
'and-conjunction-phenomena-application-2',
'and-conjunction-phenomena-application-3',
'and-conjunction-phenomena-application-4',
'and-conjunction-phenomena-application-5',
'and-conjunction-phenomena-application-6'
]
}
composite_property_extraction_sequence = {
'label': 'composite-property-extraction-sequence',
'comment': 'creation of composite properties from properties',
'rule_key_list': ['create-composite-property-net-from-property-1',
'create-composite-property-net-from-property-2']
}
restriction_adding_sequence = {
'label': 'restriction-adding-sequence',
'comment': 'add restriction to class from property',
'rule_key_list': ['add-restriction-to-class-net-from-property-1']
}
phenomena_checking_sequence = {
'label': 'phenomena-checking-sequence',
'comment': 'creation of phenomena nets',
'rule_key_list': ['expand-and-or-conjunction-phenomena-net',
'expand-degree-phenomena-net-1',
'expand-degree-phenomena-net-2',
'expand-degree-phenomena-net-3',
'expand-degree-phenomena-net-4',
'expand-degree-phenomena-net-5',
'expand-degree-phenomena-net-6']
}
composite_class_extraction_sequence_2 = {
'label': 'composite-class-extraction-sequence-2',
'comment': 'creation of composite classes from phenomena',
'rule_key_list': ['create-composite-class-net-from-phenomena-1',
'create-composite-class-net-from-phenomena-2',
'create-composite-class-net-from-phenomena-3',
'create-composite-class-net-from-phenomena-4']
}
classification_sequence = {
'label': 'classification-sequence',
'comment': 'net classification',
'rule_key_list': ['classify-net-from-core-1',
'classify-net-from-core-2',
'classify-net-from-core-3',
# -- old --- 'classify-net-from-mod',
'classify-net-from-part',
'classify-net-from-domain',
'classify-net-from-degree-phenomena-1',
'classify-net-from-degree-phenomena-2',
'classify-net-from-degree-phenomena-3',
'propagate-individual-1',
'propagate-individual-2',
'reclassify-deprecated-net']
}
atomic_extraction_sequence = ['atomic extraction sequence', atomic_extraction_sequence = ['atomic extraction sequence',
rule.extract_atom_class, rule.extract_atom_class,
rule.extract_atom_individual, rule.extract_atom_individual,
...@@ -181,11 +113,12 @@ atomic_extraction_sequence = ['atomic extraction sequence', ...@@ -181,11 +113,12 @@ atomic_extraction_sequence = ['atomic extraction sequence',
rule.propagate_atom_relation rule.propagate_atom_relation
] ]
phenomena_analyze_sequence_1 = ['phenomena analyze sequence (1)', classification_sequence_1 = ['classification sequence (1)',
rule.classify_modality_phenomena rule.classify_modality_phenomena,
rule.reclassify_argument_property_to_class
] ]
phenomena_analyze_sequence_2 = ['phenomena analyze sequence (2)', phenomena_analyze_sequence_1 = ['phenomena analyze sequence (1)',
rule.analyze_phenomena_polarity_1, rule.analyze_phenomena_polarity_1,
rule.analyze_phenomena_polarity_2, rule.analyze_phenomena_polarity_2,
rule.analyze_phenomena_polarity_3, rule.analyze_phenomena_polarity_3,
...@@ -195,7 +128,7 @@ phenomena_analyze_sequence_2 = ['phenomena analyze sequence (2)', ...@@ -195,7 +128,7 @@ phenomena_analyze_sequence_2 = ['phenomena analyze sequence (2)',
rule.classify_modality_phenomena rule.classify_modality_phenomena
] ]
phenomena_analyze_sequence_3 = ['phenomena analyze sequence (3)', phenomena_analyze_sequence_2 = ['phenomena analyze sequence (2)',
rule.analyze_phenomena_or_1, rule.analyze_phenomena_or_1,
rule.analyze_phenomena_or_2, rule.analyze_phenomena_or_2,
rule.analyze_phenomena_and_1, rule.analyze_phenomena_and_1,
...@@ -235,9 +168,9 @@ scheme = { ...@@ -235,9 +168,9 @@ scheme = {
'transduction': [transduction_refinement_sequence, 'transduction': [transduction_refinement_sequence,
atomic_extraction_sequence, atomic_extraction_sequence,
classification_sequence_1,
phenomena_analyze_sequence_1, phenomena_analyze_sequence_1,
phenomena_analyze_sequence_2, phenomena_analyze_sequence_2,
phenomena_analyze_sequence_3,
composite_property_extraction_sequence, composite_property_extraction_sequence,
composite_class_extraction_sequence, composite_class_extraction_sequence,
odrl_extraction_sequence odrl_extraction_sequence
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -16,10 +16,12 @@ FILE_PATH = f'{os.path.dirname(os.path.abspath(__file__))}' ...@@ -16,10 +16,12 @@ FILE_PATH = f'{os.path.dirname(os.path.abspath(__file__))}'
INPUT_DIR_PATH = f'{FILE_PATH}/test_data/' INPUT_DIR_PATH = f'{FILE_PATH}/test_data/'
OUTPUT_DIR_PATH = f'{FILE_PATH}/test_data/' OUTPUT_DIR_PATH = f'{FILE_PATH}/test_data/'
TEST_FILE_NAME_1 = 'modality-devGraph-1' TEST_FILE_NAME_1 = 'classifier-devGraph-1'
TEST_FILE_NAME_2 = 'classifier-devGraph-2'
from context import tenet from context import tenet
from tenet.scheme.amr_clara_rule.transduction import phenomena_modality_classifier as rule_1 from tenet.scheme.amr_clara_rule.transduction import phenomena_modality_classifier as rule_1
from tenet.scheme.amr_clara_rule.transduction import property_class_classifier as rule_2
from tenet.scheme import amr_master_rule as rule from tenet.scheme import amr_master_rule as rule
from tenet.scheme import amr_clara_rule from tenet.scheme import amr_clara_rule
...@@ -90,7 +92,7 @@ def add_triples_in_graph(test_file_name, graph, triple_list): ...@@ -90,7 +92,7 @@ def add_triples_in_graph(test_file_name, graph, triple_list):
# Development Test # Development Test
#============================================================================== #==============================================================================
def test_search_pattern(graph): def test_search_pattern_1(graph):
query_code, pattern_set = rule_1.__search_pattern(graph) query_code, pattern_set = rule_1.__search_pattern(graph)
print(f'\n ----- query code: {query_code}') print(f'\n ----- query code: {query_code}')
print(f'\n ----- number of selection found: {len(pattern_set)}') print(f'\n ----- number of selection found: {len(pattern_set)}')
...@@ -101,6 +103,17 @@ def test_search_pattern(graph): ...@@ -101,6 +103,17 @@ def test_search_pattern(graph):
return pattern_set return pattern_set
def test_search_pattern_2(graph):
query_code, pattern_set = rule_2.__search_pattern(graph)
print(f'\n ----- query code: {query_code}')
print(f'\n ----- number of selection found: {len(pattern_set)}')
for selection in pattern_set:
result_str = f'>>> '
result_str += f'{selection.property_net.n3(graph.namespace_manager)}'
print(result_str)
return pattern_set
#============================================================================== #==============================================================================
# Unit Test # Unit Test
#============================================================================== #==============================================================================
...@@ -123,20 +136,34 @@ if __name__ == '__main__': ...@@ -123,20 +136,34 @@ if __name__ == '__main__':
print('\n *** Test Preparation ***') print('\n *** Test Preparation ***')
graph_1 = load_test_graph(TEST_FILE_NAME_1) graph_1 = load_test_graph(TEST_FILE_NAME_1)
graph_2 = load_test_graph(TEST_FILE_NAME_2)
print('\n \n') print('\n \n')
print('\n ///////////////////// Extraction Rule 1') print('\n ///////////////////// Classifier Rule 1')
print('\n *** Step Test ***') print('\n *** Step Test ***')
print('\n -- Step 1: Search Pattern') print('\n -- Step 1: Search Pattern')
pattern_set = test_search_pattern(graph_1) pattern_set = test_search_pattern_1(graph_1)
print('\n \n') print('\n \n')
print('\n *** Unit Test ***') print('\n *** Unit Test ***')
test_rule_application(TEST_FILE_NAME_1, graph_1, amr_clara_rule.classify_modality_phenomena) test_rule_application(TEST_FILE_NAME_1, graph_1, amr_clara_rule.classify_modality_phenomena)
print('\n \n') print('\n \n')
print('\n ///////////////////// Classifier Rule 2')
print('\n *** Step Test ***')
print('\n -- Step 1: Search Pattern')
pattern_set = test_search_pattern_2(graph_1)
pattern_set = test_search_pattern_2(graph_2)
print('\n \n')
print('\n *** Unit Test ***')
test_rule_application(TEST_FILE_NAME_2, graph_2, amr_clara_rule.reclassify_argument_property_to_class)
print('\n \n')
print('\n *** - ***') print('\n *** - ***')
\ No newline at end of file
#!/usr/bin/python3.10
# -*-coding:Utf-8 -*
#==============================================================================
# TENET: Extraction Rule Test
#------------------------------------------------------------------------------
# Script to test rules under development
#==============================================================================
import subprocess, os
from rdflib import Graph, Namespace
from rdflib.namespace import NamespaceManager, FOAF, RDF
from rdflib import URIRef, Literal, BNode
FILE_PATH = f'{os.path.dirname(os.path.abspath(__file__))}'
INPUT_DIR_PATH = f'{FILE_PATH}/test_data/'
OUTPUT_DIR_PATH = f'{FILE_PATH}/test_data/'
TEST_FILE_NAME_1 = 'mod-analyzer-devGraph-1'
TEST_FILE_NAME_2 = 'mod-analyzer-devGraph-2'
from context import tenet
from tenet.transduction.rdfterm_computer import __update_uri_with_prefix
from tenet.transduction import rdfterm_computer, prefix_handle
from tenet.transduction import net
from tenet.scheme.amr_rule.transduction import phenomena_mod_analyzer_1 as rule_1
from tenet.scheme import amr_rule
#==============================================================================
# Useful Methods
#==============================================================================
def load_test_graph(test_file_name):
print(f'\n -- Test Graph Loading')
graph = Graph()
prefix_handle.update_graph_namespacemanager(graph)
graph_path = f'{INPUT_DIR_PATH}{test_file_name}.ttl'
graph.parse(graph_path)
print(f" ----- Graph Loaded ({len(graph)})")
return graph
def define_clause_list(composition_pattern_list):
clause_list = []
for (net_1, relation, net_2) in composition_pattern_list:
clause_list.append(f'{net_1} {relation} {net_2}.')
return clause_list
def print_triple(graph, triple, num=-1):
num_str = f'[{num}]' if num > -1 else '[-]'
(s, p, o) = triple
s = __update_uri_with_prefix(graph, s)
p = __update_uri_with_prefix(graph, p)
o = __update_uri_with_prefix(graph, o)
print(f' {num_str} {s} {p} {o}')
def add_triples_in_graph(test_file_name, graph, triple_list):
print(f'\n -- Adding triple(s) in graph')
print(f" ----- Graph length before update: {len(graph)}")
print(f" ----- Number of triples to add: {len(triple_list)}")
print(f" ----- Added triples:")
n = 0
for triple in triple_list:
n += 1
print_triple(graph, triple, num=n)
graph.add(triple)
print(f" ----- Graph length after update: {len(graph)}")
output_graph_path = f'{OUTPUT_DIR_PATH}{test_file_name}.result.ttl'
output_graph_uri = f'https://amr.tetras-libre.fr/rdf/{test_file_name}/result'
print(f'\n -- Serialize test graph to {output_graph_path}')
graph.serialize(destination=output_graph_path,
format='turtle',
base=output_graph_uri)
#==============================================================================
# Development / Step Test
#==============================================================================
def test_search_pattern_1(graph):
print('\n -- Step 1: Search Pattern')
_, pattern_set = rule_1.__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.class_net_1.n3(graph.namespace_manager)}'
result_str += f' {row.class_net_2.n3(graph.namespace_manager)}'
print(result_str)
print('\n -- Step 2: Disjoint Cover Verification')
result_set = []
return pattern_set
#==============================================================================
# Unit Test
#==============================================================================
def test_rule_application(test_file_name, graph, rule):
print('\n -- Rule Test')
rule_label, new_triple_list = rule(graph)
print(f' ----- label: {rule_label}')
print(f' ----- new_triple_list ({len(new_triple_list)}):')
add_triples_in_graph(test_file_name, graph, new_triple_list)
#==============================================================================
# Test Script
#==============================================================================
if __name__ == '__main__':
print('\n *** Test Preparation ***')
graph_1 = load_test_graph(TEST_FILE_NAME_1)
print('\n \n')
print('\n ///////////////////// Extraction Rule 1')
print('\n *** Step Test ***')
pattern_set = test_search_pattern_1(graph_1)
print('\n \n')
print('\n *** Unit Test ***')
test_rule_application(TEST_FILE_NAME_1, graph_1, rule_1.analyze_phenomena_mod_1)
print('\n \n')
print('\n *** - ***')
\ No newline at end of file
@prefix ns1: <http://amr.isi.edu/frames/ld/v1.2.2/> .
@prefix ns2: <http://amr.isi.edu/rdf/core-amr#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
ns2:Concept a rdfs:Class ;
rdfs:label "AMR-Concept" .
ns2:Role a rdfs:Class ;
rdfs:label "AMR-Role" .
<http://amr.isi.edu/amr_data/asail_odrl_sentences-14#root01> a ns2:AMR ;
ns2:has-id "asail_odrl_sentences-14" ;
ns2:has-sentence "You may distribute the Work." ;
ns2:root <http://amr.isi.edu/amr_data/asail_odrl_sentences-14#p> .
ns1:distribute-01.ARG0 a ns1:FrameRole .
ns1:distribute-01.ARG1 a ns1:FrameRole .
ns1:permit-01.ARG1 a ns1:FrameRole .
ns2:NamedEntity a ns2:Concept ;
rdfs:label "AMR-EntityType",
"AMR-Term" .
<http://amr.isi.edu/amr_data/asail_odrl_sentences-14#d> a ns1:distribute-01 ;
ns1:distribute-01.ARG0 <http://amr.isi.edu/amr_data/asail_odrl_sentences-14#y> ;
ns1:distribute-01.ARG1 <http://amr.isi.edu/amr_data/asail_odrl_sentences-14#w> .
<http://amr.isi.edu/amr_data/asail_odrl_sentences-14#p> a ns1:permit-01 ;
ns1:permit-01.ARG1 <http://amr.isi.edu/amr_data/asail_odrl_sentences-14#d> .
<http://amr.isi.edu/amr_data/asail_odrl_sentences-14#w> a ns1:work-01 .
<http://amr.isi.edu/amr_data/asail_odrl_sentences-14#y> a <http://amr.isi.edu/rdf/amr-terms#you> .
ns1:distribute-01 a ns2:Frame .
ns1:permit-01 a ns2:Frame .
ns1:work-01 a ns2:Frame .
<http://amr.isi.edu/rdf/amr-terms#you> a ns2:Concept .
ns1:FrameRole a ns2:Role ;
rdfs:label "AMR-PropBank-Role" .
ns2:Frame a ns2:Concept ;
rdfs:label "AMR-PropBank-Frame" .
...@@ -29,7 +29,7 @@ from context import tenet ...@@ -29,7 +29,7 @@ from context import tenet
# -- Input Data # -- Input Data
test_data_dir = f'{INPUT_DIR_PATH}amrDocuments/' test_data_dir = f'{INPUT_DIR_PATH}amrDocuments/'
uuid_num = '12' uuid_num = '13'
amrld_dir_path = f'{test_data_dir}dev/asail_odrl_sentences/' amrld_dir_path = f'{test_data_dir}dev/asail_odrl_sentences/'
amrld_file_path = f'{amrld_dir_path}s{uuid_num}.stog.amr.ttl' amrld_file_path = f'{amrld_dir_path}s{uuid_num}.stog.amr.ttl'
base_output_name = f'aos{uuid_num}' base_output_name = f'aos{uuid_num}'
...@@ -51,18 +51,18 @@ technical_dir_path = f'{out_dir_path}technical-data/' ...@@ -51,18 +51,18 @@ technical_dir_path = f'{out_dir_path}technical-data/'
os.chdir('..') os.chdir('..')
# -- Extraction from a file # -- Extraction from a file
# factoids = tenet.create_ontology_from_amrld_file(amrld_file_path, factoids = tenet.create_ontology_from_amrld_file(amrld_file_path,
# onto_prefix=onto_prefix,
# out_file_path=out_file_path,
# technical_dir_path=technical_dir_path)
# -- Extraction from a directory (all files in a directory)
factoids = tenet.create_ontology_from_amrld_dir(amrld_dir_path,
onto_prefix=onto_prefix, onto_prefix=onto_prefix,
out_file_path=out_file_path, out_file_path=out_file_path,
technical_dir_path=technical_dir_path) technical_dir_path=technical_dir_path)
# -- Extraction from a directory (all files in a directory)
# factoids = tenet.create_ontology_from_amrld_dir(amrld_dir_path,
# onto_prefix=onto_prefix,
# out_file_path=out_file_path,
# technical_dir_path=technical_dir_path)
print(factoids) print(factoids)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment