【Python】太宰治と芥川龍之介を97%の精度で識別するAIを作ってみた(TF-IDF + SVM)

人工知能

タグ(例): Python, 機械学習, NLP, 自然言語処理, 初心者


はじめに

こんにちは。大学の課題でテキストマイニングに取り組んでみたら、予想以上に面白い結果が出たので共有します。

今回やったのは、「文章の書き方(文体)だけで、その著者が太宰治か芥川龍之介かを当てる」というタスクです。

「メロス」や「羅生門」といった特定の単語(固有名詞)に頼らず、あくまで「言葉遣いの癖」で判別できるのか挑戦しました。

実験の概要

  • 対象データ: 青空文庫から各3作品(計6作品)
    • 太宰治:『走れメロス』『人間失格』『富嶽百景』
    • 芥川龍之介:『羅生門』『鼻』『蜘蛛の糸』
  • 手法: TF-IDF で特徴量抽出 -> SVM (Support Vector Machine) で分類
  • 工夫した点: 固有名詞を除外すること
    • 「メロス」という単語があれば太宰だと分かってしまうのは面白くないので、MeCabで固有名詞を削除し、純粋な文体での勝負にしました。

実装のポイント

使用したライブラリは MeCab, scikit-learn です。

1. 前処理(固有名詞の除外)

ここが今回の肝です。MeCabで形態素解析を行い、一般名詞・動詞・形容詞のみを残し、固有名詞(人名や地名)はストップワードとして除外しました。

# コードの一部抜粋
def get_words_refined(text):
    words = []
    node = tagger.parseToNode(text)
    while node:
        feature = node.feature.split(',')
        pos = feature[0]      
        sub_pos = feature[1]  
        
        # 名詞・動詞・形容詞かつ「固有名詞以外」を抽出
        if pos in ['名詞', '動詞', '形容詞']:
            if sub_pos != '固有名詞':
                words.append(node.surface) # または原形
        node = node.next
    return " ".join(words)
Python

2. 特徴量抽出とモデル学習

長い小説をそのまま使うとデータ数が足りないので、100単語ごとのブロックに分割(チャンキング)してデータを水増ししました。 モデルは高次元データに強い Linear SVM を採用しました。

# TF-IDFでベクトル化(上位2000語)
vectorizer = TfidfVectorizer(max_features=2000)
X_vectorized = vectorizer.fit_transform(X)

# SVMで学習
clf = SVC(kernel='linear', probability=True)
clf.fit(X_train, y_train)
Python

結果:正解率 97%!

テストデータ(未知の文章)に対する正解率は 0.97 でした。かなりの高精度で判別できています。

さらに、全く学習させていない太宰治の随筆『このごろ』を入力してみたところ、「99.7% 太宰治」 と判定されました。文体の特徴をしっかり捉えているようです。

AIは何を見て判断したのか?(ここが面白い)

SVMの係数(Weight)を確認し、どの単語が決定打になったのかをランキングにしてみました。

順位太宰治っぽい単語芥川龍之介っぽい単語
1位自分云う
2位お母さま下人
3位言う弟子
4位無い蜘蛛

考察1:「言う」vs「云う」

一番面白かったのがこれです。

  • 太宰治:「言う」 (常用漢字)
  • 芥川龍之介:「云う」 (文語的な表記)

発音は同じ「いう」でも、表記の好みが完全に分かれました。AIはこの表記揺れを最大のヒントにしていたようです。

考察2:内面 vs 情景

太宰治には「自分」「お母さま」「たち」「お前」といった、人間関係や自分自身を指す言葉が多く現れました。 一方で芥川龍之介は「蜘蛛」「死骸」「長い」など、視覚的な情景描写や少しダークな名詞が特徴的でした。

「私小説の太宰」と「物語作家の芥川」という作風の違いが、データにもはっきりと表れていました。

まとめ・今後の課題

単純な機械学習モデルでも、作家の個性をここまで数値化できることが分かりました。 ただ、まだ「メロス」などの固有名詞が一部すり抜けてしまっていたので、今後はストップワード(除外リスト)をもっと強化して、さらに厳密な文体解析をやってみたいです。

コメント

タイトルとURLをコピーしました