diff --git a/dkpro-core-castransformation-asl/bin/LICENSE.txt b/dkpro-core-castransformation-asl/bin/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/dkpro-core-castransformation-asl/bin/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/dkpro-core-castransformation-asl/bin/pom.xml b/dkpro-core-castransformation-asl/bin/pom.xml new file mode 100644 index 0000000000..6ab0719e0f --- /dev/null +++ b/dkpro-core-castransformation-asl/bin/pom.xml @@ -0,0 +1,77 @@ + + + 4.0.0 + + de.tudarmstadt.ukp.dkpro.core-asl + de.tudarmstadt.ukp.dkpro.core + 1.9.0-SNAPSHOT + ../dkpro-core-asl + + de.tudarmstadt.ukp.dkpro.core.castransformation-asl + jar + DKPro Core ASL - CAS Transformation (ASL) + + + org.apache.uima + uimaj-core + + + org.apache.uima + uimafit-core + + + commons-io + commons-io + + + de.tudarmstadt.ukp.dkpro.core + de.tudarmstadt.ukp.dkpro.core.api.metadata-asl + + + de.tudarmstadt.ukp.dkpro.core + de.tudarmstadt.ukp.dkpro.core.api.transform-asl + + + junit + junit + test + + + de.tudarmstadt.ukp.dkpro.core + de.tudarmstadt.ukp.dkpro.core.testing-asl + test + + + de.tudarmstadt.ukp.dkpro.core + de.tudarmstadt.ukp.dkpro.core.io.text-asl + test + + + de.tudarmstadt.ukp.dkpro.core + de.tudarmstadt.ukp.dkpro.core.io.xmi-asl + test + + + de.tudarmstadt.ukp.dkpro.core + de.tudarmstadt.ukp.dkpro.core.tokit-asl + test + + + diff --git a/dkpro-core-castransformation-asl/bin/src/main/java/de/tudarmstadt/ukp/dkpro/core/castransformation/.gitignore b/dkpro-core-castransformation-asl/bin/src/main/java/de/tudarmstadt/ukp/dkpro/core/castransformation/.gitignore new file mode 100644 index 0000000000..09ee449220 --- /dev/null +++ b/dkpro-core-castransformation-asl/bin/src/main/java/de/tudarmstadt/ukp/dkpro/core/castransformation/.gitignore @@ -0,0 +1,3 @@ +/ApplyChangesAnnotator.class +/Backmapper.class +/package-info.class diff --git a/dkpro-core-castransformation-asl/bin/src/main/java/de/tudarmstadt/ukp/dkpro/core/castransformation/internal/.gitignore b/dkpro-core-castransformation-asl/bin/src/main/java/de/tudarmstadt/ukp/dkpro/core/castransformation/internal/.gitignore new file mode 100644 index 0000000000..d4ec477e7b --- /dev/null +++ b/dkpro-core-castransformation-asl/bin/src/main/java/de/tudarmstadt/ukp/dkpro/core/castransformation/internal/.gitignore @@ -0,0 +1,2 @@ +/AlignmentStorage$Key.class +/AlignmentStorage.class diff --git a/dkpro-core-castransformation-asl/bin/src/test/java/de/tudarmstadt/ukp/dkpro/core/castransformation/.gitignore b/dkpro-core-castransformation-asl/bin/src/test/java/de/tudarmstadt/ukp/dkpro/core/castransformation/.gitignore new file mode 100644 index 0000000000..cb8bc7f4c6 --- /dev/null +++ b/dkpro-core-castransformation-asl/bin/src/test/java/de/tudarmstadt/ukp/dkpro/core/castransformation/.gitignore @@ -0,0 +1,4 @@ +/ApplyChangesBackmapperTest$AssertFeatureStructureCount.class +/ApplyChangesBackmapperTest$CreateFeatureStructure.class +/ApplyChangesBackmapperTest$SofaDeleteAnnotator.class +/ApplyChangesBackmapperTest.class diff --git a/dkpro-core-castransformation-asl/bin/src/test/resources/input.txt b/dkpro-core-castransformation-asl/bin/src/test/resources/input.txt new file mode 100644 index 0000000000..9887cf121f --- /dev/null +++ b/dkpro-core-castransformation-asl/bin/src/test/resources/input.txt @@ -0,0 +1,2 @@ +Lumbo labi bumbo nabi noo. Labibi humba doopi jamba Too. Mekoman jalla hembembel! Labumbu jakka +lembi nabi. Humba jumbaba tumba Jalla Jamba. diff --git a/dkpro-core-castransformation-asl/bin/src/test/resources/log4j.properties b/dkpro-core-castransformation-asl/bin/src/test/resources/log4j.properties new file mode 100644 index 0000000000..ca0c5b7a89 --- /dev/null +++ b/dkpro-core-castransformation-asl/bin/src/test/resources/log4j.properties @@ -0,0 +1,8 @@ +log4j.rootLogger=WARN,development + +log4j.appender.development=org.apache.log4j.ConsoleAppender +log4j.appender.development.layout=org.apache.log4j.PatternLayout +log4j.appender.development.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p [%t] (%C{1}) - %m%n + +log4j.logger.de.tudarmstadt.ukp = DEBUG +log4j.logger.de.tudarmstadt.ukp.dkpro.core.castransformation.ApplyChangesAnnotator = TRACE diff --git a/dkpro-core-castransformation-asl/bin/src/test/resources/output.txt b/dkpro-core-castransformation-asl/bin/src/test/resources/output.txt new file mode 100644 index 0000000000..34b822c769 --- /dev/null +++ b/dkpro-core-castransformation-asl/bin/src/test/resources/output.txt @@ -0,0 +1,297 @@ +======== CAS 0 begin ================================== + +-------- View _InitialView begin ---------------------------------- + +DocumentMetaData + sofa: _InitialView + begin: 0 + end: 141 + language: "en" + documentTitle: "input.txt" + documentId: "input.txt" + isLastSegment: false + +CAS-Text: +Lumbo labi bumbo nabi noo. Labibi humba doopi jamba Too. Mekoman jalla hembembel! Labumbu jakka +lembi nabi. Humba jumbaba tumba Jalla Jamba. + +[Lumbo labi bumbo nabi noo.] +SofaChangeAnnotation + sofa: _InitialView + begin: 0 + end: 26 + operation: "delete" +[Labibi humba doopi jamba Too.] +Sentence + sofa: _InitialView + begin: 27 + end: 56 +[Labibi] +Token + sofa: _InitialView + begin: 27 + end: 33 +[humba] +Token + sofa: _InitialView + begin: 34 + end: 39 +[doopi] +Token + sofa: _InitialView + begin: 40 + end: 45 +[jamba] +Token + sofa: _InitialView + begin: 46 + end: 51 +[Too] +Token + sofa: _InitialView + begin: 52 + end: 55 +[.] +Token + sofa: _InitialView + begin: 55 + end: 56 +[Mekoman jalla hembembel!] +Sentence + sofa: _InitialView + begin: 57 + end: 81 +[Mekoman] +Token + sofa: _InitialView + begin: 57 + end: 64 +[jalla] +Token + sofa: _InitialView + begin: 65 + end: 70 +[hembembel] +Token + sofa: _InitialView + begin: 71 + end: 80 +[!] +Token + sofa: _InitialView + begin: 80 + end: 81 +[Labumbu jakka +lembi nabi.] +Sentence + sofa: _InitialView + begin: 82 + end: 107 +[Labumbu] +Token + sofa: _InitialView + begin: 82 + end: 89 +[jakka] +Token + sofa: _InitialView + begin: 90 + end: 95 +[lembi] +Token + sofa: _InitialView + begin: 96 + end: 101 +[nabi] +Token + sofa: _InitialView + begin: 102 + end: 106 +[.] +Token + sofa: _InitialView + begin: 106 + end: 107 +[Humba jumbaba tumba Jalla Jamba.] +Sentence + sofa: _InitialView + begin: 108 + end: 140 +[Humba] +Token + sofa: _InitialView + begin: 108 + end: 113 +[jumbaba] +Token + sofa: _InitialView + begin: 114 + end: 121 +[tumba] +Token + sofa: _InitialView + begin: 122 + end: 127 +[Jalla] +Token + sofa: _InitialView + begin: 128 + end: 133 +[Jamba] +Token + sofa: _InitialView + begin: 134 + end: 139 +[.] +Token + sofa: _InitialView + begin: 139 + end: 140 +-------- View _InitialView end ---------------------------------- + +-------- View TargetView begin ---------------------------------- + +DocumentMetaData + sofa: TargetView + begin: 0 + end: 115 + language: "en" + documentTitle: "input.txt" + documentId: "input.txt" + isLastSegment: false + +CAS-Text: + Labibi humba doopi jamba Too. Mekoman jalla hembembel! Labumbu jakka +lembi nabi. Humba jumbaba tumba Jalla Jamba. + +[Labibi humba doopi jamba Too.] +Sentence + sofa: TargetView + begin: 1 + end: 30 +[Labibi] +Token + sofa: TargetView + begin: 1 + end: 7 +[humba] +Token + sofa: TargetView + begin: 8 + end: 13 +[doopi] +Token + sofa: TargetView + begin: 14 + end: 19 +[jamba] +Token + sofa: TargetView + begin: 20 + end: 25 +[Too] +Token + sofa: TargetView + begin: 26 + end: 29 +[.] +Token + sofa: TargetView + begin: 29 + end: 30 +[Mekoman jalla hembembel!] +Sentence + sofa: TargetView + begin: 31 + end: 55 +[Mekoman] +Token + sofa: TargetView + begin: 31 + end: 38 +[jalla] +Token + sofa: TargetView + begin: 39 + end: 44 +[hembembel] +Token + sofa: TargetView + begin: 45 + end: 54 +[!] +Token + sofa: TargetView + begin: 54 + end: 55 +[Labumbu jakka +lembi nabi.] +Sentence + sofa: TargetView + begin: 56 + end: 81 +[Labumbu] +Token + sofa: TargetView + begin: 56 + end: 63 +[jakka] +Token + sofa: TargetView + begin: 64 + end: 69 +[lembi] +Token + sofa: TargetView + begin: 70 + end: 75 +[nabi] +Token + sofa: TargetView + begin: 76 + end: 80 +[.] +Token + sofa: TargetView + begin: 80 + end: 81 +[Humba jumbaba tumba Jalla Jamba.] +Sentence + sofa: TargetView + begin: 82 + end: 114 +[Humba] +Token + sofa: TargetView + begin: 82 + end: 87 +[jumbaba] +Token + sofa: TargetView + begin: 88 + end: 95 +[tumba] +Token + sofa: TargetView + begin: 96 + end: 101 +[Jalla] +Token + sofa: TargetView + begin: 102 + end: 107 +[Jamba] +Token + sofa: TargetView + begin: 108 + end: 113 +[.] +Token + sofa: TargetView + begin: 113 + end: 114 +-------- View TargetView end ---------------------------------- + +======== CAS 0 end ================================== + + diff --git a/dkpro-core-io-brat-asl/pom.xml b/dkpro-core-io-brat-asl/pom.xml index 3fc48e0f78..1a7ff25d32 100644 --- a/dkpro-core-io-brat-asl/pom.xml +++ b/dkpro-core-io-brat-asl/pom.xml @@ -77,4 +77,5 @@ test + 1.10.1-taln \ No newline at end of file diff --git a/dkpro-core-io-brat-asl/src/main/java/de/tudarmstadt/ukp/dkpro/core/io/brat/BratWriter.java b/dkpro-core-io-brat-asl/src/main/java/de/tudarmstadt/ukp/dkpro/core/io/brat/BratWriter.java index 0234846f46..bc2a8cce12 100644 --- a/dkpro-core-io-brat-asl/src/main/java/de/tudarmstadt/ukp/dkpro/core/io/brat/BratWriter.java +++ b/dkpro-core-io-brat-asl/src/main/java/de/tudarmstadt/ukp/dkpro/core/io/brat/BratWriter.java @@ -19,7 +19,10 @@ import static org.apache.uima.fit.util.JCasUtil.selectAll; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.StringWriter; @@ -28,6 +31,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -46,7 +50,9 @@ import org.apache.uima.cas.text.AnnotationFS; import org.apache.uima.fit.descriptor.ConfigurationParameter; import org.apache.uima.fit.descriptor.ResourceMetaData; +import org.apache.uima.fit.util.CasUtil; import org.apache.uima.fit.util.FSUtil; +import org.apache.uima.fit.util.JCasUtil; import org.apache.uima.jcas.JCas; import org.apache.uima.resource.ResourceInitializationException; @@ -102,6 +108,14 @@ public class BratWriter extends JCasFileWriter_ImplBase @ConfigurationParameter(name = PARAM_FILENAME_EXTENSION, mandatory = true, defaultValue = ".ann") private String filenameSuffix; + /** + * Specify the suffix of output files. Default value .ann. If the suffix is not + * needed, provide an empty string as value. + */ + public static final String PARAM_HTML_TEMPLANTE = "htmlTemplate"; + @ConfigurationParameter(name = PARAM_HTML_TEMPLANTE , mandatory = false, defaultValue = "template.html") + private String htmlTemplate; + /** * Types that will not be written to the exported file. */ @@ -111,12 +125,13 @@ public class BratWriter extends JCasFileWriter_ImplBase private Set excludeTypes; /** - * Types that are text annotations (aka entities or spans). + * Types that are text annotations (aka entities or spans). Each of them includes a + * type (or parent type) after it ":" and element to extract use pipes to make a chain of elements. */ - public static final String PARAM_TEXT_ANNOTATION_TYPES = "spanTypes"; + public static final String PARAM_TEXT_ANNOTATION_TYPES = "spanTypesVals"; @ConfigurationParameter(name = PARAM_TEXT_ANNOTATION_TYPES, mandatory = true, defaultValue = { // "de.tudarmstadt.ukp.dkpro.core.api.segmentation.type.Sentence", -// "de.tudarmstadt.ukp.dkpro.core.api.segmentation.type.Token", +// "de.tudarmstadt.ukp.dkpro.core.api.segmentation.type.Token:Lemma|Value", // "de.tudarmstadt.ukp.dkpro.core.api.lexmorph.type.pos.POS", // "de.tudarmstadt.ukp.dkpro.core.api.segmentation.type.Lemma", // "de.tudarmstadt.ukp.dkpro.core.api.segmentation.type.Stem", @@ -125,7 +140,7 @@ public class BratWriter extends JCasFileWriter_ImplBase // "de.tudarmstadt.ukp.dkpro.core.api.semantics.type.SemArg", // "de.tudarmstadt.ukp.dkpro.core.api.semantics.type.SemPred" }) - private Set spanTypes; + private String[] spanTypesVals; /** * Types that are relations. It is mandatory to provide the type name followed by two feature @@ -205,7 +220,7 @@ public class BratWriter extends JCasFileWriter_ImplBase private int nextAttributeId; private int nextPaletteIndex; private Map spanIdMap; - + private Map> spanTypes; private BratConfiguration conf; private Set warnings; @@ -218,7 +233,22 @@ public void initialize(UimaContext aContext) conf = new BratConfiguration(); warnings = new LinkedHashSet(); - + spanTypes= new HashMap<>(); + for (String s: spanTypesVals){ + String[] parts=s.split(":"); + LinkedListlist; + if (spanTypes.containsKey(parts[0])){ + list=spanTypes.get(parts[0]); + } else { + list=new LinkedList<>(); + } + if (parts.length>1){ + list.add(parts[1]); + } else { + list.add(""); + } + spanTypes.put(parts[0], list); + } parsedRelationTypes = new HashMap<>(); for (String rel : relationTypes) { RelationParam p = RelationParam.parse(rel); @@ -306,32 +336,42 @@ private void writeAnnotations(JCas aJCas) // Go through all the annotations but only handle the ones that have no references to // other annotations. + for (String currentType: spanTypes.keySet()){ + for (FeatureStructure fs : selectAll(aJCas)) { + String typeName=fs.getType().getName(); + String superType = fs.getCAS().getTypeSystem().getParent(fs.getType()).getName(); + if (currentType.equalsIgnoreCase(typeName) || currentType.equalsIgnoreCase(superType)) { + writeTextAnnotation(doc, (AnnotationFS) fs); + } + } + } for (FeatureStructure fs : selectAll(aJCas)) { // Skip document annotation if (fs == aJCas.getDocumentAnnotationFs()) { continue; } - + String typeName=fs.getType().getName(); + String superType = fs.getCAS().getTypeSystem().getParent(fs.getType()).getName(); // Skip excluded types - if (excludeTypes.contains(fs.getType().getName())) { + if (excludeTypes.contains(typeName) || excludeTypes.contains(superType) ) { getLogger().debug("Excluding [" + fs.getType().getName() + "]"); continue; } - if (spanTypes.contains(fs.getType().getName())) { - writeTextAnnotation(doc, (AnnotationFS) fs); + if (spanTypes.containsKey(typeName) || spanTypes.containsKey(superType)) { + // writeTextAnnotation(doc, (AnnotationFS) fs); } - else if (parsedRelationTypes.containsKey(fs.getType().getName())) { + else if (parsedRelationTypes.containsKey(typeName)|| parsedRelationTypes.containsKey(superType)) { relationFS.add(fs); } - else if (hasNonPrimitiveFeatures(fs) && (fs instanceof AnnotationFS)) { +// else if (hasNonPrimitiveFeatures(fs) && (fs instanceof AnnotationFS)) { // else if (parsedEventTypes.containsKey(fs.getType().getName())) { - BratEventAnnotation event = writeEventAnnotation(doc, (AnnotationFS) fs); - eventFS.put(event, fs); - } +// BratEventAnnotation event = writeEventAnnotation(doc, (AnnotationFS) fs); +// eventFS.put(event, fs); +// } else if (fs instanceof AnnotationFS) { warnings.add("Assuming annotation type ["+fs.getType().getName()+"] is span"); - writeTextAnnotation(doc, (AnnotationFS) fs); + // NO writeTextAnnotation(doc, (AnnotationFS) fs); } else { warnings.add("Skipping annotation with type ["+fs.getType().getName()+"]"); @@ -358,7 +398,8 @@ else if (fs instanceof AnnotationFS) { case ".json": String template ; if (filenameSuffix.equals(".html")) { - template = IOUtils.toString(getClass().getResource("html/template.html")); + InputStream it=new FileInputStream(htmlTemplate) ; + template = IOUtils.toString(it,"UTF-8"); } else { template = "{ \"collData\" : ##COLL-DATA## , \"docData\" : ##DOC-DATA## }"; @@ -562,7 +603,9 @@ private boolean isSlotFeature(FeatureStructure aFS, Feature aFeature) private void writeRelationAnnotation(BratAnnotationDocument aDoc, FeatureStructure aFS) { RelationParam rel = parsedRelationTypes.get(aFS.getType().getName()); - + if (rel== null ) {// then is the parent type + rel=parsedRelationTypes.get(aFS.getCAS().getTypeSystem().getParent(aFS.getType()).getName()); + } FeatureStructure arg1 = aFS.getFeatureValue(aFS.getType().getFeatureByBaseName( rel.getArg1())); FeatureStructure arg2 = aFS.getFeatureValue(aFS.getType().getFeatureByBaseName( @@ -581,15 +624,25 @@ private void writeRelationAnnotation(BratAnnotationDocument aDoc, FeatureStructu String superType = getBratType(aFS.getCAS().getTypeSystem().getParent(aFS.getType())); String type = getBratType(aFS.getType()); - - BratRelationAnnotation anno = new BratRelationAnnotation(nextRelationAnnotationId, - type, rel.getArg1(), arg1Id, rel.getArg2(), arg2Id); + String value=type; + if (rel.getSubcat()!=""){ + value=aFS.getFeatureValueAsString(aFS.getType().getFeatureByBaseName(rel.getSubcat())); + } + + BratRelationAnnotation anno = new BratRelationAnnotation(nextRelationAnnotationId, + value, rel.getArg1(), arg1Id, rel.getArg2(), arg2Id); nextRelationAnnotationId++; - conf.addRelationDecl(superType, type, rel.getArg1(), rel.getArg2()); - + conf.addRelationDecl(superType, value, rel.getArg1(), rel.getArg2()); + + if (enableTypeMappings){ +// conf.addLabelDecl(type,type,type.substring(0, 2),type.substring(0, 1)); + conf.addLabelDecl(value,value); + }else { conf.addLabelDecl(anno.getType(), aFS.getType().getShortName(), aFS.getType() .getShortName().substring(0, 1)); + } + aDoc.addAnnotation(anno); @@ -604,27 +657,58 @@ private void writeTextAnnotation(BratAnnotationDocument aDoc, AnnotationFS aFS) { String superType = getBratType(aFS.getCAS().getTypeSystem().getParent(aFS.getType())); String type = getBratType(aFS.getType()); - - BratTextAnnotation anno = new BratTextAnnotation(nextTextAnnotationId, type, - aFS.getBegin(), aFS.getEnd(), aFS.getCoveredText()); - nextTextAnnotationId++; - - conf.addEntityDecl(superType, type); - - conf.addLabelDecl(anno.getType(), aFS.getType().getShortName(), aFS.getType() - .getShortName().substring(0, 1)); - - if (!conf.hasDrawingDecl(anno.getType())) { - conf.addDrawingDecl(new BratTextAnnotationDrawingDecl(anno.getType(), "black", - palette[nextPaletteIndex % palette.length])); - nextPaletteIndex++; + // check if the type has a value to display, replace the the type by the value + // do it similar as with declarations that looks for the value + LinkedList spanDatas=null; + String value=type; + if (spanTypes.containsKey(aFS.getType().getName())) { + spanDatas=spanTypes.get(aFS.getType().getName()); + } else if (spanTypes.containsKey(aFS.getCAS().getTypeSystem().getParent(aFS.getType()).getName() )) { + spanDatas=spanTypes.get(aFS.getCAS().getTypeSystem().getParent(aFS.getType()).getName() ); + } + for (String spanData : spanDatas){ + try { + if (!spanData.equalsIgnoreCase("")){ + String [] splits=spanData.split("\\|"); + if (splits.length>1){ + FeatureStructure currentAnnot = aFS.getFeatureValue(aFS.getType().getFeatureByBaseName(splits[0])); + for (int f=1;f --> -