2016-11-01 76 views
1

我想pos_tag以下文字:NLTK正則表達式的結果錯了pos_tag輸出日期和貨幣

text = """5.1 Basic Wage: 

£350.00 per week payable by monthly instalments in arrear 
from 18.12.2015 to 30.06.2016 

£550.00 per week payable by monthly instalments in arrear 
from 01.07.2016 to 30.06.2017 
£650.00 per week payable by monthly instalments in arrear 
from 01.07.2017 to 30.06.2018 
and £25 from 12.07.2016 to 18th December 2016""" 

這個問題似乎是日期的一部分要麼標記爲$VB(18.', '$'), (u'12.2015', 'CD')(u' 30.', 'VB'), (u'06.2018', 'CD')代替(u'18.12.2015', CD),而實際貨幣450.00, 650.00被拾起,因爲只有CD,我至今對正則表達式是

sentence_re = r'''(?x)(?:(?:[A-Z])(?:.[A-Z])+.?) 
         | (?:\$?\d+(?:.\d+)?%?) 
         | (?:\w+(?:-\w+)*) 
         | (?:...|)(?:[][.,;"\'?():-_`]) 
        ''' 
toks = nltk.regexp_tokenize(text, sentence_re) 

postoks = nltk.tag.pos_tag(toks) 
print postoks 

對於我的生活,我似乎無法使此任何進展,所以任何幫助,非常感謝。

+0

'toks'的輸出與預期的一樣嗎?因爲我觀察到令牌化需要修復。 –

+1

嘗試[?(?x)(?:(?:[AZ])(?:\。[AZ])+ \。?)|(?:[£$]?\ d +(?:\。\ d + )*%)|(:\ W +(: - \ W +)*)|(:\ {3} | [] [,; \「\'():?_ \' - ]????)。 '](https://regex101.com/r/DsTVhr/1)。我懷疑你錯過了點,這裏的主要解決方法是用'*'替換'?'替換'(?:\。 \ d +)'模式。 –

回答

1

我建議this regex

(?x)(?:(?:[A-Z])(?:\.[A-Z])+\.?) 
| (?:[£$]?\d+(?:\.\d+)*%?) 
| (?:\w+(?:-\w+)*) 
| (?:\.{3}|[][.,;\"\'?():_`-]) 

注:

  • 字符類以外的所有點似乎與字面點,因此必須進行轉義
  • 的貨幣符號字符類擴展爲[£$](您可以在那裏添加更多)
  • \d+(?:\.\d+)?變成\d+(?:\.\d+)*個現在這將匹配子像12.34.56
  • 最後...應該匹配點,所以,它變成\.{3}和交替與標點字符類,其中連字符放在以免創建一個範圍並匹配一個文字連字符。