2015年9月29日火曜日

形態素解析器のいらないキーワード抽出ツール(完成!?)

今日で、ほぼ完成しました。
精度も速度もだいぶ上がりました。

満足のいくものができたので、
そろそろベクター様に投稿しようと思います。

スクリプトはベクター様で公開されるまで非公開にします。

苦節一週間。
長かったなぁ。

明後日のゼミが自分の番なので

いまから本業に全力投球します。

がんばるおー

2015年9月28日月曜日

形態素解析器のいらないキーワード抽出ツール(4)

今日もこれです。

過去記事のスクリプトは削除しました。

だいぶ速くなり、10000字の文書を1~2分で処理できるようになりました。


(ある文字列のスコア) = (出現回数)×(文字列の長さ)

と定め、

キーワードの集合から(文字列1)と(文字列2)を取り出し、

条件1 : (文字列1)&(文字列2)のスコア > (文字列1)のスコア

条件2 : (文字列1)&(文字列2)のスコア > (文字列2)のスコア

の二つを満たしたとき、

(文字列1)&(文字列2)を新たにキーワードの集合に加えます。


(文字列1) : 形態素
(文字列2) : 解析器
(文字列1)&(文字列2) : 形態素解析器

こんな感じです。


2015年9月27日日曜日

形態素解析器のいらないキーワード抽出ツール(3)

今日も昨日に引き続き、キーワード抽出ツールを作りました。

前回、「機種依存文字」によって解析が止まると書きましたが、
それは間違いで、正しくは、「特殊文字」でした。
今回のソースコードでは特殊文字は削除します。

あとはアルゴリズムをいじって精度が少し上がりました。
頑張ってベクター様での公開を目指します。


2015年9月26日土曜日

形態素解析器のいらないキーワード抽出ツール(2)

今日は昨日に引き続き、キーワード抽出ツールを作りました。

今日のは完全に自動です。
面倒臭さ軽減!

速度も上昇し、ミスも減ったかな・・・

1000字くらいの記事なら、サクっと解析できます。

しかし「★」とか機種依存文字(?)が文章中にあると、解析が終わらなくなるんです。

まだまだですね。

2015年9月25日金曜日

形態素解析器のいらないキーワード抽出ツール

今作っているものです。

というか一旦は完成しました。

しかしめっちゃ遅いから、まだベクター様で公開できる段階じゃないんです。

あとたまにミスる。


それでなぜ形態素解析器のいらないツールにしたかったか?

なぜなら自分が使うとき面倒だったからです!

2015年9月24日木曜日

HTML::TagParserというPerlモジュールでスパイダリングしてみたよ!

今日は、スパイダリングのスクリプトを作成しました。

起点となるページ(デフォルトでYahoo!ニュース)に飛んで、

同じドメインのページをスパイダリングします。

たぶん幅優先探索になっていると思われます。


とりあえず pタグの innerText を抜きまくって、.txtで保存します。


HTML::TagParserモジュール以外でも作れると思いますし、

もしかすると別のモジュールの方がいいのかもしれません(´・ω・`)ショボーン

実際、Yahoo!ニュースを起点に2000ページほどスパイダリングしたんですが、

かなり時間かかりました。

でも頑張って書いたので、下記をご笑覧ください。




▼Perlスクリプト▼


#!/usr/bin/perl

use strict;
use warnings;
use URI::Fetch;
use HTML::TagParser;
use Encode;

my @contents = ();
print "スパイダリングの起点となるウェブページのURLを入力してください。(半角英数)\n";
print "※デフォルトでYahoo!ニュースが設定されています。\n";

chomp(my $start = <STDIN>);

if($start eq ""){

 $start = "http://news.yahoo.co.jp/";

}

my %links = ($start,1);
my @pages =($start);

print "起点からスパイダリングするページ数を指定してください(半角数字)\n";
chomp(my $intensity = <STDIN>);
print "スパイダリングしています。\n";

foreach my $page ( @pages ){

 my $html = HTML::TagParser->new( $page );
 my @a = $html->getElementsByTagName( "a" );
  
 foreach my $elem ( @a ) {

  my $url = $elem->attributes->{href};
  
  if(defined($url)){
  
   if( $url =~ /$start/ && !defined($links{$url})){

    $links{$url}++;
    $intensity--;

    push(@pages,$url);

   }

  }

 }

 if($intensity<=0){

  last;

 }

}

print "スパイダリング完了。\n";
print "pタグのテキストデータを抽出しています。\n";

foreach my $page ( @pages ){

 my $html = HTML::TagParser->new( $page );
 my @p = $html->getElementsByTagName( "p" );
  
 foreach my $elem ( @p ) {
   
  my $str = decode('UTF-8', $elem->innerText);
   
  my $text = encode('Shift_JIS', $str);
   
  push(@contents,$text);
  
 }

}


unlink './learningData.txt';
open(DATAFILE, ">> ./learningData.txt");

print DATAFILE "@contents\n";

close DATAFILE;

exit;





2015年9月23日水曜日

教師なし形態素解析

辞書なしで形態素解析できないか悩んでいたら、下記を発見しました。

『ベイズ階層言語モデルによる 教師なし形態素解析』
NTTコミュニケーション科学基礎研究所 持橋大地
http://chasen.org/~daiti-m/paper/nl190segment-slides.pdf


教師なしってことは、
学習用データを与えれば、
勝手に学習して、
学習後にサクサクっと形態素解析してくれるってことでしょうか。

テラオモシロス。

同じ原理でデマのパターン抽出とかもできそうだな。

連休最終日にオモロイものをみた。