Re:ゼロから始めるML生活

どちらかといえばエミリア派です

自然言語処理で遊んでみる(その1:テキストデータの準備)

この前までは、ディープラーニングという切り口で自然言語処理を勉強していました。

tsunotsuno.hatenablog.com

しかし、自然言語処理はもっと多くのタスクをカバーする学問分野で、必ずしもディープラーニングが出てくるとは限りません。 そんなわけで、今回はピュアな自然言語処理の初心者として勉強していきます。

参考にさせていただいたのはこちら。

Pythonで動かして学ぶ 自然言語処理入門

Pythonで動かして学ぶ 自然言語処理入門

基本的にはこの本の内容に沿ってやっていきますが、ツールとかを切り替えて自分専用のツールとして遊んでいきたいと思います。

やりたいこと

今回の目標は"自然言語処理で遊ぶ前の準備をすること"です。

そのために、

  1. 環境構築
  2. テキストデータの取得
  3. DBへの格納

をやっていきます。

環境構築

今回やろうとしている概要はこんな感じです。

f:id:nogawanogawa:20190213191448j:plain:w500

SQLiteを使う理由があまり良くわからなかったのと、単純にElasticSearchを使ってみたかったという不順な理由で変更しました。

ということで、ElasticSearchの準備だけすれば事足りそうです。

ElasticSearchの導入についてはこの辺りをご参照ください。

www.elastic.co

tech.innovation.co.jp

一応Dockerを使った環境構築の手順だけ残しておきます。

ディレクトリ構成

こんな感じにしていただければと思います。

.
├── Elasticsearch
│   ├── Dockerfile
├── Kibana
│   └── Dockerfile
└── docker-compose.yml

※ElasticSearchのバージョンとsudachiのバージョンを必ず合わせてください。

docker-compose.yml

version: '2'
services:
  elasticsearch:
    build: elasticsearch
    volumes:
        - <host dir>:/usr/share/elasticsearch/data
    ports:
        - 9200:9200
    expose:
        - 9300
  kibana:
    build: kibana
    ports:
        - 5601:5601

volumes:
    elasticsearch-data:
        driver: localElasticSearch

Dockerfile(ElasticSearch)

FROM docker.elastic.co/elasticsearch/elasticsearch:6.6.0

RUN elasticsearch-plugin install analysis-kuromoji

Dockerfile(Kibana)

FROM docker.elastic.co/kibana/kibana:6.6.0ElasticSearch

ビルド

docker-compose up

その他

java環境が必要になるので、必要に応じてjava環境をインストールしてください。

テキストデータの収集

使用するデータの選定と、スクレイピングについて見ていきます。

機械学習関係データセット一覧

参考までに、機械学習関係(自然言語に限らず)のデータセットをまとめてくださっている方がいました。

github.com

非常に参考になります。ありがとうございます。

スクレイピング

Webページなどから特定の必要な部分だけを抜き取る行為をスクレイピングといいます。 ネット上のデータを機械学習等に使用するために取得したりしますが、マナーとかお作法があるので注意が必要です。

robots.txt

スクレイピングによって大量データをダウンロードする行為は、ウェブサービス運営側からするとサーバーに対する攻撃に見えたりします。 そのため、サービス提供者側からコンテンツに対するルールを書いたrobots.txtを公開していることがあります。
SEO対策なんかでもこれが効いてくるらしいです)

(wikipedia)

https://ja.wikipedia.org/robots.txt

(はてなブログ)

https://hatenablog.com/robots.txt

そんなわけで、まずこの辺を確認して、禁止事項を確認しましょう。 この辺はマナーとかモラルの問題ですね。

後は、基本的なpythonスクリプトを組めば済むので割愛します。 詳しくは本買って読んでください。

DBへの格納

データの下準備

今回は手作業でダウンロードしちゃいました。 こちらの手順どおりにやれば、記事をダウンロードできます。

staff.hatenablog.com

mapping template

こんな感じにDevToolsから投入しました。

{
  "settings": {
    "analysis": {
      "analyzer": {
        "kuromoji_analyzer": {
          "type": "custom",
          "tokenizer": "kuromoji_tokenizer"
        }
      }
    }
  }
}

格納スクリプト(Python)

あんまりたくさんデータを扱うとMacbookでは厳しいので、縮小スケールでやっていきます。 データは適当に自分のブログ突っ込んでみます。これなら著作権もクソもないでしょう。

この記事がちょうど同じことをやっていたので、参考にやってみました。

acro-engineer.hatenablog.com

ElasticSearchを使っているので、格納はこんな感じになります。そのまま拝借しました。

kibanaで確認する

参考までに、kibanaで見るとこんな感じ。

(アクセス)

https://0.0.0.0:5601

f:id:nogawanogawa:20190214082840p:plain

突っ込めてますね。

何はともあれ、めでたしめでたし。

おまけ

適当にkibanaでvisualizeいじったらできました。

f:id:nogawanogawa:20190216172402p:plain:w500

まあまあ想定通りのワードクラウドですね。

感想

今回は準備段階なので、NLPはあんまり関係無かったですね。 でも、NLPをやるには必要な工程なので、そういう意味ではNLPの一部ではあるかと思います。

それにしても、ちょっと本の内容から応用しようと思うだけでも大変ですね。 結構時間かかりました。 遊び半分でやるもんじゃないですね。反省。