続)さくらインターネットにText::MeCabがインストールできない件

VineLinuxでなんとかインストールに成功したので、もういちどさくらインターネットで試してみました。

やり方は同じ

ヘッダファイルのパスも通しました。

export C_INCLUDE_PATH=/home/****/local/include
export CPLUS_INCLUDE_PATH=$C_INCLUDE_PATH

今度はコンパイルも通りました。

$ cc mecab.c

さてやってみます。
ところで、WEBで検索してみると、どのブログにも「選択肢が出るから-vせよ」とあります。
でも、多分誤りです。
「-v」ではなく「–interactive」です。
この指定で選択肢で止まるようになります。

$ cpanm --interactive Text::MeCab

Configuring Text-MeCab-0.20016 ... Subroutine checklibs redefined at inc/Module/Install/CheckLib.pm line 11.
Subroutine assertlibs redefined at inc/Module/Install/CheckLib.pm line 25.
Subroutine _author_side redefined at inc/Module/Install/CheckLib.pm line 39.
Path to mecab config? [/usr/local/bin/mecab-config] /home/****/local/bin/mecab-config
detected mecab version 0.996
Using compiler flags '-I/home/mlin/local/include -DMECAB_MAJOR_VERSION=0 -DMECAB_MINOR_VERSION=996'...
Using linker flags '-L/home/mlin/local/lib -lmecab -lstdc++'...

Text::MeCab needs to know what encoding you built your dictionary with
to properly execute tests.

Encoding of your mecab dictionary? (shift_jis, euc-jp, utf-8) [euc-jp] utf-8
Using utf-8 as your dictionary encoding
Detected the following mecab information:
   version: 0.996
   cflags: -I/home/mlin/local/include -DMECAB_MAJOR_VERSION=0 -DMECAB_MINOR_VERSION=996 -I src
   libs: -L/home/mlin/local/lib -lmecab -lstdc++
   include: /home/mlin/local/include
Can't link/include C library 'mecab', 'mecab', aborting.
N/A
! Configure failed for Text-MeCab-0.20016. See /home/****/.cpanm/work/1498387711.85430/build.log for details.

黄色のところで止まるので、入力します。

ところが残念ながら出ました。

Can't link/include C library 'mecab', 'mecab', aborting.

だめだこりゃ。

というわけで、とりあえず断念。
また何か思いついたらやってみます。

ローカルディレクトリにmecabをインストールする方法(2017)

なんだかmecabのインストールが上手くできなかったのが気持ち悪かったので
vineLinuxでソースコンパイルを試してみました。
インストール先はホームディレクトリにしてみました。さくらインターネットで応用が効くように、です。

 

mecab(0.996)のソースからのインストール

ここのSourceの
mecab-0.996.tar.gz:ダウンロード
からダウンロードします。
SorceForgeもあるのですが、このソースが見つからないです。どうしてなんでしょうか・・・?

$ tar -zxvf mecab-0.996.tar.gz
$ cd mecab-0.996

UTF8の指定はeucになってしまう不具合があるようでこうなっています。

$ ./configure --prefix=$HOME/local --with-charset=utf8

$ make

$ make install

インストールはあっさり成功しましたが、パスが通ってないので実行できません。

とりあえず以下にて設定します。

export PATH=/home/XXXX/local/bin:$PATH
export LD_LIBRARY_PATH=/home/XXXX/local/lib

これで一応実行できますが、ルートディレクトリのmecabrcを探しに行ってしまいます

param.cpp(69) [ifs] no such file or directory: /usr/local/etc/mecabrc

どうも仕様的にそうなっているようです。

環境変数を設定すると任意の場所を探しに行ってくれるようになります。

export MECABRC=/home/XXXX/local/etc/mecabrc

実行してみます。

$ mecab
param.cpp(69) [ifs] no such file or directory: /home/XXXX/local/lib/mecab/dic/ipadic/dicrc

やっと辞書がないよ、って言うエラーになりました。

 

辞書をインストール

2011年であんまり新しくないですが、最新です。

https://ja.osdn.net/projects/naist-jdic/releases/53500
naist-jdic (for MeCab) mecab-naist-jdic-0.6.3b-20111013

$ tar -zxvf mecab-naist-jdic-0.6.3b-20111013.tar.gz
$ cd mecab-naist-jdic-0.6.3b-20111013

インストールしましょう。

$ ./configure --prefix=$HOME/local --with-charset=utf8 --enable-utf8-only

