No science, No life.

もっと科学を身近に

「吾輩は猫である」のテキストを分析してみる (3)

「吾輩は猫である」のテキストを分析してみる (1)
「吾輩は猫である」のテキストを分析してみる (2)



前回までで、「吾輩は猫である」を形態素分析にかけたセル配列が手に入りました。今回は、単語の出現頻度を調べてみようと思います。前回のコードで、

in = txt(1:1000);

として、最初の1000文字だけを取り出し、下のコードで出現頻度をプロットしてみました。

% セル配列からカテゴリカル配列を作成
cat_array = categorical(result(:,1));

% 単語カテゴリーを作成
category = categories(cat_array);

% 各カテゴリの出現回数
counts = countcats(cat_array);
% 出現回数を出現パーセントに変換
prct = counts/sum(counts)*100;

% 出現パーセントに従って降順でソート
[~,I] = sort(prct,'descend');
prct_sorted = prct(I);
category_sorted = category(I);

% データを保存
save('neko.mat','result','category_sorted','prct_sorted')

% グラフ表示
figure(1); clf
x = 1:length(prct_sorted);
y = prct_sorted;
plot(x,y)
title('「吾輩は猫である」形態素分析')
xlabel('出現ランク')
ylabel('出現パーセント')
xmax = max(x);
axis([0 xmax 0 prct_sorted(1)+1])

結果は下のようになりました。もとの単語数が少ないのでグラフがガタガタしています。

f:id:neocortex:20160828225741p:plain

次に、全文を突っ込んでみると次のようになりました。軸に張りついていて分かりにくいですが、単語数が増えてグラフが滑らかになりました。

f:id:neocortex:20160828230123p:plain

同じデータを、対数グラフでプロットしてみると、下のように広い範囲でほぼ直線になりました。

loglog(x,y)

f:id:neocortex:20160828230623p:plain

対数グラフ上で直線になる関係を冪乗則 (べきじょうそく) といいます。これは、単語の出現頻度分布をふくめて、自然界のさまざまな状況で現れる関係性だそうです。「吾輩は猫である」の文章も例外ではなく、冪乗則に従うことがわかります。

さて、上位に出現するのはどんな言葉でしょうか?下のようにトップ50位を表示してみました。

plot(x,y,'o-')
xmax = 50;
axis([0 xmax 0 prct_sorted(1)+1])
text(x(1:xmax),y(1:xmax)+0.5,category_sorted(1:xmax))

f:id:neocortex:20160828232259p:plain

すると、当然と言えば当然ですが、最上位は「の」「。」「て」「、」「は」…となっていて、文章に必ず登場するような助詞・助動詞や記号ばかりです。意味のある名詞としては「吾輩」がかなり多いはずと思い見てみたら、47位にランクインしていました。

xlim([45 50])

f:id:neocortex:20160828232829p:plain

文章を特徴付ける単語を抽出してこようと思うと、記号・助詞・助動詞などは除いて名詞などに焦点を当てたほうが良さそうです。次回以降、やってみようと思います。

吾輩は猫である (新潮文庫)

吾輩は猫である (新潮文庫)