如何在python中编写正确的nltk正则表达式标记生成器?

时间:2017-02-07 16:23:24

标签: python regex nltk

我想在python中使用nltk实现一个正则表达式标记生成器,但是我遇到了以下问题。我使用this page来编写正则表达式。

import string
import nltk
from nltk.tokenize import RegexpTokenizer
from nltk.corpus import stopwords

def preprocess(sentence):
    sentence = sentence.lower()
    pattern = r'''(?x)          # set flag to allow verbose regexps
        (?:[A-Z]\.)+        # abbreviations, e.g. U.S.A.
     | \w+(?:-\w+)*        # words with optional internal hyphens
     | \$?\d+(?:\.\d+)?%?
     | \$?\d+%?
     |/\m+(?:[-'/]\w+)*
   '''
   tokenizer = RegexpTokenizer(pattern)
   tokens = tokenizer.tokenize(sentence)
   print tokens

str= 'i have one 98% 0.78 gener-alized 22 rule /m/0987hf /m/08876 i nees packages'
preprocess(str)

我得到了这个

['i', 'have', 'one', '98', '0', '78', 'gener-alized', '22', 'rule', '/m/0987hf', '/m/08876', 'i', 'nees', 'packages']

我想要这个结果

['i', 'have', 'one', '98%', '0.78', 'gener_alized', '22', 'rule', '/m/0987hf', '/m/08876', 'l', 'need', 'packages' ]

另外,如果我想删除数字,我应该在正则表达式中写什么?

1 个答案:

答案 0 :(得分:1)

请注意,\w旨在解析编程语言中的标识符(我猜),因此包含数字。

您还应该知道订单在备选方案列表中很重要。 最具体的应该先行,然后是更一般的那些。

在您的示例中,模式中的第二个替代方法\w+(?:-\w+)*已匹配"98"中的"98%""0"中的"0.78"。 在这些片段匹配后,没有匹配"%"".78"中的点的模式,因此令牌器将其作为标记分隔符跳过。

因此,在这种情况下,您应该将与数字相关的子模式放在具有\w的子模式之前,否则它将“偷走”数字匹配。

不幸的是,字母字符没有字符类快捷方式(仅限数字\d)。 我一直在使用[^\W\d_],这意味着“除\w之内或\d或下划线中的所有字符外,所有字符均与”所有字符相同来自\w的字符,但没有\d且没有下划线“。然而,这并不是一个容易理解的表达方式。

(如果您认为可以将[A-Za-z]标记为"Naïve",则可以使用["Na", "ve"]。)

相关问题