$ make
/home/XXXX/local/libexec/mecab/mecab-dict-index -d . -o . -f EUC-JP -t utf8
...
done!
To enable dictionary, rewrite /home/XXXX/local/etc/mecabrc as "dicdir = /home/XXXX/local/lib/mecab/dic/naist-jdic"

makeでEUCがなんちゃらと出ているのが少し気になりますね。EUCになってしまっているかも。

→ EUCになっちゃってます。

$ nkf -w --overwrite *.csv
$ nkf -w --overwrite *.def

してからインストールします。

dicdirも指定することができます。

./configure --with-charset=utf8 --with-dicdir=$HOME/local/lib/mecab/dic/ipadic-utf8

ここからがうまく行きません。

$ make install
make[1]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' に入ります
make  install-exec-hook
make[2]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' に入ります
if ! [ -d /etc/mecab/dic/naist-jdic ]; \
        then mkdir -p /etc/mecab/dic/naist-jdic; \
fi
mkdir: ディレクトリ `/etc/mecab' を作成できません: 許可がありません
make[2]: *** [install-exec-hook] エラー 1
make[2]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' から出ます
make[1]: *** [install-exec-am] エラー 2
make[1]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' から出ます
make: *** [install-am] エラー 2

 

”`/etc/mecab’ を作成できません: 許可がありません”
とありますように、またルートディレクトリにアクセスしようとしています。
あまりできが良くないですね・・・。

その為オプションDESTDIRを追加してディレクトリを指定します。

$ make DESTDIR=$HOME/local install
make[1]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' に入ります
make  install-exec-hook
make[2]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' に入ります
if ! [ -d /home/XXXX/local/etc/mecab/dic/naist-jdic ]; \
        then mkdir -p /home/XXXX/local/etc/mecab/dic/naist-jdic; \
fi
if ! [ -f /home/XXXX/local/etc/mecab/dic/naist-jdic/dicrc ]; \
        then ln -s /home/XXXX/local/lib/mecab/dic/naist-jdic/dicrc /home/XXXX/local/etc/mecab/dic/naist-jdic/dicrc; \
fi
make[2]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' から出ます
test -z "/home/XXXX/local/lib/mecab/dic/naist-jdic" || /bin/mkdir -p "/home/XXXX/local/home/XXXX/local/lib/mecab/dic/naist-jdic"
 /usr/bin/install -c -m 644 matrix.bin char.bin sys.dic unk.dic naist-jdic.csv char.def feature.def left-id.def matrix.def pos-id.def rewrite.def right-id.def unk.def dicrc '/home/XXXX/local/home/XXXX/local/lib/mecab/dic/naist-jdic'
make[1]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' から出ます

なんとかインストールは成功した”みたい”です。

何故か”/home/XXXX/local/home/XXXX/local/lib/mecab/dic/naist-jdic”という深い場所にインストールされます。
シンボリックリンクもおかしいので、つながっていません。

$ cd /home/XXXX/local/home/XXXX/local/lib/mecab/dic/naist-jdic
$ ls
char.bin  dicrc        left-id.def  matrix.def      pos-id.def   right-id.def  unk.def
char.def  feature.def  matrix.bin   naist-jdic.csv  rewrite.def  sys.dic       unk.dic

必要かどうかわからないのですが、dicrcを編集しておきます。

;config-charset = EUC-JP
config-charset = UTF-8

そして、

param.cpp(69) [ifs] no such file or directory: /home/XXXX/local/lib/mecab/dic/ipadic/dicrc

ということですから

/home/XXXX/local/lib/mecab/dic/ipadic

/home/XXXX/local/home/XXXX/local/lib/mecab/dic/naist-jdic
にアクセスするようにリンクを張ります。

ln -s /home/XXXX/local/home/XXXX/local/lib/mecab/dic/naist-jdic /home/XXXX/local/lib/mecab/dic/ipadic

ようやく実行できるようになりました!

$ mecab
嫌よ嫌よも好きのうち。んなわけあるか。
嫌      名詞,形容動詞語幹,*,*,*,*,嫌,イヤ,イヤ,,
よ      助詞,終助詞,*,*,*,*,よ,ヨ,ヨ,,
嫌      名詞,形容動詞語幹,*,*,*,*,嫌,イヤ,イヤ,,
よも    副詞,一般,*,*,*,*,よも,ヨモ,ヨモ,,
好き    名詞,形容動詞語幹,*,*,*,*,好き,スキ,スキ,,
の      助詞,連体化,*,*,*,*,の,ノ,ノ,,
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ,,
。      記号,句点,*,*,*,*,。,。,。,,
ん      名詞,非自立,一般,*,*,*,ん,ン,ン,,
な      助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ,,
わけ    名詞,非自立,一般,*,*,*,わけ,ワケ,ワケ,,
ある    動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル,ある/在る/有る,
か      助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ,,
。      記号,句点,*,*,*,*,。,。,。,,
EOS

