2016-08-25 56 views
3

我試圖使用RegexpTokenizer令牌化文本。NLTK - 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', '計數', 'U','。','S','。','A','。','Sec','。','of','U','。','S','。 ','Name',':','Dr','。','John','Doe','J','。','Doe','1.11','1,000','10',' ' - ',' - ','20','10',' - ','20']

預期輸出:

[ 'USA', '伯爵', '美國', '秒', '中', '美國', '名', '' '' ,'Dr','','John','Doe','J.','Doe','1.11','1,000','10',' - ',' - ','20',' '10',' - ','20']

爲什麼令牌標記還會使我預期的標記「美國」,「美國」? 我該如何解決這個問題?

我的正則表達式:https://regex101.com/r/dS1jW9/1

回答

6

點的輸出是您的\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成一個字符類是沒有意義的。此外,您不需要轉義字符類中的每個非單詞字符(如點),因爲它們大多被視爲文字字符(只有^],-\需要特別注意)。

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

'[USA \。] {4,} | [\ w] +''也會匹配'............'。不需要在字符類中放入一個'\ w'並在字符類內部轉義一個點。 –

+0

同意 - 但隨着測試數據給出(我懶得想一個更好的解決方案)這是我給的:) –

相關問題