使用FeatureUnion中的CountVectorizo​​r使用非正式功能

时间:2017-08-09 14:45:00

标签: python text pipeline countvectorizer

我有文本分类问题,想要添加两个功能。我的数据是电影评论(imbd数据集)。我想使用两个特征作为输入变量来将评论分类为正面或负面情绪。这两个特征是:评论长度(所以使用的单词)和评论的词袋表示。

所以另一件事是我想用sklearn中的FeatureUnion对象来完成它。所以我想出了如何在没有使用hstack来连接两个稀疏矩阵的情况下做到这一点。但作为一个学习目的,我很好奇如何用FeatureUnion做这件事,因为我无法绕道而行。

我迄今使用的资源:

到目前为止,我有以下代码:

from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.feature_extraction.text import CountVectorizer

# Instantiate pipeline: pl
pl = Pipeline([
        ('union', FeatureUnion(
            transformer_list = [
                ('numeric_features', Pipeline([
                    ('extract', ColumnExtractor(cols)),
                    ('length', AverageWordLengthExtractor())
                ])),
                ('text_features', Pipeline([
                    ('vectorizer', CountVectorizer())
                ]))
             ]
        )),
        ('clf', LinearSVC())
    ])

自定义变形金刚:

class AverageWordLengthExtractor(TransformerMixin):
    """Takes in dataframe, extracts road name column, outputs average word length"""

    def review_length(self, review):
        """Helper code to compute length of a review"""
        return len(review.split())

    def fit(self, X, y=None):
        """Returns `self` unless something different happens in train and test"""
        return self

    def transform(self, X, y=None):
        """The workhorse of this feature extractor"""
        return X.apply(self.review_length)

和另一个自定义Transformer:

class ColumnExtractor(TransformerMixin):
    """Takes in dataframe, extracts road name column, outputs average word length"""

    def __init__(self, cols):
        self.cols = cols

    def fit(self, X, y=None):
        """Returns `self` unless something different happens in train and test"""
        return self

    def transform(self, X, y=None):
        """The workhorse of this feature extractor"""
        return X[self.cols]

请注意,X_train,y_train,X_test和y_test数据集将转换为pandas DataFrame,因此管道的输入将是一个数据帧。

我认为错误的是CountVectorizer,因为这会输出一个稀疏矩阵。我应该使用CountVectorizer类型创建自己的自定义转换器,这样它会返回一个数据帧吗?如果是这样,使用大型语料库的计算成本是否非常昂贵?我真的可以使用一些帮助我的想法是我无法在CountVectorizer课程中使用FeatureUnion完整的图片。

0 个答案:

没有答案