2012-02-10 2 views
18

'ö', 'ü'등과 같은 문자를 포함하는 utf-8 인코딩을 사용하는 텍스트 파일이 있습니다.이 파일의 텍스트 형식을 구문 분석하고 싶지만 토큰 화 도구를 가져올 수 없습니다. 올바르게 작동.nltk를 사용하여 유니 코드를 토큰으로 만들기

f = open('C:\Python26\text.txt', 'r') # text = 'müsli pöök rääk' 
text = f.read() 
f.close 
items = text.decode('utf8') 
a = nltk.word_tokenize(items) 

출력 :

f = open('C:\Python26\text.txt', 'r') # text = 'müsli pöök rääk' 
text = f.read() 
f.close 
items = text.decode('utf8') 
a = PunktWordTokenizer().tokenize(items) 

출력 : [u'\ufeffm\xfcsli', u'p\xf6\xf6k', u'r\xe4\xe4k']

이 있습니다 [u'\ufeff', u'm', u'\xfc', u'sli', u'p', u'\xf6', u'\xf6', u'k', u'r', u'\xe4', u'\xe4', u'k']

PUNKT 토크 나이가 더 잘 할 것 같다 나는 표준 NLTK 토크 나이를 사용하는 경우 아직도 '\ ufeff'내가 알아낼 수없는 첫 번째 토큰 (내가 그것을 제거 할 수 없다는 것) 전에. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 도움말 크게 감사드립니다.

답변

19

그것은 \uFEFF 문자가 파일에서 읽은 내용의 일부임을 더 가능성이 높습니다. 나는 그것이 토큰 사에 의해 삽입 된 것이 아닌지 의심 스럽다. 파일 시작 부분의 \uFEFF은 더 이상 사용되지 않는 형식 인 Byte Order Mark입니다. 다른 곳에 나타나면 zero width non-break space으로 처리됩니다.

Microsoft 메모장에서 작성한 파일 이었습니까? the codecs module docs에서 :

는 UTF-8 인코딩을 검출 할 수있는 신뢰성을 높이기 위해, 마이크로 소프트는 UTF-8의 변형을 발명 (즉, 파이썬 2.5 통화 "UTF-8-SIG")의 메모장 프로그램 : 유니 코드 문자가 파일에 기록되기 전에 UTF-8로 인코딩 된 BOM (바이트 시퀀스로 보이는 : 0xef, 0xbb, 0xbf)이 기록됩니다.

대신 codecs.open()을 사용하여 파일을 읽으십시오. BOM을 사용하는 "utf-8-sig" 인코딩에 유의하십시오.

import codecs 
f = codecs.open('C:\Python26\text.txt', 'r', 'utf-8-sig') 
text = f.read() 
a = nltk.word_tokenize(text) 

실험 :

>>> open("x.txt", "r").read().decode("utf-8") 
u'\ufeffm\xfcsli' 
>>> import codecs 
>>> codecs.open("x.txt", "r", "utf-8-sig").read() 
u'm\xfcsli' 
>>> 
+0

감사합니다. 코드가 \ uFEFF를 제거하는 트릭을 수행합니다 – root

+0

@ user1199589 여러분을 환영합니다. 다행히 도울 수있어. –

+0

나도 도와 줬어. 많은 감사합니다! – Pitarou

4

UFEE 코드는 "ZERO WIDTH NO-BREAK SPACE"문자이며,이는 re 모듈에 의한 공간으로 생각하지, 그래서 플래그를 유니 코드로 정규식 r'\w+|[^\w\s]+'를 사용 DOTALL PunktWordTokenizer() 단어로이 문자를 인식 . 수동으로 문자를 제거하지 않으려면, 다음과 같은 토크 나이를 사용할 수 있습니다

nltk.RegexpTokenizer(u'\w+|[^\w\s\ufeff]+') 
12

당신은 tokenizers을 NLTK하는 유니 코드 문자열을 전달하고 있는지 확인해야합니다. 내 말 끝에 두 토큰 화기를 사용하여 문자열의 다음과 같은 동일한 토큰 화를 얻습니다.

import nltk 
nltk.wordpunct_tokenize('müsli pöök rääk'.decode('utf8')) 
# output : [u'm\xfcsli', u'p\xf6\xf6k', u'r\xe4\xe4k'] 

nltk.word_tokenize('müsli pöök rääk'.decode('utf8')) 
# output: [u'm\xfcsli', u'p\xf6\xf6k', u'r\xe4\xe4k'] 
관련 문제