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