読者です 読者をやめる 読者になる 読者になる

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

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

青空文庫から夏目漱石の「吾輩は猫である」の全文をダウンロードして遊んでみます。テキストファイルをダウンロードして開いてみると下のようになっていました。

f:id:neocortex:20160827234426p:plain

ヘッダと (上の画像では見えていませんが) フッタと、本文中にたくさんルビなどの注釈がついています。これらはテキスト分析にはいらないので除きます。

ヘッダ・フッタは1箇所だけなのでメモ帳で手動で消しました。本文中の注釈は膨大な量なので、Matlab正規表現を使って消すことにしました。コードはこちら。

% load text data
fileID = fopen('wagahaiwa_nekodearu.txt');
txt = fread(fileID,'*char')';
fclose(fileID);

% remove annotations
pat = '《[^》]*》'; 
txt = regexprep(txt, pat, '');
pat = '[#[^]]*]'; 
txt = regexprep(txt, pat, '');
pat = '|'; 
txt = regexprep(txt, pat, '');

% save text data
fileID = fopen('neko.txt','w');
fprintf(fileID,txt);
fclose(fileID);

これで、下のように注釈がとれたテキストneko.txtができました。

f:id:neocortex:20160827235233p:plain

著作権の消滅した書籍を自由に読める「青空文庫」

著作権の消滅した書籍などを自由に読める「青空文庫」というサイトがあります。この記事を書いている時点で13,752の作品が登録されているそうで、誰もが知っているような文豪の作品がたくさんあります。

いろんな作品を無料で読めるという点もすごいですが、整った長文テキストデータという点でも魅力的です。ここからデータを拝借してすこし遊んでみようと思います。

形態素分析エンジンMeCabをMatlab (64bit)で使う

形態素分析エンジンMeCabMatlabから使ってテキストをササッと解析できるようにしたい!、ということでやってみました。ちょっと手間だったので書き残しておきます。

下のページにまさにこれを実現するためのツールがあるのですが、「現在配布されている MeCab の dll は 32bit version であるため、64bit 版のMATLABと一緒に使うためには、dll のビルドが必要となります」という不穏な忠告が。自分の場合は64 bit版Matlabなので、まさにこれにあたります…。

Simple Text Miner for Japanese - File Exchange - MATLAB Central

仕方がないので、dllをビルドするという自分には難易度の高い旅に出ました。

blogs.mathworks.com

上のブログ記事の中盤以降にある "What about Japanese Text?" という項目を探して、そのとおりにおこないます。

  1. Matlab 64 bit版を持っている
  2. Matlab に適合した (たぶんC++) コンパイラを持っている → 自分の場合は、無料のVisual studio 2013 Communityがインストールしてあったので、これを使いました。
  3. Takuya's instructionに従いなさい

という3ステップで、あら簡単、と思いきやTakuya's instructionがヘビーでした。以下、インストラクションのPDFを見つつ読んでください。

  1. MeCab 0.966のバイナリパッケージをインストール → インストール時に、文字のエンコーディングを聞いてきますが、デフォルトのSHIFT-JISで自分はうまくいきました。
  2. MeCab 0.966のソースファイルをダウンロード&解凍 → Windows環境では.tar.gzファイルを解凍するにはソフトウェアが必要です。自分はLhaplusを使いました。
  3. 解凍されたなかの"src"というフォルダを見つけます。
  4. このフォルダのなかにあるいろんなファイルの内容を、インストラクションの通りに修正します。
  5. Visual studioコマンドプロンプト (いろいろあるが、自分はVS2013 x64 Native Tools Command Promptでうまくいきました) を起動します。
  6. フォルダをさきほどの"src"にもっていきます。フォルダを変更するコマンドはcd。
  7. "Make"とタイプ。
  8. すると、ずらずらっとビルドが始まり、"libmecab.dll"が生成されます。
  9. このdllファイルと、"mecab.h"ファイルを、Matlabスクリプトを置くフォルダにコピー。これで、MatlabMecabを使う準備完了です。ふぅ。

では、Matlabを起動してサンプルコードをコピペしてみます。まずは下のコードでDLLを読み込み。僕の環境では"警告: データ型 'mecab_node_tPtr' (構造体 mecab_node_t で使用) は存在しません…"というエラーが出ましたが、これは無視して良いらしい。

