我想在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' ]
另外,如果我想删除数字,我应该在正则表达式中写什么?
答案 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"]
。)