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


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

テラオモシロス。

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

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

2015年9月22日火曜日

有名女優さん同士の類似度


 今日はレコメンド関連にテーマを戻して活動しました。
 
 上表は有名な日本の女優さん7人の類似度を表しています。

 どのように計算したかといいますと、

 「女優A」でGoogle検索 → ヒット件数を x とする
 「女優B」でGoogle検索 → ヒット件数を y とする

 「女優A 女優B」でGoogle検索 → ヒット件数を z とする

 女優Aと女優Bの類似度 = z / (x * y) ^ (1/2)



 こんな感じです。簡単ですね。

 これ、実はコサイン類似度なんです。

 あるウェブサイトが「女優A」で、

  ヒットした     → 1
  ヒットしなかった → 0
 
 として、Googleで認識されている全てのウェブサイトを 1 または 0 で評価。

 すると「女優A」についてのベクトルができます。
 同様に「女優B」でもベクトルをつくります。

 それら二つのベクトルのコサイン類似度を計算すると、概ね上表と同じ数値を得るでしょう。

 なぜ概ねなのかというと、Googleの検索件数表示が概数で出るため。

 

 新垣結衣さんは、堀北真希さんと、よく一緒に記事にされる。
 
 新垣結衣さんは、有村佳純さんと、あまり一緒に記事にされない。

 などがわかりますね。

 こういう情報から女優さんのレコメンドとかできたら面白いかもしれません。
 

2015年9月21日月曜日

デマの形態素解析

今日は、とあるクラウドソーシングサイトで20字程度のデマを考えて欲しいという依頼をした。

そして計530件のデマが集まった!

集まったデマはこんな感じ↓

iphone6sを最後に、Appleはスマートフォン事業から撤退することになった。
小さなつむじ風の中に入って傘をさすと少し飛べる。
植村直己さんの遺体発見 行方不明から31年 マッキンリー山中で。
インドで新種の家畜ゾンビ化ウイルスを発見、隔離後アメリカ研究機関へ。
マヨネーズを食べ続けるだけで胸が大きくなる。
牛乳を飲み続けると肌の色が白くなる。
電車内、土足禁止にてダイヤが乱れ遅刻者多発。
江頭2時50分は営業で得たギャラの3割を赤い羽根募金に寄付している。
自転車が免許制になり保険の加入が義務付けられる。
消費税10%を中止にすることが正式に発表されました。
ガラパゴス島で発見された新種の生物からハゲの遺伝子治療に有効なDNAを発見。

なかなか良いセンスだと思いませんか?

これらを茶筅で形態素解析したり、

キーワード抽出とかしました。


「実は」「発見」「発表」「開発」などのキーワードが、デマの場合はよく出現するようです。


デマ検知器をどう作っていくか、まだ光がさしていませんが、

やってて面白いので、なんとか成果を出したいです。

2015年9月20日日曜日

お彼岸

今日は母の実家に行って、お墓参りをしてきました。

お墓は山の斜面にあり、高齢の祖母はもうお墓参りできないので、

私が代わりにお墓参りしました。

先日の台風のせいか、お墓の周りが荒れていて、

祖母からは「掃除はしなくていいよ」と言われていましたが、

簡単に片付けました。



そろそろ秋学期が始まる関係で、本業の方が忙しくなりそうです。

このブログの更新も徐々にまばらになりそうですが、

頑張って毎日更新したいです。


Twitterのデマ検知器ですが、

デマツイートデータを後輩から入手することに、指導の先生からNGが出ました。

理由は結構複雑で、オープンにできない事情もあるので割愛します。

残念ですが、別の方法で、デマ検知器の作成にアプローチしようと思います。

2015年9月19日土曜日

Twitterのデマ検知器を作ろう!

Twitterから情報を抜くにはどうすればいいか試行錯誤する一日でした。

Perlの場合、下記URL先の説明が一番丁寧に感じました。

http://qiita.com/nmkwnryk/items/e20ffb299ac55d7bd3d2


そんな感じでTwitterについて色々調べていたら、
大学の研究室の後輩(もう卒業した)がやってた研究に、突発的に興味が湧いた。

ナイーブベイズ分類器でデマツイートを検知する方法を彼は研究していた。

彼のスゴイところは、彼自身はTwitterにあまり興味がなかったことだ。
(なぜ研究したし。)

私もなんかそういうアルゴリズム作りたいなと思った。

なので、さっそく彼にメールした。

すると、

共同研究者の先生の了解を得られれば、
彼が分析していたツイートのデータをくれるとのこと。

次のフリーソフトは、デマ検知器になる可能性が微レ存!

2015年9月18日金曜日

「今夜はカレーよ!」 ⇒ 夜遊び自重

今後の課題まとめ

1. スパイダリングの勉強をする。

2. スパイダリングのPerlスクリプトを作って、recommendWithCosSimilar と合体させる。

3. 欲しい情報だけ出力してくれるスパイダリングツール爆誕!


夢で終わらないよう頑張らねば!

ふぬふぬ・・・!


なお今日は大学でミーティングがあり、

本業で忙しく、

エンジニアとしての進捗は全くなかった模様(´・ω・`)

2015年9月17日木曜日

岡崎図書館事件なるものを知る

マスコミ報道だけでは分からない岡崎図書館事件

スクレイピングで面白いことできないかなぁ~

と思って色々調べていたら、

逮捕された事例があると知りビックリです。


ツイッターをスクレイピングして、

不特定多数のユーザーのお気に入りツイートリストを取得したかったのですが、

素直にAPIを使おうかなと思いました。


なおリストはcsvにして recommendWithCosSimilar につっこむつもりでした。

面白いツイートを推薦する機構とかできたらいいな、と思います。

やりたかったです。

APIは制限があるし、不特定多数に対して実行できない模様。

夢で終わりそうだなぁ。

2015年9月16日水曜日

JSONファイルをCSVに変換するウェブサイト

見つけました!

https://json-csv.com/

容量1Mまでが無料で、課金すれば容量50Mまで、できるようです。


うーん(。-_-。)

いや、recommendWithCosSimilar がJSONファイルを出力する仕様なんですが、

csvファイルを出力したほうが需要あるかなぁと思いまして。

それで、JSONのCSV変換って簡単にできるものなのか?ツールがないか?

を調べた次第。



そもそも、なんで recommendWithCosSimilar が JSONファイルを出力するのかというと、

javascriptとの連携を考えてのことです。



というか冷静に考えたら、JSONとCSVの両方を出力すればいいじゃないかと!



私、すごくアホだなぁ

2015年9月15日火曜日

PerlスクリプトをPARでexe化するのがどうしてもできなかったので・・・

ActivePerlをアンインストールして、

Strawberry Perl(5.16.3001)をインストールして使ったら、

あっさりできました。


それまでは、どうも PAR::Packer のインストールが出来ていなかった模様。

PAR::Packer のインストールが上手くいっていないと、

みため exe 化ができていても、開いた瞬間閉じる、などの不審な挙動をみせるようです。



「PerlスクリプトをPARでexe化する」については、

「PerlスクリプトをPARでexe化する」で検索していただければ、

ザックザック記事がでてきます。

それらを試しても、私のリテラシーがないせいか、出来なかったので、

ふざけ半分で上記を試したらできちゃいましたwwwwww

2015年9月14日月曜日