[掲示板へもどる]
一括表示

  [No.779] クラスタ分析のターム・文書行列 投稿者:アリ  投稿日:2011/05/18(Wed) 14:05:40

樋口先生、お世話になっております。アリです。

KHCoderのクラスタ分析の手法と流れをご確認させていただきたいですが。
doc_cls.pmのsub cacl と sub cacl_execの中身を見ると、距離の計算とグループ分けはRの関数distとhclustを利用していると思います。
Rのdist関数を利用するため、分析対象ファイルのターム・文書行列(term-document matrix)というインプットファイルが必要だと思います。
KHCoderでどこでそのファイルを作成していますか?
sub cacl の「データ取り出し」ということだと思いますが、正しいでしょうか。
# データの取り出し
my $file_csv = $::project_obj->file_TempCSV;
mysql_crossout::csv->new(
 file => $file_csv,
 tani => $self->tani,
 tani2 => $self->tani,
 hinshi => $self->hinshi,
 max => $self->max,
 min => $self->min,
 max_df => $self->max_df,
 min_df => $self->min_df,
)->run;

もし、このところであれば、自分で作ったnewproject.plに追加して、単独的にそのterm-document matrixを外部に出力したいですが。

次のように、newproject.plに追加したましたが、hinshiという変数の定義でエラーが出て、なかなか動かないです。

# 新規作成したプロジェクトを開く
print "\nopen this new project\n";
$new->open or die;
$::main_gui->close_all;
$::main_gui->menu->refresh;
$::main_gui->inner->refresh;

#分析対象ファイルをチェックする
#use kh_datacheck;
#kh_datacheck->run;
#print '分析対象ファイルをチェックしました';

# 前処理実行
print "\nexecute pre-process\n";
mysql_ready->first;

#クラスタ分析
print "\ncluster analysis\n";
use gui_widget::tani;
use gui_widget::hinshi;
use mysql_crossout;
use gui_window::doc_cls;

# データの取り出し
my $file_csv = $::project_obj->file_TempCSV;
mysql_crossout::csv->new(
 file => $file_csv,
 tani => 'H2',
 tani2 => 'H2',
 hinshi => &hinshi,
 max => '',
 min => '1',
 max_df => '',
 min_df => '1',
)->run;

sub hinshi{

my $self = shift;

return $self->{words_obj}->hinshi;
}
・・・
・・・

「データ取り出し」ことはどうやって呼び出せるかご教授を頂ければ、大変助かると思います。
よろしくお願い致します。


  [No.780] Re: クラスタ分析のターム・文書行列 投稿者:HIGUCHI Koichi  投稿日:2011/05/18(Wed) 16:16:03

こんにちは、樋口です。書き込みありがとうございます。
こちらの方にコメントします。

ターム・文書行列(term-document matrix)は、お書きの所で作成しています。

良い線まで行っていますのでdoc_cls.pmの方を少し触って、hinshiの中身を見
てみて下さい。

mysql_crossout::csv->newの手前で、次のようにします。

my $test = $self->hinshi;
use Data::Dumper;
print Dumper($test);

これでhinshiの中身を見て、同じようなものを作ると良いでしょう。


  [No.781] Re: クラスタ分析のターム・文書行列 投稿者:アリ  投稿日:2011/05/19(Thu) 10:27:13

樋口先生、お世話になっております。アリです。

ご返事を頂き、ありがとうございます。

doc_cls.pmとhinshi.pmの中身を確認しましたが、hinshiの呼び方がまだよく分からないと思います。再教授を頂きたいですが、よろしくお願いします。

newproject.plに例のソース追加して、hinshiの中身をprintしたいですが、実行エラーがありました。

追加したこと
******
# データの取り出し
my $self = shift;
my $test = hinshi;
use Data::Dumper;
print Dumper($test);
#ここはsub hinshiを呼び出すため、doc_cls.pmと同じように書いた。
my $win = $self->{win_obj};
$win->title($self->gui_jt($self->label));
my $lf_w = $win->LabFrame(
-label => 'Words',
-labelside => 'acrosstop',
-borderwidth => 2,
)->pack(-fill => 'both', -expand => 1);

$self->{words_obj} = gui_widget::words->open(
parent => $lf_w,
verb => '使用',
);

sub hinshi{
 my $self = shift;
 return $self->{words_obj}->hinshi;
}
******
エラーメッセージは**can't call method 'hinshi' on an defined value **

mysql_crossout::csv->newに渡す引数hinshiはどのタイプの変数でしょうか。配列ですか?GUIからの選択により呼び出してはなく、tani => 'H2'のように直接に実データを作って、渡すことが可能でしょうか?

また、mysql_crossout::csv->new->runをスムースに実行すると、csvファイルが直接に出力しますか?もしくは、抽出語リストと同様、次のようにopen必要となりますか?
my $file_matrix = mysql_crossout::csv->new(
.....
)->run
gui_OtherWin->open($file_matrix);

こんなに簡単な質問でいいのか、先生にご迷惑をかけるかと思っていますが、Perlのほうは初心者なので、何卒よろしくお願い致します。


  [No.782] Re: クラスタ分析のターム・文書行列 投稿者:HIGUCHI Koichi  投稿日:2011/05/19(Thu) 11:01:21

こんにちは、樋口です。書き込みありがとうございます。

> ターム・文書行列(term-document matrix)の出力

えっと、もともとエラーが出て動いていないnewproject.plに追加しても、意
味がありません。

うまく動いている方(doc_cls.pm)では、$self->hinshiの中身としてどんな
ものがmysql_crossout::csvに送られているのかをまず確認するのです。その
ためには、doc_cls.pmに、print Dumper(...);を追加します。

そして、メニュー操作でクラスター分析を実行すれば、print Dumper(...);が
実行されて、hinshiオプションの中身がコンソールに表示されるでしょう。
これを見れば、変数のタイプも内容も明らかになります。

どんなものがmysql_crossout::csvのhinshiオプションとして使われているの
かが分かれば、あとは、同様のものを手で作成してnewproject.plに追加する
と良いでしょう。

> また、mysql_crossout::csv->new->runをスムースに実行すると、csvファイ
> ルが直接に出力しますか?もしくは、抽出語リストと同様、次のようにopen
> 必要となりますか?

mysql_crossout::csv->new(
file => $file_csv,
(以下略)
);

というコマンドでは、fileオプション(すなわち$file_csvの中身)でファイ
ル名を指定しています。指定されたファイルに、データが出力されます。

で、そのファイルをご自身で開いて確認するのが面倒なので、自動的にExcel
を起動したい場合にはgui_OtherWin->open($file_csv);を実行すると良いで
しょう。


  [No.783] Re: クラスタ分析のターム・文書行列 投稿者:アリ  投稿日:2011/05/19(Thu) 14:12:12

樋口先生、お世話になっております。アリです。

早速、ご教授を頂き、どうもありがとうございました。

やっと仕組みとやり方が分かりました。
doc_cls.pmのコメンドラインの出力によって、hinshiの変数タイプは次のこととなっています。
VAR1=['1','2','3',,#省略]

そのを基いて、newproject1.plで次のように書きました。

*****
# データの取り出し

my $file_csv = 'C:\khcoder\SourceCode\inputfile\term-matrix.csv';

my $hinshi = ['1','2','4','5','6','7'];#選択する品詞
mysql_crossout::csv->new(

file => $file_csv,

tani => 'H2',

tani2 => 'H2',

hinshi => $hinshi,

max => '',

min => '1',

max_df => '',

min_df => '1',
)->run;
******
うまく実行でき、csvファイルも出力されました。
どうもありがとうございました。