使用'utf8'编码处理列表文档内容

0 投票
1 回答
809 浏览
提问于 2025-04-19 04:22

我遇到了一个错误:

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 的想法可能是个好主意;如果不是,这可能会对你的结果产生负面影响。)

撰写回答