NLTK正则表达式导致日期和货币的pos_tag输出错误

时间:2016-11-01 17:58:17

标签: python regex 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

对于我的生活,我似乎无法取得任何进展,所以非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我建议this regex

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

注意:

  • 字符类之外的所有点似乎都与字面点匹配,因此必须进行转义
  • 货币符号char类扩展为[£$](您可以在那里添加更多)
  • \d+(?:\.\d+)?已变为\d+(?:\.\d+)*,现在这将匹配12.34.56
  • 等子字符串
  • 最后...应该匹配点,因此,它会转换为\.{3}并与标点字符类交替,其中连字符放在最后以免创建范围并匹配文字连字符。