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 - 正则表达式未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章