u++の備忘録

言語処理100本ノック 2020「51. 特徴量抽出」

問題文

nlp100.github.io

問題の概要

カテゴリ分類に有用そうな特徴量を抽出します。ここでは、問題文の指示通りの最低限の特徴量を作ります。sklearnに用意されている「CountVectorizer()」が利用可能です。

記事の見出しを単語列に変換したものが最低限のベースラインとなるであろう.

データセット内に「TMP」という一時的なカラムを作成し、X_train・X_valid・X_testを結合しておくことで、特徴量抽出の処理を一度で済ましています。

import joblib
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer


X_train = pd.read_table('ch06/train.txt', header=None)
X_valid = pd.read_table('ch06/valid.txt', header=None)
X_test = pd.read_table('ch06/test.txt', header=None)
use_cols = ['TITLE', 'CATEGORY']
X_train.columns = use_cols
X_valid.columns = use_cols
X_test.columns = use_cols
X_train['TMP'] = 'train'
X_valid['TMP'] = 'valid'
X_test['TMP'] = 'test'

data = pd.concat([X_train, X_valid, X_test]).reset_index(drop=True)
vectorizer = CountVectorizer(token_pattern=u'(?u)\\b\\w+\\b')
bag = vectorizer.fit_transform(data['TITLE'])
data = pd.concat([data, pd.DataFrame(bag.toarray())], axis=1)

joblib.dump(vectorizer.vocabulary_, 'ch06/vocabulary_.joblib')

X_train = data.query('TMP=="train"').drop(use_cols + ['TMP'], axis=1)
X_valid = data.query('TMP=="valid"').drop(use_cols + ['TMP'], axis=1)
X_test = data.query('TMP=="test"').drop(use_cols + ['TMP'], axis=1)

X_train.to_csv('ch06/train.feature.txt', sep='\t', index=False, header=None)
X_valid.to_csv('ch06/valid.feature.txt', sep='\t', index=False, header=None)
X_test.to_csv('ch06/test.feature.txt', sep='\t', index=False, header=None)