Как правильно сопоставить подстроки, используя Lark ?
Мое намерение (может быть, это невозможно / нежелательно с Lark или любым другим CFG) - сопоставлять и анализировать только важно частей строки, игнорируя остальные. Например:
- Из " Джон " я бы хотел проанализировать "Джон" как
one_person
. - Из "Вчера Джон спал ", я бы хотел разобрать" Джона "как
one_person
и игнорировать все остальное. - Из " Иоанна и Марии " я бы хотел проанализировать "Иоанна и Марию" как
two_people
. - Из "Вчера Иоанна и Марии" поцеловал. ", Я бы хотел разобрать" Джон и Мэри "как
two_people
и игнорировать все остальное.
Вот мой код:
from lark import Lark, tree
grammar = """
input: not_important* important not_important*
important: one_person
| two_people
one_person: PERSON
two_people: one_person conj one_person
not_important: RANDOM_WORD
conj: CONJ
PERSON: "John" | "Mary"
CONJ: "and" | "or"
RANDOM_WORD: /\\w+/
%import common.WS
%ignore WS
"""
if __name__ == '__main__':
parser = Lark(grammar, start='input', ambiguity='explicit')
tree = parser.parse('Yesterday John and Mary kissed')
print(tree.pretty())
Это работает:
- Когда важная часть ничего не окружает, например, "Джон" или "Джон и Мэри".
- Или когда только одна сторона важной части имеет неважные вещи, например " Джон спал "или" Джон и Мэри поцеловались ".
Но это не работает, когда неважные вещи окружают важные вещи, например," Вчера Джон и Мэри поцеловались ". В этом примере я надеялся получить:
input
not_important Yesterday
important
two_people
one_person John
conj and
one_person Mary
not_important kissed
Но я получаю:
_ambig
input
not_important Yesterday
important
one_person John
not_important and
not_important Mary
not_important kissed
input
not_important Yesterday
important
two_people
one_person John
conj and
one_person Mary
not_important kissed
not_important John
not_important and
То есть, Ларк не только видит входные данные как неоднозначные, но также и не второй анализ, так как два терминала («Джон» и «и») потребляются дважды.