Hi Peter and thank you once again for your excellent support of your excellent RUTA software!
Your second example was very much what I needed. Thank you so far! I have one last bump in the road: My Person#id feature is an FSArray with ID annotations instead of a plain uima.cas.String. So, one Person annotation might have multiple IDs per the type system. The ID type has a feature “entryId”. In my particular case I actually have only one entry in the id array. Still, I need to access this entry somehow. Is that at all possible in RUTA? I would need something like // collect ids of all covered Persons using an extra list STRINGLIST ids; pe:PersonEnumeration{-> pe.personIds = ids} <-{p:Person{-> ADD(ids,p.id <http://p.id/>[0].entryId)};}; This does not seem to be covered by the FeatureExpression grammar in RUTA. Is there a work around? Otherwise I will have to solve it some other way. Many thanks, Erik > On 7. Jan 2021, at 10:47, Peter Klügl <peter.klu...@averbis.com> wrote: > > Hi Erik, > > > it depends on how you want to represent the information of the ids of > the covered Person annotations. You somehow need to represent the values > in the PersonEnumeration annotation. I assume that the ID feature of > Person is uima.cas.String? PersonEnumeration could either use one String > Feature, a StringArray feature or a FSArray feature (pointing to the > Person annotation which provide the IDs). > > Here are two examples: > > > PACKAGE uima.ruta; > > // mock types > DECLARE CC, EnumCC; > DECLARE Person (STRING id); > DECLARE PersonEnumeration (FSArray persons); > > // mock annotations > "Trump" -> Person ("id" = "1"); > "Biden" -> Person ("id" = "2"); > "and" -> CC; > > COMMA? @CC{-> EnumCC}; > > // identify enum span > (Person (COMMA Person)* EnumCC Person){-> PersonEnumeration}; > > // collect all covered Persons > pe:PersonEnumeration{-> pe.persons = Person}; > > ######################## > > ######################## > > PACKAGE uima.ruta; > > // mock types > DECLARE CC, EnumCC; > DECLARE Person (STRING id); > DECLARE PersonEnumeration (StringArray personIds); > > // mock annotations > "Trump" -> Person ("id" = "1"); > "Biden" -> Person ("id" = "2"); > "and" -> CC; > > COMMA? @CC{-> EnumCC}; > > // identify enum span > (Person (COMMA Person)* EnumCC Person){-> PersonEnumeration}; > > // collect ids of all covered Persons using an extra list > STRINGLIST ids; > pe:PersonEnumeration{-> pe.personIds = ids} > <-{p:Person{-> ADD(ids,p.id)};}; > > > > > Best, > > > Peter > > > Am 06.01.2021 um 08:29 schrieb Erik Fäßler: >> Hello everyone (and a happy new year :-)), >> >> I have been working on the following issue: Whenever there is conjunction in >> text of two entities (e.g. [...]Biden and Trump ran for president […]) I >> create a new annotation spanning both entities and the conjunction ([Biden >> and Trump]_coordination). I can do this fine. >> However, my entities - Biden and Trump - also have the ID feature. The new >> annotation should receive both IDs from the Biden and Trump annotations. But >> I couldn’t manage to do this. >> >> I have rules like this: >> >> (Person ( >> ",” (Person) >> ","? PennBioIEPOSTag.value=="CC" >> Person >> ) {->MARK(PersonEnumeration)}; >> >> So an enumeration of Persons are covered with a new annotation of type >> “PersonEnumeration”. And now “PersonEnumeration” should receive all the ID >> features from the covered Person annotations. How can I do this? >> >> Best, >> >> Erik > > -- > Dr. Peter Klügl > Head of Text Mining/Machine Learning > > Averbis GmbH > Salzstr. 15 > 79098 Freiburg > Germany > > Fon: +49 761 708 394 0 > Fax: +49 761 708 394 10 > Email: peter.klu...@averbis.com > Web: https://averbis.com > > Headquarters: Freiburg im Breisgau > Register Court: Amtsgericht Freiburg im Breisgau, HRB 701080 > Managing Directors: Dr. med. Philipp Daumke, Dr. Kornél Markó >