文本挖掘与分类中列表转字符串遇TypeError错误求助
解决CountVectorizer处理单词列表的TypeError问题
我一眼就看出你遇到的问题根源了:X_train里的每个元素都是单词列表(甚至可能是spaCy的Token对象列表),而" ".join()只能拼接字符串组成的序列,直接用它处理列表序列肯定会触发TypeError。另外你生成FilteredArticle时,存的是Token对象而非字符串,这也会给后续处理埋下隐患。
下面给你两种直接可行的解决方案:
方案一:提前将单词列表转换为空格分隔的字符串(推荐)
先修正FilteredArticle的生成逻辑,把spaCy Token转成文本字符串,再将每个列表拼接成单个字符串:
Data['FilteredArticle'] = 0.0 for i in range(Data.shape[0]): DS = nlp(Data['Titre-Article'][i]) # 提取Token的文本内容,过滤后拼接成字符串 filtered_text = " ".join([w.text for w in DS if w.is_alpha and not w.is_stop and not w.is_punct and len(w)>3]) Data['FilteredArticle'][i] = filtered_text
之后再进行数据集划分和CountVectorizer的拟合,此时X_train的每个元素都是标准字符串,完全符合CountVectorizer的要求:
from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import CountVectorizer X_train, X_valid, y_train, y_valid = train_test_split(Data.FilteredArticle, Data.classe) count_vect = CountVectorizer(analyzer='word', token_pattern=r'\w{1,}') count_vect.fit(X_train) # 转换训练集和验证集为词频矩阵 X_train_counts = count_vect.transform(X_train) X_valid_counts = count_vect.transform(X_valid)
方案二:自定义Tokenizer直接处理单词列表
如果想保留单词列表的形式(比如已经提前完成了分词,不想再重复处理),可以给CountVectorizer自定义一个tokenizer,直接返回输入的列表:
# 先确保FilteredArticle里的元素是字符串列表(而非Token对象) Data['FilteredArticle'] = 0.0 for i in range(Data.shape[0]): DS = nlp(Data['Titre-Article'][i]) filtered_words = [w.text for w in DS if w.is_alpha and not w.is_stop and not w.is_punct and len(w)>3] Data['FilteredArticle'][i] = filtered_words # 自定义tokenizer,直接返回输入的单词列表 def custom_tokenizer(doc): return doc # 初始化CountVectorizer时关闭默认的预处理和小写转换(因为已经提前处理过了) count_vect = CountVectorizer( analyzer='word', tokenizer=custom_tokenizer, preprocessor=None, lowercase=False ) count_vect.fit(Data.FilteredArticle)
关键提醒:
你原来的代码里还有一个隐藏问题:生成FilteredArticle时存的是spaCy的Token对象,而非字符串。就算你解决了join的问题,CountVectorizer默认会把Token对象转换成"<Token 'word'>"这样的文本,完全不是你想要的单词内容,所以一定要先转成w.text!
内容的提问来源于stack exchange,提问作者MKD
相关产品推荐
相关产品推荐

