Scikit-learnだけで超お手軽テキスト分類

2021/10/02

自然言語処理

t f B! P L

char-ngram+ナイーブベイズ分類器で光速でテキスト分類をするサンプル。

日本語NLPだと形態素解析して分かち書きしないと始まらないみたいなとこがありますが、char-ngramを使うのでそれすら不要です。

プロジェクト開始前の初期調査でもらったデータをさくっと分類するときなどに使うといいかも。

コード

# text = [] # 文字列のリスト
# label = [] # ラベルのリスト

from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report


# テキストをtrigram特徴量に変換
vectorizer = HashingVectorizer(n_features=2**16,
                               analyzer="char",   # char
                               ngram_range=(3,3), # trigram
                               binary=True,
                               norm=None)
X = vectorizer.fit_transform(text)

# クラスを数字に置き換え
le = LabelEncoder()
y = le.fit_transform(label)
for yi in le.classes_:
    print(f"{le.transform([yi])} -> {yi}")

# データ分割
X_train, X_test, y_train, y_test = train_test_split(
     X, y, random_state=42)

# 学習
clf = MultinomialNB()
clf.fit(X_train, y_train)

# 予測
y_pred = clf.predict(X_test)

# 評価
print(classification_report(y_test, y_pred))

textとlabelが入ったリストだけ用意して、あとは実行するだけ!

ラベル

QooQ