やっとインストールできました!

 

ライブラリは?

mecab.hを使ってCプログラムをコンパイルしようとするとエラーになってしまうことから、
やはりうまく参照はできていないようです。

$ cc mecab.c 
mecab.c:1:19: 致命的エラー: mecab.h: そのようなファイルやディレクトリはありません
 #include 
                   ^
コンパイルを停止しました。

 

このように明示的にすれば通ります。

$ cc -I local/include mecab.c

 

環境変数で指定しても良いようです。

export C_INCLUDE_PATH=/home/XXXX/local/include
export CPLUS_INCLUDE_PATH=$C_INCLUDE_PATH

 

なんかとっても苦労しました。
最新版の不具合かもしれませんね・・・。

さくらインターネットにText::MeCabがインストールできない件

開発をraspberrypiでしてきたので、さくらインターネットの方で継続しようと思ったところハマっています。

何故か、Text::MeCabがインストールできません。
それほど大したモジュールではないと思うのですが、エラーを吐いてとまってしまいます。

$ cpanm Text::MeCab
--> Working on Text::MeCab
Fetching http://www.cpan.org/authors/id/D/DM/DMAKI/Text-MeCab-0.20016.tar.gz ... OK
Configuring Text-MeCab-0.20016 ... N/A
! Configure failed for Text-MeCab-0.20016. See /home/****/.cpanm/work/1498314513.60429/build.log for details.

詳細を見ます。

cpanm (App::cpanminus) 1.7043 on perl 5.008009 built for amd64-freebsd
Work directory is /home/****/.cpanm/work/1498314513.60429
You have make /usr/bin/make
You have LWP 6.24
You have /usr/bin/tar: bsdtar 2.8.5 - libarchive 2.8.5
You have /usr/bin/unzip
Searching Text::MeCab () on cpanmetadb ...
--> Working on Text::MeCab
Fetching http://www.cpan.org/authors/id/D/DM/DMAKI/Text-MeCab-0.20016.tar.gz
-> OK
Unpacking Text-MeCab-0.20016.tar.gz
Entering Text-MeCab-0.20016
Checking configure dependencies from META.yml
Checking if you have ExtUtils::ParseXS 2.21 ... Yes (3.18)
Checking if you have ExtUtils::MakeMaker 6.59 ... Yes (7.10)
Checking if you have Devel::PPPort 3.19 ... Yes (3.35)
Configuring Text-MeCab-0.20016
Running Makefile.PL
Subroutine checklibs redefined at inc/Module/Install/CheckLib.pm line 11.
Subroutine assertlibs redefined at inc/Module/Install/CheckLib.pm line 25.
Subroutine _author_side redefined at inc/Module/Install/CheckLib.pm line 39.
Path to mecab config? [/usr/local/bin/mecab-config] /usr/local/bin/mecab-config
detected mecab version 0.995
Using compiler flags '-I/usr/local/include -DMECAB_MAJOR_VERSION=0 -DMECAB_MINOR_VERSION=995'...
Using linker flags '-L/usr/local/lib -lmecab -lstdc++'...

Text::MeCab needs to know what encoding you built your dictionary with
to properly execute tests.

Encoding of your mecab dictionary? (shift_jis, euc-jp, utf-8) [euc-jp] euc-jp
Using euc-jp as your dictionary encoding
Detected the following mecab information:
   version: 0.995
   cflags: -I/usr/local/include -DMECAB_MAJOR_VERSION=0 -DMECAB_MINOR_VERSION=995 -I src
   libs: -L/usr/local/lib -lmecab -lstdc++
   include: /usr/local/include
Can't link/include C library 'mecab', 'mecab', aborting.
-> N/A
-> FAIL Configure failed for Text-MeCab-0.20016. See /home/****/.cpanm/work/1498314513.60429/build.log for details.

主にはここです

Can't link/include C library 'mecab', 'mecab', aborting.

 

こちらが一番近い・・・

Text::MeCabのインストールでCan’t build and link to ‘mecab’, ‘mecab’

でもちょっとエラーメッセージは違うし(リンク先様はbuildエラー?)あまり参考にならなかったです。
しかしながら、いくら検索してもこれ以上の情報はなし・・・。なぜでしょう。。。?

