0

テキスト分類の問題があり、2 つの機能を追加したいと考えています。私が持っているデータは、映画のレビューです (imbd データセット)。2 つの特徴を入力変数として使用して、レビューを肯定的または否定的な感情に分類したいと考えています。2 つの機能は、レビューの長さ (つまり、使用される単語) と、レビューの Bag-of-words 表現です。

FeatureUnionもう 1 つは、sklearnのオブジェクトを使用してこれを完成させたいということです。hstackそこで、 2 つのスパース行列を連結するために使用することで、それなしでそれを行う方法を考え出しました。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

4

0 に答える 0