我正在尝试使用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
答案 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']