No science, No life.

もっと科学を身近に

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

前回のneko.txtをMeCabの分析にかけていきます。

コードはこちら。neko.txtの全文をいきなり投入すると時間がかかるので、ここでは最初の100文字だけにしています。

% 「吾輩は猫である」のテキストを読込
fileID = fopen('neko.txt');
txt = fread(fileID,'*char')';
fclose(fileID);

% MeCab DLLを読込
[notfound,warnings] = loadlibrary('libmecab.dll','mecab.h');
mecab = calllib('libmecab','mecab_new',1,libpointer('stringPtrPtr',{'MeCab'}));

% MeCabで形態素分析
in = txt(1:100);
mecab_result = calllib('libmecab','mecab_sparse_tostr',mecab,in);

そうすると下のような結果が出てきます。

f:id:neocortex:20160828010041p:plain

この分析結果は、ズラズラッとつらなったテキスト形式でこのままでは扱いにくいので、下のようにセル配列に代入することにします。

ここで、MeCabの結果のフォーマットは「表層形\t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音」という10要素なのですが、改行記号などの場合は、strsplitで要素を分割したときに10要素に満たないことがあって扱いにくく、まぁ記号はいらないだろうということで消しています。

% MeCabの結果をセル配列に代入
row = strsplit(mecab_result,'\n');  % MeCabの結果をまず行ごとに分割
n = length(row)-2;                  % 行数を取得 (最後の2行は'EOS'等なので不要)
result = cell(n,10);                % 結果を格納する空配列を用意
idx = false(n,1);                   % あとで消去する行のインデックス
for ii=1:n
    % 空白と「,」で要素ごとに分割
    str = strsplit(row{ii},{'	',','});    
    if length(str)<10
        % 記号などの場合は要素数が10に満たないので消去
        idx(ii) = true;
    else
        % 結果を格納
        result(ii,:) = str;
    end
end
% いらない行を消去
result(idx,:)=[];

% DLLの開放
clear mecab
unloadlibrary('libmecab')

これで、下のような結果が得られました。

f:id:neocortex:20160828010928p:plain