Как использовать шаблон регулярных выражений 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 фразами:
- пицца была хорошей
- паста была плохой
Однако, если мое предложение что-то вроде:
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