タグ(例): 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)
Python2. 特徴量抽出とモデル学習
長い小説をそのまま使うとデータ数が足りないので、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 情景
太宰治には「自分」「お母さま」「たち」「お前」といった、人間関係や自分自身を指す言葉が多く現れました。 一方で芥川龍之介は「蜘蛛」「死骸」「長い」など、視覚的な情景描写や少しダークな名詞が特徴的でした。
「私小説の太宰」と「物語作家の芥川」という作風の違いが、データにもはっきりと表れていました。
まとめ・今後の課題
単純な機械学習モデルでも、作家の個性をここまで数値化できることが分かりました。 ただ、まだ「メロス」などの固有名詞が一部すり抜けてしまっていたので、今後はストップワード(除外リスト)をもっと強化して、さらに厳密な文体解析をやってみたいです。

コメント