在做中文文本情感分類預處理時,編碼問題着實浪費我不少時間,總結如下:
1. 文件是中文,內容是酒店評論,首先是打開文件和寫入新文件。
因爲pickle存儲默認爲是二進制形式,在Python中爲bytes類型,打開和寫入方式需用二進制方式:
# 讀取文件內容
def getContent(filename):
with open(filename, 'rb') as f: # 打開該中文文件的方式需二進制方式打開:rb
contents = f.readline()
f.close()
return contents
result_file = open(result_path, 'wb+') # 同樣新建的儲存中文的文件也要是二進制方式:wb+
result_file.write(content)
2. 對整合好的文件進行分詞再存儲時,同樣要保證編碼格式
def prepareData(sourcefile, targerfile):
source = codecs.open(sourcefile, 'rb')
target = codecs.open(targerfile, 'w', encoding='utf-8')
for line in source:
line = line.decode('gbk', 'ignore')
line = clearTxt(line)
seg_line = sent2word(line)
target.writelines(seg_line + '\n')
讀入時需將二進制格式decode爲str類型,且因爲decode的函數原型是decode([encoding], [errors='strict']),可以用第二個參數控制錯誤處理的策略,默認的參數就是strict,代表遇到非法字符時拋出異常; 如果設置爲ignore,則會忽略非法字符;
如果設置爲replace,則會用?取代非法字符;
如果設置爲xmlcharrefreplace,則使用XML的字符引用。
新建文件並寫入時,可在新建時進行編碼格式標記,這樣writelines()時就可以直接寫入了。