アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うことを書いてます。

自然言語の学習にはまとまったテキストデータ(コーパス)が必要!集める方法あれこれ。

自然言語の学習・推論などを処理しようとすると、どうしても、まとまった量のテキストデータ(コーパスと言った方がよいのかな)が必要になります。 

これを集めるのは・・意外・・でもないか・・、割合苦労します。 

今回は、ちょっとそのへんの話題を書いてみようと思います。 

インターネットには様々なデータがあります。 

が、著作権の問題もありますし、なんでもかんでも使って良いわけではありません。 

自然言語の学習用・推論のテストデータとして、個人的に使うだけなら問題だとされる可能性は非常に低いとは思ってます。 

実質的に、WEBブラウザで見ているのと変わらないはずですから。 

でも、その成果を公開する時に、つい、不用意に引用やコピーをしてしまうというリスクは常にありますし、慎重に扱う必要はあります。 

WEBからデータを取得する方法として、WEBスクレイピングの方法を紹介する本や記事がたくさんあります。 

とても便利なのですが、プログラムでガリガリデータを取りに行くのは、やりすぎるとそのサイトに負荷がかかって迷惑がかかったりします。 

Wikipediaなんかは、WEBスクレイピングを禁止にする代わりに、テキストデータでダウンロードできるものを提供してくれたりしてるくらいですから・・。 

なので、必要最低限にするように気をつけないといけませんし。 

だから、安心して使えて、手軽に大量のテキストデータを得られるのは、フリーのライセンスで公開いただいているものがあるのは、とてもありがたいです。 

自分が知っている有名所は、この3つです。

 これらには、それぞれに特徴があります。

 

青空文庫は素晴らしい。古典が多いのは当然だけど。

 

青空文庫著作権切れの小説とかが中心です。 

テキストを分類するとかの用途には、作家別に取得できるのですごく使いやすいです。 

例えば、芥川龍之介太宰治を学習させて、新たに入力した文章がどちら風かを判定させるとか(思いつきで書いてますけど・・)やってみるとかですね。 

でも、どうしても古典的な作品が多くなります。 

だから、今回みたいにネガ・ポジ判定の辞書の元ネタにしようというように、現代文よりの文章を期待すると、ちょっと厳しいです。

 

Wikipediaのテキストはとにかくサイズがでかい

 

wikipediaは、意味のある文章の宝庫です。 

だから、日本語の自然言語処理の対象データとしては、素晴らしいな・・と常々思います。 

でも、当たり前ですが・・サイズがでかいです。 

ここにアクセスすると、インデックスが表示されます。

f:id:arakan_no_boku:20180211214332j:plain

 

ここで、latest以外の最新の日付を選択します。 

latestを選んでも良いですが・・生のダンプデータなので、どれを使って良いかわからないと思います。 

日付のリンクを選ぶと、こんな感じのページが表示されます。

f:id:arakan_no_boku:20180211215511j:plain

 

このページから、「pages-meta-current.xml.bz2 : 全ページの最新版のダンプ」をダウンロードすれば良いです。 

ですが、1ファイルが数百MB~1GB近くあり、それが数ファイルにわかれてます。 

ダウンロードサイズ(圧縮ファイル)で400MB未満だったファイルを解凍すると、約1.5GBのサイズのテキストデータになりました。 

正直、内容を確認するにしても、データとして使うとしても、ここまで巨大だとなかなか大変です。 

十分テストできた後の本ちゃんの処理でしか、なかなか使いづらいです。

 

 

livedoor ニュースコーパスは手軽で使いやすい

 

使いやすいのは、これです。 

HTMLタグとかを取り去ったテキストデータですし。 

1ファイルが数KB程度と非常にコンパクトです。 

内容はスポーツやトピックなど様々なジャンルのニュースです。 

例えば、こんな感じの。

http://news.livedoor.com/article/detail/5907376/
2011-10-03T11:59:00+0900
紳助とたけしの明暗を分けたものとは
今年で20回目を迎えたTBSのオールスター感謝祭に、1回目から総合司会を務めていた島田紳助さんの姿は無かった。

司会者不在という異例の事態に、その場にいたタレントの持ち回りで司会が進められる中、思わぬ芸能人の登場に会場が盛り上がる。自身も暴力団との関わりを指摘されていたビートたけしだ。

たけしらしいユーモアがあり、かつ無理難題な出題に会場が沸いた。ひな壇の芸能人たちは紳助不在でのびのびとしているようにも見える。

 

テストとかには、とても使いやすいので重宝してます。 

ほんと、ありがたいですねえ。 

 

自分のブログとかから取ってくる手もあります 

 

最後に、自分が、WEBページからのテキスト取得に利用しているpythonプログラムを紹介します。 

なぜ必要かというと、ニュースコーパスを含め、上記のデータはとても使いでもあって、素晴らしいのですが、それで学習させてテストする時に、ちょっと違うソースからとったテキストデータを使いたくなるときがあるからです。 

まあ、ほとんど、自分のブログの昔の文章とかを取ってきて使ってるだけなんですが。 

そのとき使っている簡単なコードです。

# -*- coding: utf-8 -*-
import requests as web
import bs4
import re
import codecs

spaces = r'[\s\t ]'
output_file = "output.txt"
resp = web.get('http://arakan-pgm-ai.hatenablog.com/entry/2017/02/03/190828')
resp.raise_for_status()

# 取得したHTMLをパースする
soup = bs4.BeautifulSoup(resp.text, "html.parser")
# 検索結果のタイトルとリンクを取得
link_elem = soup.select('p')
fout = codecs.open(output_file, 'w', 'utf8') 
for i in range(len(link_elem)):
    s = re.sub(spaces,"",link_elem[i].get_text())
    if(re.sub(r'[\r\n]',"",s)): #改行のみ以外
        fout.write(s + "\r\n")
fout.close()

 

やってることは単純です。 

指定したURLいアクセスして、<p></p>に囲まれている部分のテキストだけ抜き出して、余分な空白や改行だけの空行とか以外をファイルに書き出しているだけです。 

はてなブログとかは、本文を1行ずつ<p></p>でくくってますので、意外にこれできれいに本文を取得できます。 

なので、ちょっとしたテストとかするときには、これを動かして数ファイルくらいのデータを作ってやってます。 

ファイルとかでURLを与えて、自動処理でガリガリやると楽ですけど、あえてそこはアナログでやってます。 

以上ですかね・・。 

他にもあるらしい(例えば ツィッターとか)ですけど、自分は使ったことがありません。 

また、新しいデータソースを使うことがあれば書くかもしれませんが、今回はこんなところです。