試しにモジュールをダウンロードしてきて
Makefile.plを自前で実行してみましたが、同じエラーです。

リンク先の方がおっしゃるように、
ラズパイではあっさり成功しますので、何かインストールに失敗(足りない?)しているような気もします。

Text-MeCab-0.20016]$ perl Makefile.PL
Subroutine checklibs redefined at inc/Module/Install/CheckLib.pm line 11.
Subroutine assertlibs redefined at inc/Module/Install/CheckLib.pm line 25.
Subroutine _author_side redefined at inc/Module/Install/CheckLib.pm line 39.
Path to mecab config? [/usr/local/bin/mecab-config]
detected mecab version 0.995
Using compiler flags '-I/usr/local/include -DMECAB_MAJOR_VERSION=0 -DMECAB_MINOR_VERSION=995'...
Using linker flags '-L/usr/local/lib -lmecab -lstdc++'...

Text::MeCab needs to know what encoding you built your dictionary with
to properly execute tests.

Encoding of your mecab dictionary? (shift_jis, euc-jp, utf-8) [euc-jp] utf-8
Using utf-8 as your dictionary encoding
Detected the following mecab information:
version: 0.995
cflags: -I/usr/local/include -DMECAB_MAJOR_VERSION=0 -DMECAB_MINOR_VERSION=995 -I src
libs: -L/usr/local/lib -lmecab -lstdc++
include: /usr/local/include
Can't link/include C library 'mecab', 'mecab', aborting.

自前でインストールした環境では大丈夫だった、という書き込みがあったので、
最新版をインストールしてみましたが、結果同じでした。

ふと、こんなページを発見しました
mecabライブラリ
https://taku910.github.io/mecab/libmecab.html

#include  てありますね。ここでぴーんと来ました。

試しに・・・

#include

int main(){
}

こんな何もしないCプログラムを作りコンパイルしてみました。ラズパイはあっさり通りましたが・・・

$ cc mecab.c
mecab.c:1:19: error: mecab.h: No such file or directory

ライブラリがない。ということですね。

さくらの500円レンタルサーバで MeCab を使う

こちらはあっさり諦めてましたね・・・・^^;

ちょっと悔しいですがMecab.pmでも動くように修正しますかね・・・。

あと、今後の辞書の更新のことも考えなきゃいけないので、

さくらインターネットにPerl版のMeCab(形態素解析)を導入する

こちらを参考にして辞書の設定もしたいと思います。

CGIで文字列を処理できるようにする

CGIで処理ができるように修正していきます。

送信した文字列を受け取る

CGIとして画面を表示することはできましたが、
このままではデータを受けとることができません。

use strict;
use CGI;

my $debug;

my $q=new CGI;
my @param=$q->param;
my %HASH;
for (@param){
    $HASH{$_}=$q->param($_);
    $debug.=qq($_ , $HASH{$_} | );
}

このように最初のところに追加します。

そして、$debug、が確認できるようにhtml上にも追加しておきます。

ここではbodyの直後に以下のようにしました。

print "<body>\n";

print "<body>$debug\n";

 

さらにtextareaのnameを設定しておきます。

print " <textarea name=\"\" rows=\"10\" cols=\"60\"></textarea>\n";

print " <textarea name=\"text\" rows=\"10\" cols=\"60\"></textarea>\n";

 

ここまで修正したら、CGIに戻って適当なメッセージを送信してみます。

OKをおすと・・・

フォームの上部に表示されました。
サーバーの中で文字列が処理されたからです。

何が起きているか

本当は環境変数からこのようなPOSTやGETのデータを拾うのですが、
この”CGI”というモジュールを使うと簡単です。

環境変数から読み取るよりも処理が重くなってしまいますが、
使い分けてみたところソースプログラムも短くなるし、
文字化けなどのトラブルも少ないので使ったほうが良いと思います。

上部の
text , 送信テストをしてみます。

HASHというハッシュ変数の
キー’text’

”送信テストをしてみます。”
という文字列が入っているという意味になります。

$HASH{'text'}

この変数をコマンドラインで作ったソースで処理をするようにするだけです。

コマンドラインで作ったPerlツールをCGI化する[UIだけCGI化]

UIができたので、手っ取り早くCGIにしてしまいます。
もっとスマートなやり方はあるのでしょうが、
機能が実装できればいいと考えていますので、深く考えません。

オススメツール”htos”

