You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用KMeans聚类推特文本时遇ValueError等异常求助

问题

尝试对包含已清洗推特(存储于text_clean列)的数据集应用无监督学习,执行KMeans的fit(X)操作时,出现AttributeError: 'NoneType' object has no attribute 'split'以及ValueError: setting an array element with a sequence错误。已对数据集做了空值处理,相关代码及报错栈如下:

完整代码

import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 加载CSV数据
df = pd.read_csv("nombre_del_archivo.csv")

# 删除含空值的行
df.dropna(inplace=True)

# 填充text_clean列剩余空值为空字符串
df['text_clean'].fillna('', inplace=True)

# 文本向量化
vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(df['text_clean'])

# 肘部法寻找最优聚类数
wcss = []
for i in range(2, 11):
    kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)

报错代码段

wcss = []
for i in range(2, 11):
    kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)
    
plt.plot(range(2, 11), wcss)
plt.title('肘部法')
plt.xlabel('聚类数')
plt.ylabel('WCSS')
plt.show()

完整报错栈

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
TypeError: float() argument must be a string or a number, not 'csr_matrix'

The above exception was the direct cause of the following exception:

ValueError                                Traceback (most recent call last)
<ipython-input-46-f1e874523304> in <module>
      3 for i in range(2, 11):
      4     kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
----> 5     kmeans.fit(X)
      6     wcss.append(kmeans.inertia_)
      7 

~\anaconda3\lib\site-packages\sklearn\cluster\_kmeans.py in fit(self, X, y, sample_weight)
   1415         self._validate_params()
   1416 
-> 1417         X = self._validate_data(
   1418             X,
   1419             accept_sparse="csr",

~\anaconda3\lib\site-packages\sklearn\base.py in _validate_data(self, X, y, reset, validate_separately, **check_params)
    544             raise ValueError("Validation should be done on X, y or both.")
    545         elif not no_val_X and no_val_y:
--> 546             X = check_array(X, input_name="X", **check_params)
    547             out = X
    548         elif no_val_X and not no_val_y:

~\anaconda3\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)
    877                     array = xp.astype(array, dtype, copy=False)
    878                 else:
--> 879                     array = _asarray_with_order(array, order=order, dtype=dtype, xp=xp)
    880             except ComplexWarning as complex_warning:
    881                 raise ValueError(

~\anaconda3\lib\site-packages\sklearn\utils\_array_api.py in _asarray_with_order(array, dtype, order, copy, xp)
    183     if xp.__name__ in {"numpy", "numpy.array_api"}:
    184         # Use NumPy API to support order
--> 185         array = numpy.asarray(array, order=order, dtype=dtype)
    186         return xp.asarray(array, copy=copy)
    187     else:

ValueError: setting an array element with a sequence.

已确认数据中无NoneType或空值,求解决方法。

解决方法

1. 统一text_clean列的数据类型

报错核心是TfidfVectorizer处理时遇到非字符串类型数据,即便填充了空值,列中可能存在数值、列表等非字符串对象。先验证数据类型:

print(df['text_clean'].apply(type).unique())

若输出包含非str类型,统一转为字符串并清理异常值:

df['text_clean'] = df['text_clean'].astype(str)
# 替换识别为字符串的空值标记
df['text_clean'] = df['text_clean'].replace(['nan', 'None'], '')

2. 处理稀疏矩阵兼容性问题

TfidfVectorizer.fit_transform()返回CSR稀疏矩阵,部分旧版本Scikit-learn对其支持有bug,可转为密集矩阵(注意:大数据量会占用大量内存):

X = vectorizer.fit_transform(df['text_clean']).toarray()

或升级依赖库到最新稳定版:

pip install --upgrade scikit-learn numpy pandas

3. 过滤无效文本

添加步骤过滤空字符串或仅含空白字符的行:

# 过滤空文本
df = df[df['text_clean'].str.strip() != '']
# 重置索引避免后续索引问题
df.reset_index(drop=True, inplace=True)

4. 适配KMeans参数版本

若使用旧版Scikit-learn,n_init参数在新版本中默认值已调整,确保参数符合当前版本要求,升级库可避免此类参数冲突。


内容的提问来源于stack exchange,提问作者Alba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:32:22