2015-06-02 4 views
-1

Я пытаюсь подделать текст, использовать теггер POS, а затем вырезать его вывод с помощью настраиваемого «шаблона» (см. Ниже). Это мои репозитории импорта, а затем вывод помечены позицией.Python NLTK и Regexp

from nltk.chunk import * 
from nltk.chunk.util import * 
from nltk.chunk.regexp import * 

pos = [(u'max', 'NN'), (u'workpiece', 'NN'), (u'diameter', 'NN'), (u'250', 'CD'), (u'mm', 'NN'), (u'threading', 'VBG'), (u'length', 'NN'), (u'800', 'CD'), (u'mm', 'NN'), (u'max', 'NN'), (u'module', 'NN'), (u'5', 'CD'), (u'total', 'NN'), (u'power', 'NN'), (u'requirement', 'NN'), (u'5', 'CD'), (u'kW', 'NNP')] 

Я пытаюсь настроить POS Chunker я создал следующим образом:

pattern = r""" 
      FEAT: {<NN><NN>+} 
       {<VBG><NN>} 
      VAL: {<CD><NN|NNP>} 
      """ 

Мой выходной ток:

(S 
    (ATTR max/NN workpiece/NN diameter/NN) 
    (VAL 250/CD mm/NN) 
    (ATTR threading/VBG length/NN) 
    800/CD 
    (ATTR mm/NN max/NN module/NN) 
    5/CD 
    (ATTR total/NN power/NN requirement/NN) 
    (VAL 5/CD kW/NNP) 

Моя требуемая мощность:

(S 
    (ATTR max/NN workpiece/NN diameter/NN) 
    (VAL 250/CD mm/NN) 
    (ATTR threading/VBG length/NN) 
    (VAL 800/CD mm/NN) 
    (ATTR max/NN module/NN) 
    5/CD 
    (ATTR total/NN power/NN requirement/NN) 
    (VAL 5/CD kW/NNP) 

Как я могу настроить этот chucki так что 800 (CD) мм (NN) также будут рассматриваться как VAL. Я думал, что мой код VAL выражает: найдите один маркер с маркированным тегом, за которым следует токен NN. И какой подход я должен предпринять для достижения этого?

Благодаря

ответ

1

Не уверен, если я понимаю, что именно вы после этого, и это помогло бы, если отформатировать ваш пример немного лучше, и объяснить, что вы на самом деле делаете с вашим переменным шаблоном. Но я бы предпочел; добавив часть NN | NNP? Нечто подобное ?:

import nltk 

pos = [('max', 'NN'), ('workpiece', 'NN'), ('diameter', 'NN'), ('250', 'CD'), ('mm', 'NN'), ('threading', 'VBG'), ('length', 'NN'), ('5', 'CD'), ('800', 'CD'), ('mm', 'NN'), ('max', 'NN'), ('module', 'NN')] 

pattern = r""" 
     FEAT: {<NN><NN>+} 
     {<VBG><NN>} 
     VAL: {<CD><NN|NNP>?} 
     """ 

parser = nltk.RegexpParser(pattern) 
print(parser.parse(pos)) 

Выход:

(S 
    (FEAT max/NN workpiece/NN diameter/NN) 
    (VAL 250/CD mm/NN) 
    (FEAT threading/VBG length/NN) 
    (VAL 5/CD) 
    (VAL 800/CD) 
    (FEAT mm/NN max/NN module/NN)) 
+0

спасибо за ответ, я отредактировал мой оригинальный пост – OAK

+1

Try оборачиваясь порядка ваших правил грамматики/Chunker (так что VAL приходит первый). Парсер nltk для этого довольно триггерный и не позволяет использовать несколько деревьев синтаксического анализа, поэтому он будет иметь первое совпадение. – Igor

Смежные вопросы