在 scikit-learn 中使用 TF-IDF 和其他功能

数据挖掘 Python scikit-学习 熊猫 tfidf
2021-09-26 02:17:41

将文本分析与其他功能相结合的最佳/正确方法是什么?例如,我有一个数据集,其中包含一些文本,还有其他特征/类别。scikit-learn 的 TF-IDF 矢量化器将文本数据转换为稀疏矩阵。例如,我可以直接将这些稀疏矩阵与朴素贝叶斯分类器一起使用。但是如何同时考虑其他功能呢?我应该对文本的 tf-idf 表示进行去稀疏化并将特征和文本组合到一个 DataFrame 中吗?或者我可以将稀疏矩阵保留为单独的列吗?这样做的正确方法是什么?

3个回答

scikit-learn 的FeatureUnion连接来自不同矢量化器的特征。可以在此处找到组合异构数据(包括文本)的示例。

通常,如果可能,您希望尽可能长时间地保持矩阵稀疏,因为它可以节省大量内存。这就是为什么毕竟有稀疏矩阵的原因,否则,何必呢?因此,即使您的分类器要求您使用密集输入,您也可能希望将 TFIDF 特征保持为稀疏,并以稀疏格式向它们添加其他特征。然后仅使矩阵密集。

为此,您可以使用scipy.sparse.hstack它按列将两个稀疏矩阵组合在一起。scipy.sparse.vstack也存在。当然,scipy 也有非稀疏版本 scipy.hstack 和 scipy.vstack

想象一下,您有一个包含四个特征列和一个目标的数据框。其中两个特征是您想要对其执行 tfidf 的文本列,另外两个是您想要用作 RandomForest 分类器中的特征的标准列。

我会使用以下代码:

from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_extraction.text import TfidfVectorizer

# Set X and y
X = df[['text1_column_name', 
        'text2_column_name', 
        'standard_feature1', 
        'standard_feature2']]
y = df['target']

# initialise model and vectorizers
model = RandomForestClassifier()
vectorizer1 = TfidfVectorizer()
vectorizer2 = TfidfVectorizer()

# construct the column transfomer
column_transformer = ColumnTransformer(
    [('tfidf1', vectorizer1, 'text1_column_name'), 
    ('tfidf2', vectorizer2, 'text2_column_name')],
    remainder='passthrough')

# fit the model
pipe = Pipeline([
                  ('tfidf', column_transformer),
                  ('classify', model)
                ])
pipe.fit(X,y)