From 42db5151e1a5134487ceb0ddefecbf44a53db6dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Lamercerie?= <aurelien.lamercerie@tetras-libre.fr> Date: Fri, 3 Mar 2023 10:17:30 +0100 Subject: [PATCH] Main method parsing LN sentences to generate AMR graphs --- .gitignore | 1 + README.md | 41 ++- amrbatch/amrld/.gitignore | 7 - amrbatch/amrld/test/bio_ras_0001_1.json | 61 ---- amrbatch/amrld/test/bio_ras_0001_1.rdf | 39 --- amrbatch/amrld/test/bio_ras_0001_1.txt | 15 - amrbatch/amrld/test/pmid-11777939-32_amr.rdf | 70 ----- amrbatch/amrld/test/pmid-11777939-32_amr.txt | 20 -- amrbatch/amrld/test/test.amr.graph | 12 - amrbatch/amrld/wk/__wk__.txt | 1 + amrbatch/amrld/wk/test-01.stog.amr.nt | 22 ++ amrbatch/amrld/wk/test-01.stog.amr.penman | 4 + amrbatch/amrld/wk/test-02.stog.amr.nt | 19 ++ amrbatch/amrld/wk/test-02.stog.amr.penman | 6 + amrbatch/filepath_manager.py | 112 +++++++ amrbatch/logging.conf | 39 +++ amrbatch/main.py | 295 +++++++++++++++++- tests/amrbatch.log | 48 +++ .../test-01/test-01.stog.amr.dot | 6 + .../Test-20230302/test-01/test-01.stog.amr.nt | 21 ++ .../test-01/test-01.stog.amr.penman | 4 + .../test-01/test-01.stog.amr.png | Bin 0 -> 11670 bytes .../test-01/test-01.stog.amr.ttl | 36 +++ .../test-02/test-02.stog.amr.dot | 9 + .../Test-20230302/test-02/test-02.stog.amr.nt | 18 ++ .../test-02/test-02.stog.amr.penman | 6 + .../test-02/test-02.stog.amr.png | Bin 0 -> 18820 bytes .../test-02/test-02.stog.amr.ttl | 29 ++ tests/output/Test-20230302/test.sentence.txt | 2 + .../test-01/test-01.stog.amr.dot | 6 + .../Test-20230303/test-01/test-01.stog.amr.nt | 22 ++ .../test-01/test-01.stog.amr.penman | 4 + .../test-01/test-01.stog.amr.png | Bin 0 -> 11670 bytes .../test-01/test-01.stog.amr.ttl | 36 +++ .../test-02/test-02.stog.amr.dot | 9 + .../Test-20230303/test-02/test-02.stog.amr.nt | 19 ++ .../test-02/test-02.stog.amr.penman | 6 + .../test-02/test-02.stog.amr.png | Bin 0 -> 18820 bytes .../test-02/test-02.stog.amr.ttl | 29 ++ tests/output/Test-20230303/test.sentence.txt | 2 + tests/test_amrbatch_main.py | 23 +- 41 files changed, 851 insertions(+), 248 deletions(-) delete mode 100644 amrbatch/amrld/.gitignore delete mode 100644 amrbatch/amrld/test/bio_ras_0001_1.json delete mode 100644 amrbatch/amrld/test/bio_ras_0001_1.rdf delete mode 100644 amrbatch/amrld/test/bio_ras_0001_1.txt delete mode 100644 amrbatch/amrld/test/pmid-11777939-32_amr.rdf delete mode 100755 amrbatch/amrld/test/pmid-11777939-32_amr.txt delete mode 100644 amrbatch/amrld/test/test.amr.graph create mode 100644 amrbatch/amrld/wk/__wk__.txt create mode 100644 amrbatch/amrld/wk/test-01.stog.amr.nt create mode 100644 amrbatch/amrld/wk/test-01.stog.amr.penman create mode 100644 amrbatch/amrld/wk/test-02.stog.amr.nt create mode 100644 amrbatch/amrld/wk/test-02.stog.amr.penman create mode 100644 amrbatch/filepath_manager.py create mode 100644 amrbatch/logging.conf create mode 100644 tests/amrbatch.log create mode 100644 tests/output/Test-20230302/test-01/test-01.stog.amr.dot create mode 100644 tests/output/Test-20230302/test-01/test-01.stog.amr.nt create mode 100644 tests/output/Test-20230302/test-01/test-01.stog.amr.penman create mode 100644 tests/output/Test-20230302/test-01/test-01.stog.amr.png create mode 100644 tests/output/Test-20230302/test-01/test-01.stog.amr.ttl create mode 100644 tests/output/Test-20230302/test-02/test-02.stog.amr.dot create mode 100644 tests/output/Test-20230302/test-02/test-02.stog.amr.nt create mode 100644 tests/output/Test-20230302/test-02/test-02.stog.amr.penman create mode 100644 tests/output/Test-20230302/test-02/test-02.stog.amr.png create mode 100644 tests/output/Test-20230302/test-02/test-02.stog.amr.ttl create mode 100644 tests/output/Test-20230302/test.sentence.txt create mode 100644 tests/output/Test-20230303/test-01/test-01.stog.amr.dot create mode 100644 tests/output/Test-20230303/test-01/test-01.stog.amr.nt create mode 100644 tests/output/Test-20230303/test-01/test-01.stog.amr.penman create mode 100644 tests/output/Test-20230303/test-01/test-01.stog.amr.png create mode 100644 tests/output/Test-20230303/test-01/test-01.stog.amr.ttl create mode 100644 tests/output/Test-20230303/test-02/test-02.stog.amr.dot create mode 100644 tests/output/Test-20230303/test-02/test-02.stog.amr.nt create mode 100644 tests/output/Test-20230303/test-02/test-02.stog.amr.penman create mode 100644 tests/output/Test-20230303/test-02/test-02.stog.amr.png create mode 100644 tests/output/Test-20230303/test-02/test-02.stog.amr.ttl create mode 100644 tests/output/Test-20230303/test.sentence.txt diff --git a/.gitignore b/.gitignore index 954ce385..2e448788 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ __pycache__ *.todo *.ttl.tbc *catalog-v001.xml +venv/* diff --git a/README.md b/README.md index ad601ef4..5fc94690 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,48 @@ AMR Batch is a python library to parse natural language sentences in order to bu This library is currently under development, and therefore in unstable state. -## Environment Setup -The python code has been tested under Python 3.7 and Linux Manjaro, but should be run on most common systems (Linux, Windows, Mac). + +### Installation +This project was developp under Python 3.7 and Manjaro Linux system, but should be run on most common systems (Linux, Windows, Mac). All dependencies are listed in requirements.txt. +First, it is recommended to use a [virtual environment](https://docs.python.org/fr/3/tutorial/venv.html). +For example, 'venv' can be create and use with the following commands: + + python3 -m venv venv + + source venv/bin/activate + +The necessary libraries are defined in the file 'requirements.txt', and can be installed in the virtual environment using package installer as pip: + + pip install -r requirements.txt + +See specific installation instructions about amrlib +([amrlib-install](https://amrlib.readthedocs.io/en/latest/install/)). + +So, it is necessary to install the models used by amrlib library. +Models can be downloaded from +[amrlib-models](https://github.com/bjascob/amrlib-models). + +These files need to be extracted and reside in a directory. The path to this directory can then be passed as a parameter of the main method. The model STOG 'xfm_bart_large-v0_1_0' (from source dir 'amrbatch/models/') is used by default if no model is given. + + ## Usage The script **test_amrbatch_main.py** (test directory) gives an example of using the library. +# References +------------------------------------------------------------------------------- + +[amrlib](https://github.com/bjascob/amrlib): +A python library that makes AMR parsing, generation and visualization simple. + + +[amr-ld](https://github.com/BMKEG/amr-ld/): +A Python library for mapping AMRs to linked data formats (such as RDF and JSON-LD). + +Burns, G.A., Hermjakob, U., Ambite, J.L. (2016). +Abstract Meaning Representations as Linked Data. +In: , et al. The Semantic Web – ISWC 2016. ISWC 2016. +Lecture Notes in Computer Science(), vol 9982. Springer, Cham. +https://doi.org/10.1007/978-3-319-46547-0_2 diff --git a/amrbatch/amrld/.gitignore b/amrbatch/amrld/.gitignore deleted file mode 100644 index ee142b2e..00000000 --- a/amrbatch/amrld/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -.project -.pydevproject -.history -.settings -*.pyc -out.rdf -.DS_Store diff --git a/amrbatch/amrld/test/bio_ras_0001_1.json b/amrbatch/amrld/test/bio_ras_0001_1.json deleted file mode 100644 index c790bd5f..00000000 --- a/amrbatch/amrld/test/bio_ras_0001_1.json +++ /dev/null @@ -1,61 +0,0 @@ -[ - { - "root": { - "domain": { - "op1": { - "@id": "g", - "@type": "gene", - "name": { - "@id": "n", - "@type": "name", - "op1": "KRAS" - } - }, - "@id": "a", - "@type": "and", - "op2": { - "@id": "g2", - "@type": "gene", - "name": { - "@id": "n2", - "@type": "name", - "op1": "PIK3CA" - } - }, - "op3": { - "@id": "g3", - "@type": "gene", - "name": { - "@id": "n3", - "@type": "name", - "op1": "BRAF" - } - } - }, - "@id": "o", - "@type": "oncogene", - "location": { - "@id": "c", - "@type": "cancer" - } - }, - "has-date": "2014-08-13T14:22:25", - "@context": { - "and": "http://amr.isi.edu/rdf/core-amr#and", - "oncogene": "http://amr.isi.edu/rdf/core-amr#oncogene", - "kill-01": "https://verbs.colorado.edu/propbank#kill-01", - "name": "http://amr.isi.edu/rdf/core-amr#name", - "cancer": "http://amr.isi.edu/rdf/core-amr#cancer", - "most": "http://amr.isi.edu/rdf/core-amr#most", - "@base": "http://amr.isi.edu/amr_data/bio.ras_0001_1#", - "human": "http://amr.isi.edu/rdf/core-amr#human", - "gene": "http://amr.isi.edu/entity-types#gene", - "root": "http://amr.isi.edu/rdf/core-amr#root", - "frequent": "http://amr.isi.edu/rdf/core-amr#frequent", - "mutate-01": "https://verbs.colorado.edu/propbank#mutate-01" - }, - "@id": "bio.ras_0001_1", - "@type": "http://amr.isi.edu/rdf/core-amr#AMR", - "has-sentence": "The most frequently mutated oncogenes in the deadliest cancers responsible for human mortality are KRAS , PIK3CA and BRAF ." - } -] \ No newline at end of file diff --git a/amrbatch/amrld/test/bio_ras_0001_1.rdf b/amrbatch/amrld/test/bio_ras_0001_1.rdf deleted file mode 100644 index 642dab56..00000000 --- a/amrbatch/amrld/test/bio_ras_0001_1.rdf +++ /dev/null @@ -1,39 +0,0 @@ -<http://amr.isi.edu/amr_data/bio.ras_0001_1#k> <http://amr.isi.edu/rdf/core-amr#ARG1> <http://amr.isi.edu/amr_data/bio.ras_0001_1#h> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#root01> <http://amr.isi.edu/rdf/core-amr#has-sentence> "The most frequently mutated oncogenes in the deadliest cancers responsible for human mortality are KRAS , PIK3CA and BRAF ." . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#f> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#frequent> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#n> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#name> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#g2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/entity-types#gene> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#a> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#and> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#o> <http://amr.isi.edu/rdf/core-amr#location> <http://amr.isi.edu/amr_data/bio.ras_0001_1#c> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#root01> <http://amr.isi.edu/rdf/core-amr#has-id> "bio.ras_0001_1" . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#m> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#most> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#f> <http://amr.isi.edu/rdf/core-amr#degree> <http://amr.isi.edu/amr_data/bio.ras_0001_1#m3> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#n2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#name> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#n3> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#name> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#root01> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#AMR> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#a> <http://amr.isi.edu/rdf/core-amr#op3> <http://amr.isi.edu/amr_data/bio.ras_0001_1#g3> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#k> <http://amr.isi.edu/rdf/core-amr#ARG0> <http://amr.isi.edu/amr_data/bio.ras_0001_1#c> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#a> <http://amr.isi.edu/rdf/core-amr#op1> <http://amr.isi.edu/amr_data/bio.ras_0001_1#g> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#n2> <http://amr.isi.edu/rdf/core-amr#op1> "PIK3CA" . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#g> <http://amr.isi.edu/rdf/core-amr#name> <http://amr.isi.edu/amr_data/bio.ras_0001_1#n> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#m3> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#most> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#o> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#oncogene> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#m2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://verbs.colorado.edu/propbank#mutate-01> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#k> <http://amr.isi.edu/rdf/core-amr#degree> <http://amr.isi.edu/amr_data/bio.ras_0001_1#m> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#m2> <http://amr.isi.edu/rdf/core-amr#frequency> <http://amr.isi.edu/amr_data/bio.ras_0001_1#f> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#k> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://verbs.colorado.edu/propbank#kill-01> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#h> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#human> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#g3> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/entity-types#gene> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#root01> <http://amr.isi.edu/rdf/core-amr#root> <http://amr.isi.edu/amr_data/bio.ras_0001_1#o> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#c> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#cancer> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#n3> <http://amr.isi.edu/rdf/core-amr#op1> "BRAF" . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#o> <http://amr.isi.edu/rdf/core-amr#TOP> <http://amr.isi.edu/amr_data/bio.ras_0001_1#o> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#o> <http://amr.isi.edu/rdf/core-amr#domain> <http://amr.isi.edu/amr_data/bio.ras_0001_1#a> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#g2> <http://amr.isi.edu/rdf/core-amr#name> <http://amr.isi.edu/amr_data/bio.ras_0001_1#n2> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#g> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/entity-types#gene> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#n> <http://amr.isi.edu/rdf/core-amr#op1> "KRAS" . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#m2> <http://amr.isi.edu/rdf/core-amr#ARG1> <http://amr.isi.edu/amr_data/bio.ras_0001_1#o> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#g3> <http://amr.isi.edu/rdf/core-amr#name> <http://amr.isi.edu/amr_data/bio.ras_0001_1#n3> . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#root01> <http://amr.isi.edu/rdf/core-amr#has-date> "2014-08-13T14:22:25" . -<http://amr.isi.edu/amr_data/bio.ras_0001_1#a> <http://amr.isi.edu/rdf/core-amr#op2> <http://amr.isi.edu/amr_data/bio.ras_0001_1#g2> . - diff --git a/amrbatch/amrld/test/bio_ras_0001_1.txt b/amrbatch/amrld/test/bio_ras_0001_1.txt deleted file mode 100644 index c79b0e4d..00000000 --- a/amrbatch/amrld/test/bio_ras_0001_1.txt +++ /dev/null @@ -1,15 +0,0 @@ -# ::id bio.ras_0001_1 ::date 2014-08-13T14:22:25 -# ::snt The most frequently mutated oncogenes in the deadliest cancers responsible for human mortality are KRAS , PIK3CA and BRAF . - -(o / oncogene - :domain (a / and - :op1 (g / gene :name (n / name :op1 "KRAS")) - :op2 (g2 / gene :name (n2 / name :op1 "PIK3CA")) - :op3 (g3 / gene :name (n3 / name :op1 "BRAF"))) - :location (c / cancer - :ARG0-of (k / kill-01 - :ARG1 (h / human) - :degree (m / most))) - :ARG1-of (m2 / mutate-01 - :frequency (f / frequent - :degree (m3 / most)))) diff --git a/amrbatch/amrld/test/pmid-11777939-32_amr.rdf b/amrbatch/amrld/test/pmid-11777939-32_amr.rdf deleted file mode 100644 index 9c69ec8b..00000000 --- a/amrbatch/amrld/test/pmid-11777939-32_amr.rdf +++ /dev/null @@ -1,70 +0,0 @@ -@prefix ns1: <http://amr.isi.edu/rdf/core-amr#> . -@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . -@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . -@prefix xml: <http://www.w3.org/XML/1998/namespace> . -@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#root01> a ns1:AMR ; - ns1:has-date "2015-02-27T00:14:25" ; - ns1:has-id "pmid_1177_7939.32" ; - ns1:has-sentence "In previous studies, we showed that Sos-1, E3b1, and Eps8 could form a trimeric complex in vivo upon concomitant overexpression of the three proteins." ; - ns1:root <http://amr.isi.edu/amr_data/pmid_1177_7939.32#s> . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#c> a ns1:concomitant . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#e2> a <http://amr.isi.edu/entity-types#enzyme> ; - ns1:name <http://amr.isi.edu/amr_data/pmid_1177_7939.32#n3> . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#f> a <https://verbs.colorado.edu/propbank#form-01> ; - ns1:ARG0 <http://amr.isi.edu/amr_data/pmid_1177_7939.32#a> ; - ns1:ARG1 <http://amr.isi.edu/amr_data/pmid_1177_7939.32#m> ; - ns1:condition <http://amr.isi.edu/amr_data/pmid_1177_7939.32#o> ; - ns1:manner <http://amr.isi.edu/amr_data/pmid_1177_7939.32#i> ; - ns1:mod <http://amr.isi.edu/amr_data/pmid_1177_7939.32#p> . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#i> a ns1:in-vivo . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#m> a <http://amr.isi.edu/entity-types#macro-molecular-complex> ; - ns1:mod <http://amr.isi.edu/amr_data/pmid_1177_7939.32#t> . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#n> a ns1:name ; - ns1:op1 "Sos-1" . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#n2> a ns1:name ; - ns1:op1 "E3b1" . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#n3> a ns1:name ; - ns1:op1 "Eps8" . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#o> a <https://verbs.colorado.edu/propbank#overexpress-00> ; - ns1:ARG2 <http://amr.isi.edu/amr_data/pmid_1177_7939.32#a> ; - ns1:manner <http://amr.isi.edu/amr_data/pmid_1177_7939.32#c> . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#p> a ns1:possible . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#p2> a <http://amr.isi.edu/entity-types#protein> ; - ns1:name <http://amr.isi.edu/amr_data/pmid_1177_7939.32#n> . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#p3> a <http://amr.isi.edu/entity-types#protein> ; - ns1:name <http://amr.isi.edu/amr_data/pmid_1177_7939.32#n2> . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#p5> a ns1:previous . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#s2> a ns1:study ; - ns1:time <http://amr.isi.edu/amr_data/pmid_1177_7939.32#p5> . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#t> a ns1:trimeric . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#w> a ns1:we . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#a> a ns1:and ; - ns1:op1 <http://amr.isi.edu/amr_data/pmid_1177_7939.32#p2> ; - ns1:op2 <http://amr.isi.edu/amr_data/pmid_1177_7939.32#p3> ; - ns1:op3 <http://amr.isi.edu/amr_data/pmid_1177_7939.32#e2> . - -<http://amr.isi.edu/amr_data/pmid_1177_7939.32#s> a <https://verbs.colorado.edu/propbank#show-01> ; - ns1:ARG0 <http://amr.isi.edu/amr_data/pmid_1177_7939.32#w> ; - ns1:ARG1 <http://amr.isi.edu/amr_data/pmid_1177_7939.32#f> ; - ns1:TOP <http://amr.isi.edu/amr_data/pmid_1177_7939.32#s> ; - ns1:medium <http://amr.isi.edu/amr_data/pmid_1177_7939.32#s2> . - diff --git a/amrbatch/amrld/test/pmid-11777939-32_amr.txt b/amrbatch/amrld/test/pmid-11777939-32_amr.txt deleted file mode 100755 index d53255b7..00000000 --- a/amrbatch/amrld/test/pmid-11777939-32_amr.txt +++ /dev/null @@ -1,20 +0,0 @@ -# ::id pmid_1177_7939.32 ::date 2015-02-27T00:14:25 ::authors mrizea -# ::snt In previous studies, we showed that Sos-1, E3b1, and Eps8 could form a trimeric complex in vivo upon concomitant overexpression of the three proteins. -# ::note Sentence+ loaded by script SntLoaderUlf1.7.pl -# ::save-date Wed Apr 1, 2015 ::user bbadarau ::file pmid_1177_7939_32.txt -(s / show-01 - :ARG0 (w / we) - :ARG1 (f / form-01 - :ARG0 (a / and - :op1 (p2 / protein :name (n / name :op1 "Sos-1")) - :op2 (p3 / protein :name (n2 / name :op1 "E3b1")) - :op3 (e2 / enzyme :name (n3 / name :op1 "Eps8"))) - :ARG1 (m / macro-molecular-complex - :mod (t / trimeric)) - :mod (p / possible) - :manner (i / in-vivo) - :condition (o / overexpress-00 - :ARG2 a - :manner (c / concomitant))) - :medium (s2 / study - :time (p5 / previous))) \ No newline at end of file diff --git a/amrbatch/amrld/test/test.amr.graph b/amrbatch/amrld/test/test.amr.graph deleted file mode 100644 index d374bd90..00000000 --- a/amrbatch/amrld/test/test.amr.graph +++ /dev/null @@ -1,12 +0,0 @@ -# ::id test-1 -# ::snt The sun is a star. -(s / star - :domain (s2 / sun)) - -# ::id test-2 -# ::snt Earth is a planet. -(p / planet - :domain p - :name (n / name - :op1 "Earth")) - diff --git a/amrbatch/amrld/wk/__wk__.txt b/amrbatch/amrld/wk/__wk__.txt new file mode 100644 index 00000000..8d1c8b69 --- /dev/null +++ b/amrbatch/amrld/wk/__wk__.txt @@ -0,0 +1 @@ + diff --git a/amrbatch/amrld/wk/test-01.stog.amr.nt b/amrbatch/amrld/wk/test-01.stog.amr.nt new file mode 100644 index 00000000..49251ca4 --- /dev/null +++ b/amrbatch/amrld/wk/test-01.stog.amr.nt @@ -0,0 +1,22 @@ +<http://amr.isi.edu/amr_data/test-01#root01> <http://amr.isi.edu/rdf/core-amr#has-sentence> "The sun is a star." . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-EntityType" . +<http://amr.isi.edu/rdf/core-amr#Frame> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Concept> . +<http://amr.isi.edu/rdf/core-amr#Concept> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Concept" . +<http://amr.isi.edu/amr_data/test-01#s> <http://amr.isi.edu/rdf/amr-terms#domain> <http://amr.isi.edu/amr_data/test-01#s2> . +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Role> . +<http://amr.isi.edu/entity-types#star> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#NamedEntity> . +<http://amr.isi.edu/amr_data/test-01#root01> <http://amr.isi.edu/rdf/core-amr#has-id> "test-01" . +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-PropBank-Role" . +<http://amr.isi.edu/rdf/amr-terms#domain> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Role> . +<http://amr.isi.edu/rdf/core-amr#Role> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> . +<http://amr.isi.edu/amr_data/test-01#s> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/entity-types#star> . +<http://amr.isi.edu/amr_data/test-01#root01> <http://amr.isi.edu/rdf/core-amr#root> <http://amr.isi.edu/amr_data/test-01#s> . +<http://amr.isi.edu/rdf/core-amr#Frame> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-PropBank-Frame" . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Concept> . +<http://amr.isi.edu/rdf/core-amr#Concept> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> . +<http://amr.isi.edu/amr_data/test-01#root01> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#AMR> . +<http://amr.isi.edu/amr_data/test-01#s2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/amr-terms#sun> . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Term" . +<http://amr.isi.edu/rdf/amr-terms#sun> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Concept> . +<http://amr.isi.edu/rdf/core-amr#Role> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Role" . + diff --git a/amrbatch/amrld/wk/test-01.stog.amr.penman b/amrbatch/amrld/wk/test-01.stog.amr.penman new file mode 100644 index 00000000..4f70746d --- /dev/null +++ b/amrbatch/amrld/wk/test-01.stog.amr.penman @@ -0,0 +1,4 @@ +# ::id test-01 +# ::snt The sun is a star. +(s / star + :domain (s2 / sun)) \ No newline at end of file diff --git a/amrbatch/amrld/wk/test-02.stog.amr.nt b/amrbatch/amrld/wk/test-02.stog.amr.nt new file mode 100644 index 00000000..92e70c98 --- /dev/null +++ b/amrbatch/amrld/wk/test-02.stog.amr.nt @@ -0,0 +1,19 @@ +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Term" . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Concept> . +<http://amr.isi.edu/rdf/core-amr#Concept> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> . +<http://amr.isi.edu/amr_data/test-02#root01> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#AMR> . +<http://amr.isi.edu/amr_data/test-02#p> <http://www.w3.org/2000/01/rdf-schema#label> "Earth" . +<http://amr.isi.edu/rdf/core-amr#Concept> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Concept" . +<http://amr.isi.edu/amr_data/test-02#root01> <http://amr.isi.edu/rdf/core-amr#root> <http://amr.isi.edu/amr_data/test-02#p> . +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Role> . +<http://amr.isi.edu/rdf/core-amr#Role> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Role" . +<http://amr.isi.edu/rdf/core-amr#Frame> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Concept> . +<http://amr.isi.edu/entity-types#planet> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#NamedEntity> . +<http://amr.isi.edu/amr_data/test-02#p> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/entity-types#planet> . +<http://amr.isi.edu/amr_data/test-02#root01> <http://amr.isi.edu/rdf/core-amr#has-id> "test-02" . +<http://amr.isi.edu/amr_data/test-02#root01> <http://amr.isi.edu/rdf/core-amr#has-sentence> "Earth is a planet." . +<http://amr.isi.edu/rdf/core-amr#Frame> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-PropBank-Frame" . +<http://amr.isi.edu/rdf/core-amr#Role> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-EntityType" . +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-PropBank-Role" . + diff --git a/amrbatch/amrld/wk/test-02.stog.amr.penman b/amrbatch/amrld/wk/test-02.stog.amr.penman new file mode 100644 index 00000000..c43f2d1e --- /dev/null +++ b/amrbatch/amrld/wk/test-02.stog.amr.penman @@ -0,0 +1,6 @@ +# ::id test-02 +# ::snt Earth is a planet. +(p / planet + :domain p + :name (n / name + :op1 "Earth")) \ No newline at end of file diff --git a/amrbatch/filepath_manager.py b/amrbatch/filepath_manager.py new file mode 100644 index 00000000..4075cff5 --- /dev/null +++ b/amrbatch/filepath_manager.py @@ -0,0 +1,112 @@ +#!/usr/bin/python3.10 +# -*-coding:Utf-8 -* + +#============================================================================== +# AMR Batch: Filepath Manager +#------------------------------------------------------------------------------ +# Handler to manage file paths. +#============================================================================== + +import sys, os, glob +import shutil + +# Reference Suffix +TEXT_SUFFIX = ".txt" +SENTENCE_SUFFIX = ".sentence.txt" +PENMAN_AMR_GRAPH_SUFFIX = ".stog.amr.penman" +DOT_AMR_GRAPH_SUFFIX = ".stog.amr.dot" +PNG_AMR_GRAPH_SUFFIX = ".stog.amr.png" +AMR_RDF_SUFFIX = ".stog.amr.nt" +AMR_TTL_SUFFIX = ".stog.amr.ttl" + +# AMRLD Parameters +LIB_PATH = os.path.dirname(os.path.abspath(__file__)) + '/' +AMRLD_DIR = f'{LIB_PATH}amrld/' +WK_DIR = 'wk/' +AMRLD_WORKDIR = AMRLD_DIR + WK_DIR + + +#============================================================================== +# Class +#============================================================================== + +class FilepathManager: + """ Class to handle filepaths. + """ + + #-------------------------------------------------------------------------- + # Constructor + #-------------------------------------------------------------------------- + + def __init__(self, input_filepath, output_dirpath=None): + + self.base_reference = os.path.splitext(os.path.basename(input_filepath))[0] + + self.input_filepath = input_filepath + self.input_dirpath = os.path.dirname(input_filepath) + + if output_dirpath is None: + self.output_dirpath = self._input_dirpath + else: + self.output_dirpath = output_dirpath + + + #-------------------------------------------------------------------------- + # Filepath Accessors + #-------------------------------------------------------------------------- + + def get_workdata_output_dirpath(self, data_ref): + return f'{self.output_dirpath}{data_ref}/' + + def get_sentence_output_filepath(self): + return f'{self.output_dirpath}{self.base_reference}{SENTENCE_SUFFIX}' + + def get_data_output_filepath(self, data): + return f'{self.output_dirpath}{data["output_data_dir"]}' + + def get_penman_amr_graph_output_filepath(self, data): + dirpath = self.get_data_output_filepath(data) + filename = f'{data["data_ref"]}{PENMAN_AMR_GRAPH_SUFFIX}' + return f'{dirpath}{filename}' + + def get_dot_amr_graph_output_filepath(self, data): + dirpath = self.get_data_output_filepath(data) + filename = f'{data["data_ref"]}{DOT_AMR_GRAPH_SUFFIX}' + return f'{dirpath}{filename}' + + def get_png_amr_graph_output_filepath(self, data): + dirpath = self.get_data_output_filepath(data) + filename = f'{data["data_ref"]}{PNG_AMR_GRAPH_SUFFIX}' + return f'{dirpath}{filename}' + + def get_amr_rdf_triple_output_filepath(self, data): + dirpath = self.get_data_output_filepath(data) + filename = f'{data["data_ref"]}{AMR_RDF_SUFFIX}' + return f'{dirpath}{filename}' + + def get_amr_rdf_turtle_output_filepath(self, data): + dirpath = self.get_data_output_filepath(data) + filename = f'{data["data_ref"]}{AMR_TTL_SUFFIX}' + return f'{dirpath}{filename}' + + def get_amr_graph_amrld_filepath(self, data): + dirpath = f'{AMRLD_WORKDIR}' + filename = f'{data["data_ref"]}{PENMAN_AMR_GRAPH_SUFFIX}' + return f'{dirpath}{filename}' + + def get_amr_rdf_amrld_filepath(self, data): + dirpath = f'{AMRLD_WORKDIR}' + filename = f'{data["data_ref"]}{AMR_RDF_SUFFIX}' + return f'{dirpath}{filename}' + + def get_amr_graph_wk_filepath(self, data): + dirpath = f'{WK_DIR}' + filename = f'{data["data_ref"]}{PENMAN_AMR_GRAPH_SUFFIX}' + return f'{dirpath}{filename}' + + def get_amr_rdf_wk_filepath(self, data): + dirpath = f'{WK_DIR}' + filename = f'{data["data_ref"]}{AMR_RDF_SUFFIX}' + return f'{dirpath}{filename}' + + diff --git a/amrbatch/logging.conf b/amrbatch/logging.conf new file mode 100644 index 00000000..6006ebdb --- /dev/null +++ b/amrbatch/logging.conf @@ -0,0 +1,39 @@ +[loggers] +keys=root + +[handlers] +keys=consoleSimpleHandler,consoleWarningHandler,fileHandler + +[formatters] +keys=simpleFormat,warningFormat,fileFormat + +[logger_root] +level=DEBUG +handlers=consoleWarningHandler,consoleSimpleHandler,fileHandler + +[handler_consoleSimpleHandler] +class=StreamHandler +level=INFO +formatter=simpleFormat +args=(sys.stdout,) + +[handler_consoleWarningHandler] +class=StreamHandler +level=WARNING +formatter=warningFormat +args=(sys.stdout,) + +[handler_fileHandler] +class=FileHandler +level=DEBUG +formatter=fileFormat +args=('amrbatch.log', 'w+', 'utf8') + +[formatter_simpleFormat] +format=%(message)s + +[formatter_warningFormat] +format=%(asctime)s - %(levelname)s (%(name)s, %(lineno)d) + +[formatter_fileFormat] +format= - %(levelname)s - %(message)s diff --git a/amrbatch/main.py b/amrbatch/main.py index a60a622b..336a0df2 100644 --- a/amrbatch/main.py +++ b/amrbatch/main.py @@ -8,39 +8,278 @@ #============================================================================== import sys, os, glob -import shutil +import shutil, re +import subprocess +import amrlib from rdflib import Graph +import traceback +import logging.config +from amrlib.graph_processing.amr_plot import AMRPlot +from filepath_manager import FilepathManager +# -- Config File Path +LIB_PATH = os.path.dirname(os.path.abspath(__file__)) + '/' +LOGGING_CONF_FILE_PATH = f'{LIB_PATH}logging.conf' +CONFIG_FILE_PATH = f'{LIB_PATH}config.xml' + +# AMRLD Parameters +AMRLD_DIR = f'{LIB_PATH}amrld/' +AMRLD_WORKDIR = f'{AMRLD_DIR}wk/' + +# -- Logging +logging.config.fileConfig(LOGGING_CONF_FILE_PATH, disable_existing_loggers=True) +logger = logging.getLogger('root') + + + +#============================================================================== +# Functions to manage in-process data +#============================================================================== + +def is_valid_sentence(sentence): + """ True if the sentence is correct. + """ + is_empty = ((sentence == "") | (sentence == "\n")) + lang_mark_re = re.compile("\([a-z]+\)(.)*") + is_language_mark = lang_mark_re.match(sentence) is not None + return not (is_empty | is_language_mark) + + +def clean_sentence(sentence): + """ Sentence cleanup as needed """ + sentence = re.sub("(\.)*\\n", "", sentence) + return sentence + + +def define_new_data(base_ref, number, sentence): + + number_str = str(number).rjust(2,"0") + data_ref = base_ref + "-" + number_str + output_data_dir = data_ref + "/" + id_line_str = "# ::id " + data_ref + "\n" + sentence = clean_sentence(sentence) + sentence += "." + + new_data = { + "base_ref" : data_ref, + "number" : number, + "output_data_dir" : output_data_dir, + "data_ref" : data_ref, + "id_line_str" : id_line_str, + "sentence" : sentence, + "graph" : "" + } + return new_data + + +def get_amr_graph_list(workdata_list): + amr_graph_list = [] + for workdata in workdata_list: + amr_graph_list.append(workdata['graph']) + return amr_graph_list + #============================================================================== -# Steps +# Preparation Steps #============================================================================== -# TODO +def __prepare_workdata(filepath_manager): + logger.info('-- Reading input files to recover a list of sentences') + input_filepath = filepath_manager.input_filepath + base_reference = filepath_manager.base_reference + + workdata_list = list() + + sentence_number = 0 + with open(input_filepath, "r") as reading_file: # r = read + for line in reading_file.readlines(): + sentences = line.split(". ") + for sentence in sentences: + if is_valid_sentence(sentence): + sentence_number += 1 + new_data = define_new_data(base_reference, sentence_number, sentence) + workdata_list.append(new_data) + logger.debug(f' *** sentence {sentence_number} *** \n{new_data}') + + logger.info(f'----- number of sentences: {len(workdata_list)}') + return workdata_list + + +def __build_output_dir_tree(filepath_manager, workdata_list): + base_output_dirpath = filepath_manager.output_dirpath + logger.debug(f'-- Making output directory tree ({base_output_dirpath})') + os.makedirs(base_output_dirpath, exist_ok=True) + for data in workdata_list: + output_dir = filepath_manager.get_workdata_output_dirpath(data["output_data_dir"]) + os.makedirs(output_dir, exist_ok=True) + + +def __generate_sentence_file(filepath_manager, workdata_list): + sentence_filepath = filepath_manager.get_sentence_output_filepath() + logger.debug(f"-- Generating sentence file ") + with open(sentence_filepath, "w") as writing_file: # w = write + first = True + for workdata in workdata_list: + if not first: writing_file.write("\n") + writing_file.write(workdata["sentence"]) + first = False + + #============================================================================== -# AMR Main Methods +# Conversion Steps #============================================================================== -def parse_sentences_from_file(input_file_path, - output_penman_file_path=None, - technical_dir_path=None): +def __generate_penman_amr_graph(filepath_manager, data): + """ AMR graph generation in penman format """ + + graph = data["graph"] + output_filepath = filepath_manager.get_penman_amr_graph_output_filepath(data) + logger.debug(f"----- AMR Graph file (penman): {os.path.basename(output_filepath)}") + with open(output_filepath, "w") as writing_file: # w = write + writing_file.write(data["id_line_str"]) + writing_file.write(graph) + + + +def __generate_dot_amr_graph(filepath_manager, data): + """ AMR graph generation in dot and png format """ + + graph = data["graph"] + + try: + # -- generating dot/png files using AMRLib and GraphViz + dot_filename = filepath_manager.get_dot_amr_graph_output_filepath(data) + format = 'png' + logger.debug(f'----- AMR Graph file (dot): {os.path.basename(dot_filename)}') + plot = AMRPlot(dot_filename, format) + plot.build_from_graph(graph) + plot.graph.render() + + render_fn = dot_filename + '.' + format # -- renaming PNG file + good_png_fn = filepath_manager.get_png_amr_graph_output_filepath(data) + logger.debug(f'----- AMR Graph file (png): {{os.path.basename(good_png_fn)}}') + os.rename(render_fn, good_png_fn) + + except: + logger.warning('Exception when trying to plot') + traceback.print_exc() + + + + +def __convert_sentences_to_graphs(amr_model, workdata_list): + """ Converting text sentences to AMR graphs """ + + logger.info("-- Loading AMR model") + stog = amrlib.load_stog_model(model_dir=amr_model) + + logger.info("-- Converting sentences to AMR graphs") + wd_number = 0 + for data in workdata_list: + wd_number += 1 + stog_result = stog.parse_sents([data["sentence"]]) + logger.info(f'----- Sentence {wd_number} successfully processed') + logger.debug(stog_result) + data["graph"] = stog_result[0] + + logger.info(f'----- Total processed graph number: {wd_number}') + return workdata_list + + + +def __generate_amr_graph_files(filepath_manager, workdata_list): + logger.info("-- Generating AMR graph files") + for data in workdata_list: + __generate_penman_amr_graph(filepath_manager, data) + __generate_dot_amr_graph(filepath_manager, data) + + + +#============================================================================== +# Serialization Steps +#============================================================================== + +def __serialize_amr_graph_to_rdf_triple(filepath_manager, data): + """ Serialize AMR graph to AMR-RDF triple """ + + # -- Filepath + input_file = filepath_manager.get_penman_amr_graph_output_filepath(data) + input_amrld_file = filepath_manager.get_amr_graph_amrld_filepath(data) + output_amrld_file = filepath_manager.get_amr_rdf_amrld_filepath(data) + input_wk_file = filepath_manager.get_amr_graph_wk_filepath(data) + output_wk_file = filepath_manager.get_amr_rdf_wk_filepath(data) + amr_triple_file = filepath_manager.get_amr_rdf_triple_output_filepath(data) + + # -- AMR-LD processing + amrld_process = ["python3", "amr_to_rdf.py", + "-i", input_wk_file, + "-o", output_wk_file] + if (os.path.isfile(input_file)): + logger.info("-- Serialize AMR graphs to RDF using amr-ld library") + logger.debug(f'----- penman filepath: {input_file}') + logger.debug(f'----- AMRLD filepath: {input_amrld_file}') + shutil.copyfile(input_file, input_amrld_file) + current_dirpath = os.getcwd() + os.chdir(AMRLD_DIR) + subprocess.run(amrld_process) + os.chdir(current_dirpath) + + # -- Copy result + if (os.path.isfile(output_amrld_file)): + logger.info(f'-- Generating AMR RDF file (triple): {os.path.basename(amr_triple_file)}') + shutil.copyfile(output_amrld_file, amr_triple_file) + + +def __convert_rdf_triple_to_rdf_turtle(filepath_manager, data): + """ Converting AMR-RDF triple to AMR-RDF turtle """ + + # -- Filepath + amr_triple_file = filepath_manager.get_amr_rdf_triple_output_filepath(data) + amr_turtle_file = filepath_manager.get_amr_rdf_turtle_output_filepath(data) + + # -- Conversion + if (os.path.isfile(amr_triple_file)): + logger.info(f'-- Generating AMR RDF file (turtle): {os.path.basename(amr_turtle_file)}') + g = Graph() + g.parse(amr_triple_file) + g.serialize(destination=amr_turtle_file, format='turtle') + + + +def __convert_amr_graphs_to_rdf(filepath_manager, data_list): + """ Converting AMR graphs to AMR-RDF """ + + for data in data_list: + __serialize_amr_graph_to_rdf_triple(filepath_manager, data) + __convert_rdf_triple_to_rdf_turtle(filepath_manager, data) + + + +#============================================================================== +# Main Method(s) +#============================================================================== + +def parse_sentences_from_file(input_filepath, + amr_model_path, + output_dirpath=None, + amrld_serialization=False): """ Method to parse an input file containing natural language sentences and construct the corresponding AMR graphs (and their RDF serializations if required). The method returns an AMR graph string in PENMAN format. AMR graphs are also - serialized in RDF turtle format using the AMR-LD library if requested - (by defining output_turtle_file_path as a parameter). + serialized in RDF turtle format using the AMR-LD library if required + (by defining turtle_output_file_path as parameter). Parameters ---------- - input_file_path: a path to a text file. - output_penman_file_path: a file path where the output graphs is written in PENMAN format if defined (the function still outputs the string). - output_turtle_file_path: a file path where the output AMRLD representation is written in TURTLE format if defined. + input_filepath: a path to a text file. + output_dirpath: a directory path where the output data are written if defined (the function still outputs the string). + turtle_output_file_path: a file path where the output AMRLD representation is written in TURTLE format if defined. technical_dir_path: a dir path where some technical and log files are written if defined. Returns @@ -49,7 +288,35 @@ def parse_sentences_from_file(input_file_path, """ - pass + logger.info('[AMR Batch] NL Document Parsing') + + # -- Prepare the sentences to be converted + logger.info('\n === Preparation === ') + filepath_manager = FilepathManager(input_filepath, output_dirpath) + logger.info(f'-- base reference: {filepath_manager.base_reference}') + logger.info(f'-- input filepath: {filepath_manager.input_filepath}') + logger.info(f'-- output dirpath: {filepath_manager.output_dirpath}') + assert os.path.exists(input_filepath), f'input file does not exists ({input_filepath})' + workdata_list = __prepare_workdata(filepath_manager) + __build_output_dir_tree(filepath_manager, workdata_list) + __generate_sentence_file(filepath_manager, workdata_list) + + # -- Convert sentences to graphs + logger.info('\n === Text Convert to AMR Graphs === ') + logger.info(f'-- library: amrlib') + logger.debug(f' ({AMRLD_DIR})') + logger.info(f'-- model: {os.path.basename(amr_model_path)}') + logger.debug(f' ({amr_model_path})') + logger.debug(f'-- working directory: {AMRLD_WORKDIR}') + workdata_list = __convert_sentences_to_graphs(amr_model_path, workdata_list) + __generate_amr_graph_files(filepath_manager, workdata_list) + + if amrld_serialization==True: + # -- Convert graphs to RDF + logger.info('\n === AMR Graphs Serialization to AMR-RDF Representation === ') + logger.info("-- library: amrlk") + __convert_amr_graphs_to_rdf(filepath_manager, workdata_list) + - return '' + return get_amr_graph_list(workdata_list) diff --git a/tests/amrbatch.log b/tests/amrbatch.log new file mode 100644 index 00000000..1c35a300 --- /dev/null +++ b/tests/amrbatch.log @@ -0,0 +1,48 @@ +- INFO - [AMR Batch] NL Document Parsing +- INFO - + === Preparation === +- INFO - -- base reference: test +- INFO - -- input filepath: /home/lamenji/Workspace/Tetras/amrbatch/tests/input/test.txt +- INFO - -- output dirpath: /home/lamenji/Workspace/Tetras/amrbatch/tests/output/Test-20230303/ +- INFO - -- Reading input files to recover a list of sentences +- DEBUG - *** sentence 1 *** +{'base_ref': 'test-01', 'number': 1, 'output_data_dir': 'test-01/', 'data_ref': 'test-01', 'id_line_str': '# ::id test-01\n', 'sentence': 'The sun is a star.', 'graph': ''} +- DEBUG - *** sentence 2 *** +{'base_ref': 'test-02', 'number': 2, 'output_data_dir': 'test-02/', 'data_ref': 'test-02', 'id_line_str': '# ::id test-02\n', 'sentence': 'Earth is a planet.', 'graph': ''} +- INFO - ----- number of sentences: 2 +- DEBUG - -- Making output directory tree (/home/lamenji/Workspace/Tetras/amrbatch/tests/output/Test-20230303/) +- DEBUG - -- Generating sentence file +- INFO - + === Text Convert to AMR Graphs === +- INFO - -- library: amrlib +- DEBUG - (/home/lamenji/Workspace/Tetras/amrbatch/amrbatch/amrld/) +- INFO - -- model: model_parse_xfm_bart_large-v0_1_0 +- DEBUG - (/home/lamenji/Workspace/Tetras/amrbatch/tests/../amr_models/model_parse_xfm_bart_large-v0_1_0) +- DEBUG - -- working directory: /home/lamenji/Workspace/Tetras/amrbatch/amrbatch/amrld/wk/ +- INFO - -- Loading AMR model +- INFO - -- Converting sentences to AMR graphs +- INFO - ----- Sentence 1 successfully processed +- DEBUG - ['# ::snt The sun is a star.\n(s / star\n :domain (s2 / sun))'] +- INFO - ----- Sentence 2 successfully processed +- DEBUG - ['# ::snt Earth is a planet.\n(p / planet\n :domain p\n :name (n / name\n :op1 "Earth"))'] +- INFO - ----- Total processed graph number: 2 +- INFO - -- Generating AMR graph files +- DEBUG - ----- AMR Graph file (penman): test-01.stog.amr.penman +- DEBUG - ----- AMR Graph file (dot): test-01.stog.amr.dot +- DEBUG - ----- AMR Graph file (png): {os.path.basename(good_png_fn)} +- DEBUG - ----- AMR Graph file (penman): test-02.stog.amr.penman +- DEBUG - ----- AMR Graph file (dot): test-02.stog.amr.dot +- DEBUG - ----- AMR Graph file (png): {os.path.basename(good_png_fn)} +- INFO - + === AMR Graphs Serialization to AMR-RDF Representation === +- INFO - -- library: amrlk +- INFO - -- Serialize AMR graphs to RDF using amr-ld library +- DEBUG - ----- penman filepath: /home/lamenji/Workspace/Tetras/amrbatch/tests/output/Test-20230303/test-01/test-01.stog.amr.penman +- DEBUG - ----- AMRLD filepath: /home/lamenji/Workspace/Tetras/amrbatch/amrbatch/amrld/wk/test-01.stog.amr.penman +- INFO - -- Generating AMR RDF file (triple): test-01.stog.amr.nt +- INFO - -- Generating AMR RDF file (turtle): test-01.stog.amr.ttl +- INFO - -- Serialize AMR graphs to RDF using amr-ld library +- DEBUG - ----- penman filepath: /home/lamenji/Workspace/Tetras/amrbatch/tests/output/Test-20230303/test-02/test-02.stog.amr.penman +- DEBUG - ----- AMRLD filepath: /home/lamenji/Workspace/Tetras/amrbatch/amrbatch/amrld/wk/test-02.stog.amr.penman +- INFO - -- Generating AMR RDF file (triple): test-02.stog.amr.nt +- INFO - -- Generating AMR RDF file (turtle): test-02.stog.amr.ttl diff --git a/tests/output/Test-20230302/test-01/test-01.stog.amr.dot b/tests/output/Test-20230302/test-01/test-01.stog.amr.dot new file mode 100644 index 00000000..57af6466 --- /dev/null +++ b/tests/output/Test-20230302/test-01/test-01.stog.amr.dot @@ -0,0 +1,6 @@ +digraph amr_graph { + rankdir=LR size="12,8" + s [label="s/star" shape=circle] + s2 [label="s2/sun" shape=circle] + s -> s2 [label=":domain"] +} diff --git a/tests/output/Test-20230302/test-01/test-01.stog.amr.nt b/tests/output/Test-20230302/test-01/test-01.stog.amr.nt new file mode 100644 index 00000000..6ebc9919 --- /dev/null +++ b/tests/output/Test-20230302/test-01/test-01.stog.amr.nt @@ -0,0 +1,21 @@ +<http://amr.isi.edu/rdf/core-amr#Concept> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> . +<http://amr.isi.edu/entity-types#star> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#NamedEntity> . +<http://amr.isi.edu/rdf/core-amr#Frame> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Concept> . +<http://amr.isi.edu/rdf/amr-terms#sun> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Concept> . +<http://amr.isi.edu/amr_data/test-01#root01> <http://amr.isi.edu/rdf/core-amr#has-sentence> "The sun is a star." . +<http://amr.isi.edu/amr_data/test-01#s2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/amr-terms#sun> . +<http://amr.isi.edu/rdf/core-amr#Role> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Term" . +<http://amr.isi.edu/rdf/core-amr#Concept> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Concept" . +<http://amr.isi.edu/amr_data/test-01#s> <http://amr.isi.edu/rdf/amr-terms#domain> <http://amr.isi.edu/amr_data/test-01#s2> . +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Role> . +<http://amr.isi.edu/rdf/amr-terms#domain> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Role> . +<http://amr.isi.edu/amr_data/test-01#s> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/entity-types#star> . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Concept> . +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-PropBank-Role" . +<http://amr.isi.edu/rdf/core-amr#Frame> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-PropBank-Frame" . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-EntityType" . +<http://amr.isi.edu/rdf/core-amr#Role> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Role" . +<http://amr.isi.edu/amr_data/test-01#root01> <http://amr.isi.edu/rdf/core-amr#has-id> "test-01" . +<http://amr.isi.edu/amr_data/test-01#root01> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#AMR> . +<http://amr.isi.edu/amr_data/test-01#root01> <http://amr.isi.edu/rdf/core-amr#root> <http://amr.isi.edu/amr_data/test-01#s> . diff --git a/tests/output/Test-20230302/test-01/test-01.stog.amr.penman b/tests/output/Test-20230302/test-01/test-01.stog.amr.penman new file mode 100644 index 00000000..4f70746d --- /dev/null +++ b/tests/output/Test-20230302/test-01/test-01.stog.amr.penman @@ -0,0 +1,4 @@ +# ::id test-01 +# ::snt The sun is a star. +(s / star + :domain (s2 / sun)) \ No newline at end of file diff --git a/tests/output/Test-20230302/test-01/test-01.stog.amr.png b/tests/output/Test-20230302/test-01/test-01.stog.amr.png new file mode 100644 index 0000000000000000000000000000000000000000..1184e154c13d623631e31e54b8ebd114be61aca3 GIT binary patch literal 11670 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 literal 0 HcmV?d00001 diff --git a/tests/output/Test-20230302/test-01/test-01.stog.amr.ttl b/tests/output/Test-20230302/test-01/test-01.stog.amr.ttl new file mode 100644 index 00000000..4ad04c79 --- /dev/null +++ b/tests/output/Test-20230302/test-01/test-01.stog.amr.ttl @@ -0,0 +1,36 @@ +@prefix ns1: <http://amr.isi.edu/rdf/core-amr#> . +@prefix ns2: <http://amr.isi.edu/rdf/amr-terms#> . +@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/test-01#root01> a ns1:AMR ; + ns1:has-id "test-01" ; + ns1:has-sentence "The sun is a star." ; + ns1:root <http://amr.isi.edu/amr_data/test-01#s> . + +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> a ns1:Role ; + rdfs:label "AMR-PropBank-Role" . + +ns2:domain a ns1:Role . + +ns1:Frame a ns1:Concept ; + rdfs:label "AMR-PropBank-Frame" . + +<http://amr.isi.edu/amr_data/test-01#s> a <http://amr.isi.edu/entity-types#star> ; + ns2:domain <http://amr.isi.edu/amr_data/test-01#s2> . + +<http://amr.isi.edu/amr_data/test-01#s2> a ns2:sun . + +<http://amr.isi.edu/entity-types#star> a ns1:NamedEntity . + +ns2:sun a ns1:Concept . + +ns1:NamedEntity a ns1:Concept ; + rdfs:label "AMR-EntityType", + "AMR-Term" . + diff --git a/tests/output/Test-20230302/test-02/test-02.stog.amr.dot b/tests/output/Test-20230302/test-02/test-02.stog.amr.dot new file mode 100644 index 00000000..1b8f97f7 --- /dev/null +++ b/tests/output/Test-20230302/test-02/test-02.stog.amr.dot @@ -0,0 +1,9 @@ +digraph amr_graph { + rankdir=LR size="12,8" + p [label="p/planet" shape=circle] + n [label="n/name" shape=circle] + p -> p [label=":domain"] + p -> n [label=":name"] + node_0 [label="\"Earth\"" shape=rectangle] + n -> node_0 [label=":op1"] +} diff --git a/tests/output/Test-20230302/test-02/test-02.stog.amr.nt b/tests/output/Test-20230302/test-02/test-02.stog.amr.nt new file mode 100644 index 00000000..2cdb95fe --- /dev/null +++ b/tests/output/Test-20230302/test-02/test-02.stog.amr.nt @@ -0,0 +1,18 @@ +<http://amr.isi.edu/amr_data/test-02#root01> <http://amr.isi.edu/rdf/core-amr#has-id> "test-02" . +<http://amr.isi.edu/amr_data/test-02#root01> <http://amr.isi.edu/rdf/core-amr#root> <http://amr.isi.edu/amr_data/test-02#p> . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Concept> . +<http://amr.isi.edu/rdf/core-amr#Concept> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Concept" . +<http://amr.isi.edu/rdf/core-amr#Role> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> . +<http://amr.isi.edu/rdf/core-amr#Frame> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Concept> . +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Role> . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-EntityType" . +<http://amr.isi.edu/rdf/core-amr#Concept> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> . +<http://amr.isi.edu/rdf/core-amr#Frame> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-PropBank-Frame" . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Term" . +<http://amr.isi.edu/amr_data/test-02#p> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/entity-types#planet> . +<http://amr.isi.edu/amr_data/test-02#p> <http://www.w3.org/2000/01/rdf-schema#label> "Earth" . +<http://amr.isi.edu/rdf/core-amr#Role> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Role" . +<http://amr.isi.edu/entity-types#planet> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#NamedEntity> . +<http://amr.isi.edu/amr_data/test-02#root01> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#AMR> . +<http://amr.isi.edu/amr_data/test-02#root01> <http://amr.isi.edu/rdf/core-amr#has-sentence> "Earth is a planet." . +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-PropBank-Role" . diff --git a/tests/output/Test-20230302/test-02/test-02.stog.amr.penman b/tests/output/Test-20230302/test-02/test-02.stog.amr.penman new file mode 100644 index 00000000..c43f2d1e --- /dev/null +++ b/tests/output/Test-20230302/test-02/test-02.stog.amr.penman @@ -0,0 +1,6 @@ +# ::id test-02 +# ::snt Earth is a planet. +(p / planet + :domain p + :name (n / name + :op1 "Earth")) \ No newline at end of file diff --git a/tests/output/Test-20230302/test-02/test-02.stog.amr.png b/tests/output/Test-20230302/test-02/test-02.stog.amr.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf17ae6265b900965bce09be359fa5500c2400f GIT binary patch literal 18820 zcmeAS@N?(olHy`uVBq!ia0y~yU{YsbVA#pQ#=yYvdGY+?3=9lxN#5=*4F5rJ!QSPQ z85k58JY5_^D(1YoTN%;&^S}Lv=b7qT_&dFBURvj|=(19Z<R(6^Z>ei8-}ou<*f{Nt ziA1ur_ZgSY2~V7*XU%Z&jGWAMHKfJscIE$nAKw0v5nWk)u6EV+$Gc*#m(2ft=l%1{ zbG21-f7j{T9Ft&HY!Ptk$T>0Xu@xhTd7^!V1&HqOS@@_$z==cAsI^Pji9@mFgou_O zhhmF>Qm|A^;il5pVHTE_2Tz{l^q!{k(25VF<;a?YqUz3VJO^i)W*0m?C90yPRwVnp zJ0&IMz~RHpii(Oc?jU6;)0nO^?hAQ-ZtlgM#pxd^Y}PHV+4$o}#T>g@sav;hN!U~v zTrULKH1o=XuE}jVH#Q{hD19xqtK{XOQV}N(MVGX|LZ#HOu&@|+g%$y)lv!uQ)z8nf zJ=`a2Jz>IxhP1P@4xT;BdwIG4`ojN@9wo_G7O@Bl3Z6KBzP+!H@6Me&26cZbG&D6C z8Oq+>={#`2fx%&W-rWs(cdc^n?UDTW@#BSS*N#om41VzDO^>*KT*B>bxgK6#P3zX_ zrJb3<Xl=b)EBDyZqYsaC3h$`@ZzqwwVcWK2XJ#5-+?E^t&`y5)&)fO?ug*w4Jx#Zx zzrTIiGPQmGer5Ma8oSx-_i^G-T*5e^lW$}G{e7+5x0|P(pVzx-lhMO(M~=8eL_|Dz zaIjgzBtu}C&&;Nt9-f-dXU(t5sVgfpU%PfKVq+3()wegDKR-V|eC3Kr@$+-8>*MxL zm_D7ILBgUy;o6$W<{djMT-@Cc-@Yv!yQ}2jnVH5Dr%h|C`}^zRiHXV|zI|(JZDn2N zJG;%g{M~_r2N!y&--)mL$!c5u&84!^GVR=)&WXzIN){Fp&z?Q=@beRU_dRj;$B!Sc z=JogW9c$qfPDn{<xw$!g@scGh$;bPS&a<sP^7FMCDEy@-Gj?`%_8fm~sH&>^?a$BR zhh^E>*=!9*j~?xOvp@B;7+V9cgn>hf_5Abc3=uv)Jtw{yr=K%mICJ>0bIR^nv!o_Z zo}B#s-Cg0l>K`8znGcAFir&1u+`sj<u#k`h!?uElP7{-B{{Q`+^Xtn?rQ4rAf1bH) znVPg!NygOctClT0_U6r-Rd>%l{uohIw5cFEFi<f2;v&|~Teq&=WUtsFaLFU}qr~Li z&`x=~8V*%eRS5|R1_n8siUz&dT??YO=k2KezV5`n^YiW7=gpI2<B@3K7T0572nr5P z%*p9l7rR?YRdwm9kEJCg6XwtFpEE}$BQukc;mXyk3zsf!J>D<R{XMzIF)&bY*|KFG z9v%XD`kI=JU0qx@HZ}qxA}V+O{rH%?V%4fezO&7g-hO?5U;g^~cy~v~#uH_wrKKfr zZ;5W)xG{8Fc2<^>scC4+?wK<si;9XSOrHGtWxN8&@fInkedbU0n`_niXU?=~Yz!Iq z_tj3VEiEloR9CNZU$yDLh3nVXfBW(4*RK<2&mNtu?%#5h^TWQ3p91~Io12=ProKIO z>J&r6rAt8*-&R#sad2@RdU|^L#HmwT4;^x1a0m(#irZh;+ttN&;`Hh8*)NmhYrlq0 z&DD+C;*ge>wsxLBhhmEfn^Ewbnl+W5pD{F;=idvdT(f2kk9_=xz|hdOh4l;-e}8Q~ zQTHeyDvFDpon1vm<-qad?1$U=-A_-`Wn@?#w)W80?CYzZsI&+;omhS{r!XluxA)oE z*~*rdlCG|<hmu$s-rd_9{j|UC`@6drSA}Y;sH;DIdwYAv#YL?jHoke2V^jM}B=`0< z(bqD{hK7b6{r$&R1TNlC_}FdYaT8P1qt`&?&ZQ|Q-ekyzhKB0I?U7g?xA)McrQV7H z91IMstgI3HYAUBDuUN4n;qI<d4GoQk{(k;br%y97yuY{i@SUB-fni~7XJ?y-@01OZ zcXM-_FnRLfx3{;u{%X0izh2(Z&@d^xUBHPWGib+~zGzKF#f7&nT8WB^<{a%3_3`xV zeEH&qL3DI<T0+7Bzd05MpFDj!v#pKo@#mj!9v$sI^!&~J{qtYGdS&G6>zkIHefr9k zD=p_&mb|%Pc<lM-nS1uwWZ&GR`uOut9X-9ipTB<_+s!{;VIvnD9-dxfH~;S5>glqU zMJ^UX9>KwrKmM#Kdwos!m_#x=zg)_#Teo~%U0ZM7x@DxTt^MrPt5a{@ypdpd_Tt5f zy5Dcjw<RC%)5@J^UB2#^&i1^!Ni}x!x8~fObn^6RkQIOa{$2XrzE!}9<6+yIzH2`( zyuQAE;-pDTs;a6pX3hkq<-oweL($f1YHAsGcWo`GZ**w*{r$bNy}kUcTem{5J@WMT zUvH#!?9wHn{QLVvC3iCK*&qAm(^GGo%1<sSyQfYSy>j&`;~x2wpMQKz-c$9J>+S9B z?!Ujioj7Gm%bhzh4DYSK8Xa3zlJoY`QtnfyPOUn7=<&yb-`{d4zCCvA*wr!tP>~`v zF=wVGxUz9#NIC5?A6)-T@Cum&s*hZjop=+Flqt-?Qt{~t=REuRKJ)y05AN<Rzi{PB zOIsV;tu2|#mzIM(s5t5JlJ3b*o}{p_vn#8puyAs6R{Z{!+xuHeLgK)|gN*Cet&=cL z>p5Yg1*+%-=d0aRG*eMwiQbmu=;Fe1YfEPH!DjZw;p^izY}nxN``g=#n^L_^vaj*{ z{Q2|5`Sb2>ZfyVl{mwsf<cNZik&u^{*9?P1CNcfE9zI#Cg1<!^iY*h4Ey?V?=IQBq z@XycBg+D)~?%2Ki@bTm9=gysrH!+N^tFz;ix9hpPyIk4WSlD~I-qA}-y%#Q8q;&8} zi-42I<clR;lkNZgU@m@krg7y;&9XN)7^|y)SIMqlvxaBizI_q9%XDvT&+mWmAfe>V zjX<AFPQ{i9YO6o;tETlN{`>QDhFPvuO-)U~-(O#=#MKxUtXR?E+Aa3*-QC>*p`opF z=gR8E?ow$x0<!AzwH52<aIi3)nPJFWS663I_C~_3S4wqaSyy+rVd<+77FJe86&03s z>(&Wnf-?k@)c4%EqS|2zudl5I6)OuIn^kU2b5LlQK3)9WJlpOM9|~^Vy5+US7F6X; z%-VDGWPJVKR!(8H2mSW{4lMDUyyQ|^WTYghZd6fGQ7|+VymjkVQ08<{W^<8BFZ}f7 zWpG49M8c&do*%w`otkxfecaxrrAt-UtX*69>r3X!ZN8wgiK%zJMPkpvt5-!WEiF5` zyC0`?<cEZa#KgpGsQ+K*GtVaS)mu>7;f;8#?Z?E-Y?yXN;>fXMi_*`}oAY#reZ3tM z6Vrze51k+8Y;tvV-BI+EOGH%k;iE@~BF#YUj5gDCkCv=i!=t9Awqg7B_WASWmq!*A z7hhZ%tX@%3vB0^VZ%4sHro1~l8b5t1`t#+of5grr)#X1yO&7_jcUN4y_Ve}n{S)TR z>pMMNzxa|}GLNUH=Z>16MtX63Iu<QblCh}}ICbijhPHOIgF?feJvJpJB^D>$K^|l2 zU1pKklX!WVuY`S_4G#~`l6(J7PuEXOO>O=1r9?wR!$Cp7K|z3l!OP35<#%XE$OR2K zCl19Y!cu2>HU<U;f*LIS{ru{0vokUh?(M03@UcQeUte5I?dn2pbx?$#mGUhtdT~MV z#;se24jpRR%wuO~w_)?<=0%GhsefM#ZuqT?T&&^O)!kkA>4|4Wb#?J9XFor_<9)Kt zd-nW6QKJ{TtL4xkr;3V-0$El!H@ArWb+#2Yaa;ROpFHX4?CgAMB`7PjEe;e>e|~Om z^V+q#U%q_V(Z|Fv!#rP3Mn-1U-o2Msg=(KTY1$QU4QgNt_C8wwWU2S`2k+jUE9FtN zw6y&3^QWWZ!dD3zy1Kf2LV`{lioEX4`hJ@>ZJID^R@c7T-$k;nEejVaZp*nD^i=C) zczo^AKqXMpOU(Fi^yJmm;R_cmXo%ZeRVcf(D{^z%!J|iApM2|Ew@$CU6BJuFuRrLX zyu1AUp&K_McGUIiJp5Q;QSw4y%G9Zh3|(DaCPAPy|Feh9-uX>4JO729#n1Jt&YhmF z4{Bh2`BL)a$rA;0bMeZ`%8Jj=co`NfSir#4$e^XAm2qv2<dY{)7A#$=`seyGUug*` zsY3@2I7C!jaq;)(zr8*G_?MTL6$Lm}oaa<*5%?s@yU${0{eQbTbLXzEU9)G8%=Wyy zPBAeuLPA0lX3Xe#@+3t>M1<pe=G9fAB_$;b)~@ZHrW?(~aOKJs1$FiI@bz&Ik9La- zaIl;>ecCxLPOhl9_~W~~)(r30_iV|&&iCxuvke<IG%Q`JTJ`l6tFyE7M48~_ey$D< z42KRKLUKXnj}MAz=jL!S2yn3ccs{?r;Nc-w7dN*@$9knTw6vOb?Xo&^_H1HqZf~cs z`Xc9czC+sbT3TB1chc(W>@HopG-2AbwswAbB|}3&MMcFMn^Hlg{Dp0~(O+I(X8-%^ z>)`{9%oq37R?AovFr=lWl{^KNy+3*6l6wke7p<FTU(aW2Yy0QZX?+hrKevnwjiTb> zh3nVzhlhuQ4EXl#+lyOUvwJ5m>I^O{G<@{vQNi0=rZIb~L?=$1sG+0NGIOS68^3%X zs1tDQn%Ljp-=|lIff7RFsk{wGJ#%t&%HH4WoviM^XvGSSZ{NOs`0$}&_ik$+U*Da5 z><|8C9l3b%qDB2b8^3urojpA~peEYAd-rCTWD4Edl6kn)1yn3tGg<R!$%YLA?fmk` z-tYh42Wn6sI>dDE-aQH1DwA8=^Us&=@lWbeR8wO+-Y<WAWAgD2&(2EoNE)#eKR?&n z-OYXdBPh{DUNq>Myk?Egn;RRM_y7NA4JvBu{#5wPx05X^D~oYoJ-Ph-y@yXuPQJ0b zTz}Ex#fiDOyz=t$;9kKwEpLxtkg0d}R*Uz`+q*?YNzJpX?V2-3CNcfXq)9?krc7C| zVg-kd9RI6VuNdx?CtSaHv2ofov69l##Egs%K3S^;+1J+@7#S^ks>G35k+R$3<muCg zm-)`#kbInPOU6Z}$?E>cnpnA|uDYac&%b}{+S=%c@89#=+S=;G?*pZqzi&<*YcVO& z)YR<g=x|6$QF-+E@x)oPxQ<DPh>C(DjG38vOXg*^sHmt5*RHi~+GI3k>eP#SDvJ${ zeRy?Mo8f)?zi=_bnKNg4czZkN<>@gvgocWyrKN!i+U{;{8Cltd%a$E`dRnceW?qh% zx~r?}jV+nNX8HGcKn=a<Z9JRP&aS$AVpf}ysi|o8^>s%#CLh1Bvp7BH))vlYHr_{8 zVv0$h-`q5AX=_tbQeqMm6s-98h&5_!7OUO-emUE!1BVVVJ$v@dz`$TddEvijXQh`c zSpuqtIy*Z%`udK|wJtyK_+vtHGIM%*`i@<@4&A&tb6uE_QgzB|P>pl{zC5V9ULC%E zL(R{kGxP1`SFKtV<34#7JHK4Q(^FG9czBK+Xk^}4`Z{dJj2Q*8-4m=TzrT|O)r`vS zeGd+`at8zjIlaHP_u+#F4R*D^4qUt_=;h@Vbn?@)v(hp9>tv_v#U5JfJzYRvo}ZVO zw@1p9D=seX#pUJwAw>dCcG}WDZcCOeGcq?fKlb?JjOo+Gt3N(sy*|-GR9gD<n>TM} zELx-#y{kmC`ujWC>k~OvZvF6~;Mv=^XQQ@c9Go&`%8d<)hi{ymte*O+_Ro`(!rRK; zMqS%koX*xTbJna)UteF}{QUg<V%gpa%k;WGKU%VAQB&^ST~kf-@6DMxbLPhV|NqT? z?P0Wd&z?ECx3~4KT(xRb-rZdrZ`_Djrz{wx+~{!N+#JipRo~v6WY_?b0GapZP0qT- zwP7(aGPCXL?Ji%unCRu@b>{TxZrh3v4X-0wOhWI7sY^;qo;iB7RZ~lAlYIT3iBqRc zDUftev#tEpvUBH7LsnK+kUPWT;?9+-IJIbLY2BD<oF4K0-CfE4<H^o#Jc-xW$3M3U zn>%I7lnsa5`8WH`wK8;db$#~q>CvE|pdEd#9>IrW3yXez$y~N_<;h(oFAqI>^k_%d z#RLu(rfs#q%a$!#bm-TYmxqmvjd%9BaB%bRq#QeT%*WBOv9hXa)9&*3MY5hcUf$j} z7dp2`OxKH@F=vj<Y=cCm>Tho(uW#hY)Y`Pfj<LZ(;lQfU)ejy%WaQ`PKXUx|;bX_# zZW&6+$o03ga*I7U)+>GD?Ag}dUfxBE7VYSBowdTfU+&=DyRwVj``enEncv;t&u?#U zU-J4|@9T`Dg)3HY<mcyu`b6vZ|8vU8(b-k@wk!AcwuO84%z0hWVp4ZWr}f^R%EN5D zQb(ptoqBU$?e8TwOBM$O1RQYdkvJ$KB64G0?Cu?X&a);=nk2NX?r#;ymmt6E#qK&% zs<Ki;PcO~>&j;q<z`#T?F|jwNrfSEyD=jgcd@pxy{r|tyzrMLSd28O?T?g;=Pg7-T zZ20?q|Nm4Qx&FV;?f*Zt;>%=8N=llsaibxqCv$sOskXMZ_G7C_S8Qv3OyHHVnDDW} z#;o>NNmxY0iBc6Osl_@g&lH1Nc03XW463TC9NgT_&(F<Oy_+(*@W}~5pSf0|^XARF zu{~ejSHty4pCPDcmi+Y8)ED>n+kbm=liAkRc3pCzmVtr5=Crd;v(0h~9v$g)E4J<y zkesOd(N6v3$&)W`Z`T(Q5h?ikDpbqoNY0}pouJm~$H&JFv#w}}h>I7?cA6+vR#r+_ zm1u;miD(qn4tsEBrm^on1IC8H#cmJ3y}ca}9^Srot!_<i?an?IkHtzCAE}s`iPir4 z;@Hk73#x5?1x%i>(79bnM~5dcFtDJ!{P^wd`8)euq#CoYuRD0^6j%AXJB}qKCfC+P zI(NUQT@bswtfQyr$ezm2AMTdlKY07Lw5zLY%yFe9ffH`z&Rw!Z#lp(!(7}U@jEs!E zRk1RWh0o8)etCVJf7-NZ7Ul2eTv^7d-s_)`pkQNbdvSk#y^K`}$E;biV%#TXDk>^| z`1Z|hx!>G^cXuo^GBXQhJ14aH7-hdsNlOD6SyffFqvWN~Ec1N5cWNHILc+oapMN$i zc;FyoUDmVj<s|*G4-Xtcjeg_wb4S+i|L667VN}(hABJo^5}*i**-^mw>(?((l2|BI zKY#L_J25+U?sW9^<yBNv44L6Ev$d7Asi~>p)fLS%bFHVpwph}5b3-CCX#DE^{{M2; z<?ogpdcrLsE&ce^RBcd+2O6@PF$0_!bT-y~0=2eZuix*MnW=f`(4hqj7b>1RJUObU ztgLPSe*16l?sm_w|2Ols#S+GZp2Tx=EJ4ldZ*Oike|>$uSazl3rK?w6U0hgtdV3$f zdDHXy`ubwo&IxRuIY&Dk6b`(&xOn2MSzQ}87`%A(s_XTIC48V}L45sR(bZvVo954# zzh2nU6TK;g^V{3o?ZWDQ3CDUQV~%HDFflPH`1r{6#_ijO@7|U5^z;OI{-9v={K=uK z!xBF~JKNFM=XQRc?a@LHCAMxc-9!2N|F+GTArTQ7St#3nVnMI8dD6{IsTLI<6!z@h zyR+|d#-8f$e9UY-2Nt{cgHn%#lvEKYmYi&4lbV~GA3l88xVQRy(yc9-k2u_pEZMV1 z=I`(C$1gAU7ZewF-+rs3W3hXG(xW4tH}+H-*VNSP=)3%4Pu*WBKR-WEV{={H-mYtF zqd`7zTk!9wXIh$?j;=1q(7(UGcWX-sE}k<-rsVxS*>B&zad2=vu;QBtYL-dZ)mVt> z$NAJwR(Wx>TfCs4pkdoKvqOguUtHwMy-rzB>Gi8{P=D~@_D|8<^DcU-A6~R*(Suj7 zx@v!aOZ@cYWXy3zncemO?Q(K+L4B$>_xH=&$o0SW=)DDMA20Wp-?3xIf&2I8zqV*O zvFn$p`t5DGhc7Ml{`mcVJ*Y&SbFhO&Cvp?Z?(+9;Nl8jpB`*$?${d<l{{G&=^7r=+ zsj6mdvU}Ol(a|t_wshIsTdgyV(~D%=1tP<~KT<I@6@B*XS;Vdq&9L=xy6+NPn7q8b z6O)sfV`F1mT3at}f2x-C?95Dy!bdER9zR~`F?G}bKhNz!p_i1Dl#rWywp7L`CG>9h z<bQvED=RBAZ_mHqwrSI*9nFHAJL~>h$;ikQJUGB8HS;3NT#G`c`!%0=K^@1WBOL1< zn^?-<<Jw>OSuJX7*3nWGr<B0EU6bwq{}GOhi|gp@Y@9oHu1b?2=PdhryMMo4>)TX( zXmERPqPTM9O3)bb63@vQqOp9o_5Wn9UArb>kigI<V|fVVnv2uL)sG%MYG7#SxWDdi zMu{Ku*I!?=OI}`L1&y?RdwY9lpYxKG3kw`ioH^qX6C?B0_+f;H2S*!^WK*}e{-LvH zdqLqmOJCow?$1Z}oV&Y3zrVllKHDr;MYPA`#=X7OhUM>KRMgZKWnW(xb6ioV?9&s^ z9ywbnK|#R>pMS<2S7dPOlj*cBf2Uw*I58|&-Q~)3QT6}-e(U%2^lV5v%B2&(FJ{ug zj+W4nkOQ}FNzJt`cS}f6xL(-7A}T6+@X8etKR-WEg1=sP;{VALC&0t$B`<^4L~ZQ? zIc$=C^wf&S$9h4%p=W1jtFLr$@p|&~>Bh3RQ7o*ipduIKs4Zz{r9?zT5)QZV#<(lW zXWZXs`|tDo{|}zeuXoGJ(z;&AF;R2tzM@G}r?Ms|C$EX#&c`jTH>E^RiM7Y@%ZrQ5 zpz%#UzGqf^6C0*X5s8S3I&}TI_~!KU&#d@<dPGJ_u359@!p3BGD|XJG|Fi0&)1RK2 zYEkfj;nJl`FaBjH7d<;8$s=zk<LT-7;@Vp2>xCUNDyym<eS3S`!^fv(&YT-!it0%v z4-c{K*u7g>Pp?mHv&xgbw?skh(hJwGA3xN}{qkOh@?nYQnKLEdynUPbB~*FxtXW-p zvAZ68cz77piN9WWLjB8|o5H_-{krnMd&2ju>(8HDSm>;wr*~{k<YpDw4iCxx<A)Em zau<Gi5tx#mUM$<*aq-vJ*9+IL?>9_7Rv_D2bL`X8(}E%*ElZZDtXnLgB%D?H^vI=4 zLbg?37UW;+y|TOf{etDo+f}`%CA_?}H0HQs(uA2aJNsm<lb)ZO3mOc%UU(wi;8;Rp zBBQpp_K%-G3uTv|?Cj`p@blxlZa7OvTwMIcix)LJUVh$Qnv|TJn4jPO`uh6C>F4K7 z^7XJVuK!mv$G%>UU*2wsX}MHmE4R3kh6YE!ob4jc>rx${Y;f=1y&dK6<$8L1clKRg zVqs<V2-Kc9p0P<uS=oMGJ;+=>84Ct(Zf-3fshuw`FMs^;@$rtXu18i}E0=?2YOG2) zxW#l999qICX<epsYg=x2?eA}evP(T@8K?6}B!BVm`oC$@rmR2zKc0NFWXl#2b^m!w zSRc(|C@wCJh>m`|e*ZtPQ4by@h=_?L9ctl>aaW9Yh>Me(H*cOr)fWvdEv+4W&K%3_ zBImTUwm!VNI$XjuYs!{S0(`x))?$v1jvAo$3)f0^dwY8x34?}d(=!_O?A`nE%}rw$ zH@70$Rsp}-O%|LS91idA?OnKjz5ZI87U$$+J&tj4a)%Bd-r48$N<&?pU0gq|W%_jS z>wzA!CGYM?g5t+-<C2rBH(CgCuyFA59{up}@Y0#>1uLA}`8I6YbZBSs^BsLouU@>k zxH#k99!t=m*t*3NtUi7E<dl%0aBpAj=~9uETpSz@`|JL$Fi>W&3!L-k^LcyFkpBY5 z<|Q-R3vwPDXasdzuN!*E{`~zr`OAxopxg#>L9etq-_oT^IXF2VT6Kk}sHz@3dXyDZ z-9J4&{o|LH!RwR-B?FQRg`}joYHMp}UE0$rX;GjM6de5V#YN?Hizn!Rd39C$$noRJ zA08Zxaaa5b8g`gxTm9(M)6+5T6L+xl%N@9RQ!@Ej&%##C&JL;W$tzZ9?AW!-%b0s2 z<F{|$0zyNV@>TK%q@<`wBo~yFJh9?hsV*))UG3s`Z*Onz@^^O*u8G{7QKzc3=oWae z%{=dp!+g8iC3D*gd;$XnZL7Z>*_wTQN1xNa02ddQHEY%^Si1CRsYsCjxpU_#{`@e! zbm`KLKBd5@s3?<FJt5u;clClsO#%Z2Wn^TQ%xymb?q1!$KY#PL`}=CU6`k8S>hJ9+ zRQ~k&GpNl8s!G+=)PDT?{eE@LioLbJ#g6yMI_Ko*fCeIBV`F)w&3NSG<mTIaJ3U>$ z@WTVgJ+;5ZKyEtJ$_<*YU}0rFc>lh<s;cUXtE<KL{eHJQEBwj7=kx0yJb&Ka&M)ue z=*T#2+O!#l$!%BMceb{-CqFpQ7?eBN!|naOy%*O+8oRi-B!DZ_gWcl#pi#>^dn$!N zm4S)LkrNY@K@Gl#cJJQ3)6mmnV*pKXoH}(1l$1f^-e$SC5)QR+f~t~m{YDdmt8tb) zD?h7Uxq1~ev6}f@(dfXrbA0`Bwue@SuU~R0E+9aFjbBb@PtV##i<(TcuN^pZ2GoMR zv7=DAskzxO?~Vm%kfQ$2NA@>w--3pY9vXIacVAo=YyIQbuR}L)N`8KJwz;p5?^vH~ z_sz}e+~0ryxG~!-_t4MJ&mX>g$?5Ly4l0)4y?giL>GXI3Vc}-b2$6fg+>i71|AOCs zxKsN2+QD<@_&{^DUtV7Rc-H*>gGWcZLFKKIl9I~*)4%O4EiHFcf7hEccka?_Y7=Er zQ&YdZyBodg{lX_tQb19$|KG3GC%$=4*ISr<eH{k}$AJxrhYhN~<(xQqGVwqIBWRpP zE8HP+V-oAHudmxztk3{C2;{^Ajm(C*w@jWqeVX{-K;w^($K{uPtMXtzzRIxpna{Hq zFCy+bFX8m?_fKbtC@I+za!cAYON9BrvvYH`H`U(WmdnHN``PS#mu>$+{U3%KJBy#U z+y-^Lo;-OHQB}3;#J=onYZ4i5oSkjH+V<OzkB?oq`Oh$DWK1wlKPPhY-NT0m88%GU zkLTLn+TL!=uqJ+gozibHF)<@sTia!;SD(JOw>tdveW$;3>}qG7Jb7|sQxnt5E$%A$ zZzUTeGhu51Zf#xT+|C!2o&WsYTpk8vV`JgG)925pOG!!jL`TowTlY6ArCwfMo~_~M zuU}l-=USC^F(zEQcFjjYfMYv13)8j5?)=9df4tEvZN4hE{{FsN9){oV>;G#%3;$MG z`}<pJ@v}1%t9JXwhJ}eSA5c<OUTqWdcIsrvytKzYBPFAiwZFdwgonE)B`pfM_4)JX z!(U%t-&p$kT9$lydAaz{o!QsdF(?>4*$}xoZAaN#saxCg^*61bJzJXL%8s-P$G1Cb ztrx4S`MGn`*)Ly89&T%9=Vx-5divej+2+S5C^~<5bd)=0PsPStWk=tBdwbi!$jE7R z*xDtR<R;p9dwVZgy7b}K*VltG^Uuw(+)?>?*$JkK<$iMyot~}_>eg+^xfzu5Uo&_a zL&g4ow~o8@NGM)9IQ97BgO@K0_Za%+OHOWEd<)z=oMBP8Xv<~+$)v2Tt|?PQR&H6k zXwj#Wt*ZNfz0#gIKYB|B<AcAq{HH#7`gGy4Wo@CW!yX=NW(SR?y1KR&D6RhU=TBDu z--||f54C>Ey7ez{cE7wm8$-^`O{~@5--+Jbzp22>$LGj}h0fVExsQsTpOgLNbn(QD z*|VDs+m<X*0i|TE+_LxgVxK%e^}V9>?{cl}q3=E~ytXzv{ASqCqYF2de^PxExYXk0 z`Sb3Mj*OsIvFkkjPahsSgT@4<&2k#%&W&9=zx>aS!Z-K!N+0-b@5IQ+IH~JKf~2J6 z!;_QMV~(%b`uKQ%@}D0cH*DB&;Lp#`pn+Bm4UGpE7rW1}tKIcs-wumVG0(|rzD+xK zR&M?6u{t=%%Zm#XVpF%h%6fWg>WTB`#phK&xy-}MyKvR2uIlgaJl9(MoUv+^7Q=(H zv&}>0R_|F9yz_iJ7dQ9noYgjNrN7NxUSC^#`0wxUpyKq&^XJJ&Is_xO<;?t$^`^Z( z-R}6kdvg2#eCk$td@bYFmdrzyYmfEI_e&b5)qJy@U;Xw`z*38qYqF%B3WY>OT5jBk zm@#Ws-NnyU-{19KTN~Z|$6s*~4==BvxcKqXo~YY<tIb)M82jXGwLaBNc#_MPo}M1F zr$X@5sZ#|-MM9N2wzjhO?%n(G_xpX-YyaBk+0|-Yex4H<DG6HWv9tJjk?hig4?b2H z7#KYG;^qAG_pe`HUx&)=E_}?!5OSMy_pazeQ|GJ4h(<k{HffSljqlQ>OFO!{4lVJV z+|nQZZ*Jt)EYWqbyW47ie_NP*yf3s*SVE%1y8NAocA4nrw6lla-rjCl`>W*3tE;QS z&i}lVE#9tG>v!q$<%5quN*zh6Pd_)OvAetbgLF>r*8KZ&etv%Oe{3>~%gc}Nsr+n_ zxf_(ZXS@A+e9@{DG{M9m@bYnBV4&i~QmcJ`zeSh4xglu(_lxkP$&*`e$M37@%)Gp8 z;hsG*vAaqpM*N;yR8$lY5y9c??A*CMG<@R3i4}i;nYQstA1j^0wiIOY?xx7Q8FTOL ztxkS&Vj>4W|M7*+?Jc*Bjf^%FJ@wj>b#>J(K?_AiMWw%cl9G}NK0I)gkd!o?>8h#y z|6E3PHZwy`ZtlY;PePu?m$G*6khQOq@$>WBQTaJ->hYZ1+{El`?T<Y1tGo&)O`gnb zYPvP+dGQ2Q(3D(nZ|)WOvhZ~=2iHb#x5(UG`uduNme#6opVsX7`}6sHP?N=Pu9fPY zYy0c#-`v?L%&;Nlq)_5S(3%fW|Bzur@pHe#^qaiWW((^7|NHRqW8=bwilD@icXt<O zyY%m$KS3*yjvhT~DtG(t-PjxDDfjkN9x988jct`b18U?PYUO6!vtLVCR+cw9IyxdU z^5BspEVfl&8Wt{8+_Gg$!M8UzqxSyWv&ZJ)AAwR(JC9+-CCP|sEbQ#g;o;)8RbL)h zc{MLuzrMexhiBy$Q8~Fj<MeY0_xIH*-R_sQZUc>SfM#bK8yVNET?>l06)RUNT3PM7 z#Z+^0lIo2OiOfDeJ_%V_pgF2TXU_0U*Na_M6rKL;%*=wKqC?AkXEW@1pYZz0la`B% z-LG5y2G!G_B2_sTyY)``p*y#yhsVX$_2JXg(}i-~=d8MO?d0jx!eLdL-n_ZFIibgM z>E^`X5X;jUadGpGychia^Jn78Nva#RZ4=9j-kK%K!qoU7-PF{S;r;LOnjJyg_Uy4? za0m_-PE1TZaq85e%gg;2E?Lr&cX!vqHEVd1kN1hbTfbyU$m5OSYa&2PSRR)7`uZ{) zcy)EP>#sE{R<Gv%9~~Yp?&#=P@$-|aoJ|F2d`Lo4lCwWjdb(chp(`tcL8A_w!fFfR z_tymktk|}`YHLw(F=NQvBii2Q=2$kb-~VscGL8RER#sLgPM@Ca6%7iwy?bqYdV5{B zX=`gIe|~oM$IIpOCrp~8G^b^4?(J=+a^AkaywA_icdx3lGBP&42%18ZlnmYdzDLq{ z)!WO9)~tzn{bu9FjS_}QENy(UT>k$4JQ4;DH#%d(?(V4+o^6)fw12<-t*zO|OJ!yT z=eFNC#h>c=dq?uCeYL+q6CHPU6f%p7if-7v`S6~~&#TS~%gFFVM@MhTy}d2&_)5RD zG&Rutymk4z2Uk~zzqqneSj~T)&ZWtJUtL`tu{CSzhvyeA1b~L)5)%_AOrPGqcdzZU zv$MmWvLyFBys|RbqWBpPs2OQ$YWn5vZSmk`K7#ksR@K-ZJ$iIU@$<e9`_}K-v*(H! z^J*QxqT*uJy6*Lno6|zwUSHW_*E4nMRrUU>%Y3CL&P-nYnm_3B#^2xGM!zkyoB#i$ z8KZ-<^W$!-)cQ3WHVFLt_Yc$_ymIA=LE<5n9%*wvK0dzrf1Bscp3Tk5+N!VB@#@jz zzT(<nUk-v6$W5EpR`&K*;<YuA8#ZoS`DxFO9~CJnDGy$+-@op2Aqx{DXo{j+Tpu*6 zq8qiPVe(|*Wj-^NHZgrZe*E3-?fTpD@ArNAQUWTDxW#lFj`zt5%FFlPulvn=e!ji? zbiLRO6(1jE{lAfxmX`GY-`|e@e)q^o$)4U`!^A@@H*VkVem?z|WK>jCkhULaiunJ3 zt(7ZQbksDi;H|Cwd%mu&X4P5!z?hhx1q&2dSXdUgc8f_Er}3!y%wVva&u_U?YWl?0 zo2P1rb9HO^`ue)KxNt0&S<yRPKVHeqY}>8luYT3Nzq(o+G)Cy&FSl^X5*9f*InW$E zD7`X(8u<$sE@WhwVO5&7b^DD;lPB9(+g<y<_4=vf#`Dk2GF^RYNzkN8^X8pXQc?nq zYG1x`CB?StOM?CXKgQPO?__Ro$rR4Mx=Qr&_3P>W^X)_{;}R1Uv#+g@{QYwI{8yzi z-rnBJmM>S|q-$k0OH)H*gJUz>#sv!$!~_Hmxb?}LeDd_^&5g;&TYmrj{eHiWl2VhU zg@pkFXpH)hS@^n`lNB~`Q%@fD^76VdLD6|eQxjA4o(e<j>Tf!?cNVK>UtY%h`o>1( z>Thpmo_HM?7?_xrmIgA!)x{;mJh1mjh+m)b+RhuZjOy#_*&LqCpEOB``9MiY$&Eih zKi{0H9iCP5@BRM&=eBIwqB8IE{Q7@_ep5^f9ypklya*_JbcD0)&yT{i#6-}XK}1kc z(A4LDKOE*?<Jv8Di1X#EqB;Nm{x&WxE!|f6Ij!v9pUQ2eufvutUVJzwCnq8?F>$Np z-Me>ho|ve7^W<c8&;-ehdGq8hU$~G^|M#mns430O#g)X)CzG%?dVAX2+uPG!U0s!O z+ge*Uis?ofaC38)JvkvLCL(g=Sik&vh7G*ZW*!gBW3E0t+#b0(?d+0E(=0;#4sFZ7 zZ?|%rw3JlTW6LFL*Xr7|+s%=9=R9dnOYV&gi98IOH*QR<v5Wt4{?MT&NePLN-*a~D zxi2dtGh_2+W9zav64u4fctC23pPfm(c=2M+wKb7E47c}GZvODzGb(D<2aD}_cUOI@ z*|KTVs*iib+WmbGg)Oz1X;Wz=ZIUs;rRmC%OP3}wCM@@#FLtx;-5pD|23|Rvh?L(i zFE5v5D0_ZxZk6ovU5}o;xw-kwks~crr%vt6DK9Hai;9X`vt>(2O7&Ce_uuc=i{E_r z>eVTR4cqhYb8TN6w|CbqNrA_YAA{zw<mBX(Zij}3&TMXGehg~cN-})g|Nn3Q<ZrVl zz3Q6$$}Yva?9GX~9}n5TJvhib@p=CJeRH?w-VW1>)V4nYYHk<l#q2C<WlZQ6(_QsR zMq69ktmw&!D%s=5j=4QK&6wQd>gHy|kaK#P?p3+l2M#zqv03*=z}(O<QB+j)(A$0c z_J!J+gBDlr+GTb5+BLD6qB9JSweicJd-CMTjkVF+v;Nq2cJJSBKY8-x$raX*3<@4N zq-ABDV%TtQt~F>~*{Rc~mtHC>J$kbJzlf-)B*V3BxzXE7UIu~MQlDxvMbv+Pdn+u) zCMYPF^ZD6XQ!(|@%Kg$(Qe9^}=1!cb_-D<HEt!|q?ayah$^ZZPe7@BA?7|-*g+WiZ z`DJEms(*haA}YH2i@c;wg@K8wsi2fpS5p(y!_?Og9wbOeN*+9OW=-7jm3@2n+BP*c zt-AC1{q^<oN=ix-rc4QWyY%d<G{e0$KaD^W<au{@G5+{(+!c0iO~gs)SY|<iLEPRd z)l178wWq#sJUw0Ce1%^KZ=mn=GVM^mKi^(lR0j1T?f?By-c|m-uTxk(>CKIebLMRR z`|E4-qD6~7Jb#t;mi1o$zumRJ&1!0DUX{+Vt^O7=(`Z5d{e1ypVQwKIAzP1^mzIiJ z_G_pAFD)(>-gzcIb~dO7vpRgeLG7<ETF)Qf*q97j*!1J)&)RQh$+eoAnvMzr2kzgG zzp>vd?B?y;htHkkTkO^=lxJP}X-UX0$-Db%e^2h84qBlC8Vb;j-Ub>uH83`A-oD*@ z-_K{#ozIyS-dM!1+_PuTvD(+4>fT>pKi|W=Y1fzJpFe8W*rYEpE&A*n+BNypr=rd~ z^MA|8%FfNYoqK(q?5EG4C(fJ4S6p1o!NN4hx|~l~&1c2+!mLG0m$tUFu)Mjom3!vQ znH67OiAp4&ICF+2;Iq%-`LmC1S+j;mQc@DMg7U}5$E$7Zt*xb*8X3yp-<#Tbb%D11 zmFw%{&ld`PT6l_o%a0!wpjBTgDlE^QJqxl=&o<81|M0K7WzQZPHh#I7^^ae?ehpd? zyrc57T2WC^OaJug)4fZ+-9J5DKm6t9kbnS&1;2LM99jFxM#emE&XL<$T3Y89E?J_Y z6T3^~`MJ4|Q<n7i_WJe)|GfV6Z`@7)4R&^R@~f@Qmn`)vT(o3K%c4a}E7@1RJp1wE znx^{yf6f2>{eEAnUEumR3)7j_<$9nQ2SH`Ggg-w%UbuFRt^c@lLV`ls+gqW}XS#`s zh%8vMrl+fm>(7V7{HArY4GaxeUjBG=?WeO9|Ni{c3UBSGkhQPd6L$Zeh=@o)TwLF| zxz@?2rf7cn^vUV=w%m=Wr>FVXaX-E^(>VRYa{u{NrJL$MJYcN)`ihm6l~pHxpNyKC z+M$(vZ9I}n7jM?joiitE&U9y~*Alfq+&!<YpHuMiP%HP=Uvq*&LR=yvC9TTdbZ`o* z9XNfO``EE#re%|+tMKynW~tjge)LzbdzG%=jun%*xVR?Fo2Peav$eIg^vszvFI>GU zdah1VMux}N*Z0fI%gaGc9amS@y8nO6U%Ytn;K|9!O8rNVAHV+mY2)$7p!RiQV&a9% zmxbf>R)<*bKhR!WtD&jc$&)+RBvYu3SDKBVzrQMVW$&a(LJaX{bNV~tpZ?6q$>H($ z_wSLn-*>9oJu-6U<l=9|TwGiNqN1(5(q>m)Th#yisUEklrgN@!dD6K#mP-Aeuet)C zu33Kc=+V%1a}16dRDH?lk+a=(D$3+hSWplXD=Vv(&#Q%-6f$pb({<~WYW19~R{L>< zvgfbg@Aq%4{+<U~=HHNV@BP$p2d)3}T-@A}Zg0!w;Nx58UUYKRC$G?uke2!xOFUg& zS-q#}2>Q8&Mn!eCa*HoovxaAN_<FIpOb$N2V-F5CXU}0@wC(uHzCC+vtV&)qOxKU^ z^11%!*Vk+oR@SS(P5=G*d>%Bk3K|+RvN2FqWd$wjS-N!TiPx{LtQ0mfG71O`Y}~WQ zW{yRnQ`X@<D=i+LYu_%Pc6L^)cKA9_M?7M4n(x#@EEV=5v%6Q%onQR#Pvw-UQ#soO zu7^H-vtLk9P{|dvIAir(d1slbudiASlaD<((kZMIFLCPBDNuLK#m((nR!3#+-s<mu zDK9iu&OKG^5gjePIsN>xsoLQaX3pe{kB^_J<<s!J*fUg*mBHiL-?+*%r<MvhIXf@i zcB^!5?H$*$qg|qBE?o*zvMtUIvdlVm|NeYQ2?>Mf=;&n&7ap8to`23P?~cYDeO1*~ z#so%2#;;a=`}f;F{`}J?G<2$_rlz6Y{PW-5-#;%=ec$@#ks~c1D{MfuLDjc6Cv|jm zZoIg-SdszMoJcz}<KVk{dr$wUvAcZfQW8VN{e88q#~*zDxu*8_w?hw;Pfybo-X<$8 zeR@~<`*R>`*Q{AHW9LpwP~%~B`1*B5XWqWKxf#?BSrfe6&nG;5datZ?SkC^>=RLi= zk{E8>-Ce%)T3YbehZ(Y_rl#NCZogkwbmQ^yrluwdhOnR@rHgaA#r4z7%*+nO{hhkl zkWbF$#IJ8}Pcs<k>gpbQ{`uzK>hCvhY)qcHa%JY;eq{lU8%?a-Gd6890yX{iR((y1 z-CdSyoPI7vH)>15+NiCdwbVzC9Jx~QCiV0*!|d$rhb!1Xi*O{8?d<Fh1=hK_x%HfX z&Rslh%9IU9yTvy@J3HIBwzf7cJ^gq|Ny&`8du_cvJSMz&zw1&Puk?(C3m1mm$~s{u zv-a|)RByA=S0Q3@a(YHuuY*+#qn3Yq@ALG2M}NCe_&;M~<K);~C4zSA_r3q#%+4Qn zGAJtQ)SWwbA~vU;ozdINd->Y6wCn3)lY44^{?zcBFSYh?vd<T`YuDCBZ_K@Iw$gVd z&z|`a+UDlsGiT1!(9}G5cXxSUTpXXVv9U@1y_g;MkM&A#tooYu<k_>Z-Fkkx{gWq7 z3{0Jw&&<sHP*?t##5|kIrZsDHGP1H3c~94?`1WRI!KT^MbfXsqFZT=0`x+vrY-ALa zvU}RJu&I7KBqb$JoH)_2YnN3|Pfu2i-h;2NuUC9{z-VG>nms2mPzW@W{Nzc?nl)>( zrrWDODt>pza*jnI)8k{k&9i6U7C+0!&2aJJ#Rs2%R(yQadV;0o(X<&eB9<D<%|8#C z6<@96m!6o&sI07fW~MRw>uYOQe=f|)$+@s8)tlk{dC-=O#ap(B#O^9-+_lSUUEE%+ zH~GnVd41{U=Y>|kS+YcB;%d-fNkK`8i<6Vn)QcJN_m6?<+M*&OFK_RK>(}$g#@?M( z@0kQ@y0o;nKb~LzZ(`JJ-oTU;m2YouHWxlV1{y$)x2ZaN@uHxZnAo9I-Hwu!^z_BP zv(2u?cAi-mG)Km+Mq+dN`Dw3GAMtm0`4<)x2>5l!%zr%Lymjd-5ztiYq)9>(7pA&= zTe4&cXb*~qhetzeE9><_28RE?@BhEBzrH?Zf8E|wZ}u<wrshAdXU!U&mbSJc*`<Mt zAGJu&*YaCc<9hk(RoBA8jUmf7u3!80_4UhAEJ2^%+%(R}%nVGt#1K;UukP2Em1jiM z^YZe1(?S|mY%4#x{JGpDe2F3Cr9gH<0s}*+-g+;mr$*=c<!le_|NoC$U0q$qqF}+X zzu=x`#%z6CzMp&4{pZybr3g=yUA1b}g^L#tPFDBd(dTre=bZDUkkFk)NeKxImX?-F zmM-<InQ`aF#$?y9o~OSop8Q|Tf3)rBjT<|>?6od!*jxP_H0VD$E8f^C#dWK5=hrV^ zK+CT6J_$&IW|@8k<T#u;bEe?=IoWl|0)}3Ger~R=N7d7}s4dyJs?1HixVZS&g6u<H z-rj}(|JBZXx!=L={GmfkoSd97#}$%Fo}ZIlv0}x7<l}uY?ust2R_Xfb=;$ojl*cmB z_xroM&Y78-waM8IYu2uvIDfwXUq7jdv(57lojLQSyM3DQC5e#eIT2A&kM8ZQJ`@?| zd3n-=2@I*JPqWgMRX43nKR*vNA*ZCI1oE_sl9H1}ubrZ=@7AN9>*MwYgoU;3*kJ*h zXL)dIYxah%TmL@l?BOV%GG)qz-R1dOeo~!t=E&UHTRpu?_)<z}^c)E(sYS87%XXB# zowen&fMmhfS68LP!&Ek%zIjt}x_<mKD>lLA)6?~x<KpI>bH0>vb;ps!_xJV|K0PIx znWku@ps&xbsj2zm?r!tzfhWX^3JXC~Mg{->)vjASp{lE+qhapcxdpH4oMz3E>J|<U z4+jk$-Q8V&>5Q{Q*~dq&Cr+O9Og$Q^6t`{Lwv4N*L}P6;Sq>dO{Bjy!=A|qhKQ>+| z&?@d-RhN#$>?m;D(I%J~AtEC3;Mudb$?E<^vaMG@J7Yfn_?XNiWzz9lqorWku}4c{ zcb6HMnyxLJXnW}g2Mbe6Yb$6TCdOT{^vTPYohMFstX!w%cjWbniOL3MW^U`__U`C& z;z-ZZ@nZmO32ba^6yRXFbjsO6L{_%<&6^w^dAm8UHJ0?T@ymf)Co;BGQ(kK<;nUL6 z`fxqI{^04;+@NJ97A*zOCLcXH!!Q{%!M*?gzv!q+j`luzdp>V(Z}57{)+-YiEm8tC zgTd3>tyc~n?G~RncP_8LzyG?$0*6-mi>ZTFe;OJ#?%%(E%O`=pDO0B^YG`mIAM1Gt znxWL!*I%+^$psr%-U;*P%ge~fB;@3rDHU<D_<FN);@&-bHWWT~%ek{d@a!zp$!=<g z8jGKwQ#3ah7gqCm0GiC6XIp*f$Pt$6@9$dIuGPI>=%EYh^IO#ZGTD}Y|6J)5wU-wc zyIa)#vAAwHYf4j7la%~p!(%s=&zm!KDr;?Rt&CL($K&Ju;?)*P(x9MdbZEG6Az<BN z0mB>H^W~qNnc3{#FXtE^KmWDG5;4#+w%Xs{6m@lZL5on2X9oSKv0Jow@y@=BDXy-r z2QOayc-Z&md|f|=gd-h-pxKO&kSR|t37)g5{Uvhj*s%}azk@ba?dWqpvS7^`9$D+M zBOQXu8**=(t$RG-JZR6<!i9>{^kTbGPfsh9Z5LRVTEFSM=hB_U&y}pKq|Ec~Oej$} z)cE%HcF>6F;WpmKR$PL@uCA^>e*8#ye{b)JlP4cq@%`k9kB>Jv2AZpbEL{kl16m?< z>(;Dyt!7TFtgJsC_uFqMc<7{|rBwu4`EX{Y@xo=x+@7!P(bmy9(kE*TlAQHt!i4|9 zs~@p2)YQ}n2naM>xf0^}OfhI%_I14v6*fNe?dHDLa5)na60#xTAQPyka`WcRnB$73 zAHIHd_4MR?c7Fc(QW2*Vx3$0KFuYf1H!?MC-MiP8PtHc;WsD0K7Z(?3m!oCzvxK*| zwt^O=fCkltg@rAwtsj4QcsS;`qP(ZSzdLBVXwA=}H8DFUf!4Ql-TG?D$WU2Xxh7_( zP+eW!j`H{ORGbAhZ*I$#2BqA)<@XC^TRl2ft<u_-dz;PP-X6S|puHyL;i1-y+uL-- zbfb=doaME4{Tzn(>*qy8L>xGBgr%{uanc!A6&-79>ABYB#~vN+-k5b&Yu#f3PHCeQ zj!Ty=6}-Nt`zl&R8ML2-k(uqmpP!!#%FCZy@hNUvQs&%gU-IuyC6Anq1h`UJA8+r; zsw`xdd&>m0tnd5#`^zmwXEhw}mp^>w4A1LpYn%J~`L7qw+B0dA5Xb?yZp})2ptfX{ zzP=yBfxCBQBO@a_y1SeA?AZfa<J8sP@7^zGTkzzB;4HyyoIgJvm*1FrTI|U2<BLJ% z@bSz`pcDhz*`%t<T2)mQb6nBo+Lg5yo}QkKQ>TiW<=kj!<reo+l9)K5tBdQ#?c2_t zo}A(9Vir#IpFLsICL;?gE6@u4jT<*^kzsXra&|UMIUxYrGB8=q_Yug0E56Al*{38W zHKm@OmiYA4RFf?`8b5yh>gwdg^zF?}=T=YQ#Vb~T*3Lb8d3kxno(jY3g|n8NIpgCq z$3igqc;C`PEff4#T%IcY;IHlFcXxL?`}^}JCMJGqU&mPS<%QsyHET9xTvS>Uxw-AN zMT>G{V<Tv3f1j+i+v`-%z{*O?n3$LebLaN%*kQ3H=jNo>9xW$U?YetyWy#-PrC(lN zW}j`I4_ZBcM6#zN($kZ(>iauhx&HPUGbA)LH49}s3o_2lu>_6UK6>=%!pdOvb&pLr zPfyc5yng?`uGiPsAHH*E4k%%50vVZ-p5A_Sb$Ig2OG`mJOv5#l813xrDt>%W1UaXb z^WZeyXwbrUP^o<F-o&QAzrQCxKGu6<Yqq$kTFVuuz3b*Mytj_9va|#hQ094e7I;rJ z(oj%f0Ie+pEsU-DlCkcwfaJ&b`~NS3k64IYxq5YH-xZCyw$)<FZaoK1P1Sx`rlq(w zc>isyshc)!N=Qy_mb0yTaAjrimH#enHg$g_%*@O_eED+Z++6FOea<O9Sy@`3VlyeJ z>B5Bo4Q=gW*_DBvy}hlgS8LnY+HOogFSqWoz@>nW<ra($D^_THd3~K9v=aHOg_iQY zeYM<n^ZAcSBqb#+ShVO+sftqbyE{9X-QC?SEG-oc3?@9&6PgTJI16&JMdc?I5fPCc zeJ&o(f&1;$<sW_i`Qhu=qpz;6E_`r+u~2r}mB7eINl>rx%o!gRHnyNdr>vB`yuJks z6k6Ka4xK*Dy>#i)8279Xj~+dG@ah#8H#fJ8ecc=`VW)i)ZgdGV{P=b|e`D5Ftuu2h zh1LD%i9BC;Qaqt2@z<A^9i5#Ae|~<Rn38g&R7L6WoVjyBV^b3*2<+Is`|;P;*JIqX zHXJ&9_~ENpT*bx3b8M@p?UN7)Vow5<#&2(J1sVMC<;za(@O2%(KP(Xw(~W8Yt)yaP zWZbZEBWQ)S!koEt3%|Y!z2hIHnaIGvsR%k3V0StHx^?SJx|Z`bH8mMjd`JMT+gP}8 zp@~Do1S_HHLM8^#g3Aet&ITnf0`BaqjTZ8qAhjlbzZ^)ok(u2f;Q+(B#}n9&-MJ$Z z7#IlJ%y@ra?Z+o4h1V&YO6=RW50u)|&d=*z?B0Lr)%lhy%`RQSm6er0e*Qdo>J%3< zJD*EU%^sCmit?c4zMu-|?d|P{PoM4vtpI*?W25rAxV>G^&dxr3>=@g@g9kxNl|eh+ zmoHb}_xqhSXmihvU8UN+5h_dOsRYeoXz1$Va&mG?$j#-oo8P}-gMp{%)hC9>Ky!hh z5fN$gyd!^peg>_uwup_5{qy(x{STi$HMO_1i|Ir-$fm9aZC|aft_CgXy0f!5Vp9s| z^@$vrA}V2X7#dcs(gLk*DR~i4^Y`m@i@HBMRAy&SI(7OqXgSD_U%wvR*q9u#B}4G~ zL=WYKixx4($H%j<usrzi@Gz*MC1+oErc`GpXlnb$ty@mP!NQ=;Fbf=;L1}HV;>AZS z3{$2|DR^_k5VQy6@v+{+*VaaZ*0TpjL}=*z0@<8*$6}rGM7NA5CnoNw`)hUT^y$Rx z?C$&Z|7DpP8(v4u@$~m^Z*ON;^Pk5fFE8KH-tO%0-w)aoq4g<yiNSoM{^QR7|NULK zVns*l>1hwo&NeS7ENq-J=ScQqx7QyZ9|tWz2Ti`eyrgPjWmP2GX_9p7)-BLNn0tFF zo8{|%FoO2nZQW{mYg_K=Qj?XM+S-Soot<r1_9kM=v}uoybPCTfO698U6I7~e4YFMg zic4kpz6aay*EP?cEzKLcW^qFU184y;gMhHG^WoOc5YT4o!)?5vErz>xS-pAl#-Q+# z%ado%ie!BsEn2iFAvd>IzW$G3x0tSzlM~aNxpQ~+xq2*C{W|IX<;%i`hK3&g{_fx3 z-7Wn2DK*nQW5d0@)$O1f_sk5#L-!YN+-P`xqlfV2oyF;(=)ADdc}K-ZB_AK352y9_ zo1E&r4ccv)c(@HTEam3r=HcgeY?f(u2CtHnO3&oi6T`y7K$X<qy|%x;zwcM|o_4{b z;XJ572hABTcJBxI7gREywehq#{P^R8r%zj}zrRa7)*}g;s^#I~*#PPVKYdy#yZ+vy z#fuFS4lvxfc~enan_E#)5j3C2!^^v~&&^}<ftzQ8czJn2N#()8<{Nvf&2w^c1f-=; zhsw-U72w!V{yr`uI=cDz<A=}A&IaYC>l-;38CI-boqTs!sfV}s;qUkB`|s{9KYZbW zK)0Cgp~LO`JNv%7o;r1^;Mo~T3oEOp^UoJAS;8W&A9v*I>+6{+e2SNjr8s0|X%!b2 zCl?hJ<=op-`R3~C@EG?=oaXuW!1GjIUS4n7<?9kuRaIl$m7YuntsLBzbMw%xt=Y#J z463WEzunH?zj4nVn{|t?zWDX^HOLGfclY*_Cr=udmzS44Jtev>S@6=7)Q=L$J+GNK zE9@uUn5gUystG?-*nl>;&af)YnjEvw*4kQnb=cZN^7VfhtE;Qu+}zB*Y}qo<mWFFu zT3Q7^Kc)Wo`4cn+s-drce1T)LLE0IK9XobBSiOGVBa_>2Z*K<`lF7&W9^Ttq{o>YE z?LB+;Jb3w%v$nSO+$KRM28NqP!E-{YetuE~t!Mu8?RGv$(Y1B4-HC_WOgmpL;O64m zQ2V<q=k6}iwNYCS{rdXau<p+fwU4(vAAkM!HhPXtC8!<N(beVT>dNZl>-+H0BPMZi z@ee<1R;*s_ZF2bT?s7pnxxNn{3P63Nr>Cc9-2L@`Yq7rm$v1@(2j)*SI^4R<ty|18 zHo!o;w<~Bu#{t&>?bw#x3b#a_n!U2;P`Xvp80ILm##OgP<K&UllprtO8L<in4fz*p z##M>Wee$8mVopVWMdg0^8E?;&r+qzh=KW98gGn0?q-|cfe*O9t*VS8UynnV%)<2ja z(B0jA<Np2jxb?>`T@pHW?AWRz|HcZNzOP?P*Q{BiF#r7FyzR+#b#h4?cU)O4_-TJt zb#?RYw{54N9(wswv&K$dqRr9WoqbD`?v^OsTeoi?+@v$bOLf+)S^tVH>g(%|KYpz2 zv{1llp#W1O!=F0)b?eq0_-wNzNYh76xUIe2(8!3X*UkCh{0W~z_C0)Z`sq{EY15|{ zR#b3I^=fTxWxbKJZB@pqmcxl_)~!p*&gSMhoKRLKR<?WZi~NZ#Q@SH`*tXy9?e6CO z@we{B-@2B=i7A^S8RoB5*crpu>J-TFTBws{WeC^H5~-gxayI9crFxZS`iPy=p6Ib4 zXyt{wcYDvB^W)*;b6S7>|Fr#`oGTrk%KPmrkZIq#)iftB&q+h%P}bI@v@|wbTic~_ zZ=;KL%Eai2o0*vv6cjMDIyJt0nR({y*@X)iF1+$sFsSHej+no{e?>(FXf%A$MU9Gi z?n)CGKKxu7s3PR3BIKwb;Gj2MyzkkwG>xfVCsH;E-Dg#NA|B#r@l&YN1+@41?c3Zt zckenbzkD!j>!GBL4XHPS`oH&o`e}3S{P~UBx3jk&Zp<+0x_B|r$JaNprbcG#)~!qB zCJH!lXo^o2_uE%fQ*+>LS#o)~IA1%n&3WhLmk;Kc9nLXJ&dA^}H8oY8-T%B&Mqd8# z%aTJcOO%8<7pz{*9kyC@^5n@GnVFh5b3og&C0E}m_*8x~M@(H^9aIQhe#vsYP@wzh zi}&x_FJ>G$aDZV;RPIHsrkOr$jSiqG@woNka{cV)=H>z%ECv!h2D8u3m@%UvYOUU> zubhf46SRV4A3jN!IsWj?8y>lS_PF)p+qZ9Luq)quCBq~mH<$JFri4hb-rn9;)^ekn zJUoXTG(?<q#2$bBD#|dyZ@FOiQ7-QH^XAXz?q%qEEWpDy@ni~UchtRmaS}Xi61{FS zeAGNtCI#7Xfp*wl3Q4#48EGS@Z^F24{rbZC`gjiUl_9TgKM&RrX<d~Z9UZ-pX=T{z z%)g+`ub;B(`U^hg3w5$o%ws?Qx#Rfb6HkjgmS6Tzn>@j5X@UgX*RNkEcr9&pV_*fH z`LHBI1AO+wk~J=?@^^=Vjw1>&;R5Ys=g`zPW%#G@RRFY&Sh4=+XZFy$ks-50o+vOd PFfe$!`njxgN@xNAo<+DT literal 0 HcmV?d00001 diff --git a/tests/output/Test-20230302/test-02/test-02.stog.amr.ttl b/tests/output/Test-20230302/test-02/test-02.stog.amr.ttl new file mode 100644 index 00000000..5f7d3d7f --- /dev/null +++ b/tests/output/Test-20230302/test-02/test-02.stog.amr.ttl @@ -0,0 +1,29 @@ +@prefix ns1: <http://amr.isi.edu/rdf/core-amr#> . +@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/test-02#root01> a ns1:AMR ; + ns1:has-id "test-02" ; + ns1:has-sentence "Earth is a planet." ; + ns1:root <http://amr.isi.edu/amr_data/test-02#p> . + +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> a ns1:Role ; + rdfs:label "AMR-PropBank-Role" . + +ns1:Frame a ns1:Concept ; + rdfs:label "AMR-PropBank-Frame" . + +<http://amr.isi.edu/amr_data/test-02#p> a <http://amr.isi.edu/entity-types#planet> ; + rdfs:label "Earth" . + +<http://amr.isi.edu/entity-types#planet> a ns1:NamedEntity . + +ns1:NamedEntity a ns1:Concept ; + rdfs:label "AMR-EntityType", + "AMR-Term" . + diff --git a/tests/output/Test-20230302/test.sentence.txt b/tests/output/Test-20230302/test.sentence.txt new file mode 100644 index 00000000..2bc85c3e --- /dev/null +++ b/tests/output/Test-20230302/test.sentence.txt @@ -0,0 +1,2 @@ +The sun is a star. +Earth is a planet. \ No newline at end of file diff --git a/tests/output/Test-20230303/test-01/test-01.stog.amr.dot b/tests/output/Test-20230303/test-01/test-01.stog.amr.dot new file mode 100644 index 00000000..57af6466 --- /dev/null +++ b/tests/output/Test-20230303/test-01/test-01.stog.amr.dot @@ -0,0 +1,6 @@ +digraph amr_graph { + rankdir=LR size="12,8" + s [label="s/star" shape=circle] + s2 [label="s2/sun" shape=circle] + s -> s2 [label=":domain"] +} diff --git a/tests/output/Test-20230303/test-01/test-01.stog.amr.nt b/tests/output/Test-20230303/test-01/test-01.stog.amr.nt new file mode 100644 index 00000000..49251ca4 --- /dev/null +++ b/tests/output/Test-20230303/test-01/test-01.stog.amr.nt @@ -0,0 +1,22 @@ +<http://amr.isi.edu/amr_data/test-01#root01> <http://amr.isi.edu/rdf/core-amr#has-sentence> "The sun is a star." . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-EntityType" . +<http://amr.isi.edu/rdf/core-amr#Frame> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Concept> . +<http://amr.isi.edu/rdf/core-amr#Concept> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Concept" . +<http://amr.isi.edu/amr_data/test-01#s> <http://amr.isi.edu/rdf/amr-terms#domain> <http://amr.isi.edu/amr_data/test-01#s2> . +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Role> . +<http://amr.isi.edu/entity-types#star> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#NamedEntity> . +<http://amr.isi.edu/amr_data/test-01#root01> <http://amr.isi.edu/rdf/core-amr#has-id> "test-01" . +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-PropBank-Role" . +<http://amr.isi.edu/rdf/amr-terms#domain> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Role> . +<http://amr.isi.edu/rdf/core-amr#Role> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> . +<http://amr.isi.edu/amr_data/test-01#s> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/entity-types#star> . +<http://amr.isi.edu/amr_data/test-01#root01> <http://amr.isi.edu/rdf/core-amr#root> <http://amr.isi.edu/amr_data/test-01#s> . +<http://amr.isi.edu/rdf/core-amr#Frame> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-PropBank-Frame" . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Concept> . +<http://amr.isi.edu/rdf/core-amr#Concept> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> . +<http://amr.isi.edu/amr_data/test-01#root01> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#AMR> . +<http://amr.isi.edu/amr_data/test-01#s2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/amr-terms#sun> . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Term" . +<http://amr.isi.edu/rdf/amr-terms#sun> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Concept> . +<http://amr.isi.edu/rdf/core-amr#Role> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Role" . + diff --git a/tests/output/Test-20230303/test-01/test-01.stog.amr.penman b/tests/output/Test-20230303/test-01/test-01.stog.amr.penman new file mode 100644 index 00000000..4f70746d --- /dev/null +++ b/tests/output/Test-20230303/test-01/test-01.stog.amr.penman @@ -0,0 +1,4 @@ +# ::id test-01 +# ::snt The sun is a star. +(s / star + :domain (s2 / sun)) \ No newline at end of file diff --git a/tests/output/Test-20230303/test-01/test-01.stog.amr.png b/tests/output/Test-20230303/test-01/test-01.stog.amr.png new file mode 100644 index 0000000000000000000000000000000000000000..1184e154c13d623631e31e54b8ebd114be61aca3 GIT binary patch literal 11670 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 literal 0 HcmV?d00001 diff --git a/tests/output/Test-20230303/test-01/test-01.stog.amr.ttl b/tests/output/Test-20230303/test-01/test-01.stog.amr.ttl new file mode 100644 index 00000000..4ad04c79 --- /dev/null +++ b/tests/output/Test-20230303/test-01/test-01.stog.amr.ttl @@ -0,0 +1,36 @@ +@prefix ns1: <http://amr.isi.edu/rdf/core-amr#> . +@prefix ns2: <http://amr.isi.edu/rdf/amr-terms#> . +@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/test-01#root01> a ns1:AMR ; + ns1:has-id "test-01" ; + ns1:has-sentence "The sun is a star." ; + ns1:root <http://amr.isi.edu/amr_data/test-01#s> . + +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> a ns1:Role ; + rdfs:label "AMR-PropBank-Role" . + +ns2:domain a ns1:Role . + +ns1:Frame a ns1:Concept ; + rdfs:label "AMR-PropBank-Frame" . + +<http://amr.isi.edu/amr_data/test-01#s> a <http://amr.isi.edu/entity-types#star> ; + ns2:domain <http://amr.isi.edu/amr_data/test-01#s2> . + +<http://amr.isi.edu/amr_data/test-01#s2> a ns2:sun . + +<http://amr.isi.edu/entity-types#star> a ns1:NamedEntity . + +ns2:sun a ns1:Concept . + +ns1:NamedEntity a ns1:Concept ; + rdfs:label "AMR-EntityType", + "AMR-Term" . + diff --git a/tests/output/Test-20230303/test-02/test-02.stog.amr.dot b/tests/output/Test-20230303/test-02/test-02.stog.amr.dot new file mode 100644 index 00000000..1b8f97f7 --- /dev/null +++ b/tests/output/Test-20230303/test-02/test-02.stog.amr.dot @@ -0,0 +1,9 @@ +digraph amr_graph { + rankdir=LR size="12,8" + p [label="p/planet" shape=circle] + n [label="n/name" shape=circle] + p -> p [label=":domain"] + p -> n [label=":name"] + node_0 [label="\"Earth\"" shape=rectangle] + n -> node_0 [label=":op1"] +} diff --git a/tests/output/Test-20230303/test-02/test-02.stog.amr.nt b/tests/output/Test-20230303/test-02/test-02.stog.amr.nt new file mode 100644 index 00000000..92e70c98 --- /dev/null +++ b/tests/output/Test-20230303/test-02/test-02.stog.amr.nt @@ -0,0 +1,19 @@ +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Term" . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Concept> . +<http://amr.isi.edu/rdf/core-amr#Concept> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> . +<http://amr.isi.edu/amr_data/test-02#root01> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#AMR> . +<http://amr.isi.edu/amr_data/test-02#p> <http://www.w3.org/2000/01/rdf-schema#label> "Earth" . +<http://amr.isi.edu/rdf/core-amr#Concept> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Concept" . +<http://amr.isi.edu/amr_data/test-02#root01> <http://amr.isi.edu/rdf/core-amr#root> <http://amr.isi.edu/amr_data/test-02#p> . +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Role> . +<http://amr.isi.edu/rdf/core-amr#Role> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-Role" . +<http://amr.isi.edu/rdf/core-amr#Frame> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#Concept> . +<http://amr.isi.edu/entity-types#planet> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/rdf/core-amr#NamedEntity> . +<http://amr.isi.edu/amr_data/test-02#p> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://amr.isi.edu/entity-types#planet> . +<http://amr.isi.edu/amr_data/test-02#root01> <http://amr.isi.edu/rdf/core-amr#has-id> "test-02" . +<http://amr.isi.edu/amr_data/test-02#root01> <http://amr.isi.edu/rdf/core-amr#has-sentence> "Earth is a planet." . +<http://amr.isi.edu/rdf/core-amr#Frame> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-PropBank-Frame" . +<http://amr.isi.edu/rdf/core-amr#Role> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> . +<http://amr.isi.edu/rdf/core-amr#NamedEntity> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-EntityType" . +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> <http://www.w3.org/2000/01/rdf-schema#label> "AMR-PropBank-Role" . + diff --git a/tests/output/Test-20230303/test-02/test-02.stog.amr.penman b/tests/output/Test-20230303/test-02/test-02.stog.amr.penman new file mode 100644 index 00000000..c43f2d1e --- /dev/null +++ b/tests/output/Test-20230303/test-02/test-02.stog.amr.penman @@ -0,0 +1,6 @@ +# ::id test-02 +# ::snt Earth is a planet. +(p / planet + :domain p + :name (n / name + :op1 "Earth")) \ No newline at end of file diff --git a/tests/output/Test-20230303/test-02/test-02.stog.amr.png b/tests/output/Test-20230303/test-02/test-02.stog.amr.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf17ae6265b900965bce09be359fa5500c2400f GIT binary patch literal 18820 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 PFfe$!`njxgN@xNAo<+DT literal 0 HcmV?d00001 diff --git a/tests/output/Test-20230303/test-02/test-02.stog.amr.ttl b/tests/output/Test-20230303/test-02/test-02.stog.amr.ttl new file mode 100644 index 00000000..5f7d3d7f --- /dev/null +++ b/tests/output/Test-20230303/test-02/test-02.stog.amr.ttl @@ -0,0 +1,29 @@ +@prefix ns1: <http://amr.isi.edu/rdf/core-amr#> . +@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/test-02#root01> a ns1:AMR ; + ns1:has-id "test-02" ; + ns1:has-sentence "Earth is a planet." ; + ns1:root <http://amr.isi.edu/amr_data/test-02#p> . + +<http://amr.isi.edu/frames/ld/v1.2.2/FrameRole> a ns1:Role ; + rdfs:label "AMR-PropBank-Role" . + +ns1:Frame a ns1:Concept ; + rdfs:label "AMR-PropBank-Frame" . + +<http://amr.isi.edu/amr_data/test-02#p> a <http://amr.isi.edu/entity-types#planet> ; + rdfs:label "Earth" . + +<http://amr.isi.edu/entity-types#planet> a ns1:NamedEntity . + +ns1:NamedEntity a ns1:Concept ; + rdfs:label "AMR-EntityType", + "AMR-Term" . + diff --git a/tests/output/Test-20230303/test.sentence.txt b/tests/output/Test-20230303/test.sentence.txt new file mode 100644 index 00000000..2bc85c3e --- /dev/null +++ b/tests/output/Test-20230303/test.sentence.txt @@ -0,0 +1,2 @@ +The sun is a star. +Earth is a planet. \ No newline at end of file diff --git a/tests/test_amrbatch_main.py b/tests/test_amrbatch_main.py index f5d67831..5da50414 100644 --- a/tests/test_amrbatch_main.py +++ b/tests/test_amrbatch_main.py @@ -10,9 +10,10 @@ import subprocess, os from datetime import datetime -FILE_PATH = f'{os.path.dirname(os.path.abspath(__file__))}' -INPUT_DIR_PATH = f'{FILE_PATH}/input/' -OUTPUT_DIR_PATH = f'{FILE_PATH}/output/' +TESTS_PATH = f'{os.path.dirname(os.path.abspath(__file__))}' +INPUT_DIR_PATH = f'{TESTS_PATH}/input/' +OUTPUT_DIR_PATH = f'{TESTS_PATH}/output/' +AMR_MODEL_PATH = f'{TESTS_PATH}/../amr_models/model_parse_xfm_bart_large-v0_1_0' from context import amrbatch @@ -23,14 +24,15 @@ from context import amrbatch #============================================================================== # -- Input Data -amrld_file_path = f'{INPUT_DIR_PATH}test.txt' +input_filename = f'test.txt' +input_filepath = f'{INPUT_DIR_PATH}{input_filename}' # -- Output references base_output_name = f'Test' time_ref = f'{datetime.now().strftime("%Y%m%d")}' -out_dir_path = f'{OUTPUT_DIR_PATH}{base_output_name}-{time_ref}/' -os.makedirs(out_dir_path, exist_ok=True) +output_dirpath = f'{OUTPUT_DIR_PATH}{base_output_name}-{time_ref}/' +os.makedirs(output_dirpath, exist_ok=True) penman_output_file = f'{base_output_name}.pnm' turtle_output_file = f'{base_output_name}.ttl' @@ -41,5 +43,10 @@ turtle_output_file = f'{base_output_name}.ttl' #============================================================================== # -- Parsing from a file -amrbatch.parsing_sentences_from_file( - input_file_path, penman_output_file=None, turtle_output_file=None) +amr_graph_list = amrbatch.parse_sentences_from_file( + input_filepath, amr_model_path=AMR_MODEL_PATH, + output_dirpath=output_dirpath, amrld_serialization=True) + +print(f'\n *** TEST RESULT ***') +for amr_graph in amr_graph_list: + print(f'\n{amr_graph}') \ No newline at end of file -- GitLab