2013-04-11 42 views
1

我使用Python NLTK標記了一些unicode文本。 問題在於文本來自嚴重編碼的數據源,並且未指定編碼。經過一番弄亂之後,我發現文本必須是UTF-8格式。 鑑於輸入字符串:Python中的另一個unicode混亂

s = u"The problem isn’t getting to Huancavelica from Huancayo to the north." 

我想處理它與NLTK,例如用於詞性標註,但特殊字符不解決,我得到的輸出,如:

The/DT problem/NN isn’t/NN getting/VBG 

相反的:

The/DT problem/NN isn't/VBG getting/VBG 

如何從這些特殊字符中清除文本?

感謝您的任何反饋,

Mulone

更新:如果我運行HTMLParser().unescape(s),我得到:

u'The problem isn\u2019t getting to Huancavelica from Huancayo to the north.' 

在其他情況下,我還是得到像&
在文本。 我需要做些什麼才能將其轉化爲NLTK能夠理解的內容?

+0

不,您的示例輸入文本完全由您的碼。我沒有看到任何'&#....;'逃離左邊。你的示例文本是什麼*你的方法返回* – 2013-04-11 11:02:42

+0

其實我將文本存儲在一個文件中,寫入一個XML文件,然後再次讀取,所有這些都使用lxml。 – Mulone 2013-04-11 11:06:18

+0

嘗試類似'txt = lec.decode('utf8')。encode('latin9')' – 2013-04-11 11:26:15

回答

4

這不是一個字符/ Unicode編碼問題。您擁有的文本包含標記的XML/HTML numeric character reference實體。無論你用什麼庫來解析文件,都應該提供一些功能,以便將’解除引用到合適的字符。

如果你不綁定到任何庫,請參閱Decode HTML entities in Python string?

結果字符串包括一個特殊的撇號,而不是一個ASCII單引號。你可以在結果中替換它:

In [6]: s = u"isn’t" 

In [7]: print HTMLParser.HTMLParser().unescape(s) 
isn’t 

In [8]: print HTMLParser.HTMLParser().unescape(s).replace(u'\u2019', "'") 
isn't 

Unescape會照顧其餘的角色。例如&&符號本身。 
是一個CR符號(\r),可以忽略或轉換爲換行符,具體取決於原始文本的來源(舊的mac用於換行符)

+0

如果我使用'HTMLParser()。unescape(s)',我會得到:'u'從Huancayo到北部,問題沒有得到Huancavelica。'# – Mulone 2013-04-11 12:00:12

+0

我更新了我的問題。 – Mulone 2013-04-11 12:04:34

+2

這很好 - 這正是文本所在。如果你打印它而不是在REPL中顯示變量,你會看到「不是」。這不是典型的ascii撇號,但如果需要,可以用一個替換它。 – viraptor 2013-04-11 12:04:37