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

New AMR Rule: transduction.phenomena_polarity_analyzer_3

parent 98fe8c23
No related branches found
No related tags found
No related merge requests found
...@@ -13,6 +13,7 @@ from scheme.amr_clara_rule.transduction.composite_class_extractor_2 import * ...@@ -13,6 +13,7 @@ from scheme.amr_clara_rule.transduction.composite_class_extractor_2 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 *
from scheme.amr_clara_rule.transduction.phenomena_polarity_analyzer_3 import *
from scheme.amr_clara_rule.transduction.phenomena_mod_analyzer_1 import * from scheme.amr_clara_rule.transduction.phenomena_mod_analyzer_1 import *
from scheme.amr_clara_rule.transduction.phenomena_or_analyzer_1 import * from scheme.amr_clara_rule.transduction.phenomena_or_analyzer_1 import *
from scheme.amr_clara_rule.transduction.phenomena_or_analyzer_2 import * from scheme.amr_clara_rule.transduction.phenomena_or_analyzer_2 import *
......
#!/usr/bin/python3.10
# -*-coding:Utf-8 -*
#==============================================================================
# TENET: Rule to negative polarity phenomena (rule 3)
#------------------------------------------------------------------------------
# Net Expansion AMR rule to analyse negative polarity phenomena
# Rule: polarity(phenomena, 'negative') => phenomena
#==============================================================================
import rdflib
from rdflib import Graph
import transduction
from transduction import net
from transduction.query_builder import generate_select_query
from transduction.naming_computer import define_axiom_naming
from transduction.naming_computer import define_composite_naming_2
#==============================================================================
# Pattern Search: polarity(phenomena, 'negative')
#==============================================================================
POLARITY_RELATION = 'amr:role_polarity'
PHENOMENA_TYPE_RELATION = 'net:hasPhenomenaType'
POSSIBLE_PHENOMENA_URI = 'amr:phenomena_modality_prohibition'
def __search_pattern(graph):
select_data_list = ['?phenomena_net', '?value_net']
clause_list = [f'?phenomena_net a [rdfs:subClassOf* net:Phenomena_Net].',
f'FILTER NOT EXISTS {{ ?phenomena_net a net:Deprecated_Net. }}',
f'?phenomena_net {PHENOMENA_TYPE_RELATION} {POSSIBLE_PHENOMENA_URI}.',
f'?phenomena_net {POLARITY_RELATION} ?value_net.',
('?value_net', 'net:hasValueLabel', rdflib.term.Literal('negative'))]
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 __filter_relation(relation_list):
result_list = []
for relation in relation_list:
check = True
(s, p, o) = relation
if s == o: check = False
if p == POLARITY_RELATION: check = False
if check: result_list.append(relation)
return result_list
def __propagate_relation(target_net, base_net):
target_net.input_relation_list = base_net.input_relation_list
out_relation_list = __filter_relation(base_net.output_relation_list)
target_net.output_relation_list = out_relation_list
#==============================================================================
# Construct Method(s)
#==============================================================================
def __construct_phenomena_net(graph, origin_phenomena_net, value_net):
# -- Net Composition
new_phenomena_net = net.PhenomenaNet(graph)
new_phenomena_net.compose(origin_phenomena_net, value_net)
# -- Data Computation
new_phenomena_net.phenomena_type = 'amr:phenomena_modality_possible'
new_phenomena_net.phenomena_ref = f'not-{origin_phenomena_net.phenomena_ref}'
# -- Net Naming
new_phenomena_net.naming = 'possible-modality'
# -- Relation Propagation
__propagate_relation(new_phenomena_net, origin_phenomena_net)
# -- Finalization
new_phenomena_net.finalize()
triple_definition = new_phenomena_net.generate_triple_definition()
return new_phenomena_net, triple_definition
#==============================================================================
# Main Method
#==============================================================================
def analyze_phenomena_polarity_3(graph):
# -- Rule Initialization
rule_label = 'analyze "polarity" phenomena (3)'
rule_triple_list = []
# -- Search for patterns
_, pattern_set = __search_pattern(graph)
# -- Pattern Analysis
for pattern in pattern_set:
origin_phenomena_net = net.PhenomenaNet(graph, uri=pattern.phenomena_net)
value_net = net.ValueNet(graph, uri=pattern.value_net)
# -- New Negative Property Net
_, triple_list_1 = __construct_phenomena_net(graph, origin_phenomena_net, value_net)
rule_triple_list += triple_list_1
# -- Deprecation: Origin Class Net
rule_triple_list += origin_phenomena_net.deprecate()
return rule_label, rule_triple_list
\ No newline at end of file
...@@ -184,6 +184,7 @@ atomic_extraction_sequence = ['atomic extraction sequence', ...@@ -184,6 +184,7 @@ atomic_extraction_sequence = ['atomic extraction sequence',
phenomena_analyze_sequence_1 = ['phenomena analyze sequence (1)', 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_mod_1 rule.analyze_phenomena_mod_1
] ]
......
...@@ -399,6 +399,7 @@ ns1:Role rdf:type owl:Class ; ...@@ -399,6 +399,7 @@ ns1:Role rdf:type owl:Class ;
### https://amr.tetras-libre.fr/rdf/schema#phenomena_modality_prohibition ### https://amr.tetras-libre.fr/rdf/schema#phenomena_modality_prohibition
:phenomena_modality_prohibition rdf:type owl:Class ; :phenomena_modality_prohibition rdf:type owl:Class ;
rdfs:subClassOf :phenomena_modality ; rdfs:subClassOf :phenomena_modality ;
:hasConceptLink "prohibit-01" ;
:label "prohibition-modality" . :label "prohibition-modality" .
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -19,11 +19,14 @@ OUTPUT_DIR_PATH = f'{FILE_PATH}/test_data/' ...@@ -19,11 +19,14 @@ OUTPUT_DIR_PATH = f'{FILE_PATH}/test_data/'
TEST_FILE_NAME_1 = 'negation-devGraph-1' TEST_FILE_NAME_1 = 'negation-devGraph-1'
TEST_FILE_NAME_2 = 'negation-devGraph-2' TEST_FILE_NAME_2 = 'negation-devGraph-2'
TEST_FILE_NAME_3 = 'negation-devGraph-3' TEST_FILE_NAME_3 = 'negation-devGraph-3'
TEST_FILE_NAME_4 = 'negation-devGraph-4'
from context import tenet from context import tenet
from tenet.scheme.amr_master_rule.transduction import phenomena_polarity_analyzer_1 as rule_1 from tenet.scheme.amr_master_rule.transduction import phenomena_polarity_analyzer_1 as rule_1
from tenet.scheme.amr_clara_rule.transduction import phenomena_polarity_analyzer_2 as rule_2 from tenet.scheme.amr_clara_rule.transduction import phenomena_polarity_analyzer_2 as rule_2
from tenet.scheme.amr_clara_rule.transduction import phenomena_polarity_analyzer_3 as rule_3
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.transduction import net from tenet.transduction import net
from tenet.transduction.rdfterm_computer import __update_uri_with_prefix from tenet.transduction.rdfterm_computer import __update_uri_with_prefix
...@@ -114,6 +117,17 @@ def test_search_pattern_2(graph): ...@@ -114,6 +117,17 @@ def test_search_pattern_2(graph):
return pattern_set return pattern_set
def test_search_pattern_3(graph):
query_code, pattern_set = rule_3.__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.phenomena_net.n3(graph.namespace_manager)}'
print(result_str)
return pattern_set
#============================================================================== #==============================================================================
# Unit Test # Unit Test
#============================================================================== #==============================================================================
...@@ -138,6 +152,7 @@ if __name__ == '__main__': ...@@ -138,6 +152,7 @@ if __name__ == '__main__':
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) graph_2 = load_test_graph(TEST_FILE_NAME_2)
graph_3 = load_test_graph(TEST_FILE_NAME_3) graph_3 = load_test_graph(TEST_FILE_NAME_3)
graph_4 = load_test_graph(TEST_FILE_NAME_4)
print('\n \n') print('\n \n')
...@@ -198,4 +213,18 @@ if __name__ == '__main__': ...@@ -198,4 +213,18 @@ if __name__ == '__main__':
test_rule_application(TEST_FILE_NAME_3, graph_3, rule.analyze_phenomena_polarity_2) test_rule_application(TEST_FILE_NAME_3, graph_3, rule.analyze_phenomena_polarity_2)
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_4)
print('\n \n')
print('\n *** Unit Test ***')
test_rule_application(TEST_FILE_NAME_4, graph_4, amr_clara_rule.analyze_phenomena_polarity_3)
print('\n \n')
print('\n *** - ***') print('\n *** - ***')
\ No newline at end of file
...@@ -11,7 +11,7 @@ ns1:Role a rdfs:Class ; ...@@ -11,7 +11,7 @@ ns1:Role a rdfs:Class ;
<http://amr.isi.edu/amr_data/document-03#root01> a ns1:AMR ; <http://amr.isi.edu/amr_data/document-03#root01> a ns1:AMR ;
ns1:has-id "document-03" ; ns1:has-id "document-03" ;
ns1:has-sentence "John is not allowed to play the movie.." ; ns1:has-sentence "John is not allowed to play the movie." ;
ns1:root <http://amr.isi.edu/amr_data/document-03#a> . ns1:root <http://amr.isi.edu/amr_data/document-03#a> .
ns3:allow-01.ARG1 a ns3:FrameRole . ns3:allow-01.ARG1 a ns3:FrameRole .
......
@prefix ns1: <http://amr.isi.edu/rdf/core-amr#> .
@prefix ns2: <http://amr.isi.edu/rdf/amr-terms#> .
@prefix ns3: <http://amr.isi.edu/frames/ld/v1.2.2/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
ns1:Concept a rdfs:Class ;
rdfs:label "AMR-Concept" .
ns1:Role a rdfs:Class ;
rdfs:label "AMR-Role" .
<http://amr.isi.edu/amr_data/document-03#root01> a ns1:AMR ;
ns1:has-id "document-03" ;
ns1:has-sentence "John is not allowed to play the movie." ;
ns1:root <http://amr.isi.edu/amr_data/document-03#a> .
ns3:prohibit-01.ARG1 a ns3:FrameRole .
ns3:play-01.ARG0 a ns3:FrameRole .
ns3:play-01.ARG1 a ns3:FrameRole .
<http://amr.isi.edu/amr_data/document-03#a> a ns3:prohibit-01 ;
ns3:prohibit-01.ARG1 <http://amr.isi.edu/amr_data/document-03#p> ;
ns2:polarity "-" .
<http://amr.isi.edu/amr_data/document-03#m> a ns2:movie .
<http://amr.isi.edu/amr_data/document-03#p> a ns3:play-01 ;
ns3:play-01.ARG0 <http://amr.isi.edu/amr_data/document-03#p2> ;
ns3:play-01.ARG1 <http://amr.isi.edu/amr_data/document-03#m> .
<http://amr.isi.edu/amr_data/document-03#p2> a <http://amr.isi.edu/entity-types#person> ;
rdfs:label "John" .
<http://amr.isi.edu/entity-types#person> a ns1:NamedEntity .
ns3:prohibit-01 a ns1:Frame .
ns3:play-01 a ns1:Frame .
ns2:movie a ns1:Concept .
ns1:NamedEntity a ns1:Concept ;
rdfs:label "AMR-EntityType",
"AMR-Term" .
ns1:Frame a ns1:Concept ;
rdfs:label "AMR-PropBank-Frame" .
ns3:FrameRole a ns1:Role ;
rdfs:label "AMR-PropBank-Role" .
...@@ -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 = '03' uuid_num = '06'
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