{ "cells": [ { "cell_type": "markdown", "metadata": { "nbpresent": { "id": "1cf04953-2e3a-469a-bfac-e9f0ef6d2654" } }, "source": [ "# Python による「スクレイピング & 自然言語処理」入門" ] }, { "cell_type": "markdown", "metadata": { "nbpresent": { "id": "8bf08c21-ee84-4d70-bd11-5121df226180" } }, "source": [ "## 1. はじめに\n", " クローラーとはWeb上のデータを自動的に収集するための道具です。クローラーを活用することで、担当者が手動で行っていたWeb情報収集の効率化、また自社だけでは入手できないさまざまなデータを取得し自社データと結合することで新たな示唆を得ることが可能になります。\n", " \n", " 今回のセミナーでは初心者を対象にクローラーを作成し対象サイトのデータを収集、テキスト解析を行い、分析結果を得るまでの一連の流れについて、Python で使用するライブラリ、解析手法を交えて解説いたします。\n", " \n", " ※本発表は所属する組織とは一切関係がありません\n", "\n", " 今回は対象ページとして、[日本酒物語 日本酒ランキング(人数)](http://www.sakeno.com/followrank/) とそれに紐づく各銘柄の詳細を収集し、各種分析を行います。本解析の内容として次の項目を含みます。\n", "\n", " * 解析のための下準備\n", " * 使用するライブラリのインストール\n", " * 使用するライブラリの読み込み\n", " * 定数の設定\n", " * クローラーによるデータの収集\n", " * ランキング一覧の生の HTML 確認\n", " * ランキング一覧のテーブル要素の取得\n", " * 詳細ページのデータ取得\n", " * テキスト解析\n", " * TFIDF によるレビュー中の特徴的な形容詞の抽出\n", " * 単語ベースのクラスタリング" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. クローラーとは?\n", "\n", "(スライド参照)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. 自然言語処理とは?\n", "\n", "(スライド参照)" ] }, { "cell_type": "markdown", "metadata": { "nbpresent": { "id": "59d5cb39-c80e-48c4-9f89-1d267945f8b3" } }, "source": [ "## 4. 解析のための下準備\n", "### 4. 1 使用するライブラリのインストール" ] }, { "cell_type": "markdown", "metadata": { "nbpresent": { "id": "b77d35ce-4bcf-4f8b-a636-173e83d1f3bc" } }, "source": [ " まずは形態素解析ツール MeCab のインストールを行います。ここでは Mac (OSX Sierra) を仮定して進めています。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "nbpresent": { "id": "d46d2ea9-f98d-465f-a93a-8f01b96047c0" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[33mWarning:\u001b[0m mecab-0.996 already installed\n", "\u001b[33mWarning:\u001b[0m mecab-ipadic-2.7.0-20070801 already installed\n", "Requirement already satisfied: mecab-python3 in /Users/tojima/anaconda3/lib/python3.5/site-packages\n" ] } ], "source": [ "!brew install mecab mecab-ipadic\n", "!pip install mecab-python3" ] }, { "cell_type": "markdown", "metadata": { "nbpresent": { "id": "8fc7fa85-df27-4b49-afb9-ce0f58e33fa5" } }, "source": [ " 次にクローラー関係のライブラリもインストールします。ここでは以下の3つのライブラリを導入しています。\n", "\n", "* html5lib\n", "* requests\n", "* BeautifulSoup" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "nbpresent": { "id": "72d4cb84-4bda-40a6-ac1c-0c4e92fe7d34" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fetching package metadata .........\n", "Solving package specifications: .\n", "\n", "# All requested packages already installed.\n", "# packages in environment at /Users/tojima/anaconda3:\n", "#\n", "html5lib 0.999 py35_0 \n", "Fetching package metadata .........\n", "Solving package specifications: .\n", "\n", "# All requested packages already installed.\n", "# packages in environment at /Users/tojima/anaconda3:\n", "#\n", "requests 2.13.0 py35_0 \n", "Fetching package metadata .........\n", "Solving package specifications: .\n", "\n", "# All requested packages already installed.\n", "# packages in environment at /Users/tojima/anaconda3:\n", "#\n", "beautifulsoup4 4.5.3 py35_0 \n" ] } ], "source": [ "!conda install -y html5lib \n", "!conda install -y requests\n", "!conda install -y BeautifulSoup4" ] }, { "cell_type": "markdown", "metadata": { "nbpresent": { "id": "4fc0feb3-1780-4762-b6b4-dc93644026f8" } }, "source": [ "### 4.2. 使用するライブラリの読み込み\n", "\n", " ここではこの解析に使用する各種ライブラリを読み込んでいます。" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true, "nbpresent": { "id": "d284731e-a29b-43e6-a9a8-0a3bf834e900" } }, "outputs": [], "source": [ "# ファイル操作\n", "import glob\n", "import csv\n", "\n", "# データ処理・視覚化\n", "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# クローラー\n", "import time\n", "from datetime import datetime\n", "from bs4 import BeautifulSoup\n", "import requests\n", "\n", "# テキスト解析\n", "import MeCab\n", "from sklearn.feature_extraction.text import TfidfVectorizer\n", "from sklearn.feature_extraction.text import CountVectorizer\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.decomposition import PCA\n", "from sklearn.cluster import AgglomerativeClustering" ] }, { "cell_type": "markdown", "metadata": { "nbpresent": { "id": "81db66b5-ff05-4bf3-b44f-ec3fc68d804b" } }, "source": [ "### 4.3. 定数の設定\n", "\n", " ここでは取得対象となっているページのURLやクローラーの待ち時間、各種データの出力先を定義しています。" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "nbpresent": { "id": "d0450c37-ab4b-41b8-8170-7297d639fb1d" } }, "outputs": [], "source": [ "# 日本酒物語 日本酒ランキング(人数)の URL\n", "FOLLOWRANK_URL = \"http://www.sakeno.com/followrank/\"\n", "\n", "# クロール時の待ち時間\n", "WAIT_TIME = 5\n", "\n", "# 銘柄マスタの出力先\n", "MEIGARA_MASTER_PATH = \"../data/meigara_maseter.csv\"\n", "# 銘柄評価スコアの出力先ディレクトリ\n", "MEIGARA_SCORES_DIR = \"../data/meigara_scores/\"\n", "# 銘柄コメントの出力先ディレクトリ\n", "MEIGARA_COMMENTS_DIR = \"../data/meigara_comments/\"\n", "\n", "# TFIDF スコア算出後の結果出力先\n", "TFIDF_PATH = \"../data/tfidf.csv\"\n", "# クラスタリング結果の結果出力先\n", "CLUSTER_PATH = \"../data/cluster.csv\"" ] }, { "cell_type": "markdown", "metadata": { "nbpresent": { "id": "70fa09d6-b4a9-4ab9-9a72-ba9a20355e94" } }, "source": [ "## 5. クローラーによるデータの取得\n", "\n", " では、ここからクローラーでデータを取得するための流れを見ていきます。基本的な流れは次のようになります。\n", " \n", "1. 対象ページのHTMLの取得。\n", "2. 取得対象情報が含まれている部分のタグの特定。\n", "3. 取得対象情報のパース。\n", "4. 結果の保存。\n", "\n", "では実際にクローラーのコードを見ていきましょう。\n", "\n", "### 5.1 ランキング一覧の生の HTML 確認\n", "\n", " まずはランキングの一覧ページの HTML を取得します。ここでは `response` ライブラリを利用し取得します。" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "nbpresent": { "id": "d4c2aa96-d669-4781-8bfd-a1afd5786e56" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "OK.\n" ] } ], "source": [ "# ページの HTML を取得\n", "response = requests.get(FOLLOWRANK_URL)\n", "\n", "# 正しく取得できたかどうか HTTP ステータスコードで確認\n", "if not response.status_code == 200:\n", " raise ValueError(\"Invalid response\")\n", "else:\n", " print(\"OK.\")" ] }, { "cell_type": "markdown", "metadata": { "nbpresent": { "id": "63a25210-2464-4b81-9ce7-bf6a33800136" } }, "source": [ "正しくランキングページが取得されていれば `OK.` と出力されます。\n", "\n", "次は取得してきた HTML の先頭 1000 件を見てみると…" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "nbpresent": { "id": "1cee42a0-9cc7-429b-8618-9116a1e11184" }, "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "'\\r\\n\\r\\n
\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n