htosというフリーのツールがあります。
htmlコードをかけば、perlやphpのソースに変換してくれるのです。
かなり便利で、なぜこういうツールの派生版が出てこないのか不思議です。
なので、はじめのうちはこれを使ってhtmlをcgiにするのがおすすめです。
ああ、こういうことか、ってすっとわかります。

こんなふうに貼り付けて、変換、を押します。

 

#!/usr/bin/perl

print "Content-type: text/html\n\n";

print "<html lang=\"ja\">\n";
print "<head>\n";
print " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n";
print " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0\">\n";
print " <meta http-equiv=\"Pragma\" content=\"no-cache\" />\n";
print " <meta http-equiv=\"cache-control\" content=\"no-cache\" />\n";
print " <meta http-equiv=\"expires\" content=\"0\" />\n";
print " <link rel=\"apple-touch-icon-precomposed\" href=\"\" />\n";
print " <title>Water</title>\n";
print "</head>\n";
print "<body>\n";
print " <form action=\"index.cgi\" method=\"post\">\n";
print " <input type=\"submit\" value=\"OK\">\n";
print " <a href=\"./index.cgi\">リロード</a><br>\n";
print " <textarea name=\"\" rows=\"10\" cols=\"60\"></textarea>\n";
print " </form>\n";
print "</body>\n";
print "</html>\n";

これでOKです。

これを、CGIの使えるサーバーにアップして、
実行権をつければ、CGIのになります。

はじめのうちは、ここにコマンドラインで作ったツールを組み合わせていけばいいです。

ちょっとprint文の連続はアレなのですが、何も作れないより全然いいです!

肝は

print “Content-type: text/html\n\n”;

だけなんですよね。

次回は文字列を処理させるために修正を加えていきます。

コマンドラインで作ったPerlツールをCGI化する[UIを作る]

コマンドラインでのツールができたのでCGI化してみます。
あくまでも自分で使う用です。あまり難しいアクセス制御など考えません。
と言うか、そんなにアクセスが簡単に稼げるなら、お金も簡単に稼げますね^^;
というわけで、サンデープログラマー的にはあまり不安を感じる必要はないと思っています。

UIを作る

使いやすいツールを使えばいいと思いますが、とりあえずHTMLでUIを作ります。
私はez-htmlというツールを使っています。

こんなふうにざっくり作ります。

<html lang="ja">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
  <meta http-equiv="Pragma" content="no-cache" />
  <meta http-equiv="cache-control" content="no-cache" />
  <meta http-equiv="expires" content="0" />
  <link rel="apple-touch-icon-precomposed" href="" />
  <title>Water</title>
</head>
<body>
  <form action="index.cgi" method="post">
    <input type="submit" value="OK">
    <a href="./index.cgi">リロード</a><br>
    <textarea name="" rows="10" cols="60"></textarea>
  </form>
</body>
</html>

ちょっと解説します。
viewportと言うのはスマホで見た場合に画面が拡大される仕組みを搭載できます。
PerlでCGIを作る場合キャッシュがいたずらすることが多いのでno-cacheとしています。
http-equiv=”expires” content=”0″もキャッシュを無効にする設定です。
apple-touch-icon-precomposedと言うのはiphoneでホームにアイコンを追加した際に使われるアイコンを設定することができます。
アプリみたいにすることができるので、設定しておくと良いです。

これらの設定はフォーマットとして作っておくとCGIを作るときに簡単にできます。いつも同じですからね。

 

↓ じっさいの画面はこんな感じにシンプルです。

 


リロード

 

 

ex_mecab.plを短く修正

CGI化するためにシンプルに修正してみました。

どういうわけかTermExtractにUTF8で通すと結果が何も返らずEUCに変換しないとダメなので
そのようにしてみました。

何か原因があると思いますが・・・

#! /usr/bin/perl -w
use strict;
use warnings;
use Text::MeCab;
use TermExtract::MeCab;
use Jcode;
use Encode;
my $data = new TermExtract::MeCab;

my $m = Text::MeCab->new();
my $s = "全域が太平洋側気候であるが、標高差が大きいため地域による寒暖の差が激しい。冬の平野部や沿岸>部は黒潮の影響で本州の中でも非常に温暖であり、寒気の影響を受けにくいために放射冷却によって朝晩は氷点
下まで下がることがあっても、日中は10°Cを超えることがほとんどである.";
my $n = $m->parse($s);
my $t="";
my $str="";
my $txtfile="in.txt";
while ($t = $n->next) {
    $str.=sprintf("%s\t%s\n",
           $n->surface,          # 表層
           $n->feature          # 現在の品詞
           );
    $n = $t;
}
# 何故かEUCじゃないとTermExtractの結果が返らないのでEUCに変換.
$str = &Jcode::convert($str,"euc");

