NLTK - nltk.tokenize.RegexpTokenizer - 正则表达式无法按预期工作

时间:2016-08-25 12:12:05

标签: python regex nlp nltk tokenize

我正在尝试使用RegexpTokenizer对文本进行标记。

代码:

from nltk.tokenize import RegexpTokenizer
#from nltk.tokenize import word_tokenize

line = "U.S.A Count U.S.A. Sec.of U.S. Name:Dr.John Doe J.Doe 1.11 1,000 10--20 10-20"
pattern = '[\d|\.|\,]+|[A-Z][\.|A-Z]+\b[\.]*|[\w]+|\S'
tokenizer = RegexpTokenizer(pattern)

print tokenizer.tokenize(line)
#print word_tokenize(line)

输出:

  

[' U''。',' S','。',' A' ,' Count',' U','。',' S','。',&# 39; A','。',' Sec','。','',' U& #39;,'。',' S','。','名称',':' ,' Dr','。',' John',' Doe',' J',&# 39;。',' Doe',' 1.11',' 1,000',' 10',' - ',' - ',' 20',' 10',' - ',' 20&# 39]

预期输出:

  

[' USA',' Count',' USA',' Sec','。' ,' of',' US',' Name',':',' Dr',& #39;。',' John',' Doe',' J。',' Doe',' ; 1.11',' 1,000',' 10',' - ',' - ',' 20',' 10',' - ',' 20']

为什么令牌者也会掠过我预期的代币?#34; U.S.A" ,"美国"? 我该如何解决这个问题?

我的正则表达式:https://regex101.com/r/dS1jW9/1

2 个答案:

答案 0 :(得分:7)

关键是您的\b是退格符,您需要使用原始字符串文字。此外,你在字符类中有文字管道,这也会弄乱你的输出。

这可以按预期工作:

>>> pattern = r'[\d.,]+|[A-Z][.A-Z]+\b\.*|\w+|\S'
>>> tokenizer = RegexpTokenizer(pattern)
>>> print(tokenizer.tokenize(line))

['U.S.A', 'Count', 'U.S.A.', 'Sec', '.', 'of', 'U.S.', 'Name', ':', 'Dr', '.', 'John', 'Doe', 'J.', 'Doe', '1.11', '1,000', '10', '-', '-', '20', '10', '-', '20']

请注意,将单个\w放入字符类是没有意义的。此外,您不需要在字符类中转义每个非单词字符(如点),因为它们在那里主要被视为文字字符(仅^]-并且\需要特别注意。)

答案 1 :(得分:0)

如果修改你的正则表达式

pattern = '[USA\.]{4,}|[\w]+|[\S]'

然后

pattern = '[USA\.]{4,}|[\w]+'
tokenizer = RegexpTokenizer(pattern)
print (''+str(tokenizer.tokenize(line)))

您可以获得所需的输出

['U.S.A', 'Count', 'U.S.A.', 'Sec', '.', 'of', 'U.S.', 'Name', ':', 'Dr', '.', 'John', 'Doe', 'J', '.', 'Doe', '1', '.', '11', '1', ',', '000', '10', '-', '-', '20', '10', '-', '20']