nltk

2012-02-10 9 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']

पंक्ट tokenizer बेहतर कर रहा है अगर मैं मानक nltk tokenizer का उपयोग फिर भी पहले टोकन से पहले '\ ufeff' जिसे मैं समझ नहीं सकता (नहीं कि मैं इसे हटा नहीं सकता)। मैं क्या गलत कर रहा हूं? बहुत सराहना में मदद करें।

उत्तर

19

यह अधिक संभावना है कि \uFEFF चार फ़ाइल से पढ़ने सामग्री का हिस्सा है। मुझे संदेह है कि यह टोकनिसर द्वारा डाला गया था। फ़ाइल की शुरुआत में \uFEFFByte Order Mark का बहिष्कृत रूप है। यदि यह कहीं और दिखाई देता है, तो इसे zero width non-break space के रूप में माना जाता है।

क्या माइक्रोसॉफ्ट नोटपैड द्वारा लिखी गई फाइल थी? the codecs module docs से:

विश्वसनीयता जिसके साथ एक UTF-8 एन्कोडिंग पता लगाया जा सकता बढ़ाने के लिए, माइक्रोसॉफ्ट UTF-8 का एक प्रकार का आविष्कार (कि अजगर 2.5 कॉल "utf-8-sig") अपने नोटपैड कार्यक्रम के लिए: किसी भी यूनिकोड वर्ण फ़ाइल में लिखा जाने से पहले, एक यूटीएफ -8 एन्कोडेड बीओएम (जो इसे बाइट अनुक्रम के रूप में दिखता है: 0xef, 0xbb, 0xbf) लिखा गया है।

इसके बजाय codecs.open() का उपयोग करके अपनी फ़ाइल पढ़ने का प्रयास करें। "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 कोड एक "शून्य चौड़ाई ब्रेक स्पेस" चरित्र है और इस re मॉड्यूल द्वारा एक स्थान के रूप में करने पर विचार नहीं कर रहा है, इसलिए PunktWordTokenizer() जो यूनिकोड साथ regex r'\w+|[^\w\s]+' का उपयोग करें और झंडे dotall एक शब्द के रूप में इस चरित्र को पहचान । आप मैन्युअल रूप से चरित्र को दूर नहीं करना चाहते हैं, तो आपको निम्न tokenizer इस्तेमाल कर सकते हैं:

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