Используя Ruta, получите данные, присутствующие в следующей строке аннотированного ключевого слова. - PullRequest
1 голос
/ 06 ноября 2019

Как получить данные ниже / выше аннотированного ключевого слова, присутствующего в другой строке? Я могу комментировать ключевое слово, но не могу получить информацию

Пример текста:

Underwriter's Name    Appraiser's Name          Appraisal Company Name
Alice Wheaton Cooper  Bruce Banner               Stark Industries

Код

TYPESYSTEM utils.PlainTextTypeSystem;
ENGINE utils.PlainTextAnnotator;

EXEC(PlainTextAnnotator, {Line});
ADDRETAINTYPE(WS);
Line{->TRIM(WS)};
REMOVERETAINTYPE(WS);
Document{->FILTERTYPE(SPECIAL)};

DECLARE UnderWriterKeyword, NameKeyword, UnderWriterNameKeyword;
DECLARE UnderWriterName(String label, String value);

CW{REGEXP("\\bUnderwriter") -> UnderWriterKeyword};
CW{REGEXP("Name")->NameKeyword};
(UnderWriterKeyword SW NameKeyword){->UnderWriterNameKeyword};
ADDRETAINTYPE(SPACE);
Line{CONTAINS(UnderWriterNameKeyword)} Line -> {
    (CW SPACE)+ {-> MARK(UnderWriterName)};
    };
REMOVERETAINTYPE(SPACE)

Ожидаемый результат:

Underwriter's Name: Alice Wheaton Cooper    
Appraiser's Name: Bruce Banner
Appraisal Company Name: Stark Industries

Подскажите, пожалуйста, возможно ли это в РУТА? Если это правда, как получить данные?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019
TYPESYSTEM utils.PlainTextTypeSystem;
ENGINE utils.PlainTextAnnotator;

DECLARE Header;
DECLARE ColumnDelimiter;
DECLARE Cell(INT column);

DECLARE Keyword (STRING label);
DECLARE Keyword UnderWriterNameKeyword, AppraiserNameLicenseKeyword,
AppraisalCompanyNameKeyword;

"Underwriter's Name" -> UnderWriterNameKeyword ( "label" = "UnderWriter
Name");
"Appraiser's Name/License" -> AppraiserNameLicenseKeyword ( "label" =
"Appraiser Name");
"Appraisal Company Name" -> AppraisalCompanyNameKeyword ( "label" =
"Appraisal Company Name");

DECLARE Entry(Keyword keyword);

EXEC(PlainTextAnnotator, {Line,Paragraph});

ADDRETAINTYPE(WS);
Line{->TRIM(WS)};
Paragraph{->TRIM(WS)};

SPACE[3,100]{-PARTOF(ColumnDelimiter) -> ColumnDelimiter};
Line -> {ANY+{-PARTOF(Cell),-PARTOF(ColumnDelimiter) -> Cell};};
REMOVERETAINTYPE(WS);

INT index = 0;
BLOCK(structure) Line{}{
    ASSIGN(index, 0);
    Line{STARTSWITH(Paragraph) -> Header};
    c:Cell{-> c.column = index, index = index + 1};
}

Header<-{hc:Cell{hc.column == c.column}<-{k:Keyword;};}
    # c:@Cell{-PARTOF(Header) -> e:Entry, e.keyword = k};

DECLARE Entity (STRING label, STRING value);
DECLARE Entity UnderWriterName, AppraiserNameLicense, AppraisalCompanyName;

FOREACH(entry) Entry{}{
    entry{ -> CREATE(UnderWriterName, "label" = k.label, "value" =
entry.ct)}<-{k:entry.keyword{PARTOF(UnderWriterNameKeyword)};};
    entry{ -> CREATE(AppraiserNameLicense, "label" = k.label, "value" =
entry.ct)}<-{k:entry.keyword{PARTOF(AppraiserNameLicenseKeyword)};};
    entry{ -> CREATE(AppraisalCompanyName, "label" = k.label, "value" =
entry.ct)}<-{k:entry.keyword{PARTOF(AppraisalCompanyNameKeyword)};};
}

Наиболее важным правилом является следующее:

Header<-{hc:Cell{hc.column == c.column}<-{k:Keyword;};}
    # c:@Cell{-PARTOF(Header) -> e:Entry, e.keyword = k};

Содержит три элемента правила Header, # и Cell и работает следующим образом:

  • Правило начинает совпадать с элементом правила Cell, поскольку оно помечено как якорь с @.
  • Этот элемент правила совпадает со всеми аннотациями Cell, которые не являются частьюHeader аннотация. Он начинается с первой аннотации Cell, которая удовлетворяет этому условию, и называет ее «c».
  • Следующий элемент правила - #, который соответствует, пока следующий элемент правила не сможет соответствовать.
  • Следующий элемент правила соответствует аннотации Header, если встроенное правило может соответствовать в пределах аннотации Header. Встроенное правило соответствует аннотациям Cell, которые помнят как "hc" в этом диапазоне, которые имеют то же значение для функции column. Совпадение будет успешным, если оно содержит Keyword, запомненное как «k».
  • Если эти три элемента правила совпадают успешно, действия применяются.
  • Первое действие создает Entry аннотация, называемая "e", для диапазона аннотации Cell.
  • Второе действие назначает ключевое слово функции Entry keyword.

КакТаким образом, правило создает аннотацию Entry для каждой аннотации Cell, которая не является частью заголовка, и назначает ключевое слово заголовка соответствующего столбца для определения типа записи.

0 голосов
/ 06 ноября 2019

Взгляните на встроенные правила в рута.

Вы можете определить свое состояние для одной строки и добавить необходимую информацию в следующую строку:

Line{CONTAINS(UserName)} Line -> { //your logic here };
...