テキストマイニングを使う技術/作る技術

正月休みにまとめて読もうと、何冊か買ったうちの一冊。

結論から言うと、テキストマイニングを使う技術という感じの本でした。

内部を知らなくても良い人向け, 2006/12/26 レビュアー: iwashi - レビューをすべて見る 全体として、テキストマイニングを利用したい側の人にとって、 また概要を理解したい人にとっては、非常に有用な本だと思う。 だが、テキストマイニングの具体的なロジックを知りたい人には向いていない。 言い換えれば、開発者ではなく利用者向けということである。 私は開発者向けの内容と踏んで、購入してしまったため、拍子抜けしてしまった。 今から買う人は、その点を注意して購入してほしい。

僕も、amazon reviewerのコメントにあるように、統計的なアプローチでバリバリ実装していく方法を説明している本。というイメージで購入してしまったので、家に届いて本をめくったらアレ~~なんだよ~~って感じになった。

でも、使う技術の本(というかマイニングの解説本)としてはかなり面白かった。具体例はIBMでのヘルプセンターでのマイニング事例だけど、創薬とかバイオ分野でのテキストマイニングに読みかえても面白い。

(テキストマイニングに限らず)マイニングは基本的に気付きを与えてくれるツールなんだよということを再確認させてくれる。

あとは組織の在り方にも触れていてそうだよナァと思ったり。

マイニングするチームがでてきた仮説を実行権限を持っていることが大切ということ。

なかなか面白かった。

TTSiteをいじってみた

Catalyst::Manual::Tutorial::CatalystBasics

script/myapp_create.pl view TT TT

ではなく、

script/myapp_create.pl view TT TTSite

とやれと。これにより、ちょっとした雛形も一緒に作成されるので、ちょっと便利になったかなと。

で、TTSiteってどうなってんだろうかと、root/lib/siteを眺めてみたら、WRAPPERというしらない構文があったので。

Catalyst::Helper::View::TTSite と TT の AutoWrapper : おまえのログ

WRAPPER オプションに一番外側になるテンプレートを指定すると、tt_process で生成される出力が、WRAPPER で指定したテンプレの content になる

おー、入れ子にするには便利な機能だ(WRAPPER)。

TTSiteはヘッダ、フッタはPROCESSで埋め込んで、bodyの中身をWRAPPERで埋め込むと。図にするとこんな感じ。

TTsite

Perl Template Toolkitが気になるが、

ProductName Perl Template Toolkit
Darren Chamberlain
Oreilly & Associates Inc / 3031円 ( 2004-03 )


Template Toolkit Manual -テンプレートツールキット和訳マニュアル-も読み返そう。

FC6アップデートでyumが動かん

うるさくてイマイチ好きになれないマシンだが、筐体開けたらCPUクーラーがやかましいだけみたいなので、正月休みを利用して、静音タイプに付け替えた。ちょっとはマシになったっぽい。

その勢いで、FC5をFC6にアップデート(ここまで順調)。

でyum updateしたらエラー。

ヒビノアワ: FC5からFC6へアップデート

fastestmirrorプラグインをインストールし直したらいいんじゃないか

こういうことらしい。あっさり解決したけど、またやりそうなのでメモ。

ポイントフリースタイルのhead

普通のhaskellプログラミングの216ページに

ポイントフリースタイルへの書き換えは脊髄反射の速度でできるようにしてください。

と書いてあったのだけど、脊髄どころか反射すらできない。

firstNLines :: Int -> String - String
firstNLines n = unlines . take n . lines

nを押し出すのってどうやるんだろうか?

追記07.01.03

解決したヨ。

ポイントフリーなhead.hs

下の式を完全なポイントフリースタイルにする方法を色々と考えてみたんだけど。

firstNLines n = unlines . take n . lines

結局分からんかったので、mixiで聞いてみたらさくっと教えてもらえた(ありがたい)。

unlines . take n . lines
(unlines . take n) . lines
(. lines) (unlines . take n)
(. lines) ((unlines .) (take n))
((. lines) . (unlines .)) (take n)
((. lines) . (unlines .)) . take
(. lines) . (unlines .) . take

.って演算子として考えればよいらしい。だから、左側を取るように書き換えてやればいいのか。

Prelude> 5 + 7
12
Prelude> (+ 7) 5
12

(+)だとこんな感じ。

型を確認すると

Prelude> :type (.)
(.) :: (b -> c) -> (a -> b) -> a -> c

.は(b -> c)と(a -> b)という関数をとってa->cという関数を合成する関数(二項演算子?)なのか。

(.) :: (b -> c) -> (a -> b) -> (a -> c)

関数合成で、変数が消えていくのは、こういうことなのね。

Wiiをゲットした

コンビニにビールを買いにいったらPLUTOの4巻が並んでいた。あれ、3巻読んでないじゃんってことで、チャリで3巻物色に近所のブックオフへ。

あんまり期待してなかった、というか予想通りにPLUTO3巻は置いてなかったので、立ち読みでもしてから帰るかなぁと軽く店内を見回すと、

wii入荷しました

という張り紙が。

おーラッキー、そのままの流れでお買い上げ(+ wii sports)してきた。というわけで、予想外の大モノをゲット。

で、さくっと帰って、ゲームで遊んだら、Wi-Fiコネクションの設定だ。

