2

私はsklearnのPipelineを使ってテキストを分類しています。この例ではSklearnパイプラインにさまざまな入力を合わせるにはどうすればいいですか?

パイプラインは、私はその後、トレーニングデータをフィットし、予測を行い、パイプラインのステップとしてTFIDFのベクトル化とFeatureUnionで包まれたいくつかのカスタム機能と分類器を持っている:

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

X = ['I am a sentence', 'an example'] 
Y = [1, 2] 
X_dev = ['another sentence'] 

# load custom features and FeatureUnion with Vectorizer 
features = [] 
measure_features = MeasureFeatures() # this class includes my custom features 
features.append(('measure_features', measure_features)) 

countVecWord = TfidfVectorizer(ngram_range=(1, 3), max_features= 4000) 
features.append(('ngram', countVecWord)) 

all_features = FeatureUnion(features) 

# classifier 
LinearSVC1 = LinearSVC(tol=1e-4, C = 0.10000000000000001) 

pipeline = Pipeline(
    [('all', all_features), 
    ('clf', LinearSVC1), 
    ]) 

pipeline.fit(X, Y) 
y_pred = pipeline.predict(X_dev) 

# etc. 

上記のコードの作品ちょうど良いですが、ひねりがあります。私は、テキストの音声タグ付けのパーツを行い、タグ付けテキストに別のVectorizerを使用したいと思います。

X = ['I am a sentence', 'an example'] 
X_tagged = do_tagging(X) 
# X_tagged = ['PP AUX DET NN', 'DET NN'] 
Y = [1, 2] 
X_dev = ['another sentence'] 
X_dev_tagged = do_tagging(X_dev) 

# load custom featues and FeatureUnion with Vectorizer 
features = [] 
measure_features = MeasureFeatures() # this class includes my custom features 
features.append(('measure_features', measure_features)) 

countVecWord = TfidfVectorizer(ngram_range=(1, 3), max_features= 4000) 
# new POS Vectorizer 
countVecPOS = TfidfVectorizer(ngram_range=(1, 4), max_features= 2000) 

features.append(('ngram', countVecWord)) 
features.append(('pos_ngram', countVecWord)) 

all_features = FeatureUnion(features) 

# classifier 
LinearSVC1 = LinearSVC(tol=1e-4, C = 0.10000000000000001) 

pipeline = Pipeline(
    [('all', all_features), 
    ('clf', LinearSVC1), 
    ]) 

# how do I fit both X and X_tagged here 
# how can the different vectorizers get either X or X_tagged? 
pipeline.fit(X, Y) 
y_pred = pipeline.predict(X_dev) 

# etc. 

どのようにこの種のデータに適切に適合しますか? 2つのベクタライザは、生のテキストとposのテキストをどのように区別できますか?私の選択肢は何ですか?

私もカスタム機能を持っていますが、その中には生のテキストとその他のPOSテキストを取り込むものもあります。

EDIT:追加されましたMeasureFeatures()

from sklearn.base import BaseEstimator 
import numpy as np 

class MeasureFeatures(BaseEstimator): 

    def __init__(self): 
     pass 

    def get_feature_names(self): 
     return np.array(['type_token', 'count_nouns']) 

    def fit(self, documents, y=None): 
     return self 

    def transform(self, x_dataset): 


     X_type_token = list() 
     X_count_nouns = list() 

     for sentence in x_dataset: 

      # takes raw text and calculates type token ratio 
      X_type_token.append(type_token_ratio(sentence)) 

      # takes pos tag text and counts number of noun pos tags (NN, NNS etc.) 
      X_count_nouns.append(count_nouns(sentence)) 

     X = np.array([X_type_token, X_count_nouns]).T 

     print X 
     print X.shape 

     if not hasattr(self, 'scalar'): 
      self.scalar = StandardScaler().fit(X) 
     return self.scalar.transform(X) 

この機能トランスは、その後count_nouns()関数またはtype_token_ratioのための生のテキスト(のためのタグ付きテキストを取るのいずれかが必要)

答えて

2

私は、あなたが持っていると思いますFeatureUnion on 2 Transformers(TfidfTransformerおよびPOSTransformer)を実行します。もちろん、そのPOSTransformerを定義する必要があります。
多分このarticleがお手伝いします。

多分あなたのパイプラインはこのように見えます。

pipeline = Pipeline([ 
    ('features', FeatureUnion([ 
    ('ngram_tf_idf', Pipeline([ 
     ('counts_ngram', CountVectorizer()), 
     ('tf_idf_ngram', TfidfTransformer()) 
    ])), 
    ('pos_tf_idf', Pipeline([ 
     ('pos', POSTransformer()),   
     ('counts_pos', CountVectorizer()), 
     ('tf_idf_pos', TfidfTransformer()) 
    ])), 
    ('measure_features', MeasureFeatures()) 
    ])), 
    ('classifier', LinearSVC()) 
]) 

そして、これはMeasureFeaturesPOSTransformerがsklearn APIにトランスフォーマー準拠していることを前提としています。

+0

最新の編集でMeasureFeatures()を追加しました。基本的には、1セットのフィーチャの生テキストと、他のフィーチャセットのposタグセットを取る必要があります。 2つのMeasureFeatureクラスが役立つでしょうか? 1つは生テキスト機能用、もう1つはPOSタグ機能用です。 –

+0

私はあなたのワークフローをここで実際には見ません。私があなたに提案したもの、そのリンクとこの例(http://scikit-learn.org/stable/auto_examples/hetero_feature_union.html)を見てください。その後、ワークフローについて考えるだけで、データはどうなるのでしょうか。 – dooms

関連する問題