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()
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? –
İş 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