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

Posted

技术标签:

【中文标题】NLTK - nltk.tokenize.RegexpTokenizer - 正则表达式未按预期工作【英文标题】:NLTK - nltk.tokenize.RegexpTokenizer - regex not working as expected 【发布时间】:2017-01-01 20:51:02 【问题描述】:

我正在尝试使用 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', '.', 'A', '. ', 'Sec', '.', 'of', 'U', '.', 'S', '.', 'Name', ':', 'Dr', '.', 'John', 'Doe'、'J'、'.'、'Doe'、'1.11'、'1,000'、'10'、'-'、'-'、'20'、'10'、'-'、'20 ']

预期输出:

['USA', 'Count', 'USA', 'Sec', '.', 'of', 'US', 'Name', ':', 'Dr', '.', ' John'、'Doe'、'J.'、'Doe'、'1.11'、'1,000'、'10'、'-'、'-'、'20'、'10'、'-'、'20 ']

为什么分词器也会拆分我预期的令牌“U.S.A”、“U.S.”? 我该如何解决这个问题?

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

【问题讨论】:

【参考方案1】:

关键是您的 \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 放入字符类是没有意义的。此外,您不需要转义字符类中的每个非单词字符(如点),因为它们在那里大多被视为文字字符(只有 ^]-\ 需要特殊注意)。

【讨论】:

【参考方案2】:

如果你修改你的正则表达式

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']

【讨论】:

'[USA\.]4,|[\w]+' 也将匹配 ............。无需将单个 \w 放入字符类并转义字符类中的点。 同意 - 但由于给出了测试数据(我懒得想更好的解决方案),这就是我给出的:)

以上是关于NLTK - nltk.tokenize.RegexpTokenizer - 正则表达式未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

NLTK1

snownlp和nltk啥关系

linux下python3离线加载nltk_data,不用nltk.download()

离线下载安装 NLTK 的 nltk_data 模块

离线下载安装 NLTK 的 nltk_data 模块

NLTK学习笔记:NLTK的一些工具