ANTLR на зашумленном потоке данных, часть 3

Все еще в процессе изучения ANTLR ... Недавно я разместил 2 вопроса относительно синтаксического анализа текста и извлечения информации, не считая «нежелательных» слов или символов. После очень интересного обсуждения с Бартом Кирсом анализа зашумленного потока данных Часть 1 и и разбор зашумленного потока данных Часть 2, я заканчиваю с еще одной проблемой ...

Изначально моя грамматика выглядела так

VERB            : 'SLEEPING' | 'WALKING';
SUBJECT         : 'CAT'|'DOG'|'BIRD'; 
INDIRECT_OBJECT : 'CAR'| 'SOFA';
ANY2            :'A'..'Z'+ {skip();};
ANY             : . {skip();};

parse 
  :  sentenceParts+ EOF 
  ;

sentenceParts  
  :  SUBJECT VERB INDIRECT_OBJECT  
  ;    

предложение типа it's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TV. приведет к следующему

alt text

Это хорошо ... и он делает то, что я хочу, то есть извлекает только слова CAT, SLEEPING и SOFA, оставляя в стороне другие слова. Теперь по другой причине мне нужно ввести новый токен в мою грамматику, назовем его OTHER : 'PLANE'. Позже он будет использован другим правилом. Я все еще хочу, чтобы мое основное правило работало: SUBJECT VERB INDIRECT_OBJECT. Допустим, в моем предложении есть токен 'PLANE', например

it's 10PM and the Lazy CAT on the PLANE is currently SLEEPING heavily on the SOFA in front of the TV. Это приведет к следующей ошибке (здесь нет ничего удивительного, поскольку лексер имеет четкое определение PLANE в качестве токена)

 alt text



Есть ли способ сообщить ANTLR, что если я ввожу правило sentenceParts, меня интересуют только 3 определенных мною токена, а именно SUBJECT, VERB или INDIRECT_OBJECT, даже если он встречает другой токен, не учитывать? Я хотел бы иметь возможность сделать это, не добавляя OTHER? везде в этом правиле


person BlackLabrador    schedule 03.12.2010    source источник


Ответы (2)


Well in fact, I might have found a way to do it... Although it's questionable at that point to introduce tokens if you don't want to parse them, this solution works :

VERB            : 'SLEEPING' | 'WALKING';
SUBJECT         : 'CAT'|'DOG'|'BIRD'; 
INDIRECT_OBJECT : 'CAR'| 'SOFA';
OTHER       : 'PLANE';
OTHER2      : 'BEAUTIFUL';
OTHER3      : 'HEAVILLY';
ANY2            :'A'..'Z'+ {skip();};
ANY             : . {skip();};

синтаксический анализ: предложениеParts + EOF;

следующий: (параметры {жадность = ложь;}:.) *;

предложениеParts
: SUBJECT следующий ГЛАГОЛ следующий INDIRECT_OBJECT
;



в следующем предложении it's 10PM and the Lazy CAT on the BEAUTIFUL PLANE is currently SLEEPING HEAVILLY on the SOFA in front of the TV будет получено следующее дерево ... Таким образом, промежуточный токен

 alt text

person BlackLabrador    schedule 04.12.2010
comment
Да, это немного странный подход. Обратите внимание, что на самом деле не имеет значения, добавляете ли вы пару next в свои правила вместо OTHER?. Если честно, я считаю, что это все довольно грязно. Возможно, вы могли бы объяснить, что вы на самом деле пытаетесь здесь сделать, поскольку у меня создается впечатление, что вы объясняете только очень упрощенную версию своей реальной проблемы. - person Bart Kiers; 04.12.2010
comment
Привет, Барт, ты абсолютно прав. Как вы сказали, у меня более сложная проблема. Я провожу исследования в области медицины и просматриваю различные отчеты. Проблема в том, что в файлах нет реальных структур. Мне нужно поймать очень специфического патерна, например, у пациента X, 45 лет, у него проблемы с бла-бла-бла, а количество холестерина составляет 0,65-0,85 на мл / кровь ... и т. Д. Очевидно, есть много цифр и беспорядочных данных, которые я не т забота. Я просто хочу закончить с ВОЗРАСТОМ, ХОЛЕСТЕРИНОМ, 0,65-0,85 ... Но я буду токенизировать все другие числа или токены ключа неорганизованным образом ... - person BlackLabrador; 04.12.2010
comment
Хм, это будет непросто. Возможно, вы захотите немного погуглить для существующих парсеров NLP. Если вам это удобно, вы также можете опубликовать пару сложных примеров из реального мира, с которыми вы столкнулись до сих пор, или, по крайней мере, что-то очень близкое к этому: возможно, я (или кто-то другой) могу предложить что-то более подходящее, чем дорога. вы сейчас гуляете (что, ИМО, будет не очень плодотворно). Удачи! - person Bart Kiers; 04.12.2010
comment
Постараюсь привести реальный пример. Всего один быстрый вопрос: можно ли определить 2 разных лексера и использовать их в одной грамматике? Спасибо - person BlackLabrador; 07.12.2010
comment
Не то, чтобы я знаю. Возможно, вы захотите посмотреть вики-статью о грамматике острова: antlr.org/wiki/display/ANTLR3/ - person Bart Kiers; 08.12.2010
comment
Спасибо, Барт, я посмотрю на это - person BlackLabrador; 10.12.2010

Есть ли способ сообщить ANTLR, что если я ввожу правило предложения Части, меня интересуют только 3 токена, которые я определил, а именно SUBJECT, VERB или INDIRECT_OBJECT, и что, даже если он встречается с другим токеном, не вводить его в учетная запись ? Я хотел бы иметь возможность делать это, не ставя ДРУГОЕ? везде в этом правиле

No.

Вы либо игнорируете токен, либо нет, и в этом случае вам придется сделать его необязательным в правилах парсера.

person Bart Kiers    schedule 03.12.2010