Как использовать шаблон регулярных выражений nltk для извлечения определенного фрагмента фразы?

Я написал следующее регулярное выражение, чтобы пометить определенный шаблон фраз

pattern = """
        P2: {<JJ>+ <RB>? <JJ>* <NN>+ <VB>* <JJ>*}
        P1: {<JJ>? <NN>+ <CC>? <NN>* <VB>? <RB>* <JJ>+}
        P3: {<NP1><IN><NP2>}
        P4: {<NP2><IN><NP1>}

    """

Этот шаблон правильно пометит фразу, такую ​​как:

a = 'The pizza was good but pasta was bad'

и дать желаемый результат с 2 фразами:

  1. пицца была хорошей
  2. паста была плохой

Однако, если мое предложение что-то вроде:

a = 'The pizza was awesome and brilliant'

соответствует только фразе:

'pizza was awesome' 

вместо желаемого:

'pizza was awesome and brilliant'

Как мне включить шаблон регулярных выражений для моего второго примера?

1 ответ

Решение

Во-первых, давайте посмотрим на POS-теги, которые дает NLTK:

>>> from nltk import pos_tag
>>> sent = 'The pizza was awesome and brilliant'.split()
>>> pos_tag(sent)
[('The', 'DT'), ('pizza', 'NN'), ('was', 'VBD'), ('awesome', 'JJ'), ('and', 'CC'), ('brilliant', 'JJ')]
>>> sent = 'The pizza was good but pasta was bad'.split()
>>> pos_tag(sent)
[('The', 'DT'), ('pizza', 'NN'), ('was', 'VBD'), ('good', 'JJ'), ('but', 'CC'), ('pasta', 'NN'), ('was', 'VBD'), ('bad', 'JJ')]

(Примечание: выше приведены выходы NLTK v3.1 pos_tag, старая версия может отличаться)

То, что вы хотите захватить, по сути:

  • NN VBD JJ CC JJ
  • NN VBD JJ

Итак, давайте поймать их с помощью этих шаблонов:

>>> from nltk import RegexpParser
>>> sent1 = ['The', 'pizza', 'was', 'awesome', 'and', 'brilliant']
>>> sent2 = ['The', 'pizza', 'was', 'good', 'but', 'pasta', 'was', 'bad']
>>> patterns = """
... P: {<NN><VBD><JJ><CC><JJ>}
... {<NN><VBD><JJ>}
... """
>>> PChunker = RegexpParser(patterns)
>>> PChunker.parse(pos_tag(sent1))
Tree('S', [('The', 'DT'), Tree('P', [('pizza', 'NN'), ('was', 'VBD'), ('awesome', 'JJ'), ('and', 'CC'), ('brilliant', 'JJ')])])
>>> PChunker.parse(pos_tag(sent2))
Tree('S', [('The', 'DT'), Tree('P', [('pizza', 'NN'), ('was', 'VBD'), ('good', 'JJ')]), ('but', 'CC'), Tree('P', [('pasta', 'NN'), ('was', 'VBD'), ('bad', 'JJ')])])

Так что это "обман" путем жесткого кодирования!!!

Давайте вернемся к шаблонам POS:

  • NN VBD JJ CC JJ
  • NN VBD JJ

Можно упростить до:

  • NN VBD JJ (CC JJ)

Таким образом, вы можете использовать дополнительные операторы в регулярном выражении, например:

>>> patterns = """
... P: {<NN><VBD><JJ>(<CC><JJ>)?}
... """
>>> PChunker = RegexpParser(patterns)
>>> PChunker.parse(pos_tag(sent1))
Tree('S', [('The', 'DT'), Tree('P', [('pizza', 'NN'), ('was', 'VBD'), ('awesome', 'JJ'), ('and', 'CC'), ('brilliant', 'JJ')])])
>>> PChunker.parse(pos_tag(sent2))
Tree('S', [('The', 'DT'), Tree('P', [('pizza', 'NN'), ('was', 'VBD'), ('good', 'JJ')]), ('but', 'CC'), Tree('P', [('pasta', 'NN'), ('was', 'VBD'), ('bad', 'JJ')])])

Скорее всего, вы используете старый тегер, поэтому ваши шаблоны отличаются, но я думаю, вы видите, как вы можете захватить нужные фразы, используя приведенный выше пример.

Шаги:

  • Сначала проверьте, что такое POS-шаблоны, используя pos_tag
  • Затем обобщите шаблоны и упростите их
  • Затем поместите их в RegexpParser
Другие вопросы по тегам