# 出力モードを指定
# 1 → 専門用語+重要度、2 → 専門用語のみ
# 3 → カンマ区切り
my $output_mode = 1;

#
# 「形態素解析」済みのテキストファイルから、データを読み込み
#  専門用語リストを配列に返す
#  (累積統計DB使用、ドキュメント中の頻度使用にセット)
#
my @noun_list = $data->get_imp_word($str,'var');      # 入力が変数
#my @noun_list = $data->get_imp_word("in.txte");  # 入力がファイル

#
#  専門用語リストと計算した重要度を標準出力に出す
#
foreach (@noun_list) {
   # 日付・時刻は表示しない
   next if $_->[0] =~ /^(昭和)*(平成)*(\d+年)*(\d+月)*(\d+日)*(午前)*(午後)*(\d+時)*(\d+分)*(\d+秒)*$/;
   # 数値のみは表示しない
   next if $_->[0] =~ /^\d+$/;

   my $prt=&Jcode::convert($_->[0],"utf8");

   # 結果表示
   printf "%-60s %16.2f\n", $_->[0], $_->[1] if $output_mode == 1;
   printf "%s\n",           $_->[0]          if $output_mode == 2;
   printf "%s,",            $_->[0]          if $output_mode == 3;
}

カンマ区切りで出力してみました。

影響,太平洋側気候,平野部,沿岸部,放射冷却,°C,差,標高差,黒潮,寒暖,全域,冬,本州,地域,日,氷点下,寒気

 

次はCGI化してみます。

ex_mecab.plのオプションを変化させて結果を見る(2)

次は重要度計算になります。

重要度計算で、「ドキュメント中の用語の頻度」と「連接語の重要度」
のどちらに比重をおくかを設定する。
値が大きいほど「ドキュメント中の用語の頻度」の比重が高まる

6.設定値0.1(連接後の重要度高)

デフォルト値は1です。
少し順位が入れ替わってるかぐらいにしか見えませんかね。

 

7.設定値0.5(ドキュメント中の用語の頻度と連接語の重要度の中間)

当たり前ですが、違いが減りましたね。

 

8.学習機能

とは言え、

# 前回読み込んだ「形態素解析」済みテキストファイルを元に
# モードを変えて、専門用語リストを配列に返す

の部分です。学習機能をオンにしておかないと機能しないからです。
事前準備で
$data->use_stat; # 学習機能を使う

# 学習機能用DBにデータを蓄積するかどうか選択
$data->use_storage; # 蓄積する
の2つを有効にしおいて一度出力させて”stat.db”と”comb.db”を出力させてから
実行します。

これ31個にまとまっていい感じです!

 

難しい

どの設定が良いのかというのは難しいです。
となれば、デフォルトでも良いような気がしてきます・・・。

気になるキーワードが幾つかありました。

くに静岡
・・・ふじのくに静岡県がそのように分解されてしまっているようです。

アメリカ海軍
・・・イージス艦の事故の件でヒットしてしまっているようです。

らんnet
・・・じゃらんnetが分解されてしまっています。

公式ホームページふじ
・・・静岡県公式ホームページ ふじのくに総合トップページ

やはりどうしても変なところで切れたりするようですね。

もしかするとmecabの辞書に何かを追加したりすると良いのですかね??

試してみたいと思います。

ex_mecab.plのオプションを変化させて結果を見る(1)

オプションを検証してみます。

解析する例文は「静岡」で検索した一覧です。
URL先の文章まで読み込むと文章が大きすぎるので結果一覧のものだけとしました。

