Подбор подстрок в жаворонке - PullRequest
0 голосов
/ 03 марта 2020

Как правильно сопоставить подстроки, используя 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

То есть, Ларк не только видит входные данные как неоднозначные, но также и не второй анализ, так как два терминала («Джон» и «и») потребляются дважды.

...