python - 带有TfidfVectorizer的ColumnTransformer产生 “empty vocabulary”错误

标签 python scikit-learn

我正在使用ColumnTransformer运行一个非常简单的实验,目的是转换列数组,在此示例中为[“a”]:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.compose import ColumnTransformer
dataset = pd.DataFrame({"a":["word gone wild","gone with wind"],"c":[1,2]})
tfidf = TfidfVectorizer(min_df=0)
clmn = ColumnTransformer([("tfidf", tfidf, ["a"])],remainder="passthrough")
clmn.fit_transform(dataset)

这给了我:
ValueError: empty vocabulary; perhaps the documents only contain stop words

显然,TfidfVectorizer可以自己执行fit_transform():
tfidf.fit_transform(dataset.a)
<2x5 sparse matrix of type '<class 'numpy.float64'>'
    with 6 stored elements in Compressed Sparse Row format>

发生这种错误的原因可能是什么,以及如何纠正该错误?

最佳答案

那是因为您要提供["a"]而不是"a"中的ColumnTransformer。根据文档:

A scalar string or int should be used where transformer expects X to be a 1d array-like (vector), otherwise a 2d array will be passed to the transformer.



现在,TfidfVectorizer需要一个字符串迭代器作为输入(因此是一维字符串数组)。但是,由于您正在发送ColumnTransformer中的列名列表(即使该列表仅包含单个列),因此它将是二维数组,并将其传递给TfidfVectorizer。因此,错误。

更改为:
clmn = ColumnTransformer([("tfidf", tfidf, "a")],
                         remainder="passthrough")

为了获得更多的理解,请尝试使用以上内容从pandas DataFrame中选择数据。在执行以下操作时,请检查返回数据的格式(dtype,形状):
dataset['a']

vs 

dataset[['a']]

更新:@SergeyBushmanov,关于您对其他答案的评论,我认为您在误解文档。如果要在两列上执行tfidf,则需要传递两个转换器。像这样的东西:
tfidf_1 = TfidfVectorizer(min_df=0)
tfidf_2 = TfidfVectorizer(min_df=0)
clmn = ColumnTransformer([("tfidf_1", tfidf_1, "a"), 
                          ("tfidf_2", tfidf_2, "b")
                         ],
                         remainder="passthrough")

关于python - 带有TfidfVectorizer的ColumnTransformer产生 “empty vocabulary”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54694923/

相关文章:

python - 按列向量化二维字符数组

python - 映射 - 特征重要性与标签分类

python - sklearn 的 KMeans : Cluster centers and cluster means differ. 数值不精确?

Python os.exec() : Termination on running 'notify-send'

python - 线程代码在调用 FFI 进程时崩溃

c++ - 如何在 Python 中检索程序输出?

python - Django 围绕标题发送电子邮件 u''

python - 如何从 scikit-learn 的 TransformedTargetRegressor 管道中经过训练的估计器访问属性?

machine-learning - OneVsRestClassifier 的损失函数

python - SQLAlchemy - 创建表模板