我想用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)
我知道了
^{pr2}$我想要这个结果
['i', 'have', 'one', '98%', '0.78', 'gener_alized', '22', 'rule', '/m/0987hf', '/m/08876', 'l', 'need', 'packages' ]
另外,如果我想删除数字,我应该在正则表达式中写些什么?在
请注意,
\w
是为解析编程语言中的标识符而设计的(我猜),因此包括数字。在你还应该知道,在一系列备选方案中,顺序很重要。 最具体的应该放在第一位,其次是更一般的。在
在您的示例中,模式中的第二个备选方案}中的{}。
在这些片段匹配之后,就没有匹配}中的点的模式,因此标记器会将它们作为标记分隔符跳过。在
\w+(?:-\w+)*
已经匹配了"98%"
中的"98"
,或者{"%"
或{因此,在本例中,您应该将与数字相关的子模式放在带有
\w
的子模式之前,否则它将“窃取”数字匹配。在不幸的是,对于字母字符没有字符类的快捷方式(比如}中的字符或下划线之外的所有字符”,这与“所有来自
\d
只用于数字)。 我一直在使用[^\W\d_]
,这意味着“除了不在\w
或{\w
但没有\d
和下划线的字符除外”。然而,这不是一个容易理解的表达。在(当然,如果您认为可以将
"Naïve"
标记为["Na", "ve"]
,那么可以使用[A-Za-z]
。)相关问题 更多 >
编程相关推荐