2

Metni sınıflandırmak için sklearn'den Pipeline kullanıyorum. Bir TfIDF vectorizer ve FeatureUnion ve Boru Hattı adımlar gibi bir sınıflandırıcı ile sarılmış bazı özel özelliklere sahip bu örnek Boru Hattı olarak Farklı girişleri sklearn Pipeline nasıl takılır?

, o zaman eğitim verilerine uyacak ve tahmini yapın:

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. 

Yukarıdaki kod çalışır sadece iyi, ama bir twist var. Metinde Konuşma Etiketleme'nin bir bölümünü yapmak ve etiket metninde farklı bir Vectorizer kullanmak istiyorum.

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. 

Bu tür verileri düzgün şekilde nasıl takarım? İki vektörleyici, ham metin ve pos metni arasında nasıl ayrım yapabilir? Seçeneklerim nelerdir?

Ayrıca bazı özel özellikleri de var, bunların bir kısmı ham metni ve diğerlerini de POS metnini alacak.

DÜZENLEME: Bu özellik trafo sonra etiketlenmiş count_nouns için metin() işlevi veya type_token_ratio() için ham metni almak ya ihtiyacı

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) 

Eklenen MeasureFeatures()

cevap

2

Sana sahip olduğunu düşünüyorum 2 Transformers (TfidfTransformer ve POSTransformer) üzerinde FeatureUnion yapmak için. Elbette bu POSTransformer'i tanımlamanız gerekir.
Belki bu article size yardımcı olacaktır.

Belki de boru hattınız böyle görünecektir.

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()) 
]) 

Ve bu MeasureFeatures ve POSTransformer Transformers olduğunu varsaymak sklearn API ile uyumlu.

+0

En son düzenlememde MeasureFeatures() yöntemini ekledim. Temel olarak, bir dizi özellik için ham metin alması ve diğer özellikler dizisi için ayarlanmış bir etiket koyması gerekir. İki MeasureFeature sınıfı yardım eder mi? Ham metin özellikleri ve pos etiketi özellikleri için bir tane? –

+0

İş akışınızı burada gerçekten göremiyorum. Size önerdiğim şeye, bağlantıya ve bu örneğe bakın (http://scikit-learn.org/stable/auto_examples/hetero_feature_union.html). Bundan sonra sadece iş akışınızı düşünmeniz gerekir, verilerinize ne olur? – dooms