2017-02-11 15 views
0

所以我想從文本中提取一些信息,我正在使用NLTK分塊。NLTK Chunk Parser:如何轉義特殊字符

這裏是我的輸入

The stocks show 67% rise, last year it was 12% fall

我想捕捉

67% rise12% fall

詞性標註上面的句子表明

('The', 'DT'), ('stocks', 'NNS'), ('show', 'VBP'), ('67', 'CD'), ('%', 'NN'), ('rise', 'NN'), (',', ','), ('last', 'JJ'), ('year', 'NN'), ('it', 'PRP'), ('was', 'VBD'), ('12', 'CD'), ('%', 'NN'), ('fall', 'NN') 

現在,我來了同一個簡單的規則

Stat: {<CD><NN>(<NN>+|<VBN>|JJ)?}

效果很好,並且捕獲

('67', 'CD'), ('%', 'NN'), ('rise', 'NN') 

('12', 'CD'), ('%', 'NN'), ('fall', 'NN') 

但在我的數據集,我有這樣的東西

5 million dollars

這是

('5', 'CD'), ('man', 'NN'), ('stock', 'NN')

並且也被錯誤地捕獲。所以我想包括我的規則

Stat: {<CD><%>(<NN>+|<VBN>|JJ)?}

%跡象,但是這個規則現在不匹配任何內容。我如何在我的塊規則中轉義/包含%

更新

所以,我不明白的是,我可以匹配其他特殊字符。舉例來說,如果我有一個規則爲

XYZ:{<:>}

這一切的: s比輸入。因此,所有我試圖做的是

XYZ:{<%>}

,這是行不通的。我曾試圖逃脫%通過

XYZ:{<\%>}

但這也不管用。我試過\\但無濟於事。我真的不想修改輸入字符串,因爲一旦我匹配,我想找出匹配的字符串的索引。所以,如果我修改輸入字符串,這將甩掉我的指數,除非我先做一個逆向轉換

+1

我認爲你不能將文本(''%),只有其標籤(奇怪的是,'NN'匹配)。如果你得到另一個POS標籤,它爲'%'提供了一個獨特的標籤,那麼你可能可以改進分塊。 – lenz

+0

我是否可以將nltk的chunker與其他POS tagger一起使用? nltk是否有其他pos標籤可用?或者我應該去做一些像斯坦福大學的標記? – AbtPst

+0

@lenz有沒有一種方法來指定一個規則,比如'NN與字符串%'匹配? – AbtPst

回答

1

那麼,因爲它的正則表達式,你可以逃避它。

Stat: {<CD><\%>(<NN>+|<VBN>|JJ)?} 

你也可以有一個你想要替換的關鍵字列表,這樣你的塊規則不會變得太長。

例如

s = '56% rise and 75% fall' 
gen_replacements = [('%', 'PERCENTAGE'), ('perc.', 'PERCENTAGE'), etc] 
for ndl, rpl in gen_replacements: 
    s = s.replace(' %s ' % ndl, ' %s ' % rpl) 

Stat: {<CD><PERCENTAGE>(<NN>+|<VBN>|JJ)?} 
+0

您確定您熟悉ChunkParser解釋對標記文本進行操作的塊表達式嗎? – lenz

+0

謝謝,但轉義不起作用 – AbtPst

+0

lenz:你能精心設計嗎?我後面的建議?這不是作爲一個工作的例子,而是一個建議。我不親自使用NLTK,而是使用Pattern,通過NLTK文檔閱讀,似乎可行的做法是包含諸如%這樣的字符,通過轉義來避免它們,因爲它表明規則僅僅是正則表達式。 – alexisdevarennes

0

使用像 < CD模式> < NN> +