英単語の英字遷移率をChord Diagramで可視化してみた

Pythonでクロール・スクレイピングをする練習がしたかっただけなんですが、ただスクレイピングするだけじゃ面白くないので、付け足しで遊んでみました。

本当はこれでコーパスを作って、自然言語系でディープラーニングをやりたいという目的はあるのですが…。

英語単語集めるだけであれば、すでに下記のようなコーパスもありますし。

http://www.anc.org/

ということで遠回りにはなりますが、今回は英語文献をスクレピングする練習をしてみて、それぞれの英単語の文字の遷移を調べて、可視化してみます。

可視化グラフに関しては、Chord Diagramを利用します。

Chord Diagramの特徴

綺麗です←

特徴としては、あるシステムを構成する要素同士の関係を全体的に可視化することができます。

下記がD3.jsでの実装例のページになります。

https://bl.ocks.org/mbostock/1046712

ビジュアルが糸玉みたいな見た目からか、書籍の『データビジュアライゼーションのデザインパターン20』では、「毛糸玉ダイアグラム」という名前で紹介されています。

名前の「Chord」も「楽器などの弦」という意味があるそうです。

今回は遷移データですが、上記のように複数の要素同士の関係を表す数値データを可視化しますので、例えば、クロス表になるデータなどでもChord Diagramに可視化することが可能です。

Pythonのクロール・スクレピングライブラリ「Scrapy」

今回はPythonのクロール・スクレイピングのライブラリ、Scrapyを使ってみます。

Scrapy : https://scrapy.org/

かなりがっちりとフレームワーク化されているライブラリで、クロール・スクレイピングを1プロジェクトとして構成するようなイメージになります。

そのためか、プロジェクトファイルの中に、コントローラーみたいな感じでクロール担当のスクリプトを書いて、クラスでデータを保持するといった書き方をしますので、個人的には、初学者には少し取っ付きづらい印象があるのかなと思います。

以前、当サイトでRubyのクロール・スクレイピングのライブラリ「Anemone」を利用したことがありましたが、こちらの方が直感的に書きやすいと思います。

Anemone : http://anemone.rubyforge.org/

青空文庫のデータを形態素解析・感情分析してみた
青空文庫の文書データを形態素解析し、分割された単語ごとにネガティブかポジティブかの判定を行なって、スコアを計算させてみました。形態素解析にはMecabを、ネガポジの判定には下記の単語感情極性対応表を使わせていただきました。青空文庫 : http://www.aozor...

また、PHPのクロール・スクレイピングのライブラリ「Goutte」も利用したことがありますが、こちらはもっと機能をパーツとして提供する感じで、どちらかといえば、Pythonの別のスクレイピングライブラリである「Beautiful Soup」とかと使い勝手は似ている印象です。

Goutte : https://github.com/FriendsOfPHP/Goutte

Beautiful Soup : https://www.crummy.com/software/BeautifulSoup/bs4/doc/

色々と規模の異なるライブラリが揃っていますので、使う場面に応じて、ライブラリを選べると良いと思います。

今回は、Scrapyをまだ使ったことがありませんでしたので、試しに使ってみることにしました。

可視化するデータの説明

大したことはしませんが、英語の文献から単語を収集してきて、アルファベットに分解した時に、どの文字からどの文字に遷移されているかを集計したものを可視化してみます。

例えば「data」という文字であれば

  1. d -> a
  2. a -> t
  3. t -> a
  4. a -> eos

といった感じです。

eosは単語の末尾を表します。

これを、ある程度の単語量を取得して、集計します。

下記のような集計テーブルがあって、各セルに、列の文字から各行の文字に遷移している数が入るイメージですね。

a b c x y z
a
b
c
x
y
z
eos

クロール・スクレピング実装

それでは、Scrapyでクロール・スクレイピングをして英語文章データを収集するプログラムを作成してみます。

今回はニュースサイトの「The Japan Times」から適当に記事をクロールすることにします。

The Japan Times : http://www.japantimes.co.jp/

下記コマンドで、Scrapyをインストールして、プロジェクトを作成します。

プロジェクト名は「the_japan_times」としました。

最後のコマンドは生成ファイルやディレクトリの確認をしています。

以下のファイルを次のように編集します。

このファイルで、スクレイピングをしてどのような情報を取ってくるのかを設定します。

今回は英文ニュース記事の内容を取得する想定で、「title(記事のタイトル)」と「contents(記事の文章)」を設定しました。

次にクローラーを作成します。

これで、ドメイン「www.japantimes.co.jp」をクロールするクローラー「thejapantimes」を作成するという意味になります。

生成されたクローラーのファイルを編集します。

next_pageにトップページの左側に並んでいるニュース記事のTOP NEWSのリンクを取得して格納しています。

リンクが存在すれば、リクエストし、コールバック関数としてarticle_parseを呼び出します。

その中でTheJapanTimesItemクラスを作成して、先ほど設定した変数に、それぞれ記事タイトルと本文を格納して保存するといった実装になります。

これでクロール・スクレイピングが可能になりましたが、実行をする前に設定ファイルを開いて、少し編集しておきます。

上記の変数で、クローラーが各ページをダウンロードする間隔を秒単位で指定できます。

デフォルトではコメントアウトされていますが、クロール先のページにも迷惑をかけないように、コメントアウトを外しておきます。

これで準備が完了しました。

下記コマンドで実行します。

-oオプションにファイル名を指定してスクレイピングしたデータをファイルに保存できます。

オプション無しで実行すれば標準出力で結果を確認できます。

ファイル名には、拡張子まで指定をすることで、その形式でスクレイピングしてきたデータを保存してくれます。

csv、json、jl、xmlに対応しています。

おお、長い長い。

記事のタイトルと本文を取得できました。

Scrapyは他にも色々と運用の仕方を考慮して設計することができますが、今回はデータだけ取れれば良いので、Scrapyの出番はここまでで十分です。

後はこれを適当に単語に切り分けて、カウントしてあげて、入れ子の配列の形式で保存してあげます。

適当に何日かに分けてニュース記事の文字を取得したところ、単語数8,000語程度、文字数にすると約40,000文字集まりました。

これらの遷移の様子をD3.jsで可視化します。

可視化の実装

ファイルはJSONで出力しましたので、同じくd3.jsonメソッドで読み込みます。(eosの分の行を入れるのを忘れていたので、こちらで無理矢理入れ込みました)

実は今までずっとバージョン3でのコーディングでしたので、バージョン4で作ることに。

微妙によく使うメソッドの名前が変更されていて少々面倒臭かったですが、そこまで大きな変更ではないみたいで良かったです。

※画像をクリックするとページを移動します。


綺麗ですけど、ちょっと見づらくなってしまいました。

結構思った通りといいますか、「z」とか全く出てきませんね。

よく末尾となる文字は、「d」「e」「s」「t」「y」といった感じみたいです。

一応、弧にマウスオーバーすることで、どの文字から遷移してきているかを透過で分かるようにしましたが、eosから始まるものは当然ないから、eosの弧にマウスを乗せるのが非常に難しくなっております笑

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です