私は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のための生のテキスト(のためのタグ付きテキストを取るのいずれかが必要)
最新の編集でMeasureFeatures()を追加しました。基本的には、1セットのフィーチャの生テキストと、他のフィーチャセットのposタグセットを取る必要があります。 2つのMeasureFeatureクラスが役立つでしょうか? 1つは生テキスト機能用、もう1つはPOSタグ機能用です。 –
私はあなたのワークフローをここで実際には見ません。私があなたに提案したもの、そのリンクとこの例(http://scikit-learn.org/stable/auto_examples/hetero_feature_union.html)を見てください。その後、ワークフローについて考えるだけで、データはどうなるのでしょうか。 – dooms