2015-06-02 38 views
-1

我想標記文本,使用POS標記器,然後使用自定義的「模式」(見下文)塊輸出它的輸出。這些是我的安裝導入存儲庫,然後是pos標籤的輸出。Python NLTK和正則表達式

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分塊:

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 ng模式,使得800(CD)mm(NN)也將被視爲VAL。我認爲我的VAL代碼表示:找到一個標記標記的CD,然後是標記標記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

嘗試圍繞你的語法/組塊規則的順序轉動(這樣VAL人來過第一)。 nltk解析器對此非常重要,並且不允許使用多個解析樹,因此它將採用第一個匹配。 – Igor