使用TfidfVectorizer的ColumnTransformer生成“空词汇表”

2024-04-28 11:31:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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)

这给了我:

^{pr2}$

显然,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>

出现这种错误的原因是什么?如何纠正?在


Tags: fromimport目的withtransform数组sklearndataset
2条回答

这是因为您提供的是["a"],而不是ColumnTransformer中的"a"。根据文件:

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数据框中选择数据。执行以下操作时,请检查返回数据的格式(数据类型、形状):

^{pr2}$

回答:关于你的更新文档,你认为是误解了。如果要在两个列上执行tfidf,则需要传递两个transformer。像这样:

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")

我们可以创建一个定制的tfidf转换器,它可以接受一个列数组,然后在应用.fit().transform()之前连接它们。在

试试这个!在

from sklearn.base import BaseEstimator,TransformerMixin

class custom_tfidf(BaseEstimator,TransformerMixin):
    def __init__(self,tfidf):
        self.tfidf = tfidf

    def fit(self, X, y=None):
        joined_X = X.apply(lambda x: ' '.join(x), axis=1)
        self.tfidf.fit(joined_X)        
        return self

    def transform(self, X):
        joined_X = X.apply(lambda x: ' '.join(x), axis=1)

        return self.tfidf.transform(joined_X)        

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

clmn = ColumnTransformer([("tfidf", custom_tfidf(tfidf), ['a','b'])],remainder="passthrough")
clmn.fit_transform(dataset)

#
array([[0.36439074, 0.51853403, 0.72878149, 0.        , 0.        ,
        0.25926702, 1.        ],
       [0.        , 0.438501  , 0.        , 0.61629785, 0.61629785,
        0.2192505 , 2.        ]])

注:可能需要为每个列创建一个tfidf向量器,然后创建一个字典,其中key作为列名,value作为fitted vectorizer。此字典可在转换相应列时使用

相关问题 更多 >