[前途多難]テキスト抜き出し

WEBページからテキストを抽出して形態素解析にかけるには
テキスト抜き出しをしなければなりません。

タグを削除する

単純にタグを消すだけでも良いのですが、
↑に説明があるように、HTML::TokeParserを使ってみます。

モジュール HTML::TokeParser の get_text メソッド,または get_trimmed_text メソッドや, striphtml を使っても同じようなことができます

こんな簡単なperlスクリプトを試します。

#!/usr/bin/perl
use strict;
use HTML::TokeParser;
use LWP::Simple;

my $url = shift @ARGV or die "usage $0 url\n";
my $content = get $url;
my $parser = HTML::TokeParser->new( \$content );
die "Error constructor of HTML::TokeParser\n" unless defined $parser;
while ( my $text = $parser->get_text("") ) {
    print $text;
}

ところが以下のような簡単なhtmlであればうまくいきますが、

<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>テストページ</title>
</head>
<body>
これはテストコンテンツです。
<br>
テストとは、英語のtestのカタカナ表記です。<br>
試験、試す、という意味です。
<br>
<img src="002.png" alt="画像ファイルです">
<br>
画像を表示できます。
</body>
</html>

多くのWebサイトではjavascriptが本文として抽出されてしまいます。
Scriptタグを除去した後に、テキストを抽出する必要がありそうです。

さくらインターネットでTermExtractを使ってみる

さくらインターネットでTermExtractが使えるかどうか試してみました。

cpanmを使ってインストールしました。

cpanm

perlモジュールのinstallにcpanmを使う

さくらインターネットサーバでのCPAN導入を完全に手順化して見た

手前味噌ですが・・・
さくらインターネットにcpanmでNET::Twitterを導入(1)(CPANM導入編)

cpanmは既にインストール済みの方が多いかもしれませんね。

TermExtractをインストール

cpanmでインストールします。

wget http://gensen.dl.itc.u-tokyo.ac.jp/soft/TermExtract-4_11.tar.gz
cpanm TermExtract-4_11.tar.gz

これだけ。

試してみる

自分のブログから少し抜き出してきました。

形態素解析して共起語を抽出したいと思います。
Mecabだとキーワードが細切れになってしまいます。
名詞と名詞をつなげるというようなカスタマイズもありですが、
自動的につなげてくれるモジュールがあるようです。

これをtest.txtとして

mecab text.txt > mecab_out.txt

./ex_mecab.pl

補足
@INCにはいっていない場合は
use TermExtract::MeCab; の前にいかのように書いておくと動きます。
use lib ‘/home/ユーザー名/perl5/lib/perl5’;

結果はこんな感じ

名詞 2.00
共起語 1.41
モジュール 1.00
キーワード 1.00
細切れ 1.00
カスタマイズ 1.00
Mecab 1.00

なかなか良い感じです。

課題

今後の課題です。

  1. google検索
  2. 検索結果のリンク部分を取得
  3. リンクを開く
  4. テキスト部分を抜き出す

こうして得たテキストを解析すると共起語っぽい結果が得られるのではないでしょうか。

TermExtractインストールするも、まったく動作しなかった

Mecabだとキーワードが細切れになってしまいます。
名詞と名詞をつなげるというようなカスタマイズもありですが、
自動的につなげてくれるモジュールがあるようです。

専門用語(キーワード)自動抽出システム – TermExtract

インストールは以下を参考にRaspberryPiにインストールしました。

TermExtractとMecabとperl

> wget http://gensen.dl.itc.u-tokyo.ac.jp/soft/TermExtract-4_11.tar.gz
> tar xvzf TermExtract-4_11.tar.gz
> cd TermExtract-4_11
> perl Makefile.PL
> make
> sudo make install

対象テキストはmecabのwikiの文章としました。

まずmecabで解析したテキストをmecab_out.txtに出力して
ex_mecab.pl
を実行すればよいのだと思うが何も表示されない。

というわけでデバッグ実行してみました。

デバッグ

> perl -d ex_mecab.pl