静岡県公式ホームページ ふじのくに総合トップページ
静岡の観光スポットランキングTOP10 – じゃらんnet
ハローナビしずおか 静岡県観光情報公式ホームページ
静岡市ホームページ
@S[アットエス] | 静岡新聞SBSオフィシャルサイト
絶対に行きたい!“静岡”のオススメ観光スポットランキングTOP40
静岡銀行
富士山静岡空港
ふじのくに静岡県の公式ホームページです。観光,産業,県庁案内、申請、申込など いろいろご利用いただけます。
静岡でおすすめの観光スポット3110ヶ所をセレクト!人気の富士サファリパークや大 室山などを口コミランキングでご紹介。静岡周辺で観光スポットを探すならじゃらんnet。
地理院地図 Googleマップ Bing GeoHack MapFan Mapion Yahoo! NAVITIME ゼンリン. ウィキポータル, 日本の都道府県/静岡県 表示・ノート・編集・履歴 ウィキ プロジェクト. 静岡県(しずおかけん)は、太平洋に面する日本の県の一つ。県庁所在地 は静岡市..
17日未明、静岡県南伊豆町の石廊崎から、およそ20キロ沖合で、フィリピン船籍の コンテナ船から「アメリカ海軍の船と衝突した」と、第3管区海上保安本部に通報がありま した。アメリカ海軍の船はイージス駆逐艦で、船体の右側の側面が
静岡県観光協会が提供する静岡県観光ホームページ ハローナビしずおかです。宿泊・ 温泉・グルメ・お土産情報から富士山情報まで、静岡の観光を楽しむ情報が満載です。
静岡県静岡市(政令指定都市)のホームページです。生活情報・観光情報ほか、住む人 にも来る人にも便利な情報を掲載しています。
静岡新聞社・静岡放送(SBS)の総合ポータルサイト「@S[アットエス]」。静岡新聞掲載の ニュース、スポーツ、静岡放送の番組情報・動画ニュース、グルメ、イベント、映画、施設 などの静岡県内の生活情報などを紹介しています。
静岡といえばやはり世界遺産に登録された富士山が有名ですが、その他でも伊豆・熱海 の温泉も人気が高く日本国内でも有数の観光名所があります!素敵なスポットをあます ところなく絶対に外せない静岡の人気スポットを紹介していきます.
静岡銀行のホームページです。総合口座から外貨預金、ローン、カードとさまざまな商品 ・サービスをご用意しております。
富士山静岡空港の公式ウェブサイト。国内線・国際線の時刻表、空港へのアクセス方法 、レストランやイベント情報など情報満載。富士山静岡空港は、人と自然にやさしい空港 を目指しています。

 

1.異なり数

順位が変わっていますが、結果そのものはあまり違いがないように見えます。

 

2.パープレキシティをとる

「情報理論的に見ていくつの単名詞が連接可能か」というのがパープレキシティだそうです。
右側ですが、結果が極端に減ります。このくらいのほうが多すぎず良いかもしれません。
「くに静岡」というのは誤検知でしょうか・・・。

 

3.隣接情報を使わない

こちらも結果が極端に減ります。「くに静岡」がなくなりましたね。その代わり「らんnet」と言うのが入っています。

 

4.Term Frequency

用語頻度情報のとり方のようです。分解された用語が増えたように思います。

  • Frequency ———— 用語が他の用語の一部として使われていた場合にカウントしない
  • TF(Term Frequency) — 用語が他の用語の一部として使われていた場合もカウントする

このような違いがあるそうです。

 

5.頻度情報をつかわない

結果が少し減るようです。ただ、共起語は「よく使われる言葉」なので頻度情報はあったほうが良いかもしれません。

 

ちょっと多くなりましたので、

続きは次回とします。

 

ex_mecab.plの内容をみてみた

ex_mecab.pl の中でやっていることをみてみました。

# 出力モードを指定
# 1 → 専門用語+重要度、2 → 専門用語のみ
# 3 → カンマ区切り
my $output_mode = 1;

出力形式を変えられるようになっているんですね。

 

#
# 重要度計算で、連接語の"延べ数"、"異なり数"、"パープレキシティ"のい
# ずれをとるか選択。パープレキシティは「学習機能」を使えない
# また、"連接語の情報を使わない"選択もあり、この場合は用語出現回数
# (と設定されていればIDFの組み合わせ)で重要度計算を行う
# (デフォルトは"延べ数"をとる $obj->use_total)
#
#$data->use_total;      # 延べ数をとる
#$data->use_uniq;       # 異なり数をとる
#$data->use_Perplexity; # パープレキシティをとる(TermExtract 3.04 以上)
#$data->no_LR;          # 隣接情報を使わない (TermExtract 4.02 以上)

結果の横に出てくる数値が”重要度”のようです。
設定しないと「延べ数」になるようですね。
これ設定を変えて結果がどうなるか見てみるのも良いかも??

 

# 重要度計算で、連接情報に掛け合わせる用語出現頻度情報を選択する
# $data->no_LR; との組み合わせで用語出現頻度のみの重要度も算出可能
# (デフォルトは "Frequency" $data->use_frq)
# TFはある用語が他の用語の一部に使われていた場合にもカウント
# Frequency は用語が他の用語の一部に使われていた場合にカウントしない
#
#$data->use_TF;   # TF (Term Frequency) (TermExtract 4.02 以上)
#$data->use_frq;  # Frequencyによる用語頻度
#$data->no_frq;   # 頻度情報を使わない

