2016-08-25 3 views
3

RegexpTokenizer를 사용하여 텍스트를 토큰 화하려고합니다.NLTK - nltk.tokenize.RegexpTokenizer - regex가 예상대로 작동하지 않습니다.

코드 :

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', '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' 'Do', 'Doe', 'Doe', 'Doe', '1.11', '1,000', '10', ' '-', '-', '20', '10', '-', '20']

예상 출력 :

[ '미국', '백작', 'USA', '초', '미국', '이름', '의' '.' '' 'Doe', 'Doe', 'Doe', '1.11', '1,000', '10', '-', '-', '20', ' '10 ','- ','20 ']

tokenizer가 내 토큰 "us", "US"을 왜 spiltting하는 이유는 무엇입니까? 이 문제를 어떻게 해결할 수 있습니까?

내 정규식 : 당신이 당신의 정규식 MOD 경우 https://regex101.com/r/dS1jW9/1

답변

6

점을 원하는 출력이다 \b은 백 스페이스 문자 였으므로 원시 문자열 리터럴을 사용해야합니다. 또한 문자 클래스에서 문자 그대로 출력을 엉망으로 만드는 문자 파이프가 있습니다.

이 예상대로 작동 : 문자 클래스에 하나의 \w을 두는 것은 무의미 것을

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

참고. 또한 문자 클래스의 문자가 아닌 문자 (점과 같은)는 대개 리터럴 문자로 처리되므로 문자로만 이스케이프 할 필요가 없습니다 (^, ], -\에만주의해야합니다).

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

동의 -하지만 테스트 데이터가 주어 졌기 때문에 (그리고 나는 더 나은 해결책을 생각하기에는 너무 게을 렀습니다.) 이것이 제가 준 것입니다 :) –

관련 문제