[英]How can I write a correct nltk regular expression tokenizer in python?
我想在python中用nltk实现一个正则表达式标记器,但存在以下问题。 我使用此页面编写我的正则表达式。
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' ]
另外,如果要删除数字,应在正则表达式中写什么?
请注意, \\w
旨在解析编程语言中的标识符(我想),因此包含数字。
您还应该注意,顺序在替代列表中很重要。 最具体的应该放在第一位,其次才是更一般的。
在示例中,该图案中的第二替代方案中, \\w+(?:-\\w+)*
,已经匹配"98"
中"98%"
或"0"
在"0.78"
在这些片段匹配之后,就没有匹配"%"
或".78"
中点的模式,因此令牌化程序将它们跳过作为令牌分隔符。
因此,在这种情况下,应将与数字相关的子模式放在带有\\w
子模式之前,否则它将“偷走”数字匹配项。
不幸的是,没有仅针对字母字符的字符类快捷方式(例如\\d
仅用于数字)。 我一直在使用[^\\W\\d_]
,意思是“所有字符,除了不在\\w
或在\\d
或下划线的字符”,与“来自\\w
所有字符”相同,但没有\\d
并且没有下划线”。 但是,这不是一个易于解释的表达式。
(当然,如果您认为可以将"Naïve"
标记为["Na", "ve"]
则可以使用[A-Za-z]
["Na", "ve"]
。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.