これよくわからないですね。
またこんどどう変わるか確認してみます。

 

#
# 重要度計算で、学習機能を使うかどうか選択
# (デフォルトは、使用しない $obj->no_stat)
#
#$data->use_stat; # 学習機能を使う
#$data->no_stat;  # 学習機能を使わない

学習機能を使うと、どうなるのか?

単名詞の連接情報は、元となるデータが多ければ多いほど正確な統計データが
得られると推定されます。この学習機能は、いままでに処理対象としたテキストか
ら単名詞の連接情報を蓄積し、重要度計算で用いるものです。ただし、雑多な
文献を扱うと、結果として一般すぎる語が上位にきます。分野を特定した上でお使
い下さい。

とのことです。
どんな原文を解析させていくかで、結果が変わっていくということでしょうか?
 

# 重要度計算で、「ドキュメント中の用語の頻度」と「連接語の重要度」
# のどちらに比重をおくかを設定する。
# デフォルト値は1
# 値が大きいほど「ドキュメント中の用語の頻度」の比重が高まる
#
#$data->average_rate(0.5);

なるほど。これは面白そうです。
これも値を変えてみてどうなっていくか調べたいですね。

# 学習機能用DBにデータを蓄積するかどうか選択
# 重要度計算で、学習機能を使うときは、セットしておいたほうが
# 無難。処理対象に学習機能用DBに登録されていない語が含まれる
# と正しく動作しない。
# (デフォルトは、蓄積しない $obj->no_storage)
#
#$data->use_storage; # 蓄積する
#$data->no_storage;  # 蓄積しない

これは、学習機能を使う、とセットでないと意味はなさそう。

# 学習機能用DBに使用するDBMをSDBM_Fileに指定
# (デフォルトは、DB_FileのBTREEモード)
#
#$data->use_SDBM;

# 過去のドキュメントの累積統計を使う場合のデータベースの
# ファイル名をセット
# (デフォルトは "stat.db"と"comb.db")
#
#$data->stat_db("stat.db");
#$data->comb_db("comb.db");

DBの種類の設定とDBファイル名の設定ですね。
これは別にそのままでいいと思います。
DBM(バークレーDB)はデフォルトでは入っていないからだそうです。
しかし、今はレンタルサーバーでも入っていると思います。

# データベースの排他ロックのための一時ディレクトリを指定
# ディレクトリ名が空文字列(デフォルト)の場合はロックしない
#
#$data->lock_dir("lock_dir");

ロックですね。シングルで使うには必要ないでしょう。

# 「形態素解析」済みのテキストファイルから、データを読み込み
#  専門用語リストを配列に返す
#  (累積統計DB使用、ドキュメント中の頻度使用にセット)
#
#my @noun_list = $data->get_imp_word($str,'var');      # 入力が変数
my @noun_list = $data->get_imp_word($InputFile);  # 入力がファイル

変数読み込みもできるように配慮されています。
WEBからの読み込みと組み合わ焦ることも簡単にできそうですね。

# 前回読み込んだ「形態素解析」済みテキストファイルを元に
# モードを変えて、専門用語リストを配列に返す
#$data->use_stat->no_frq;
#my @noun_list2 = $data->get_imp_word();
# また、その結果を別のモードによる結果と掛け合わせる
#@noun_list = $data->result_filter (\@noun_list, \@noun_list2, 30, 1000);

ここ謎ですね?
すべてコメントですから、デフォルトでは動作していません。
get_imp_word という関数を使って何かをしマージしているように見えます。
30,1000という引数が何を意味するのでしょうかね・・・?

#
#  専門用語リストと計算した重要度を標準出力に出す
#
foreach (@noun_list) {
   # 日付・時刻は表示しない
   next if $_->[0] =~ /^(昭和)*(平成)*(\d+年)*(\d+月)*(\d+日)*(午前)*(午後)*(\d+時)*(\d+分)*(\d+秒)*$/;
   # 数値のみは表示しない
   next if $_->[0] =~ /^\d+$/;

   # 結果表示
   printf "%-60s %16.2f\n", $_->[0], $_->[1] if $output_mode == 1;
   printf "%s\n",           $_->[0]          if $output_mode == 2;
   printf "%s,",            $_->[0]          if $output_mode == 3;
}

出力形式をいじれますね。

次回はこれを踏まえて検証をしてみたいと思います。