main::(./ex_mecab.pl:15): my $data = new TermExtract::MeCab;
DB n
main::(./ex_mecab.pl:16): my $InputFile = “mecab_out.txt”; # 入力ファイル
DB n
main::(./ex_mecab.pl:20): $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = ‘sigexit’;
DB n
main::(./ex_mecab.pl:25): my $output_mode = 1;
DB n
main::(./ex_mecab.pl:100): my @noun_list = $data->get_imp_word($InputFile); # 入力がファイル
DB n
main::(./ex_mecab.pl:112): foreach (@noun_list) {
DB n
Debugged program terminated. Use q to quit or R to restart,
use o inhibit_exit to avoid stopping after program termination,
h q, h R or h o to get additional info.

という感じで終わってしまう。
get_imp_wordを実行しても
@noun_listに何も値が入らないみたい・・・。

eucにしたら動いた

ベースはUTF8で動いているのだけど、何故かEUCじゃないとダメな感じになってしまいました。

というわけで、なんかうまく動かないと思った方は
一旦変換対象をEUCにしてみると動くかもしれません。

結果は以下のような感じです。

ChaSen 4.00
. 3.00
MeCab 3.00
日本語入力 2.91
解析 2.83
[ 2.83
Google日本語入力開発者 2.35
開発者 2.21
開発開始 2.00
– 2.00
解析精度 2.00
]。 2.00
][ 2.00
解析速度 2.00
規模日本語n – gramデータ 1.95
iPhone OS 1.86
品詞情報 1.86
形態素解析エンジン 1.78
Mac OS X v 1.77
Google 1.73
IPA品詞体系 1.70
Googleソフトウェアエンジニア 1.70
工藤拓[ 1.59
奈良先端科学技術大学院大学出身 1.41
オープンソース 1.41
和布蕪 1.41
v 1.41
IPADIC 1.00
推定 1.00
程度 1.00
作成 1.00
Spotlight 1.00
ChaSenTNG 1.00
平均 1.00
好物 1.00
名前 1.00
名称 1.00
スクラッチ 1.00
基 1.00
辞書 1.00
] 1.00
独立 1.00

なかなかいい感じではないでしょうか?!
’[’ や ’]’ や ’.’ が邪魔なような感じがしますので、少しカスタムが必要そうですが。

共起語ツールの作成

関連後やサジェストを調べると記事作成がはかどります。
と言うか、SEO的にも良い記事が出来上がる・・・ような気がする。

そこで共起語

共起というのは、

共起(きょうき)は、ある単語がある文章(または文)中に出たとき、その文章(文)中に別の限られた単語が頻繁に出現すること。

ということですから、
Google検索やBing検索で
あるキーワードを検索したときに、同時に使っているキーワードを抽出すれば良い感じがします。
関連語やサジェストではサービスが停止したり不便なこともありましたが、
共起語は検索結果ですので、ずっと使えそうですね。

とりあえず形態素解析

共起の共起語を考えてみます。

自然言語処理の分野において、任意の文書や文において、ある文字列とある文字列が同時に出現することである。

これをmecabコマンドにかけてみます。

すると結果はこう出ました。

自然 名詞,形容動詞語幹,*,*,*,*,自然,シゼン,シゼン
言語 名詞,一般,*,*,*,*,言語,ゲンゴ,ゲンゴ
処理 名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
分野 名詞,一般,*,*,*,*,分野,ブンヤ,ブンヤ
において 助詞,格助詞,連語,*,*,*,において,ニオイテ,ニオイテ
、 記号,読点,*,*,*,*,、,、,、
任意 名詞,一般,*,*,*,*,任意,ニンイ,ニンイ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
文書 名詞,一般,*,*,*,*,文書,ブンショ,ブンショ
や 助詞,並立助詞,*,*,*,*,や,ヤ,ヤ
文 名詞,一般,*,*,*,*,文,ブン,ブン
において 助詞,格助詞,連語,*,*,*,において,ニオイテ,ニオイテ
、 記号,読点,*,*,*,*,、,、,、
ある 連体詞,*,*,*,*,*,ある,アル,アル
文字 名詞,一般,*,*,*,*,文字,モジ,モジ
列 名詞,一般,*,*,*,*,列,レツ,レツ
と 助詞,格助詞,一般,*,*,*,と,ト,ト
ある 動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル
文字 名詞,一般,*,*,*,*,文字,モジ,モジ
列 名詞,一般,*,*,*,*,列,レツ,レツ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
同時に 副詞,一般,*,*,*,*,同時に,ドウジニ,ドージニ
出現 名詞,サ変接続,*,*,*,*,出現,シュツゲン,シュツゲン
する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
こと 名詞,非自立,一般,*,*,*,こと,コト,コト
で 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある 助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
。 記号,句点,*,*,*,*,。,。,。

名詞だけに絞るとこんな感じに。

自然 言語 処理 分野 任意 文書 文 文字 列 文字 列 出現 こと

一部ダブっていますが。

これは悩ましいかも

冒頭の
 ”自然 言語 処理”
は1語ずつとするのか
 ”自然言語処理”
と一つの単語として扱うのが正解なのか判断がわかれるところで悩ましいですね。

もう少しいろいろ試していこうと思います。

自動更新ブログの実験

自動更新でブログを作ると、高い確率でスパム認定されてしまうみたい。
でも、有用なコンテンツでもダメなのか?って言う疑問はありますね。
でも、なかなか日々一刻と変わる情報を自動投稿って簡単じゃありません。

検索結果

キーワードでの検索結果を自動で投稿する、と言うのはどうでしょう。
共起語を抜き出して、適当に接続詞をつけて文章にしたらどうでしょう。
うーん。
書いてて、スパム認定まっしぐらな気がしてきました 笑
何しろ、意味が通る文章にするのが難しいです。

天気予報

天気予報サイトから天気予報を読み取って
予測をして、当たった外れた、というのを自動投稿してみたら面白いかもしれません。
ちゃんとプログラムすれば、ランダムではないちゃんとした情報になるような気もします。

宝くじ情報

普通の宝くじの情報を投稿しても面白くありませんので、
・ロト6
・ミニロト
・ナンバーズ4
・ナンバーズ3
の当選結果を取得して、予測を自動投稿していったらどうでしょう。

所詮予測なんてあたりませんから、
あたったーはずれたー、というシンプルな記事が投稿できそうです。

実はナンバーズ3には下2桁だけをあてるナンバーズミニもあります。
下2桁だから1/100の確率ですね。

最近何がよく出てるとか、
最近何が出てないかとか、
当たった、外れた、
そういうデータの自動投稿はできそうじゃないです?
とくに当たった報告は面白いですね。
1/100なら時々当たりそうですね 笑
そして、もしかしたら本当に必勝法が見つかるかも・・・
そんなに甘くないでしょうが。

自動投稿ってどうやるの

APIを使って投稿する方法もありますが、
いろいろブログ個別のやり方を模索せねばなりません。
なので、一番簡単なのは「メール投稿」です。
メール本文を使ってブログ投稿するのです。
カテゴリの設定ができなかったりしますが、たくさんのブログサービスで対応が可能なため
汎用性が大きいです。

自動投稿ブログの検証結果を記録してみようかな

どのくらいでスパムになるのかとか・・・?
なかなか面白そうなので、やってみます。