%% Loading DLL
fname_lib = 'libmecab.dll';
fname_header = 'mecab.h';
[notfound, warnings] = loadlibrary(fname_lib, fname_header);

下のコードで「ライブラリlibmecabdeの関数」がたくさん表示されればDLLを読み込めているということのようです。

%% (optional) view available functions of the DLL
libfunctionsview('libmecab')

あと、下のように2,3行おまじないを書いてから、

%% Calling MeCab morphological analyzer
argv = libpointer('stringPtrPtr', {'MeCab'});
argc = 1;
mecab = calllib('libmecab', 'mecab_new', argc, argv);

日本語のテキストを与えると形態素分析の結果が返ってきます。すばらしい。

%% test MeCab functionality
input = '太郎は次郎が持っている本を花子に渡した。';
result = calllib('libmecab', 'mecab_sparse_tostr', mecab,input);

result =

太郎 名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
次郎 名詞,固有名詞,人名,名,*,*,次郎,ジロウ,ジロー
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
持っ 動詞,自立,*,*,五段・タ行,連用タ接続,持つ,モッ,モッ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
いる 動詞,非自立,*,*,一段,基本形,いる,イル,イル
本 名詞,一般,*,*,*,*,本,ホン,ホン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
花 名詞,一般,*,*,*,*,花,ハナ,ハナ
子 名詞,接尾,一般,*,*,*,子,コ,コ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し 動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
EOS

最後にDLLを開放します。

%% Release DLL from the memory
clear
unloadlibrary('libmecab')

Matlab (64 bit)でMeCabを使う環境が整ったので、これからいろんなテキストを突っ込んで遊んでみます。

テキストデータを単語に分割して品詞などを判別する形態素解析

テキストデータ (文章) をパソコンで分析する場合、英語だと単語同士のあいだにスペースがあるので、どれが単語か見分けるのは簡単です。でも日本語の場合はスペースがないので、そう簡単にはいきません。

テキストデータを、言語的に意味を持つ最小の単位に分割して、品詞などを判別する作業を形態素解析というそうです。これをおこなってくれるオープンソースMeCab というソフトウェアがあったので、インストールしてみました。

MeCab: Yet Another Part-of-Speech and Morphological Analyzer

インストールして起動するとウィンドウがあらわれるので、テキストを入力してみましょう。「すもももももももものうち」を正しく認識して分析してくれます。すごい。

f:id:neocortex:20160806225700p:plain

でも平仮名だらけのテキストはやはり難しいようで、「何だか分かるか若旦那」はきちんと分解してくれますが、「なんだかわかるかわかだんな」は最後の「だんな」が1文字ずつにばらされてしまいました。

f:id:neocortex:20160806230137p:plain

ちなみに、「なんだか…」は始めから読んでも終わりから読んでも読みが同じ回文になっています (意味はないです…)。

入門 自然言語処理

入門 自然言語処理

MatlabでWebコンテンツを読み込む

Matlabでウェブページを読み込んで情報を自動抽出できたりしたら楽しそう!、ということで少しずつやってみます。

ウェブページのソースを読み込むのはめちゃくちゃ簡単で、webreadという関数で1行でできます。ためしに東京都の公式ページを読みこんでみます。

data = webread('http://www.metro.tokyo.jp/index.htm')

こんなふうに、ずらずらっとソースが表示されればオーケーです。

f:id:neocortex:20160803003404p:plain

HTMLタグが邪魔だというときには、正規表現を使うと、タグを消して本文だけを取り出すことができます (ここのコードを拝借しました)。

pat = '<[^>]*>'; 
data2 = regexprep(data, pat, '')

そうすると、ウェブページの本文がこんなふうに表示されます。ニュースサイトなどであれば、ここから頻出単語を抜き出して記事を特徴づける、というようなこともすぐに出来そうです。次回からもうちょっと遊んでみます。

f:id:neocortex:20160803004131p:plain

Matlab Home

Matlabは簡単で高機能なプログラミング言語ですが、なにぶん高価なのが玉に瑕。ただし、個人が趣味などに使う用途で、商用や研究用途でなければ、下のページからMatlab Homeという安価なライセンスを購入できます。Matlab本体が¥14,900、ツールボックスがひとつ¥4,490です。

MATLAB Home R2016a 新規ライセンス

MATLABプログラミング入門

MATLABプログラミング入門