2012-02-10 10 views
18

「ö」、「ü」などの文字を含むutf-8エンコーディングを使用するテキストファイルがあります。これらのファイルのテキスト形式を解析したいと思いますが、正しく機能します。私は、標準のNLTKトークナイザを使用する場合: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) 

出力:[u'\ufeff', u'm', u'\xfc', u'sli', u'p', u'\xf6', u'\xf6', u'k', u'r', u'\xe4', u'\xe4', u'k']

プンクトのトークナイザは良くやっているようだ:

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

ありまだ'\ ufeff'私は理解できない最初のトークンの前に(私はそれを削除することはできません)。私は間違って何をしていますか?ヘルプは非常に感謝します。

答えて

19

それは、\uFEFF charは、ファイルから読み出されたコンテンツの一部である可能性が高いです。私はそれがトークナイザーによって挿入されたのではないかと思う。ファイルの先頭の\uFEFFは、非推奨の形式のByte Order Markです。他の場所に表示されている場合は、zero width non-break spaceとして扱われます。

ファイルはMicrosoft Notepadによって書かれていますか? the codecs module docsから:

UTF-8エンコーディングを検出することができると共に、信頼性を高めるために、マイクロソフトは、そのメモ帳プログラムのUTF-8(それはPython 2.5呼び出し "UTF-8-SIG")の変形を考案。 Unicode文字のいずれかがファイルに書き込まれる前に、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」文字であり、UnicodeとDOTALLフラグを正規表現r'\w+|[^\w\s]+'を使用PunktWordTokenizer()が単語としてこの文字を認識して、これは、reモジュールによってスペースとして考慮されていません。手動で文字を削除したくない場合は、以下のトークナイザを使用することができます。

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

あなたはトークナイザをNLTKするUnicode文字列を渡していることを確認する必要があります。私はあなたの文字列の最後の両方のトークナイザで以下の同一のトークン化を取得します:

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'] 
関連する問題