如何用python编写正确的nltk正则表达式标记器?

2024-09-30 01:35:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用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' ]

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


Tags: fromimporthaveonesentencetokenizerpatterntokenize
1条回答
网友
1楼 · 发布于 2024-09-30 01:35:27

请注意,\w是为解析编程语言中的标识符而设计的(我猜),因此包括数字。在

你还应该知道,在一系列备选方案中,顺序很重要。 最具体的应该放在第一位,其次是更一般的。在

在您的示例中,模式中的第二个备选方案\w+(?:-\w+)*已经匹配了"98%"中的"98",或者{}中的{}。 在这些片段匹配之后,就没有匹配"%"或{}中的点的模式,因此标记器会将它们作为标记分隔符跳过。在

因此,在本例中,您应该将与数字相关的子模式放在带有\w的子模式之前,否则它将“窃取”数字匹配。在

不幸的是,对于字母字符没有字符类的快捷方式(比如\d只用于数字)。 我一直在使用[^\W\d_],这意味着“除了不在\w或{}中的字符或下划线之外的所有字符”,这与“所有来自\w但没有\d和下划线的字符除外”。然而,这不是一个容易理解的表达。在

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

相关问题 更多 >

    热门问题