带有TfidfVectorizer的ColumnTransformer产生“空词汇”错误

Ser*_*nov 3 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)
Run Code Online (Sandbox Code Playgroud)

这给了我:

ValueError: empty vocabulary; perhaps the documents only contain stop words
Run Code Online (Sandbox Code Playgroud)

显然,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>
Run Code Online (Sandbox Code Playgroud)

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

Viv*_*mar 5

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

标量字符串或整数应在转换器期望X像一维数组(矢量)的情况下使用,否则会将二维数组传递给转换器。

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

更改为:

clmn = ColumnTransformer([("tfidf", tfidf, "a")],
                         remainder="passthrough")
Run Code Online (Sandbox Code Playgroud)

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

dataset['a']

vs 

dataset[['a']]
Run Code Online (Sandbox Code Playgroud)

更新:@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")
Run Code Online (Sandbox Code Playgroud)