Я делаю обработку текста с использованием CountVectorizer / logisti c регрессия и сравниваю оценку f1 без предварительной обработки и предварительной обработки. Я хотел бы использовать регулярное выражение для предварительной обработки, поэтому я построил код, подобный приведенному ниже
def better_preprocessor(s):
lower = s.lower()
lower = re.sub(r'^\w{8,}$', lambda x:x[:7], lower)
return lower
def a():
cv = CountVectorizer()
train = cv.fit_transform(train_data)
features = cv.get_feature_names()
cv_dev = CountVectorizer(vocabulary = features)
dev = cv_dev.fit_transform(dev_data)
print(features)
lgr = LogisticRegression(C=0.5, solver="liblinear", multi_class="auto")
lgr.fit(train, train_labels)
lgr_pred = lgr.predict(dev)
score = metrics.f1_score(dev_labels, lgr_pred, average="weighted")
print('No preprocessing score:', score)
cv_im = CountVectorizer(preprocessor=better_preprocessor)
train_im = cv_im.fit_transform(train_data)
features_im = cv_im.get_feature_names()
cv_im_dev = CountVectorizer(preprocessor=better_preprocessor, vocabulary = features_im)
dev_im = cv_im_dev.fit_transform(dev_data)
lgr.fit(train_im, train_labels)
lgr_pred_im = lgr.predict(dev_im)
score_im = metrics.f1_score(dev_labels, lgr_pred_im, average="weighted")
print('Preprocessing score', score_im)
print(len(features)-len(features_im))
print(features_im)
a()
Я попытался усечь длину слова больше или равно 8 до 7, но когда я проверял список словаря, используя get_feature_names, было без изменений. Я не знаю, где мне это исправить.