暗号方式はWEPのほかにもAESとか色々使えるんだけど、DSにあわせなあかんのでDS+Wii+パソコンとかという家庭だと実質WEP128という選択肢がないと思うんだけど、、、、(もしかしてDS LiteってAES対応してんのかな?)うちのは普通のDSなので、もちろんWEP128で無線LAN環境構築してある。

あと、Wii本体更新が結構おそい上によく失敗するみたい。夕方から更新作業始めて、3回DLに失敗して、4回目に1時間近くかかって更新が終わったと思ったら、

さらなる、本体更新が始まったのには凹んだ(今21時)失敗したら、最初からダウンロードやり直しっぽいのも勘弁して欲しい。

いつになったら更新完了するんじゃろか?うーん、近くでADSLモデムがバッツンバッツン切れてるから、うちのネットワークの問題なのかなぁ、とエントリ書きながら思ったりしている。

ProductName Wii【メーカー生産終了】

任天堂 / ?円 ( 2006-12-02 )


ちなみにwii sportsはおもろい。特にテニス。明日リモコンもう一個買ってきてU隊長と対戦するかも。

ProductName Wii Sports

任天堂 / 3727円 ( 2006-12-02 )


これWi-Fiで対戦できたらいいのにねぇ。

年越し蕎麦を打った

なんか、最近そば打ちしてないけど。

粉

ちょっと日がたった粉だったので不安だったけど、50%位の加水でまとまった。

玉

延しと、切りは全然駄目だった。

切り

もう少し、小さい量で数こなすようにしないと。

春菊、ミニホタテ、レンコンでかき揚げ作って、年越し蕎麦にして食べた。蕎麦は香りが良かった。満足。

lambってスキー道中に聴く音なのか

明日からスキーに行くから、道中lamb聴くから貸して~ と言われたので、渡しといたけど。

ProductName Best of Lamb 1996-2004: Best Kept Secrets
Lamb
Koch Records / 1570円 ( 2004-07-13 )


これってドライブ向きじゃないような気がすんだけど。 まぁいいやってことで、ついでにGoth-Tradも渡しといた。

ProductName マッド・レイヴァーズ・ダンス・フロア
GOTH-TRAD
インディーズ・メーカー / ?円 ( 2005-11-19 )


ちなみに僕はボードトリップでは、DJ Krushとかlambとかカケマクリデス。真っ白な雪道にガブリエルとかかかるとドープなほうに盛り上がってなんとも言えん。

smi2pngの幅と高さを指定できるようにした

高さとか幅とか指定して画像に出力するように、コマンドを書いた。というわけで、これよりは使いやすくなった。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/perl

use strict;
use warnings;
use CDK::Smi2Png;
use Getopt::Long;

my $width = 300;
my $height = 300;
my $output = "output.png";

my $result = GetOptions(
                        "width=i" => \$width,
                        "height=i" => \$height,
                        "output=s" => \$output,
);

sub usage
{
  print <<EOF;
usage:

smi2png [-w <width>] [-h <height>] [-o <output>] <SMILES>

  -w, --width             width of output
  -h, --height            height of output
  -o, --output            output PNG file name

EOF
print "\n";
exit;
}

my $smi = shift || usage();

$smi = (split(/\t/, $smi))[0];

my $smic = CDK::Smi2Png->new();
$smic->writePNG($smi,$width,$height,$output);

使い方は、

smi2png -w 200 -h 200 -o thiophene.png "C1=CSC=C1"

とか。

あとは、ベンゼン環をチオフェンに変換するようなモジュールをChemichoに追加した。

benzene

これで、6員環が生物学的等価体の5員環に置換されるようになった。

thiophene

MeCab (和布蕪)入れた

オモシロそうなので遊んでみたが、幾つかはまった部分があった(未解決)

[を] 裏で形態素解析器を使い長い文をそのままキーとしてWeb検索する

長い文を検索キーとしてWeb検索をするというハックです。 一年前の検索会議[2005-09-30-3]で紹介しましたが、 今回ゼロから書き直しました。

辞書はutf8な環境でつかえるように

./configure --with-charset=utf8

でインストール

自分の環境で実行すると、フォームの部分だけ文字化けした(謎)

mecab

あと、名詞かどうか判定している部分で

while ($n = $n->{next}) {
    if ($n->{feature} =~ /^\xcc\xbe\xbb\xec/) { # 名詞
        my $w = $n->{surface};
        Encode::from_to($w, 'euc-jp', 'utf-8');
        $word{$w}++;
    }
}

とやっているのだが、なぜ、xccxbexbbxecでマッチさせないといけないのかよくわかってない。というか、Encodingちゃんと理解してないナァ、、、、

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl
use strict;
use warnings;
use MeCab;
use Devel::Peek;
use utf8;

my $m = new MeCab::Tagger ("");
my $word = "今朝は雨の中、U隊長とユッキー様とハナタロウと散歩した。";
my $n = $m->parseToNode($word);

while ($n = $n->{next}) {
    if ($n->{feature} =~ /^\345\220\215\350\251\236/) { # 名詞
#    if ($n->{feature} =~ /^名詞/) { # 名詞
        my $w = $n->{surface};
        print $w,"\n";
    }
}

この場合、use utf8しなければ、/^345220215350251236/でも/^名詞/でもマッチするのに、use utf8すると/^名詞/はマッチしなくなってしまう。

  • フォームが文字化け
  • 正規表現の部分がよくわからなかった。

あとで、ちゃんと調べる。