Конвейеры и два разных набора данных для классификации текста в Python - PullRequest
0 голосов
/ 27 ноября 2018

Недавно я начал читать больше о НЛП, чтобы узнать больше об этом предмете.Проблема, с которой я столкнулся, теперь, когда я пытаюсь создать свой собственный алгоритм классификации (текст отправляет положительное / отрицательное сообщение), касается наборов данных обучения и тестирования.Я хочу использовать конвейер, главная причина в том, что я также хочу принять во внимание количество отрицательных слов, найденных в тексте.У меня есть два набора данных, и мой подход заключался в объединении в одном корпусе всех текстов в двух наборах данных (после предварительной обработки) и после этого, разделении корпуса на набор тестов и обучающий набор.

datasetTrain = pd.read_csv('train.tsv', delimiter = '\t', quoting = 3)
datasetTrain['PN'].value_counts()

datasetTest = pd.read_csv('test.tsv', delimiter = '\t', quoting = 3)
datasetTest['PN'].value_counts()

corpus = []
y = []

# some preprocessing
    y.append(posNeg)
    corpus.append(text)
#...

class TextSelector(BaseEstimator, TransformerMixin):
    def __init__(self, field):
        self.field = field
    def fit(self, X, y=None):
        return self
    def transform(self, X):
        return X[self.field]
class NumberSelector(BaseEstimator, TransformerMixin):
    def __init__(self, field):
        self.field = field
    def fit(self, X, y=None):
        return self
    def transform(self, X):
        return X[[self.field]]

classifier = Pipeline([
    ('features', FeatureUnion([
        ('text', Pipeline([
            ('colext', TextSelector('processed')),
            ('cv', CountVectorizer(stop_words = stopwords,ngram_range=(1,1),min_df = 5, max_df=0.65)),
            ('tfidf', TfidfTransformer()),
        ])),
        ('negative', Pipeline([
            ('numbers', NumberSelector('posWords')),
            ('wscaler', StandardScaler()),
        ])),
        ('offensive', Pipeline([
                ('numbers', NumberSelector('offWords')),
                ('wscaler', StandardScaler()),
        ])),
    ])),
    ('clasif', RandomForestClassifier()),
    ])

classifier.fit(X_train, y_train)
pred = classifier.predict(X_test)

Причина, по которой я это сделал (хотя я предпочел бы использовать два набора данных отдельно):

# Splitting the dataset into the Training set and Test set
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.11, random_state = 0)

, потому что если я создаю с самого началаX_train и X_test (y_train, y_test соответственно) и без использования функции разделения:

classifier.fit(X_train)
X_train = classifier.transform(X_train)
X_test = classifier.transform(X_test)

pred = classifier.predict(X_test)

Я получаю ошибку при запуске алгоритма классификации:

  File "<ipython-input-6-c7a95544645f>", line 21, in <module>
classifier.fit(X_train)

  File "/anaconda3/lib/python3.7/site-packages/sklearn/pipeline.py", line 250, in fit
self._final_estimator.fit(Xt, y, **fit_params)

  File "/anaconda3/lib/python3.7/site-packages/sklearn/ensemble/forest.py", line 248, in fit
y = check_array(y, accept_sparse='csc', ensure_2d=False, dtype=None)

  File "/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py", line 457, in check_array
n_samples = _num_samples(array)

  File "/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py", line 119, in _num_samples
" a valid collection." % x)


TypeError: Singleton array array(None, dtype=object) cannot be considered a valid collection.

Если я изменяюсь в конвейереTfidfTransformer () с TfidfVectorizer () Я получаю эту ошибку:

File "/anaconda3/lib/python3.7/site-packages/scipy/sparse/base.py", line 686, in __getattr__
raise AttributeError(attr + " not found")

AttributeError: lower not found

Я новичок в этом, и мне было интересно, если кто-нибудь может, пожалуйста, направить меня в правильном направлении?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...