使用'utf8'编码处理列表文档内容
我遇到了一个错误:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xba in position 1266: invalid start byte
在第
X_train = self.vectorizer.fit_transform(self.data_train.data)
行。
所以我尝试这样编码数据:
self.data_train.data = unicode(self.data_train.data, "utf-8")
结果出现了错误:
TypeError: coercing to Unicode: need string or buffer, list found
这里正确的文本编码方法是什么呢?
代码片段:
self.data_train = self.fetch_data(cache, subset='train')
if not os.path.exists(self.root_dir+"/autocreated/vectorizer.txt"):
self.vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5,
stop_words='english')
start_time = time()
print("Transforming the dataset")
X_train = self.vectorizer.fit_transform(self.data_train.data) // Error is here
joblib.dump(self.vectorizer, self.root_dir+"/autocreated/vectorizer.txt")
1 个回答
2
你在对一个列表使用 unicode
,但它其实只适用于单个字符串。
self.data_train.data = [s.decode("utf-8") for s in self.data_train.data]
这个语法是正确的;不过这样做又会出问题,因为这些字符串不是有效的 UTF-8,正如 scikit-learn 已经告诉你的那样。
你可以通过 s.decode("utf-8", errors='ignore')
让 decode
忽略编码错误,或者更简单的方法是让 scikit-learn 来处理这个问题:
TfidfVectorizer(sublinear_tf=True, max_df=0.5, stop_words='english',
decode_error='ignore')
(不过,重新检查一下你假设输入是 UTF-8 的想法可能是个好主意;如果不是,这可能会对你的结果产生负面影响。)