Как настроить слова тега в грамматике GATE JAPE?

У меня есть набор документов, и каждый документ имеет свой заголовок. Пример: если в заголовке документа указано «Психологическая оценка», я хочу пометить документ как «Медицинское правило».

  1. Я загрузил документ и загрузил ANNIE с настройками по умолчанию.
  2. В разделе «Ресурсы обработки» > «Создать» > Jape Transducer 2.1 написал следующий код в текстовом документе и сохранил его как расширение .JAPE.

КОД :


Phase: ConjunctionIdentifier
Input: Token Split    
Rule: Medicalrule
(
({Token.string=="Psychological"})+({Token.string == " "})+ ({Token.string == "Evaluation"}):Meddoc({Token.kind=="word"})
)

--> 
:Meddoc
  {
    gate.AnnotationSet matchedAnns= (gate.AnnotationSet) bindings.get("Meddoc"); gate.FeatureMap newFeatures= Factory.newFeatureMap();newFeatures.put("rule","Medicalrule");annotations.add(matchedAnns.firstNode(),matchedAnns.lastNode(),"CC", newFeatures);
 }

  1. Загрузил созданный выше файл .JAPE и повторно инициализировал

После запуска приложения в наборе аннотаций тег не отображается!

Я где-то ошибаюсь? Было бы здорово, если бы кто-нибудь помог мне в этом.

Цените свое время.

Спасибо


person Sanjeev    schedule 02.12.2013    source источник


Ответы (2)


Я вижу здесь три проблемы.

  • Во-первых, как говорит Ашингель, пробелы не представлены в виде Token аннотаций - это сделано намеренно, поскольку в большинстве случаев вам не важны интервалы между словами, а только сами слова.
  • Во-вторых, ({Token.kind=="word"}) в конце означает, что правило будет совпадать только тогда, когда за «Психологической оценкой» следует другое слово перед концом текущего предложения (поскольку у вас есть Split в строке ввода).
  • В-третьих, вы привязываете метку Meddoc только к токену «Оценка», а не ко всему совпадению.

Я бы попытался упростить LHS правила:

Phase: ConjunctionIdentifier
Input: Token Split    
Rule: Medicalrule
(
  {Token.string=="Psychological"}
  {Token.string == "Evaluation"}
):meddoc

а для RHS (а) вам не нужно делать явное bindings.get, потому что вы использовали помеченный блок, поэтому у вас уже есть связанные аннотации, (б) вы должны использовать outputAS вместо annotations, и (c) вы обычно следует избегать метода add, который принимает узлы, так как это небезопасно, если наборы входных и выходных аннотаций различаются. Если вы используете недавний снимок GATE, то gate.Utils статические методы могут вам здесь очень помочь.

:meddoc {
    Utils.addAnn(outputAS, meddocAnnots,"CC",
                 Utils.featureMap("rule","Medicalrule"));
}

Если вы используете 7.1 или более раннюю версию, метод addAnn недоступен, поэтому он немного более запутан:

:meddoc {
  try {
    outputAS.add(Utils.start(meddocAnnots), Utils.end(meddocAnnots),"CC",
                 Utils.featureMap("rule","Medicalrule"));
  } catch(InvalidOffsetException e) { // can't happen, but won't compile without
    throw new JapeException(e);
  }
}

Наконец, просто для проверки, вы действительно добавили свой новый JAPE Transducer PR в конец пайплайна?

person Ian Roberts    schedule 03.12.2013
comment
Да, я добавил JAPE Transducer PR в конец конвейера, спасибо, Лан и Ашингель. - person Sanjeev; 11.12.2013

Я уверен, что нет аннотации типа: Token.string == " ". Вместо этого попробуйте использовать аннотацию SpaceToken. Кроме того, почему бы не попробовать географические справочники вместо жесткого кодирования текстовых значений в коде JAPE?

person ashingel    schedule 03.12.2013