Created
March 23, 2018 14:55
-
-
Save ds-hitori/1f03c4f7df8ec297a2816fe013e6de4f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# 機械学習でツイート主を推測する\n", | |
| "\n", | |
| "こんにちは。ライブラリのAPI叩くマンの DSひとり[@factorydatamng](https://twitter.com/factorydatamng)です。 \n", | |
| "\n", | |
| "ところで、私はツイッターで[@nardtree](https://twitter.com/nardtree)さんと南極にゃんこ[@NekoAntarctica](https://twitter.com/NekoAntarctica)さんをフォローしているのですが、このお二人はキャラがやや被っているうえ、どちらもアニメアイコンで、しかもアイコン変更の頻度が多いという共通点があります。 \n", | |
| "\n", | |
| "フォローして間もない頃は**これはどっちのツイートだ?**と迷う事がよくありました。 \n", | |
| "\n", | |
| "今ではキャラの違いも分かってきて混同する事も無くなったのですが、ふと、**これ機械学習で分類できるんじゃね?** と思いたちました。\n", | |
| "\n", | |
| "以下、勢いでやってみましたが、自然言語処理は素人なのでおかしな点があればコメント頂けるとありがたいです。(あと、お二方ネタにしてすみません😅) \n", | |
| "\n", | |
| "\n", | |
| "## おおまかな方針\n", | |
| "\n", | |
| " - ツイートを取得\n", | |
| " - ツイートを形態素解析して分割\n", | |
| " - ツイート毎のベクトル特徴量を作成\n", | |
| " - 分類器で学習\n", | |
| " \n", | |
| " この流れでやっていきます。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# 各種ライブラリのインポートなど\n", | |
| "import pandas as pd\n", | |
| "import numpy as np\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "import seaborn as sns\n", | |
| "import sys\n", | |
| "import MeCab\n", | |
| "from gensim import corpora, matutils\n", | |
| "\n", | |
| "\n", | |
| "%matplotlib inline\n", | |
| "plt.style.use('ggplot')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## ツイートの取得と分割\n", | |
| "\n", | |
| "ツイッターのAPIキーを取得して…というのが正攻法でしょうが、ネタ企画なので今回は手抜き。 \n", | |
| "[TwimeMachine](http://www.twimemachine.com) でツイートを取得し、テキストファイルに保存します。\n", | |
| "\n", | |
| "- nardtree.txt\n", | |
| "- NekoAntarctica.txt\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "nardtree: 3189 tweets, last: カフェアサンの近くのガスストーブ https://t.co/7PpECLl1LR Fri Mar 23 08:52:19 +0000 2018\n", | |
| "南極にゃんこ: 3198 tweets, last: 病んでいたときの記憶を封印したので当時の細かい事実関係を正確に思い出せないから、雰囲気でいい加減なことを言っているアカウントですが、ただ、20代のときに年収が250万円を越えたことはない、これは記録に残っている紛れもない事実であります。 Fri Mar 23 13:28:53 +0000 2018\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# テキストを行毎に分割\n", | |
| "def tw_list_from_text(filepath):\n", | |
| " f = open(filepath)\n", | |
| " text = f.read()\n", | |
| " f.close()\n", | |
| " return text.split('\\n')\n", | |
| "\n", | |
| "nardtree_list = tw_list_from_text('nardtree.txt')\n", | |
| "NekoAntarctica_list = tw_list_from_text('NekoAntarctica.txt')\n", | |
| "\n", | |
| "print(\"nardtree: {0} tweets, last: {1}\".format(len(nardtree_list), nardtree_list[0]))\n", | |
| "print(\"南極にゃんこ: {0} tweets, last: {1}\".format(len(NekoAntarctica_list), NekoAntarctica_list[0]))\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "ツイート毎のリストが出来ました。 \n", | |
| "ただ、最後に投稿時間の情報がくっついているので、ツイート本文と分けておく必要があります。\n", | |
| "\n", | |
| "## データフレームの作成" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "(6387, 2)" | |
| ] | |
| }, | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# 2人のツイートを連結\n", | |
| "df = pd.DataFrame({'uid': 'NekoAntarctica' , 'line' : NekoAntarctica_list})\n", | |
| "df = df.append(pd.DataFrame({'uid': 'nardtree', 'line': nardtree_list}), ignore_index=True)\n", | |
| "\n", | |
| "df.shape" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "分析用にいくつかの列を追加しておきます。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": { | |
| "scrolled": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style>\n", | |
| " .dataframe thead tr:only-child th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: left;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>uid</th>\n", | |
| " <th>dt</th>\n", | |
| " <th>tweet</th>\n", | |
| " <th>tw_len</th>\n", | |
| " <th>RT</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>NekoAntarctica</td>\n", | |
| " <td>Fri Mar 23 13:28:53 +0000 2018</td>\n", | |
| " <td>病んでいたときの記憶を封印したので当時の細かい事実関係を正確に思い出せないから、雰囲気でいい...</td>\n", | |
| " <td>118</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>NekoAntarctica</td>\n", | |
| " <td>Fri Mar 23 13:25:36 +0000 2018</td>\n", | |
| " <td>スクフェスする時間がない</td>\n", | |
| " <td>12</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>NekoAntarctica</td>\n", | |
| " <td>Fri Mar 23 13:21:31 +0000 2018</td>\n", | |
| " <td>※当時は本当に人生修羅場過ぎて、記憶の詳細が曖昧なので、細かい事実関係が雑なのは許してほしい...</td>\n", | |
| " <td>103</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>NekoAntarctica</td>\n", | |
| " <td>Fri Mar 23 12:31:21 +0000 2018</td>\n", | |
| " <td>ふたりせぞん~ふたりせぞん~</td>\n", | |
| " <td>14</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>NekoAntarctica</td>\n", | |
| " <td>Fri Mar 23 12:06:15 +0000 2018</td>\n", | |
| " <td>南極や ああ南極や 難局や</td>\n", | |
| " <td>13</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " uid dt \\\n", | |
| "0 NekoAntarctica Fri Mar 23 13:28:53 +0000 2018 \n", | |
| "1 NekoAntarctica Fri Mar 23 13:25:36 +0000 2018 \n", | |
| "2 NekoAntarctica Fri Mar 23 13:21:31 +0000 2018 \n", | |
| "3 NekoAntarctica Fri Mar 23 12:31:21 +0000 2018 \n", | |
| "4 NekoAntarctica Fri Mar 23 12:06:15 +0000 2018 \n", | |
| "\n", | |
| " tweet tw_len RT \n", | |
| "0 病んでいたときの記憶を封印したので当時の細かい事実関係を正確に思い出せないから、雰囲気でいい... 118 False \n", | |
| "1 スクフェスする時間がない 12 False \n", | |
| "2 ※当時は本当に人生修羅場過ぎて、記憶の詳細が曖昧なので、細かい事実関係が雑なのは許してほしい... 103 False \n", | |
| "3 ふたりせぞん~ふたりせぞん~ 14 False \n", | |
| "4 南極や ああ南極や 難局や 13 False " | |
| ] | |
| }, | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# コンテンツを本文と日付に分割\n", | |
| "df['dt'] = [line[-31:] for line in df['line']]\n", | |
| "df['tweet'] = [line[:len(line)-31] for line in df['line']]\n", | |
| "\n", | |
| "# 分割前のコンテンツはもう要らないので除外\n", | |
| "df = df.iloc[:, df.columns != 'line']\n", | |
| "\n", | |
| "# ツイートの長さの列を追加\n", | |
| "df['tw_len'] = [ len(tw) for tw in df['tweet'] ]\n", | |
| "\n", | |
| "# リツイートかどうかの列を追加\n", | |
| "df['RT'] = [s[0:2] == 'RT' for s in df['tweet']]\n", | |
| "\n", | |
| "df.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "形態素解析前の処理はこんなところでしょうか。 \n", | |
| "後で再利用するため、ここまでの処理を関数にまとめておきます。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def tw_text_to_df(user_ids, textfiles):\n", | |
| " df = pd.DataFrame(columns=['uid', 'line'])\n", | |
| " \n", | |
| " for uid, text in zip(user_ids, textfiles):\n", | |
| " twlist = tw_list_from_text(text)\n", | |
| " df = df.append(pd.DataFrame({'uid': uid, 'line': twlist}), ignore_index=True)\n", | |
| " \n", | |
| " df['dt'] = [line[-31:] for line in df['line']]\n", | |
| " df['tweet'] = [line[:len(line)-31] for line in df['line']]\n", | |
| " df = df.iloc[:, df.columns != 'line']\n", | |
| " df['tw_len'] = [ len(tw) for tw in df['tweet'] ]\n", | |
| " df['RT'] = [s[0:2] == 'RT' for s in df['tweet']]\n", | |
| " return df" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## EDA\n", | |
| "\n", | |
| "ツイートの形態素解析に入る前に、軽くデータの傾向を見ておきます。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "array([[<matplotlib.axes._subplots.AxesSubplot object at 0x1a11536710>]], dtype=object)" | |
| ] | |
| }, | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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\numgAAAAASUVORK5CYII=\n", | |
| "text/plain": [ | |
| "<matplotlib.figure.Figure at 0x103856780>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# ツイートの長さの分布を確認\n", | |
| "df.hist(column='tw_len')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "ツイート数の制限である140文字のところにピークがありますね。もう少し詳しく見てみます。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": { | |
| "scrolled": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "array([[<matplotlib.axes._subplots.AxesSubplot object at 0x1a11ee0ba8>,\n", | |
| " <matplotlib.axes._subplots.AxesSubplot object at 0x1a11f86320>],\n", | |
| " [<matplotlib.axes._subplots.AxesSubplot object at 0x1a11f20240>,\n", | |
| " <matplotlib.axes._subplots.AxesSubplot object at 0x1a11fc7240>]], dtype=object)" | |
| ] | |
| }, | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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\nVK9evXx+YmJivOPOOOMMvfjii0pOTlZqaqrPX+BJSUkqKSnRgQMHvMv27dunHTt2KCkpSZL05JNP\nqm/fvvroo498jtS+8MILeu211/TVV1/5vc/Hf+nW1tZ6l5WVlWnr1q267777dMUVV6hfv34KDw9v\n9AiIJA0cOFAlJSX68ssv/b69k23njTfeOOn1a9euVXp6usaOHavk5GSdddZZ2rVrV6P5mmrt2rX6\n1a9+5b2d+Pj4eh9z1ZDk5GTdc889WrVqlSZNmuQ95y8lJUWffvqpOnfuXO85ctZZZ/lsY/PmzUpJ\nSWn2fQIQGOaI7zBHNC4sLEzR0dH6+uuvvcsqKyu1fft27+WUlBQZY/TVV1/Vez4kJib6bI/5oHlQ\nvG1m1KhR2r17d713fn/f+PHjNWTIEGVmZvosnz17trZt26abbrpJH3zwgXbv3q23335bd999d73/\n8GeccYZWrlyplJQUpaameq+/8cYbFRcXp+uvv15FRUXauHGjJkyYoK5du+r6669XTU2NnnrqKV1/\n/fW64IILfH5+/vOfq1u3bg2+geZkevToIUl6+eWXtX//flVUVCgmJkZxcXF68skntWPHDr333nu6\n4YYbvG8QPJUbbrhB3bt319ixY5WXl6fdu3frP//5j55//nlJUvfu3dWuXTu99tprKi0t1cGDBxvc\nzv/7f/9Pr7/+umbMmKFNmzZp+/btWr58ufeX1nnnnacVK1Zo8+bN+vDDD3XDDTc0+os6EOedd56e\nffZZbdmyRcXFxZowYcIpjwRt375dv/vd7/Tuu+/q888/1/r16/Xuu++qX79+kr47gn722WdrzJgx\neuutt/TZZ5/p/fff14MPPqhXXnnFu52DBw+quLhYY8aMafZ9AhAY5gjmiKZwu91asmSJ3n//fW3e\nvFm33HKLz/yRlJSkG2+8UZMnT9bf//53ffrpp/rwww+1bNkyLVy40Gdba9asYT5oBhRvm+nbt6/S\n0tL0zDPPNDo2IyOj3rlWffv21fr161VRUeE9CnDbbbepqqpKnTt3rreN0NBQ/f3vf9fw4cOVmpqq\nnTt3qkOHDnrzzTfVvn17jRgxQqmpqYqMjNSqVasUFhamV155RV9//bXGjx/fYK7rrrtOWVlZjb5M\neNygQYN0991364477lB8fLx+9atfqV27dnrhhRf06aef6sILL9TkyZM1Y8aMekdkGxIREaH8/Hxd\ncMEFmjBhgvr27au77rrLe65yfHy8HnroIS1YsEBnnXWWrrnmmga3c/nll+u1117T+++/ryFDhmjw\n4MF6+umnvS/HZWdnq66uToMHD9a4ceN05ZVX+nyhhfTdx0+d7kuaTz/9tP7v//5PgwYN0rXXXqux\nY8fqxz/+8UnHHz8HfPz48erTp4+uu+46jRgxwvtJABEREVq7dq369++vSZMmqU+fPvrZz36mjRs3\n6pxzzvFuZ+XKlerdu7eGDx9+WvkBNB/mCOaIpli0aJF69eolt9utq666SqNGjdKFF17oM+bpp5/W\nnXfeqXnz5qlv37667LLLtGLFCvXs2dM7Ztu2bdqyZYt+8YtfBC1rW+Ew3z/5By1u3bp1mjBhgnbu\n3KmIiIiWjoPTcMstt2jv3r2Nfu623dTW1io5OVkPPPCAfvazn7V0HAAnYI744Wgtc8SUKVMUHR2t\njIyMlo7S6oXMmzdvXkuHgK/u3burY8eO6tixo7p06dLScRCguro6TZs2TStXrvR501JrsGfPHnXo\n0EG33nprS0cB8D3MET8MrWWOqKmpUUlJiX7729+e8hN14B+OeAMAAAAW4BxvAAAAwAIUbwAAAMAC\nFG8AAADAAhRvAAAAwAK2+cr4E79ZqTEul8vnG7PshGyBs3M+sgXOzvkCzZaQkBCENGiIv3ODnZ9n\nkr3zkS1wds5HtsAFks/feYEj3gAAAIAFKN4AAACABSjeAAAAgAUo3gAAAIAFKN4AAACABSjeAAAA\ngAX8+jjBI0eOaOnSpdqzZ48cDofuvPNOJSQkKCMjQ/v371dcXJxmzpypqKgoGWOUnZ2t4uJitW/f\nXunp6UpMTAz2fgAAAAC25tcR7+zsbPXv31+LFi3SI488oq5duyonJ0fJycnKzMxUcnKycnJyJEnF\nxcXau3evMjMzdfvtt2vZsmVB3QEAAACgNWj0iHdlZaW2bdumu+6667sVQkMVGhqqgoICzZs3T5KU\nmpqqefPm6aabblJhYaFGjBghh8OhPn366MiRIyovL1dMTExQdyTYam8b69e4fc1wWyFPvtwMWwEA\nAICdNFq8S0tL1alTJz322GP6/PPPlZiYqMmTJ+vgwYPeMh0TE6NDhw5Jkjwej1wul3d9p9Mpj8fT\n6os3AAAAcDoaLd61tbXavXu3pkyZot69eys7O9t7WklDjDH1ljkcjnrL8vLylJubq8rKSmVlZfmU\n9UZDh4Y2aXxzaI4j2f4K1r61xP3WFHbOR7bA2TmfnbO1VYHODXZ/LO2cj2yBs3M+sgUumPkaLd5O\np1NOp1O9e/eWJA0dOlQ5OTmKjo72nkJSXl6uTp06ecef+P32ZWVlDR7tdrvdcrvd3ssnrtMYl8vV\npPGtTbD2ze73m53zkS1wds4XaLaEhIQgpIEU+Nxg5+eZZO98ZAucnfORLXCB5PN3Xmj0zZWdO3eW\n0+nU119/LUnavHmzunXrppSUFOXn50uS8vPzNWjQIElSSkqK1q5dK2OMduzYoYiICE4zAQAAQJvn\n18cJTpkyRZmZmaqpqVGXLl2Unp4uY4wyMjK0evVquVwuzZo1S5I0YMAAFRUVafr06QoLC1N6enpQ\ndwAAAABoDfwq3ueee64WLFhQb/mcOXPqLXM4HJo6derpJwMAAAB+QPjmSgAAAMACFG8AAADAAhRv\nAAAAwAIUbwAAAMACFG8AAADAAhRvAAAAwAIUbwAAAMACFG8AAADAAhRvAAAAwAIUbwAAAMACFG8A\nAADAAhRvAAAAwAIUbwAAAMACFG8AAADAAhRvAAAAwAIUbwAAAMACFG8AAADAAhRvAAAAwAIUbwAA\nAMACFG8AAADAAhRvAAAAwAIUbwAAAMACFG8AAADAAhRvAAAAwAIUbwAAAMACof4MuuuuuxQeHq52\n7dopJCRECxYsUEVFhTIyMrR//37FxcVp5syZioqKkjFG2dnZKi4uVvv27ZWenq7ExMRg7wcAAABg\na34Vb0maO3euOnXq5L2ck5Oj5ORkjRs3Tjk5OcrJydFNN92k4uJi7d27V5mZmdq5c6eWLVumBx98\nMCjhAQAAgNYi4FNNCgoKlJqaKklKTU1VQUGBJKmwsFAjRoyQw+FQnz59dOTIEZWXlzdPWgAAAKCV\n8vuI9/z58yVJl112mdxutw4ePKiYmBhJUkxMjA4dOiRJ8ng8crlc3vWcTqc8Ho93LAAAANAW+VW8\nH3jgAcXGxurgwYP64x//qISEhJOONcbUW+ZwOOoty8vLU25uriorK5WVleVT1hsNHRrapPHNYZ+F\ntxWsfWuJ+60p7JyPbIGzcz47Z2urAp0b7P5Y2jkf2QJn53xkC1ww8/lVvGNjYyVJ0dHRGjRokD75\n5BNFR0ervLxcMTExKi8v957/7XQ6deDAAe+6ZWVlDR7tdrvdcrvd3ssnrtMYl8vVpPGtTbD2ze73\nm53zkS1wds4XaLZTHXzA6Ql0brDz80yydz6yBc7O+cgWuEDy+TsvNHqOd3V1taqqqrz/3rRpk845\n5xylpKQoPz9fkpSfn69BgwZJklJSUrR27VoZY7Rjxw5FRERwmgkAAADavEaPeB88eFB//vOfJUm1\ntbUaPny4+vfvr549eyojI0OrV6+Wy+XSrFmzJEkDBgxQUVGRpk+frrCwMKWnpwd3DwAAAIBWoNHi\nHR8fr0ceeaTe8o4dO2rOnDn1ljscDk2dOrV50gEAAAA/EHxzJQAAAGABijcAAABgAYo3AAAAYAG/\nv0AH1qm9bWxQtnuyzyIPefLloNweAAAA/osj3gAAAIAFKN4AAACABSjeAAAAgAUo3gAAAIAFKN4A\nAACABSjeAAAAgAUo3gAAAIAFKN4AAACABSjeAAAAgAUo3gAAAIAFKN4AAACABSjeAAAAgAVCWzrA\n6ai9bWxLRwAAAAD8whFvAAAAwAIUbwAAAMACFG8AAADAAhRvAAAAwAIUbwAAAMACFG8AAADAAhRv\nAAAAwAIUbwAAAMACfn+BTl1dne677z7FxsbqvvvuU2lpqRYtWqSKigr16NFD06ZNU2hoqI4dO6Yl\nS5Zo165d6tixo2bMmKEuXboEcx8AAAAA2/P7iPdrr72mrl27ei8/++yzGjNmjDIzMxUZGanVq1dL\nklavXq3IyEgtXrxYY8aM0YoVK5o/NQAAANDK+FW8y8rKVFRUpJEjR0qSjDEqKSnR0KFDJUlpaWkq\nKCiQJBUWFiotLU2SNHToUG3ZskXGmCBEBwAAAFoPv4r38uXLddNNN8nhcEiSDh8+rIiICIWEhEiS\nYmNj5fF4JEkej0dOp1OSFBISooiICB0+fDgY2QEAAIBWo9FzvDdu3Kjo6GglJiaqpKSk0Q02dHT7\neGE/UV5ennJzc1VZWamsrCy5XC4/I0uhoaFyuVza5/caOJWm3PfBdPxxtSOyBc7O+eycra0KdG6w\n+2Np53xkC5yd85EtcMHM12jx3r59uwoLC1VcXKyjR4+qqqpKy5cvV2VlpWpraxUSEiKPx6PY2FhJ\nktPpVFlZmZxOp2pra1VZWamoqKh623W73XK73d7LBw4c8Du0y+Vq0nicml3uSzs/rmQLnJ3zBZot\nISEhCGkgBT432Pl5Jtk7H9kCZ+d8ZAtcIPn8nRcaPdXkxhtv1NKlS/Xoo49qxowZuuCCCzR9+nQl\nJSVpw4YNkqQ1a9YoJSVFkjRw4ECtWbNGkrRhwwYlJSU1eMQbAAAAaEsC/hzviRMn6tVXX9W0adNU\nUVGhSy+9VJJ06aWXqqKiQtOmTdOrr76qiRMnNltYAAAAoLXy+3O8JSkpKUlJSUmSpPj4eD300EP1\nxoSFhWnWrFnNkw4AAAD4geCbKwEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAA\nAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAA\nC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAAL\nULwBAAAAC1C8AQAAAAtQvAEAAAALhDY24OjRo5o7d65qampUW1uroUOHavz48SotLdWiRYtUUVGh\nHj16aNq0aQoNDdWxY8e0ZMkS7dq1Sx07dtSMGTPUpUsXK/YFAAAAsK1Gi/cZZ5yhuXPnKjw8XDU1\nNZozZ4769++vV199VWPGjNGwYcP0xBNPaPXq1br88su1evVqRUZGavHixXr33Xe1YsUKzZw504p9\nQYBqbxtr2W2FPPmyZbcFAABgJ42eauJwOBQeHi5Jqq2tVW1trRwOh0pKSjR06FBJUlpamgoKCiRJ\nhYWFSktLkyQNHTpUW7ZskTEmSPEBAACA1qHRI96SVFdXp3vvvVd79+7VFVdcofj4eEVERCgkJESS\nFBsbK4/HI0nyeDxyOp2SpJCQEEVEROjw4cPq1KlTkHYBAAAAsD+/ine7du30yCOP6MiRI/rzn/+s\nr7766qRjGzq67XA46i3Ly8tTbm6uKisrlZWVJZfL5X/o0FC5XC7t83sN2MWpHufjj6sdkS1wds5n\n52xtVaBzg90fSzvnI1vg7JyPbIELZj6/ivdxkZGR6tevn3bu3KnKykrV1tYqJCREHo9HsbGxkiSn\n06mysjI5nU7V1taqsrJSUVFR9bbldrvldru9lw8cOOB3DpfL1aTxsI9TPW52flzJFjg75ws0W0JC\nQhDSQAp8brDz80yydz6yBc7O+cgWuEDy+TsvNHqO96FDh3TkyBFJ333CyebNm9W1a1clJSVpw4YN\nkqQ1a9YoJSVFkjRw4ECtWbNGkrRhwwYlJSU1eMQbAAAAaEsaPeJdXl6uRx99VHV1dTLG6KKLLtLA\ngQPVrVs3LVq0SM8995x69OihSy+9VJJ06aWXasmSJZo2bZqioqI0Y8aMoO8EAAAAYHeNFu/u3bvr\nT3/6U73l8fHxeuihh+otDwsL06xZs5onHQAAAPADwTdXAgAAABageAMAAAAWoHgDAAAAFqB4AwAA\nABageAMAAAAWoHgDAAAAFqB4AwAAABageAMAAAAWoHgDAAAAFqB4AwAAABageAMAAAAWoHgDAAAA\nFqB4AwAAABageAMAAAAWoHgDAAAAFqB4AwAAABageAMAAAAWoHgDAAAAFqB4AwAAABageAMAAAAW\noHgDAAAAFqB4AwAAABYIbekAaFtqbxt70uv2NfNthTz5cjNvEQAAIHAc8QYAAAAswBFvALZyqldF\nmt1L6627LQBAm9do8T5w4IAeffRRffvtt3I4HHK73Ro9erQqKiqUkZGh/fv3Ky4uTjNnzlRUVJSM\nMcrOzlZxcbHat2+v9PR0JSYmWrEvAAAAgG01eqpJSEiIbr75ZmVkZGj+/Pl644039OWXXyonJ0fJ\nycnKzMxUcnKycnJyJEnFxcXau3evMjMzdfvtt2vZsmVB3wkAAADA7hot3jExMd4j1h06dFDXrl3l\n8XhUUFCg1NRUSVJqaqoKCgokSYWFhRoxYoQcDof69OmjI0eOqLy8PIi7AAAAANhfk95cWVpaqt27\nd6tXr146ePCgYmJiJH1Xzg8dOiRJ8ng8crlc3nWcTqc8Hk8zRgYAAABaH7/fXFldXa2FCxdq8uTJ\nioiIOOk4Y0y9ZQ6Ho96yvLw85ebmqrKyUllZWT5lvTGhoaFyuVzN/vFz+GFpynOqMcefc3Zk52xS\n0/NZ+f/a7vddWxTo3GD3x9LO+cgWODvnI1vggpnPr+JdU1OjhQsX6pJLLtGQIUMkSdHR0SovL1dM\nTIzKy8vVqVMnSd8d4T5w4IB33bKyMu+R8RO53W653W7v5RPXaYzL5WrSeLRNzfkcsfNzzs7ZJHvn\nq6mpCShbQkJCENJACnxusPPzTLJ3PrIFzs75yBa4QPL5Oy80eqqJMUZLly5V165dddVVV3mXp6Sk\nKD8/X5KUn5+vQYMGeZevXbtWxhjt2LFDERERDRZvAAAAoC1p9Ij39u3btXbtWp1zzjn6zW9+I0m6\n4YYbNG7cOGVkZGj16tVyuVyaNWuWJGnAgAEqKirS9OnTFRYWpvT09ODuAQAAANqMoH/fQxC/46HR\n4n3++edr5cqVDV43Z86cesscDoemTp16+skAAACAHxC+Mh4AAACwAMUbAAAAsADFGwAAALAAxRsA\nAACwgN9foAO0Ns35rmd/vtQl5MmXm+32AADADw9HvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAAL\nULwBAAAAC1C8AQAAAAtQvAGdZg16AAAgAElEQVQAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwB\nAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEA\nAAALULwBAAAAC4Q2NuCxxx5TUVGRoqOjtXDhQklSRUWFMjIytH//fsXFxWnmzJmKioqSMUbZ2dkq\nLi5W+/btlZ6ersTExKDvBGAHtbeNtey2Qp582bLbAgAAzaPRI95paWmaPXu2z7KcnBwlJycrMzNT\nycnJysnJkSQVFxdr7969yszM1O23365ly5YFJzUAAADQyjRavPv166eoqCifZQUFBUpNTZUkpaam\nqqCgQJJUWFioESNGyOFwqE+fPjpy5IjKy8uDEBsAAABoXQI6x/vgwYOKiYmRJMXExOjQoUOSJI/H\nI5fL5R3ndDrl8XiaISYAAADQujV6jndTGGPqLXM4HA2OzcvLU25uriorK5WVleVT2BsTGhoql8ul\nfQEnBVq3E88nD/b/g/iX1p/W+sf/v/rLyv/XTc2G4At0brD7Y2nnfGQLnJ3z/ZCzBXueCOZ9F1Dx\njo6OVnl5uWJiYlReXq5OnTpJ+u4I94EDB7zjysrKvEfGv8/tdsvtdnsvn7heY1wuV5PGAwjc6f5f\ns/P/15qamoCyJSQkBCENpMDnBjs/zyR75yNb4Oycj2yBC2Ru8HdeCKh4p6SkKD8/X+PGjVN+fr4G\nDRrkXb5q1SoNGzZMO3fuVERExEmLN4DW4XQ/rYVXpgAA+E6jxXvRokXaunWrDh8+rDvuuEPjx4/X\nuHHjlJGRodWrV8vlcmnWrFmSpAEDBqioqEjTp09XWFiY0tPTg74DAAAAQGvQaPGeMWNGg8vnzJlT\nb5nD4dDUqVNPPxUAAADwA8M3VwIAAAAWoHgDAAAAFqB4AwAAABageAMAAAAWoHgDAAAAFqB4AwAA\nABageAMAAAAWoHgDAAAAFqB4AwAAABageAMAAAAWoHgDAAAAFqB4AwAAABageAMAAAAWoHgDAAAA\nFqB4AwAAABYIbekAAADAfmpvGxvU7Yc8+XJQtw/YEUe8AQAAAAtwxBsAAMBGmuPVhn2nuC7YrzY0\nlv9U2X7oKN4AAMBy/pTL0yloVpTL1logg30aEU6O4g0AQCsV7COjrRnlEnbEOd4AAACABSjeAAAA\ngAUo3gAAAIAFKN4AAACABSjeAAAAgAWC8qkmH374obKzs1VXV6eRI0dq3LhxwbgZAAAAoNVo9uJd\nV1enrKws/f73v5fT6dTvfvc7paSkqFu3bs19UwAA2Nrxj7T7oX5kH4CmafZTTT755BOdeeaZio+P\nV2hoqC6++GIVFBQ0980AAAAArUqzF2+PxyOn0+m97HQ65fF4mvtmAAAAgFal2U81McbUW+ZwOOot\ny8vLU25uriorK5WVlaWEhIQm3U5CQoL078KAcwKApCb/7kFwnc7cYMvHknkKaJWC9fuk2Y94O51O\nlZWVeS+XlZUpJiam3ji3263FixcrKyurybdx6623nlbGYCJb4Oycj2yBs3M+O2drqwKdG+z+WNo5\nH9kCZ+d8ZAtcMPM1e/Hu2bOnvvnmG5WWlqqmpkbr169XSkpKs95GREREs26vOZEtcHbOR7bA2Tmf\nnbOhaez+WNo5H9kCZ+d8ZAtcMPM1+6kmISEhmjJliubPn6+6ujr95Cc/0dlnn92stxEZGdms22tO\nZAucnfORLXB2zmfnbGgauz+Wds5HtsDZOR/ZAhfMfCHz5s2b19wbPeusszRq1CiNHj1affv2be7N\nS5ISExODst3mQLbA2Tkf2QJn53x2zoamsftjaed8ZAucnfORLXDByucwDb0bEgAAAECz4ivjAQAA\nAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAA\nC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAAL\nULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQ\nvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8\nAQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwB\nAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEA\nAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAA\nAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAA\nC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAAL\nULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQvAEAAAALULwBAAAAC1C8AQAAAAtQ\nvAEAAAALULwBAAAAC1C8AQAAAAtQvNugiooKde3aVQUFBS2W4bPPPpPD4dA777zTYhms1K1bNy1Y\nsKDZtrdu3Tqde+65qq6ubrZtAoDEHNHalJeXKy4uTtu2bWvpKPADxbsNevjhh5WSkqJBgwa1dBSv\nd955Rw6HQ5999llLR6knLS1NDoej3s+GDRtaLNMll1yiPn36aNGiRS2WAcAPE3OEf47/cXCqn7S0\ntKDniImJ0bRp0/Sb3/wm6LeF00fxbmOqq6v1+OOP65e//KUlt3f06NFm3d6xY8dkjGnWbfrjxhtv\n1DfffOPzM3DgQMtznGjq1KlasmSJampqWjQHgB8O5gj/nX322T5zwpIlSyTJZ9mLL77Y4LrNvd9T\npkzRqlWrtHPnzmbdLpofxbuNWbVqlaqqqnT55Zd7lx3/q33lypW6+uqrFRERocTERD3zzDM+6/7l\nL39R//79FRUVpTPPPFMTJkzQN998471+zZo1cjgc+ve//63hw4crPDxcTzzxhCRp5cqV6tWrl8LD\nw3XxxRdr06ZNPrd/ySWXSJJ69Ojhc5Rg8uTJcrvdWrx4sc4991y1b99eR44ckSQtXrxY559/vsLD\nw9W7d2/Nnz/fp4TW1NRo3rx56tGjh8LDw5WUlKS//vWvAd1vHTp00Jlnnunzc8YZZ3jv09TUVMXG\nxqpz585KS0tTYWHhKbf34osvqn///oqIiFDnzp01dOhQn/tkx44d+ulPf6rOnTsrJiZGV1xxhUpK\nSny2cdVVV2nfvn1as2ZNQPsEAN/HHOH/HBESEuIzJ0RHR0uSz7LY2FhVV1fL4XDo8ccf1/jx49Wx\nY0dNmTJFH3/8sRwOR7354vunJh46dEh33XWXzjrrLEVGRiolJUWvvPJKvXUGDhyoFStW+J0fLcSg\nTZkxY4YZNmyYz7Ldu3cbSaZHjx7m+eefNzt37jT33nuvCQkJMTt27PCOW7RokXnrrbfMrl27zPr1\n681FF11kRowY4b3+7bffNpLMeeedZ3Jzc82uXbvMnj17TFFRkXE4HOa+++4zH3/8sfnXv/5lzj33\nXCPJrFu3ztTU1Jjc3FwjyXzwwQfmm2++MWVlZcYYYyZNmmQ6duxoxo0bZ4qLi82mTZvMsWPHzNy5\nc80555xjXnzxRbNr1y7z73//25x99tnm97//vTfPpEmTTHJysnnjjTfMrl27zHPPPWeio6PNsmXL\nmnSfpaammltvvfWk1//zn/80L7zwgtm+fbvZsmWLmTx5snE6ncbj8XjHdO3a1Tz00EPGGGO+/PJL\nExoaahYuXGh27dpltm7dap599lmzZcsWY4wxX3/9tYmLizN33XWX2bRpk9m2bZu54447jMvlMgcO\nHPC57QEDBpjZs2c3aX8A4GSYI5o+Rxz3zDPPmIZqVVVVlZFkXC6Xefzxx80nn3xidu7cabZt22Yk\nmYKCAp/xJ84XtbW15uKLLzYjR4407777rvnkk0/MkiVLTGhoqFm3bp3PetOmTfO5v2FPFO825ppr\nrjHjx4/3WXb8l+rChQu9y44dO2YiIyPN0qVLT7qtoqIiI8l8+eWXxpj//lL929/+5jNu4sSJ5qKL\nLvJZtnjxYu8vVWOMWbdunZFkdu/e7TNu0qRJJjo62hw+fNi77MiRI6ZDhw7m9ddf9xn79NNPm+jo\naGOMMbt27TIOh8Ns27bNZ8wf/vAH86Mf/eik+9SQ1NRUExoaaiIjI70/P/nJT046vqamxnTs2NE8\n99xz3mUn/iL94IMPjCSzZ8+eBte///776018dXV1pnv37mbx4sU+y6+++mozYcKEJu0PAJwMc0TT\n54jjGive6enpPsv9Kd6vv/66iYiIMBUVFT5jbrjhBnP99df7LHv44YdNt27dAsoO64RadmgdtlBV\nVeV9Oez7+vfv7/13aGio4uPjtW/fPu+yNWvW6KGHHtLWrVv17bffqq6uTpL0+eefq2vXrt5xgwcP\n9tnu1q1bNXLkSJ9lw4cP9ztz3759FRUV5b1cUlKiqqoq/exnP5PD4fAur62tVXV1tfbv36/CwkIZ\nY5SSkuKzrZqaGoWEhPh928f99Kc/1YMPPui9HB4e7v33p59+qrlz52rDhg0qLS1VXV2dKisr9fnn\nnze4rQEDBsjtdqtv37667LLLlJaWpmuvvVbdunWTJBUUFOj999/32Wfpu8fu++fvhYeHq6qqqsn7\nAwANYY4IbI7wx/f32x8FBQWqqqpSfHy8z/KjR48qOTnZZxnzQetA8W5j4uLi5PF4GrwuLCzM57LD\n4fD+4vziiy80evRo3XzzzZozZ45cLpe+/PJLud3uem8SiYyM9LlsjPH55ddU39/e8UwvvPCC+vTp\nU298bGysd8z69esVERFRb7+aqlOnTurVq1eD140ePVoJCQl67LHH1K1bN4WFhemiiy466ZtnQkND\n9eabb+qDDz5QXl6eVq5cqXvvvVcvvviiRo0apbq6Ol1xxRUNfmLJ9ydEj8ejHj16NHl/AKAhzBGB\nzRGB5GzX7ru32ZnvvRn02LFj3n/X1dWpS5cuDX6sYvv27X0uezwexcXFNVdcBAnFu4358Y9/7H3n\ndVMc/6t70aJF6tChgyRp48aNfq2blJSkd99912fZ9y8f/4VeW1vr1/bCw8O1a9cujR49usExxz9x\n5IsvvtBVV13lV85A7Nu3Tzt27NCSJUt02WWXSfru6M6BAwdOuZ7D4dCQIUM0ZMgQ3X///XK73Vq+\nfLlGjRqllJQU/eMf/9DZZ59d7xfr923ZskXXXXdds+0PgLaNOcI6Xbp0kSR9/fXX3mVfffWVSktL\nvZdTUlJUWloqY4x69+59yu1t3ry53hF82A+fatLGjBo1Srt379aePXuatF7v3r3lcDi0cOFC7d69\nWzk5Ofqf//kfv9adOXOm3nvvPd1///3asWOHXnrpJS1cuNBnTPfu3dWuXTu99tprKi0t1cGDB0+6\nvaioKM2ePVuzZ8/WkiVLtH37dpWUlOi5557TvffeK0nq1auXpkyZottuu03PPPOMPvnkE3300Ud6\n6qmn9PDDDzdp30/F5XIpNjZWTzzxhHbs2KH169dr4sSJ3omnIevWrdP8+fP1wQcf6IsvvtBbb72l\nLVu2qF+/fpKk6dOnq7q6WuPGjdM777yjzz77TO+8845mz56t999/37udbdu2af/+/bryyiubbX8A\ntG3MEc07R5xK586dNXDgQD300EPavHmzCgoKNGnSJJ9TGUeNGqXhw4dr7Nixevnll7V7924VFhZq\n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\nAADAgP8DOPYZsIABgaAAAAAASUVORK5CYII=\n", | |
| "text/plain": [ | |
| "<matplotlib.figure.Figure at 0x1a11515f60>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# ユーザー、RT別に確認\n", | |
| "df.hist(column='tw_len', by=['uid', 'RT'], figsize=(12,10), sharex=True, sharey=True)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "南極にゃんこさんはツイート短め。 \n", | |
| "nardtreeさんはリツイート多めの傾向です。 \n", | |
| "\n", | |
| "ユーザー別のリツイート率も見てみましょう。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "metadata": { | |
| "scrolled": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<matplotlib.axes._subplots.AxesSubplot at 0x1a120654a8>" | |
| ] | |
| }, | |
| "execution_count": 8, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<matplotlib.figure.Figure at 0x1a12032d68>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# リツイート率を確認するデータフレームを作成\n", | |
| "df_pv = pd.DataFrame()\n", | |
| "df_pv['tw_count'] = df.groupby('uid')['tweet'].count()\n", | |
| "df_pv['RT_count'] = df.groupby('uid')['RT'].sum()\n", | |
| "df_pv['RT_rate'] = df_pv['RT_count'] / df_pv['tw_count']\n", | |
| "df_pv['RT_rate'].plot(kind='bar')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "nardtreeさんのリツイート率は4割を超えています。やるまでもないと思いますが、一応カイ二乗検定の結果をみてみます。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style>\n", | |
| " .dataframe thead tr:only-child th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: left;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>RT_count</th>\n", | |
| " <th>noRT_count</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>uid</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>NekoAntarctica</th>\n", | |
| " <td>463.0</td>\n", | |
| " <td>2735.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>nardtree</th>\n", | |
| " <td>1365.0</td>\n", | |
| " <td>1824.0</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " RT_count noRT_count\n", | |
| "uid \n", | |
| "NekoAntarctica 463.0 2735.0\n", | |
| "nardtree 1365.0 1824.0" | |
| ] | |
| }, | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# 分割表の作成\n", | |
| "df_pv['noRT_count'] = df_pv['tw_count'] - df_pv['RT_count'] \n", | |
| "df_cross = df_pv[['RT_count', 'noRT_count']]\n", | |
| "df_cross" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 10, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "p-value: 0.000000\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "from scipy import stats\n", | |
| "\n", | |
| "chsq, p, dof, ef = stats.chi2_contingency(df_cross)\n", | |
| "print(\"p-value: {:1.6f}\".format(p))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "二人が同一人物である可能性はかなり低そうです。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## MeCabで形態素解析\n", | |
| "\n", | |
| "ここからは、全ツイートを形態素解析して辞書を準備し、最終的にツイート毎のベクトル特徴量を作っていきます。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 11, | |
| "metadata": { | |
| "scrolled": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style>\n", | |
| " .dataframe thead tr:only-child th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: left;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>0</th>\n", | |
| " <th>1</th>\n", | |
| " <th>2</th>\n", | |
| " <th>3</th>\n", | |
| " <th>4</th>\n", | |
| " <th>5</th>\n", | |
| " <th>6</th>\n", | |
| " <th>7</th>\n", | |
| " <th>8</th>\n", | |
| " <th>9</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>俺</td>\n", | |
| " <td>名詞</td>\n", | |
| " <td>代名詞</td>\n", | |
| " <td>一般</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>俺</td>\n", | |
| " <td>オレ</td>\n", | |
| " <td>オレ</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>は</td>\n", | |
| " <td>助詞</td>\n", | |
| " <td>係助詞</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>は</td>\n", | |
| " <td>ハ</td>\n", | |
| " <td>ワ</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>空中</td>\n", | |
| " <td>名詞</td>\n", | |
| " <td>一般</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>空中</td>\n", | |
| " <td>クウチュウ</td>\n", | |
| " <td>クーチュー</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>浮遊</td>\n", | |
| " <td>名詞</td>\n", | |
| " <td>サ変接続</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>浮遊</td>\n", | |
| " <td>フユウ</td>\n", | |
| " <td>フユー</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>し</td>\n", | |
| " <td>動詞</td>\n", | |
| " <td>自立</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>サ変・スル</td>\n", | |
| " <td>連用形</td>\n", | |
| " <td>する</td>\n", | |
| " <td>シ</td>\n", | |
| " <td>シ</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>5</th>\n", | |
| " <td>てる</td>\n", | |
| " <td>動詞</td>\n", | |
| " <td>非自立</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>一段</td>\n", | |
| " <td>基本形</td>\n", | |
| " <td>てる</td>\n", | |
| " <td>テル</td>\n", | |
| " <td>テル</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6</th>\n", | |
| " <td>から</td>\n", | |
| " <td>助詞</td>\n", | |
| " <td>接続助詞</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>から</td>\n", | |
| " <td>カラ</td>\n", | |
| " <td>カラ</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>7</th>\n", | |
| " <td>揺れ</td>\n", | |
| " <td>動詞</td>\n", | |
| " <td>自立</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>一段</td>\n", | |
| " <td>未然形</td>\n", | |
| " <td>揺れる</td>\n", | |
| " <td>ユレ</td>\n", | |
| " <td>ユレ</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>8</th>\n", | |
| " <td>なかっ</td>\n", | |
| " <td>助動詞</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>特殊・ナイ</td>\n", | |
| " <td>連用タ接続</td>\n", | |
| " <td>ない</td>\n", | |
| " <td>ナカッ</td>\n", | |
| " <td>ナカッ</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>9</th>\n", | |
| " <td>た</td>\n", | |
| " <td>助動詞</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>*</td>\n", | |
| " <td>特殊・タ</td>\n", | |
| " <td>基本形</td>\n", | |
| " <td>た</td>\n", | |
| " <td>タ</td>\n", | |
| " <td>タ</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>10</th>\n", | |
| " <td>EOS</td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>11</th>\n", | |
| " <td></td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " <td>None</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " 0 1 2 3 4 5 6 7 8 9\n", | |
| "0 俺 名詞 代名詞 一般 * * * 俺 オレ オレ\n", | |
| "1 は 助詞 係助詞 * * * * は ハ ワ\n", | |
| "2 空中 名詞 一般 * * * * 空中 クウチュウ クーチュー\n", | |
| "3 浮遊 名詞 サ変接続 * * * * 浮遊 フユウ フユー\n", | |
| "4 し 動詞 自立 * * サ変・スル 連用形 する シ シ\n", | |
| "5 てる 動詞 非自立 * * 一段 基本形 てる テル テル\n", | |
| "6 から 助詞 接続助詞 * * * * から カラ カラ\n", | |
| "7 揺れ 動詞 自立 * * 一段 未然形 揺れる ユレ ユレ\n", | |
| "8 なかっ 助動詞 * * * 特殊・ナイ 連用タ接続 ない ナカッ ナカッ\n", | |
| "9 た 助動詞 * * * 特殊・タ 基本形 た タ タ\n", | |
| "10 EOS None None None None None None None None None\n", | |
| "11 None None None None None None None None None" | |
| ] | |
| }, | |
| "execution_count": 11, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# MeCabで1ツイートだけ解析してみる\n", | |
| "tagger = MeCab.Tagger()\n", | |
| "output = tagger.parse(df.loc[500, 'tweet'])\n", | |
| "tagger_test_dt = pd.DataFrame( [line.replace('\\t', ',').split(',') for line in output.split('\\n')] )\n", | |
| "tagger_test_dt" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "うまく分割できているようです。 \n", | |
| "今回は品詞などの情報は使わず、シンプルに単語のみ使うことにします。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 12, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "['俺', 'は', '空中', '浮遊', 'し', 'てる', 'から', '揺れ', 'なかっ', 'た']" | |
| ] | |
| }, | |
| "execution_count": 12, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# MeCabで分割して単語のリストを取得する関数\n", | |
| "def split_by_mecab(content, tagger):\n", | |
| " parsed = tagger.parse(content)\n", | |
| " word_list = [ line.split('\\t')[0] for line in parsed.split('\\n') ]\n", | |
| " return word_list[:-2]\n", | |
| "\n", | |
| "# 関数のテスト\n", | |
| "split_by_mecab(df.loc[500,'tweet'], tagger)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## gensimで特徴量作成\n", | |
| "\n", | |
| "次に全ツイートを形態素解析して辞書を作成していきます。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 13, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "6387" | |
| ] | |
| }, | |
| "execution_count": 13, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# 全ツイートをMeCabで分割\n", | |
| "whole_tweets = [split_by_mecab(tweet, tagger) for tweet in df['tweet'].tolist() ]\n", | |
| "len(whole_tweets)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 14, | |
| "metadata": { | |
| "scrolled": true | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "21757" | |
| ] | |
| }, | |
| "execution_count": 14, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# gensimで辞書を作成\n", | |
| "dictionary = corpora.Dictionary(whole_tweets)\n", | |
| "len(dictionary)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "辞書のサイズが大きいと後の学習で辛いので、程々に減らしておきます。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 15, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "9108" | |
| ] | |
| }, | |
| "execution_count": 15, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# 極端に頻度が少ない単語と多い単語を除外\n", | |
| "dictionary.filter_extremes(no_below=2, no_above=0.8)\n", | |
| "len(dictionary)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "辞書が準備できたので、ツイート毎のベクトル特徴量を作ります。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 16, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "(6387, 9108)" | |
| ] | |
| }, | |
| "execution_count": 16, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# 特徴量を作成\n", | |
| "bows = [dictionary.doc2bow(tweet) for tweet in whole_tweets]\n", | |
| "x = [list(matutils.corpus2dense([bow], num_terms=len(dictionary)).T[0]) for bow in bows]\n", | |
| "x = np.array(x, dtype=np.float32)\n", | |
| "x.shape" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "教師データを用意します。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 17, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "(6387,)" | |
| ] | |
| }, | |
| "execution_count": 17, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "y = df['uid'].as_matrix()\n", | |
| "y.shape" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 18, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "(4790, 9108) (1597, 9108)\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# 訓練データとテストデータを作成\n", | |
| "from sklearn.model_selection import train_test_split\n", | |
| "\n", | |
| "X_train, X_test, Y_train, Y_test = train_test_split(x, y, random_state=0)\n", | |
| "print(X_train.shape, X_test.shape)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "再利用のため、ここまでの作業を関数にしておきます。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 19, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# データフレームから学習用データセットを返す\n", | |
| "def df_to_train_test_split(df):\n", | |
| " whole_tweets = [split_by_mecab(tweet, tagger) for tweet in df['tweet'].tolist() ]\n", | |
| " dictionary = corpora.Dictionary(whole_tweets)\n", | |
| " dictionary.filter_extremes(no_below=2, no_above=0.8)\n", | |
| " bows = [dictionary.doc2bow(tweet) for tweet in whole_tweets]\n", | |
| " x = [list(matutils.corpus2dense([bow], num_terms=len(dictionary)).T[0]) for bow in bows]\n", | |
| " x = np.array(x, dtype=np.float32)\n", | |
| " y = df['uid'].as_matrix()\n", | |
| " return train_test_split(x, y, random_state=0)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## モデル選択と学習\n", | |
| "\n", | |
| "前処理が終わったので、ようやく学習の時間です。 \n", | |
| "\n", | |
| "モデル選択ですが、セオリーでは、単語ベクトルのような高次元のスパースなデータは線形モデルが良いとされています。 \n", | |
| "\n", | |
| "今回は Binary Classification なので、ロジスティック回帰モデルを選択する事にします。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 20, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "GridSearchCV(cv=5, error_score='raise',\n", | |
| " estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", | |
| " intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n", | |
| " penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n", | |
| " verbose=0, warm_start=False),\n", | |
| " fit_params=None, iid=True, n_jobs=1,\n", | |
| " param_grid={'C': [0.1, 1, 10], 'penalty': ['l1', 'l2']},\n", | |
| " pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n", | |
| " scoring=None, verbose=0)" | |
| ] | |
| }, | |
| "execution_count": 20, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# ロジスティック回帰モデルでグリッドサーチ\n", | |
| "from sklearn.model_selection import GridSearchCV\n", | |
| "from sklearn.linear_model import LogisticRegression\n", | |
| "\n", | |
| "logistic_param_grid = { 'C' : [0.1, 1, 10], 'penalty' : ['l1', 'l2'] }\n", | |
| "lgs = GridSearchCV( LogisticRegression(), logistic_param_grid, cv=5 )\n", | |
| "lgs.fit(X_train, Y_train)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "サクッと完了。再利用のため、ここまでの作業を関数にしておきます。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 21, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# グリッドサーチの結果を返す\n", | |
| "def logistic_grid_search(X_train, Y_train):\n", | |
| " param_grid = { 'C' : [0.1, 1, 10], 'penalty' : ['l1', 'l2'] }\n", | |
| " grid_search = GridSearchCV( LogisticRegression(), param_grid, cv=5 )\n", | |
| " grid_search.fit(X_train, Y_train)\n", | |
| " return grid_search" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## モデルの評価\n", | |
| "\n", | |
| "グリッドサーチで最適だったパラメータを確認します。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 22, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "{'C': 1, 'penalty': 'l2'}" | |
| ] | |
| }, | |
| "execution_count": 22, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "lgs.best_params_" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "結局、デフォルトのパラメータが最適でした。 \n", | |
| "訓練データに対するスコアと、テストセットに対するスコアを確認します。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 23, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "0.83716075156576197" | |
| ] | |
| }, | |
| "execution_count": 23, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "lgs.best_score_" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 24, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "0.81903569192235437" | |
| ] | |
| }, | |
| "execution_count": 24, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "lgs.score(X_test, Y_test)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "テストセットで約0.820…ビミョーですね。\n", | |
| "\n", | |
| "念のため混同行列を確認しておきます。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 27, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style>\n", | |
| " .dataframe thead tr:only-child th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: left;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Negative</th>\n", | |
| " <th>Positive</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>True</th>\n", | |
| " <td>665</td>\n", | |
| " <td>124</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>False</th>\n", | |
| " <td>165</td>\n", | |
| " <td>643</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Negative Positive\n", | |
| "True 665 124\n", | |
| "False 165 643" | |
| ] | |
| }, | |
| "execution_count": 27, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# ロジスティック回帰モデルのテストセットに対する混同行列\n", | |
| "logreg_pred = lgs.predict(X_test)\n", | |
| "\n", | |
| "from sklearn.metrics import confusion_matrix\n", | |
| "confusion = confusion_matrix(Y_test, logreg_pred)\n", | |
| "confusion_df = pd.DataFrame(confusion, columns= ['Negative', 'Positive'], index=['True', 'False'])\n", | |
| "confusion_df" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## 考察\n", | |
| "\n", | |
| "分類に失敗したツイートの傾向を見てみます。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 30, | |
| "metadata": { | |
| "scrolled": true | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style>\n", | |
| " .dataframe thead tr:only-child th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: left;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>uid</th>\n", | |
| " <th>dt</th>\n", | |
| " <th>tweet</th>\n", | |
| " <th>tw_len</th>\n", | |
| " <th>RT</th>\n", | |
| " <th>pred</th>\n", | |
| " <th>match</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>15</th>\n", | |
| " <td>NekoAntarctica</td>\n", | |
| " <td>Fri Mar 23 06:00:06 +0000 2018</td>\n", | |
| " <td>RT @tokyoxxxclub: シモキタを紹介する、画像をつくっよ☝️😉✨ https:...</td>\n", | |
| " <td>63</td>\n", | |
| " <td>True</td>\n", | |
| " <td>nardtree</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>39</th>\n", | |
| " <td>NekoAntarctica</td>\n", | |
| " <td>Thu Mar 22 06:07:17 +0000 2018</td>\n", | |
| " <td>@Sunset_Yuhi 大丈夫かどうかは今後の当局の方針と本人の努力次第でしょう。</td>\n", | |
| " <td>42</td>\n", | |
| " <td>False</td>\n", | |
| " <td>nardtree</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>42</th>\n", | |
| " <td>NekoAntarctica</td>\n", | |
| " <td>Thu Mar 22 05:33:39 +0000 2018</td>\n", | |
| " <td>@Sunset_Yuhi 顧客情報の流出と20代でリスクを取ることに何の関係があるのでしょうか</td>\n", | |
| " <td>47</td>\n", | |
| " <td>False</td>\n", | |
| " <td>nardtree</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>44</th>\n", | |
| " <td>NekoAntarctica</td>\n", | |
| " <td>Wed Mar 21 21:09:49 +0000 2018</td>\n", | |
| " <td>RT @tkf: 何がどうダメかを正確にディスりたいのでMATLABやりたいなって常々おもっている</td>\n", | |
| " <td>49</td>\n", | |
| " <td>True</td>\n", | |
| " <td>nardtree</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>65</th>\n", | |
| " <td>NekoAntarctica</td>\n", | |
| " <td>Wed Mar 21 12:56:27 +0000 2018</td>\n", | |
| " <td>なるほどね https://t.co/Rrx7tXNwcx</td>\n", | |
| " <td>29</td>\n", | |
| " <td>False</td>\n", | |
| " <td>nardtree</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " uid dt \\\n", | |
| "15 NekoAntarctica Fri Mar 23 06:00:06 +0000 2018 \n", | |
| "39 NekoAntarctica Thu Mar 22 06:07:17 +0000 2018 \n", | |
| "42 NekoAntarctica Thu Mar 22 05:33:39 +0000 2018 \n", | |
| "44 NekoAntarctica Wed Mar 21 21:09:49 +0000 2018 \n", | |
| "65 NekoAntarctica Wed Mar 21 12:56:27 +0000 2018 \n", | |
| "\n", | |
| " tweet tw_len RT \\\n", | |
| "15 RT @tokyoxxxclub: シモキタを紹介する、画像をつくっよ☝️😉✨ https:... 63 True \n", | |
| "39 @Sunset_Yuhi 大丈夫かどうかは今後の当局の方針と本人の努力次第でしょう。 42 False \n", | |
| "42 @Sunset_Yuhi 顧客情報の流出と20代でリスクを取ることに何の関係があるのでしょうか 47 False \n", | |
| "44 RT @tkf: 何がどうダメかを正確にディスりたいのでMATLABやりたいなって常々おもっている 49 True \n", | |
| "65 なるほどね https://t.co/Rrx7tXNwcx 29 False \n", | |
| "\n", | |
| " pred match \n", | |
| "15 nardtree False \n", | |
| "39 nardtree False \n", | |
| "42 nardtree False \n", | |
| "44 nardtree False \n", | |
| "65 nardtree False " | |
| ] | |
| }, | |
| "execution_count": 30, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# 分類に失敗したツイートを確認する\n", | |
| "df['pred'] = lgs.predict( x )\n", | |
| "df['match'] = (df['uid'] == df['pred'])\n", | |
| "df_fail = df[df['match'] == False]\n", | |
| "df_fail.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 31, | |
| "metadata": { | |
| "scrolled": true | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style>\n", | |
| " .dataframe thead tr:only-child th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: left;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>uid</th>\n", | |
| " <th>dt</th>\n", | |
| " <th>tweet</th>\n", | |
| " <th>tw_len</th>\n", | |
| " <th>RT</th>\n", | |
| " <th>pred</th>\n", | |
| " <th>match</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>6332</th>\n", | |
| " <td>nardtree</td>\n", | |
| " <td>Sat Feb 03 12:10:52 +0000 2018</td>\n", | |
| " <td>もうダメです…</td>\n", | |
| " <td>7</td>\n", | |
| " <td>False</td>\n", | |
| " <td>NekoAntarctica</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6341</th>\n", | |
| " <td>nardtree</td>\n", | |
| " <td>Sat Feb 03 11:53:30 +0000 2018</td>\n", | |
| " <td>FF外でもこれだけ言ってる刺さらなくていい人に刺さってめんどい</td>\n", | |
| " <td>31</td>\n", | |
| " <td>False</td>\n", | |
| " <td>NekoAntarctica</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6366</th>\n", | |
| " <td>nardtree</td>\n", | |
| " <td>Sat Feb 03 08:39:45 +0000 2018</td>\n", | |
| " <td>RT @A_Researcher: 文系レポートを書くときは次の点を守ってください。 1.自...</td>\n", | |
| " <td>140</td>\n", | |
| " <td>True</td>\n", | |
| " <td>NekoAntarctica</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6370</th>\n", | |
| " <td>nardtree</td>\n", | |
| " <td>Sat Feb 03 06:46:22 +0000 2018</td>\n", | |
| " <td>あほくさ</td>\n", | |
| " <td>4</td>\n", | |
| " <td>False</td>\n", | |
| " <td>NekoAntarctica</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6381</th>\n", | |
| " <td>nardtree</td>\n", | |
| " <td>Sat Feb 03 06:10:25 +0000 2018</td>\n", | |
| " <td>ひどいにほんごだ</td>\n", | |
| " <td>8</td>\n", | |
| " <td>False</td>\n", | |
| " <td>NekoAntarctica</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " uid dt \\\n", | |
| "6332 nardtree Sat Feb 03 12:10:52 +0000 2018 \n", | |
| "6341 nardtree Sat Feb 03 11:53:30 +0000 2018 \n", | |
| "6366 nardtree Sat Feb 03 08:39:45 +0000 2018 \n", | |
| "6370 nardtree Sat Feb 03 06:46:22 +0000 2018 \n", | |
| "6381 nardtree Sat Feb 03 06:10:25 +0000 2018 \n", | |
| "\n", | |
| " tweet tw_len RT \\\n", | |
| "6332 もうダメです… 7 False \n", | |
| "6341 FF外でもこれだけ言ってる刺さらなくていい人に刺さってめんどい 31 False \n", | |
| "6366 RT @A_Researcher: 文系レポートを書くときは次の点を守ってください。 1.自... 140 True \n", | |
| "6370 あほくさ 4 False \n", | |
| "6381 ひどいにほんごだ 8 False \n", | |
| "\n", | |
| " pred match \n", | |
| "6332 NekoAntarctica False \n", | |
| "6341 NekoAntarctica False \n", | |
| "6366 NekoAntarctica False \n", | |
| "6370 NekoAntarctica False \n", | |
| "6381 NekoAntarctica False " | |
| ] | |
| }, | |
| "execution_count": 31, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "df_fail.tail()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "傾向がありそうですね…ちょっと確認してみましょう。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 32, | |
| "metadata": { | |
| "scrolled": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "array([[<matplotlib.axes._subplots.AxesSubplot object at 0x1a17a07278>,\n", | |
| " <matplotlib.axes._subplots.AxesSubplot object at 0x1a17a305f8>],\n", | |
| " [<matplotlib.axes._subplots.AxesSubplot object at 0x1a17971a20>,\n", | |
| " <matplotlib.axes._subplots.AxesSubplot object at 0x1a17ad3d30>]], dtype=object)" | |
| ] | |
| }, | |
| "execution_count": 32, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtgAAAJVCAYAAADk/YIDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3Xt0VNXB/vFnSIAkBELCxEi4yUW5\nGUtLuAkYKiN3kdqKgCAU61urRQHbSrEv2NdSpEpDFS9Fo1ixVWwx8YIoKRJBBCKgYEAuAoqKhJAI\nhCTFJPv3hz+mDAnMTLInOYnfz1pZiznZc85zzgzZT07OzLiMMUYAAAAArGhQ2wEAAACA+oSCDQAA\nAFhEwQYAAAAsomADAAAAFlGwAQAAAIso2AAAAIBFFOxaVFhYqFatWik7Ozsk67/vvvvUqVOnkKy7\nLqvLx2XAgAG67bbbrK1v//79crvdOnLkiLV1ArCDOaJ2fFePS2lpqTp16qTVq1fXdpR6gYJdixYs\nWKDk5GT16tXLu8zlciksLEzbtm3zGbt06VKFh4fXdEQfo0aNUlhYmF555ZUq3X/ZsmVyuVyWU53f\n+vXr5XK5dPDgQZ/lv/rVr7Rx48Yay3HGlClT5HK5Kny98MILNZ7ljA4dOuj666/X3Llzay0DgMox\nR4SWk+aIyuaGs78uueSSkGcIDw/XnDlzdPfdd4uPSKk+CnYtKSkp0eOPP66f//znFb7XuHFjzZw5\nsxZSnd+hQ4e0Zs0a/epXv9KSJUtqO45Onz5d5ftGR0fL7XZbTBO4gQMH6vDhwz5fY8aMqZUsZ/zs\nZz/T3/72NxUUFNRqDgD/xRxRPXVtjjh7TsjIyJAkbd682bvsfH/FqM5+VuaGG27Qp59+qn//+99W\n1/tdRMGuJatWrVJxcbGGDBlS4Xt33XWX1q1bp5dffvmC69iyZYuGDBmi6OhoxcfH6/rrr9enn356\n3vH5+fnq37+/UlJS9PXXX0uSdu/erZEjRyo6OlrR0dG69tprtW/fvgr3feqppzRs2DBNnz5dq1ev\n1qFDh3y+f+ZPahkZGerSpYuaNGmiH/7wh/rkk08kSWvXrtWkSZMk/fc39SlTpkiSVq9erUGDBiku\nLk4xMTFKSUnR5s2bfdbvcrn08MMPa8KECYqJidFNN90kScrNzdVPf/pTJSQkKCIiQp07d9bTTz+t\ngwcPauDAgZKk9u3by+VyadCgQT5Zz5aZmamBAwcqKirKm+FM9q1bt2r48OG66KKLFB0drV69emnV\nqlUXfGzOp1GjRrr44ot9viIiIiRJ2dnZGjp0qOLj49W0aVP17t1bb7311gXX98477+jKK69U06ZN\n1axZM/Xo0UOZmZne73/11Ve6+eabvescMGCA1q9f77OO3r17KzY2Vv/617+qtE8A7GOO+G7NEWfP\nCXFxcZKk+Ph477L4+HjvuN///vf6n//5H8XFxWnw4MEqKSmRy+XSP//5T591nntJ4enTp3Xvvfeq\nXbt2ioyM1OWXX65nnnnG5z6RkZEaNmyYli1bFlR+VETBriVZWVn6/ve/X+mf9Lp3766f/exn+s1v\nfnPe30537typlJQU9evXT++//77WrFmjsLAwXXPNNSopKakw/rPPPtOAAQPUsmVLvfXWW2revLn3\nh3dJSYmysrKUlZWlwsJCDRs2zGe7ZWVlSktL05QpU9SyZUsNHjxYaWlpFbZx+PBhPf7443r++ee1\nYcMGff3115o6daok6corr9TixYu94w4fPqy//OUvkr69zvCOO+7Qxo0btWHDBl166aUaNmyYjh07\n5rP+3//+9+rXr5+2bt2qefPmqbi4WCkpKfrwww/1/PPPa+fOnXrkkUcUFRWlNm3aVDgLsGLFikqP\nZWZmpoYOHaqePXvqvffe06ZNm3TzzTfrm2++kSSdOHFC48aN09q1a7V161YNHTpUo0eP1p49eypd\nX1WdPHlSN910k7KysrRlyxYNHjz4vJOZJH3zzTe69tpr1b9/f23btk1btmzRnDlzFBkZKUkqKipS\nSkqKSkpKtGrVKm3btk1DhgyRx+OpkL1Pnz56++23re4PgKpjjmCOOJ+FCxeqXbt22rRpU1B/Lbj5\n5pv1xhtv6Omnn9bOnTs1e/Zs3XnnnXr++ed9xjEfWGJQK6677jozduzYCsslmeeee84cOXLENGvW\nzCxcuNAYY8wzzzxjwsLCvOMmT55sbrzxRp/7lpSUmMjISPPyyy8bY4yZO3eu6dixo/nwww9NYmKi\nuf32201ZWZl3/FNPPWUiIyPN0aNHvcu++uorExERYZ599lnvsvT0dBMfH29Onz5tjDHmxRdfNK1b\ntzalpaXeMXPnzjVhYWEmNzfXu+wf//iHcblcpri42BhjzHPPPWcCecqVlZWZ5s2bm2XLlvkcl6lT\np/qMe+qpp0zjxo3NoUOHKl3PunXrjCRz4MABn+VnjssZAwYMMCNHjvSb62xXXHGF+cMf/hDUfSZP\nnmzCwsJMkyZNvF8dOnS44H26detmHnjgAe/t/v37m5///OfGGGNyc3ONJLNu3bpK7/vkk0+atm3b\n+jxOxhgzcOBAc/fdd/ssmzZtmunbt29Q+wMgdJgjzq++zhH+chljTEJCghkxYoTPsuLiYiPJvPTS\nSz7Lz54vdu3aZSSZ/fv3+4z57W9/a/r06eOz7MUXXzQul8t88803VcqPb3EGu5YUFxd7Lw2ozEUX\nXaTZs2fr/vvvr/BbuvTt5QQvv/yy98920dHRatGihUpKSrR3717vuKNHj+qqq67S+PHj9eijj6pB\ng/8+5Dk5OerWrZvPtWYJCQnq3LmzcnJyvMv++te/asKECWrYsKEk6brrrtOpU6f0xhtv+GRKTEz0\n/hlLklq1aiVjjHJzcy94LA4cOKBJkyapU6dOatasmZo1a6bjx49X+FNm7969fW5v2bJF3bp1U+vW\nrS+4fn/O/Bn1fI4eParbb79dXbp0UfPmzRUdHa2cnJwL/qn1fPr06aMPPvjA+3X2dW65ubn6xS9+\noc6dO3u38/HHH593O/Hx8ZoyZYo8Ho9GjBihBQsW+Dz22dnZ+uKLLxQTE+PzPHnvvfd8xklSRESE\niouLg94fAKHBHPFf36U5IhDn7mcgzlzDnZSU5POc+POf/1zpfGCMqfQvHQhc7b7k+DssPj5e+fn5\nFxwzffp0/fWvf9V9992nnj17+nyvvLxckyZN0qxZsyrcr0WLFt5/N2/eXFdccYUyMjI0ffr0Cj9o\nKnvFtjHGu/yzzz7Tm2++qTfffNP75zvp2z8JLlmyRKNGjfIua9SoUaXrLi8vv+B+jho1Sm63W48+\n+qjatGmjRo0aacCAARX+9NmkSZMK97X1ivMLrWfKlCn67LPP9Kc//Unt27dXZGSkxo0bV6UXl0RG\nRp737Z8mTZqkr776Sg8++KB3Oz/5yU8uuJ1nnnlGM2fO1FtvvaXVq1frd7/7nZ544gndcsstKi8v\n1+WXX17hujyp4rHMz8/3mfgA1C7miP/6Ls0RgTh3P8/8UmTOeeePM5ewSN8eY5fLpezsbO8vQufe\n/4z8/HxFREQoOjraZuzvHM5g15If/OAHPmcAKtO4cWM98MADeuKJJ/Txxx/7fC85OVnbt29Xx44d\n1alTJ5+v2NhY77iGDRtqxYoVSkpKUkpKis9v1N27d1dOTo7y8vK8y44cOaI9e/aoe/fukqQnn3xS\nXbt21Ycffuhz5vWll17SypUr9cUXXwS8z2d+uJaVlXmXHTt2TDt37tSsWbM0dOhQdevWTREREX7P\naEhSz549lZOTo88//zzg7Z1vPW+++eZ5v//OO+/o9ttv1+jRo5WUlKSWLVtq//79fvMF65133tEv\nf/lL73YSEhIqvH1UZZKSknT33Xdr1apVmjx5sveavOTkZH3yySdq3rx5hedIy5YtfdaxY8cOJScn\nW98nAFXDHPEt5gj/GjVqpJiYGH355ZfeZUVFRdq9e7f3dnJysowx+uKLLyo8Hzp06OCzPuYDOyjY\ntWT48OE6cOBAhVdan2vs2LHq06ePHn74YZ/ls2fP1q5duzRx4kRt3rxZBw4c0Ntvv6277rqrwn/s\nhg0bavny5UpOTlZKSor3+xMmTFB8fLxuvPFGbd26VVu2bNG4cePUqlUr3XjjjSotLdXTTz+tG2+8\nUZdffrnP109+8hO1bt260heynE/79u0lSa+88oqOHj2qwsJCxcbGKj4+Xk8++aT27Nmj9957T+PH\nj/e+UO9Cxo8fr3bt2mn06NHKzMzUgQMH9O9//1svvviiJKldu3Zq0KCBVq5cqdzcXB0/frzS9fzv\n//6v3njjDU2fPl3bt2/X7t27tXTpUu8Pp86dO+v555/Xjh079MEHH2j8+PF+fyBXRefOnbVs2TJ9\n9NFH2rZtm8aNG3fBMzu7d+/Wb3/7W7377rv69NNPtWHDBr377rvq1q2bpG/PiLdp00YjR47U6tWr\ndfDgQW3atEl//OMf9eqrr3rXc/z4cW3btk0jR460vk8AqoY5gjkiGB6PR4sXL9amTZu0Y8cO3Xzz\nzT7zR/fu3TVhwgRNmTJFf//73/XJJ5/ogw8+0FNPPaWFCxf6rGvt2rXMBxZQsGtJ165dNWjQID33\n3HN+x6ampla4Fqpr167asGGDCgsLvb/V33rrrSouLlbz5s0rrCM8PFx///vfNWDAAKWkpGjv3r2K\njIzUW2+9pcaNG+uqq65SSkqKmjRpolWrVqlRo0Z69dVX9eWXX2rs2LGV5rrhhhuUlpbm9897Z/Tq\n1Ut33XWXbrvtNiUkJOiXv/ylGjRooJdeekmffPKJrrjiCk2ZMkXTp0+vcIa1MlFRUcrKytLll1+u\ncePGqWvXrrrjjju81xInJCRo/vz5euCBB9SyZUtdd911la5nyJAhWrlypTZt2qQ+ffqod+/eevbZ\nZ71/RnvmmWdUXl6u3r17a8yYMRo2bJjPBz9I376tU3X/FPnss8/qP//5j3r16qXrr79eo0eP1g9+\n8IPzjj9zjfbYsWN12WWX6YYbbtBVV13lfeV9VFSU3nnnHfXo0UOTJ0/WZZddph//+MfasmWL2rZt\n613P8uXLdemll2rAgAHVyg/AHuYI5ohgLFq0SJ06dZLH49GoUaM0fPhwXXHFFT5jnn32Wf3iF7/Q\nfffdp65du+qaa67R888/r44dO3rH7Nq1Sx999JF++tOfhizrd4XLnHvRDmrMunXrNG7cOO3du1dR\nUVG1HQfVcPPNN+urr77y+77VTlNWVqakpCTdf//9+vGPf1zbcQCchTmi/qgrc8TUqVMVExOj1NTU\n2o5S54Xdd99999V2iO+qdu3aqWnTpmratKkuuuii2o6DKiovL9e0adO0fPlynxcP1QWHDh1SZGSk\nbrnlltqOAuAczBH1Q12ZI0pLS5WTk6Pf/OY3F3wHGwSGM9gAAACARVyDDQAAAFhEwQYAAAAsomAD\nAAAAFlGwAQAAAItq/KPSz/6kofNxu90+nxzlJE7OJjk7n5OzSc7O5+RsUv3Ml5iYGKI0qIy/uaE+\nPsdqipOzSeSrDidnk5ydr6rZAp0bOIMNAAAAWETBBgAAACyiYAMAAAAWUbABAAAAiyjYAAAAgEUU\nbAAAAMAiCjYAAABgEQUbAAAAsIiCDQAAAFhEwQYAAAAsomADAAAAFlGwAQAAAIvCAxl0xx13KCIi\nQg0aNFBYWJgeeOABFRYWKjU1VUePHlV8fLxmzJih6OjoUOcFAAAAHC2ggi1Jc+fOVbNmzby309PT\nlZSUpDFjxig9PV3p6emaOHFiSEICAAAAdUWVLxHJzs5WSkqKJCklJUXZ2dnWQgEAAAB1VcBnsOfN\nmydJuuaaa+TxeHT8+HHFxsZKkmJjY3XixInQJAQAAADqkIAK9v3336+4uDgdP35cf/jDH5SYmBjw\nBjIzM5WRkaGioiKlpaXJ7Xb7DxUeHtC42uDkbJKz8zk5m+TsfE7OJpEPwQt2bnD6Y+jkfE7OJpGv\nOpycTXJ2vlBnC6hgx8XFSZJiYmLUq1cv7du3TzExMSooKFBsbKwKCgp8rs8+m8fjkcfj8d7Oy8vz\nuz232x3QuNrg5GySs/M5OZvk7HxOzibVz3zBnEhA8IKdG+rjc6ymODmbRL7qcHI2ydn5qpot0LnB\n7zXYJSUlKi4u9v57+/btatu2rZKTk5WVlSVJysrKUq9evYIOCQAAANQ3fs9gHz9+XA899JAkqays\nTAMGDFCPHj3UsWNHpaamas2aNXK73Zo5c2bIwwIAAABO57dgJyQk6MEHH6ywvGnTppozZ05IQgEA\nAAB1FZ/kCAAAAFhEwQYAAAAsomADAAAAFlGwAQAAAIso2AAAAIBFFGwAAADAIgo2AAAAYBEFGwAA\nALCIgg0AAABYRMEGAAAALKJgAwAAABZRsAEAAACLKNgAAACARRRsAAAAwCIKNgAAAGARBRsAAACw\niIINAAAAWETBBgAAACyiYAMAAAAWUbABAAAAiyjYAAAAgEUUbAAAAMAiCjYAAABgEQUbAAAAsIiC\nDQAAAFhEwQYAAAAsomADAAAAFlGwAQAAAIso2AAAAIBFFGwAAADAIgo2AAAAYFF4oAPLy8s1a9Ys\nxcXFadasWcrNzdWiRYtUWFio9u3ba9q0aQoPD3h1AAAAQL0U8BnslStXqlWrVt7by5Yt08iRI/Xw\nww+rSZMmWrNmTUgCAgAAAHVJQAX72LFj2rp1qwYPHixJMsYoJydHffv2lSQNGjRI2dnZoUsJAAAA\n1BEBFeylS5dq4sSJcrlckqSTJ08qKipKYWFhkqS4uDjl5+eHLiUAAABQR/i9aHrLli2KiYlRhw4d\nlJOTE/QGMjMzlZGRoaKiIqWlpcntdvsPFR4e0Lja4ORskrPzOTmb5Ox8Ts4mkQ/BC3ZucPpj6OR8\nTs4mka86nJxNcna+UGfzW7B3796t999/X9u2bdPp06dVXFyspUuXqqioSGVlZQoLC1N+fr7i4uIq\nvb/H45HH4/HezsvL8xvK7XYHNK42ODmb5Ox8Ts4mOTufk7NJ9TNfYmJiiNJACn5uqI/PsZri5GwS\n+arDydkkZ+erarZA5wa/BXvChAmaMGGCJCknJ0evvvqq7rzzTv35z3/Wxo0b1b9/f61du1bJyclB\nhwQAAADqmyq/D/ZNN92k1157TdOmTVNhYaGuvvpqm7kAAACAOimoN67u3r27unfvLklKSEjQ/Pnz\nQxIKAAAAKLt1dGhW/PKG0Kz3/+OTHAEAAACLKNgAAACARRRsAAAAwCIKNgAAAGARBRsAAACwiIIN\nAAAAWETBBgAAACyiYAMAAAAWUbABAAAAiyjYAAAAgEUUbAAAAMAiCjYAAABgEQUbAAAAsIiCDQAA\nAFhEwQYAAAAsomADAAAAFlGwAQAAAIso2AAAAIBFFGwAAADAIgo2AAAAYBEFGwAAALCIgg0AAABY\nRMEGAAAALKJgAwAAABZRsAEAAACLKNgAAACARRRsAAAAwCIKNgAAAGARBRsAAACwiIINAAAAWETB\nBgAAACwK9zfg9OnTmjt3rkpLS1VWVqa+fftq7Nixys3N1aJFi1RYWKj27dtr2rRpCg/3uzoAAACg\nXvPbiBs2bKi5c+cqIiJCpaWlmjNnjnr06KHXXntNI0eOVP/+/bVkyRKtWbNGQ4YMqYnMAAAAgGP5\nvUTE5XIpIiJCklRWVqaysjK5XC7l5OSob9++kqRBgwYpOzs7tEkBAACAOiCgazrKy8t1zz336Kuv\nvtLQoUOVkJCgqKgohYWFSZLi4uKUn59f6X0zMzOVkZGhoqIipaWlye12+w8VHh7QuNrg5GySs/M5\nOZvk7HxOziaRD8ELdm5w+mPo5HxOziaRrzqcnE2yk++IpSznCvWxC6hgN2jQQA8++KBOnTqlhx56\nSF988UXAG/B4PPJ4PN7beXl5fu/jdrsDGlcbnJxNcnY+J2eTnJ3Pydmk+pkvMTExRGkgBT831Mfn\nWE1xcjaJfNXh5GySs/OVlpZWKVugc0NQ7yLSpEkTdevWTXv37lVRUZHKysokSfn5+YqLiws6JAAA\nAFDf+C3YJ06c0KlTpyR9+44iO3bsUKtWrdS9e3dt3LhRkrR27VolJyeHNikAAABQB/i9RKSgoECP\nPvqoysvLZYxRv3791LNnT7Vu3VqLFi3SCy+8oPbt2+vqq6+uibwAAACAo/kt2O3atdOf/vSnCssT\nEhI0f/78kIQCAAAA6io+yREAAACwiIINAAAAWETBBgAAACyiYAMAAAAWUbABAAAAiyjYAAAAgEUU\nbAAAAMAiCjYAAABgEQUbAAAAsIiCDQAAAFhEwQYAAAAsomADAAAAFlGwAQAAAIso2AAAAIBFFGwA\nAADAIgo2AAAAYBEFGwAAALCIgg0AAABYRMEGAAAALKJgAwAAABZRsAEAAACLKNgAAACARRRsAAAA\nwCIKNgAAAGARBRsAAACwiIINAAAAWETBBgAAACyiYAMAAAAWUbABAAAAiyjYAAAAgEXh/gbk5eXp\n0Ucf1ddffy2XyyWPx6MRI0aosLBQqampOnr0qOLj4zVjxgxFR0fXRGYAAADAsfwW7LCwME2aNEkd\nOnRQcXGxZs2apSuuuEJr165VUlKSxowZo/T0dKWnp2vixIk1kRkAAABwLL+XiMTGxqpDhw6SpMjI\nSLVq1Ur5+fnKzs5WSkqKJCklJUXZ2dmhTQoAAADUAUFdg52bm6sDBw6oU6dOOn78uGJjYyV9W8JP\nnDgRkoAAAABAXeL3EpEzSkpKtHDhQk2ZMkVRUVEBbyAzM1MZGRkqKipSWlqa3G63/1Dh4QGNqw1O\nziY5O5+Ts0nOzufkbBL5ELxg5wanP4ZOzlfdbEd+dKXFNL4SXt7g6GMn1e/HNtRs5DtiKcu5Qn3s\nAirYpaWlWrhwoQYOHKg+ffpIkmJiYlRQUKDY2FgVFBSoWbNmld7X4/HI4/F4b+fl5fndntvtDmhc\nbXByNsnZ+ZycTXJ2Pidnk+pnvsTExBClgRT83FAfn2M1xcnZ8vLyHJ1Pcvbxc3I2ydn5SktLq5Qt\n0LnB7yUixhg98cQTatWqlUaNGuVdnpycrKysLElSVlaWevXqFXRIAAAAoL7xewZ79+7deuedd9S2\nbVv9+te/liSNHz9eY8aMUWpqqtasWSO3262ZM2eGPCwAAADgdH4LdpcuXbR8+fJKvzdnzhzrgQAA\nAIC6jE9yBAAAACyiYAMAAAAWUbABAAAAiyjYAAAAgEUUbAAAAMAiCjYAAABgEQUbAAAAsIiCDQAA\nAFhEwQYAAAAsomADAAAAFlGwAQAAAIvCaztAXVd26+ga2U7Yk6/UyHYAAABQPZzBBgAAACyiYAMA\nAAAWUbABAAAAiyjYAAAAgEUUbAAAAMAiCjYAAABgEQUbAAAAsIiCDQAAAFhEwQYAAAAsomADAAAA\nFlGwAQAAAIso2AAAAIBFFGwAAADAIgo2AAAAYBEFGwAAALCIgg0AAABYRMEGAAAALKJgAwAAABaF\n13YABKbs1tEBjTtSze2EPflKNdcAAED9FuicHCzm4PrDb8F+7LHHtHXrVsXExGjhwoWSpMLCQqWm\npuro0aOKj4/XjBkzFB0dHfKwAAAAgNP5vURk0KBBmj17ts+y9PR0JSUl6eGHH1ZSUpLS09NDFhAA\nAACoS/wW7G7dulU4O52dna2UlBRJUkpKirKzs0OTDgAAAKhjqnQN9vHjxxUbGytJio2N1YkTJ847\nNjMzUxkZGSoqKlJaWprcbrf/UOHhAY27kCM/urJa9z/vekOyVueo7nG/EBuPayg5OZ+Ts0nkQ/CC\nnRuc/hg6OV91s4Vy3nO73Y4+dlLlxy9UxyTY41AXj12wQnWsQ33sQv4iR4/HI4/H472dl5fn9z5u\ntzugcbAvlMfd6Y+rk/M5OZtUP/MlJiaGKA2k4OeG+vgcqylOzpaXl+fofFLNHr9gt8Oxq7rS0tIq\nZQt0bqjS2/TFxMSooKBAklRQUKBmzZpVZTUAAABAvVOlgp2cnKysrCxJUlZWlnr16mU1FAAAAFBX\n+b1EZNGiRdq5c6dOnjyp2267TWPHjtWYMWOUmpqqNWvWyO12a+bMmTWRFTUgVO/tKfleR8V7fQIA\n4CvYOTiY65OZd2uW34I9ffr0SpfPmTPHehgAAACgruOj0gEAAACLKNgAAACARRRsAAAAwCIKNgAA\nAGARBRsAAACwiIINAAAAWBTyj0oHgPMJ5fuu+3h5Q81sB6glF/q/FMx7JQOwgzPYAAAAgEUUbAAA\nAMAiCjYAAABgEddgAwBQQ2rsdQcAahVnsAEAAACLKNgAAACARRRsAAAAwCIKNgAAAGARBRsAAACw\niIINAAAAWETBBgAAACzifbBRK5z4XrBHqnHfsCdfsZYDAL4rym4dXa2fvTXB6fkCVRvzbn05dlXB\nGWwAAADAIgo2AAAAYBEFGwAAALCIa7ABC0J9bVtNX8fGNeUAAFQdZ7ABAAAAiyjYAAAAgEUUbAAA\nAMAiCjYAAABgEQUbAAAAsIiCDQAAAFhEwQYAAAAsqtb7YH/wwQd65plnVF5ersGDB2vMmDG2cgGo\nRcG+r3dNv083AABOVuUz2OXl5UpLS9Ps2bOVmpqqd999V59//rnNbAAAAECdU+WCvW/fPl188cVK\nSEhQeHi4rrzySmVnZ9vMBgAAANQ5VS7Y+fn5atGihfd2ixYtlJ+fbyUUAAAAUFdV+RpsY0yFZS6X\nq8KyzMxMZWRkqKioSGlpaUpMTAxo/YGOO6/X36/e/QHUK9X+mQKrqjI3OP0xDCgfcxPgGKH8mVLl\nM9gtWrTQsWPHvLePHTum2NjYCuM8Ho8eeeQRpaWlBbzuW265paqxQs7J2SRn53NyNsnZ+ZycTSIf\nghfs3OD0x9DJ+ZycTSJfdTg5m+TsfKHOVuWC3bFjRx0+fFi5ubkqLS3Vhg0blJycbCVUVFSUlfWE\ngpOzSc7O5+RskrPzOTmbRD6EntMfQyfnc3I2iXzV4eRskrPzhTpblS8RCQsL09SpUzVv3jyVl5fr\nhz/8odq0aWMlVJMmTaysJxScnE1ydj4nZ5Ocnc/J2STyIfSc/hg6OZ+Ts0nkqw4nZ5OcnS/U2cLu\nu++++6p655YtW2r48OEaMWI9n0j9AAAgAElEQVSEunbtajGW1KFDB6vrs8nJ2SRn53NyNsnZ+Zyc\nTSIfQs/pj6GT8zk5m0S+6nByNsnZ+UKZzWUqe7UiAAAAgCrho9IBAAAAiyjYAAAAgEUUbAAAAMAi\nCjYAAABgEQUbAAAAsIiCDQAAAFhEwQYAAAAsomADAAAAFlGwAQAAAIso2AAAAIBFFGwAAADAIgo2\nAAAAYBEFGwAAALCIgg0AAABYRMEGAAAALKJgAwAAABZRsAEAAACLKNgAAACARRRsAAAAwCIKNgAA\nAGARBRsAAACwiIINAAAAWETBBgAAACyiYAMAAAAWUbABAAAAiyjYAAAAgEUUbAAAAMAiCjYAAABg\nEQUbAAAAsIiCDQAAAFhEwQYAAAAsomADAAAAFlGwAQAAAIso2AAAAIBFFGwAAADAIgo2AAAAYBEF\nGwAAALCIgg0AAABYRMEGAAAALKJgAwAAABZRsAEAAACLKNgAAACARRRsAAAAwCIKNgAAAGARBRsA\nAACwiIINAAAAWETBBgAAACyiYAMAAAAWUbABAAAAiyjYAAAAgEUUbAAAAMAiCjYAAABgEQUbAAAA\nsIiCDQAAAFhEwQYAAAAsomADAAAAFlGwAQAAAIso2AAAAIBFFGwAAADAIgo2AAAAYBEFGwAAALCI\ngg0AAABYRMEGAAAALKJgAwAAABZRsAEAAACLKNgAAACARRRsAAAAwCIKNgAAAGARBRsAAACwiIIN\nAAAAWETBBgAAACyiYAMAAAAWUbABAAAAiyjYAAAAgEUUbAAAAMAiCjYAAABgEQUbAAAAsIiCDQAA\nAFhEwQYAAAAsomADAAAAFlGwAQAAAIso2AAAAIBFFGwAAADAIgo2AAAAYBEFGwAAALCIgl2PFRYW\nqlWrVsrOzq61DAcPHpTL5dL69etrLUNNat26tR544AFr61u3bp0uueQSlZSUWFsnAEjMEXVNQUGB\n4uPjtWvXrtqOggBQsOuxBQsWKDk5Wb169artKF7r16+Xy+XSwYMHaztKBYMGDZLL5arwtXHjxlrL\nNHDgQF122WVatGhRrWUAUD8xRwTmzC8BF/oaNGhQyHPExsZq2rRp+vWvfx3ybaH6KNj1VElJiR5/\n/HH9/Oc/r5HtnT592ur6vvnmGxljrK4zEBMmTNDhw4d9vnr27FnjOc72s5/9TIsXL1ZpaWmt5gBQ\nfzBHBK5NmzY+c8LixYslyWfZihUrKr2v7f2eOnWqVq1apb1791pdL+yjYNdTq1atUnFxsYYMGeJd\ndua38OXLl+vaa69VVFSUOnTooOeee87nvn/5y1/Uo0cPRUdH6+KLL9a4ceN0+PBh7/fXrl0rl8ul\n119/XQMGDFBERISWLFkiSVq+fLk6deqkiIgIXXnlldq+fbvP9gcOHChJat++vc9v/VOmTJHH49Ej\njzyiSy65RI0bN9apU6ckSY888oi6dOmiiIgIXXrppZo3b55P2SwtLdV9992n9u3bKyIiQt27d9df\n//rXKh23yMhIXXzxxT5fDRs29B7TlJQUxcXFqXnz5ho0aJDef//9C65vxYoV6tGjh6KiotS8eXP1\n7dvX55js2bNHP/rRj9S8eXPFxsZq6NChysnJ8VnHqFGjdOTIEa1du7ZK+wQA52KOCHyOCAsL85kT\nYmJiJMlnWVxcnEpKSuRyufT4449r7Nixatq0qaZOnaqPP/5YLperwnxx7iWFJ06c0B133KGWLVuq\nSZMmSk5O1quvvlrhPj179tTzzz8fcH7UEoN6afr06aZ///4+yw4cOGAkmfbt25sXX3zR7N2719xz\nzz0mLCzM7Nmzxztu0aJFZvXq1Wb//v1mw4YNpl+/fuaqq67yfv/tt982kkznzp1NRkaG2b9/vzl0\n6JDZunWrcblcZtasWebjjz82//rXv8wll1xiJJl169aZ0tJSk5GRYSSZzZs3m8OHD5tjx44ZY4yZ\nPHmyadq0qRkzZozZtm2b2b59u/nmm2/M3LlzTdu2bc2KFSvM/v37zeuvv27atGljfve733nzTJ48\n2SQlJZk333zT7N+/37zwwgsmJibGPPXUU0Eds5SUFHPLLbec9/v//Oc/zUsvvWR2795tPvroIzNl\nyhTTokULk5+f7x3TqlUrM3/+fGOMMZ9//rkJDw83CxcuNPv37zc7d+40y5YtMx999JExxpgvv/zS\nxMfHmzvuuMNs377d7Nq1y9x2223G7XabvLw8n21///vfN7Nnzw5qfwDgfJgjgp8jznjuuedMZfWp\nuLjYSDJut9s8/vjjZt++fWbv3r1m165dRpLJzs72GX/2fFFWVmauvPJKM3jwYPPuu++affv2mcWL\nF5vw8HCzbt06n/tNmzbN53jDmSjY9dR1111nxo4d67PszA/PhQsXepd98803pkmTJuaJJ54477q2\nbt1qJJnPP//cGPPfH55/+9vffMbddNNNpl+/fj7LHnnkEe8PT2OMWbdunZFkDhw44DNu8uTJJiYm\nxpw8edK77NSpUyYyMtK88cYbPmOfffZZExMTY4wxZv/+/cblcpldu3b5jPn9739vvve97513nyqT\nkpJiwsPDTZMmTbxfP/zhD887vrS01DRt2tS88MIL3mVn/8DcvHmzkWQOHTpU6f3vvffeChNceXm5\nadeunXnkkUd8ll977bVm3LhxQe0PAJwPc0Twc8QZ/gr27bff7rM8kIL9xhtvmKioKFNYWOgzZvz4\n8ebGG2/0WbZgwQLTunXrKmVHzQmvsVPlqFHFxcXeP2Odq0ePHt5/h4eHKyEhQUeOHPEuW7t2rebP\nn6+dO3fq66+/Vnl5uSTp008/VatWrbzjevfu7bPenTt3avDgwT7LBgwYEHDmrl27Kjo62ns7JydH\nxcXF+vGPfyyXy+VdXlZWppKSEh09elTvv/++jDFKTk72WVdpaanCwsIC3vYZP/rRj/THP/7Rezsi\nIsL7708++URz587Vxo0blZubq/LychUVFenTTz+tdF3f//735fF41LVrV11zzTUaNGiQrr/+erVu\n3VqSlJ2drU2bNvnss/TtY3fu9XUREREqLi4Oen8AoDLMEVWbIwJx7n4HIjs7W8XFxUpISPBZfvr0\naSUlJfksYz6oGyjY9VR8fLzy8/Mr/V6jRo18brtcLu8PyM8++0wjRozQpEmTNGfOHLndbn3++efy\neDwVXqzRpEkTn9vGGJ8fcsE6d31nMr300ku67LLLKoyPi4vzjtmwYYOioqIq7FewmjVrpk6dOlX6\nvREjRigxMVGPPfaYWrdurUaNGqlfv37nfRFLeHi43nrrLW3evFmZmZlavny57rnnHq1YsULDhw9X\neXm5hg4dWuk7hJw78eXn56t9+/ZB7w8AVIY5ompzRFVyNmjw7cvdzDkvyvzmm2+8/y4vL9dFF11U\n6dsVNm7c2Od2fn6+4uPjbcVFiFCw66kf/OAH3lc6B+PMb9GLFi1SZGSkJGnLli0B3bd79+569913\nfZade/vMD+6ysrKA1hcREaH9+/drxIgRlY458w4fn332mUaNGhVQzqo4cuSI9uzZo8WLF+uaa66R\n9O3Zmry8vAvez+VyqU+fPurTp4/uvfdeeTweLV26VMOHD1dycrL+8Y9/qE2bNhV+gJ7ro48+0g03\n3GBtfwB8tzFH1JyLLrpIkvTll196l33xxRfKzc313k5OTlZubq6MMbr00ksvuL4dO3ZUOCMP5+Fd\nROqp4cOH68CBAzp06FBQ97v00kvlcrm0cOFCHThwQOnp6fq///u/gO47Y8YMvffee7r33nu1Z88e\nvfzyy1q4cKHPmHbt2qlBgwZauXKlcnNzdfz48fOuLzo6WrNnz9bs2bO1ePFi7d69Wzk5OXrhhRd0\nzz33SJI6deqkqVOn6tZbb9Vzzz2nffv26cMPP9TTTz+tBQsWBLXvF+J2uxUXF6clS5Zoz5492rBh\ng2666SbvBFOZdevWad68edq8ebM+++wzrV69Wh999JG6desmSbrzzjtVUlKiMWPGaP369Tp48KDW\nr1+v2bNna9OmTd717Nq1S0ePHtWwYcOs7Q+A7zbmCLtzxIU0b95cPXv21Pz587Vjxw5lZ2dr8uTJ\nPpcgDh8+XAMGDNDo0aP1yiuv6MCBA3r//fe1aNEiLV261DuurKxM69ev18iRI2skO6qhNi8AR2gN\nGjTIzJs3z3v7zAtYzn1FcseOHc3cuXO9txcvXmxat25tIiIiTP/+/c0bb7xhJJm3337bGPPfF7BU\n9uK9f/zjH6ZDhw6mUaNGpnfv3iY9Pb3CNhcsWGASExNNgwYNTEpKijHm2xewDB48uNL9eOqpp8z3\nvvc907hxY9O8eXPTu3dv89hjj3m/X1paahYsWGA6d+5sGjZsaFq0aGGuuuoqs3z5cu+YyZMnm3bt\n2l3wePl7F5F///vf5vLLLzeNGzc2Xbp0MStWrDDt2rUz999/v3fM2S9a2b59uxk2bJi56KKLTKNG\njUy7du3Mb37zG3P69Gnv+AMHDpjx48cbt9vtHTNx4kRz8OBB75jZs2ebESNGXDA7AASLOSK4OeIM\nfy9yfOmllyp8Lycnx/Tv399ERkaayy67zLz66qs+84UxxhQWFpq7777btG3b1jRs2NAkJCSY4cOH\nm6ysLO+YlStXmvj4ePOf//wnoKyoPS5jauHTPFAj1q1bp3Hjxmnv3r0Vrj37rrnqqqvUtWvXKr8/\n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\n8Kp0AAAAwEc02AAAAICPYn7I0S/nzp1TY2OjQqGQ4uLiNGPGDOXm5iorK8t1NACAI9QGAJOZ0zXY\n9fX1OnTokJYuXapAICBp4A2Rg8eKi4tdRQMAOEJtADDZOb2C3dDQoK1bt2ratKExioqKVF5e7nwS\nDYfDqqurU2Njo3799QIbllkAAAf1SURBVFdJUmpqqnJzc1VcXOx0+5n+/n599tln+uqrr/TLL78M\nucLzyCOPDBvTiWZ57CT74zfowoULQ67gpaWluY4kaeBNridOnBiSLTs7+x/f5uqK1bHDlVEbYmd9\nbmPsxs7y3Ga9Nkzk2Dm9gl1WVqbKykrNnDlzyPHOzk5t3rxZ27dvd5RsQFVVlXJycvTwww9HT8KF\nCxf0+eefq7W1Va+88oqzbG+++aaSk5OVn5+vYDAoaeBtml988YUuXryo559/3lk2yfbYSfbH79Sp\nU9q9e7fC4XD0Cl5XV5eSk5NVUlLidNujb775Rnv27FFGRsaQbOfPn9fq1at1zz33OMsm2R47jA61\nIXbW5zbGLnbW5zbLtcHJ2HkONTc3e6WlpV5VVZW3c+dOb+fOnd7mzZu90tJSr7m52WU0z/M8b926\ndTF9byJYznalDOS7soqKCu/48ePDjn/33XdeRUWFg0SXlZWVee3t7cOOt7e3e2VlZQ4SDWV57DA6\n1IbYWc52pQyu81nO5nn25zbLtcHF2Dm937FgwQJt3749ejtBkgKBgLKzsxUf736Dk5kzZ+rAgQPK\nz88f9pf2DTfc4DRbSkqKjhw5osWLF0fHKhKJ6OjRo86XX0i2x06yP369vb26/fbbhx2fN2+eenp6\nHCS6rL+/P3p1568CgYD6+vocJBrK8thhdKgNsbM+tzF2sbM+t1muDS7GjhfNjODixYuqr69XU1OT\nuru7JUlpaWm67777VFxcrJSUFGfZOjo69OGHH+rYsWNKSUmR53kKh8PKycnRypUrlZ6e7iybZHvs\npMvj9+2330Ynzt9//93M+O3du1ft7e3/eKsyPT1dJSUlzrLV1dXpyJEjysvLixbEn3/+WYcPH9aS\nJUv0xBNPOMsm2R47TA2W5zdqQ+yoC2NjuTa4GDsa7Cs4d+6curq6NG/ePCUmJkaPt7S0aMGCBQ6T\nXfbbb7/J8zy9//77Wrdunes4kqS2tjZlZmYqKSlJvb29qq+v1w8//KCsrCytWLFCSUlJTvP19fXp\nyy+/VCAQ0K233qrm5mYdP35cWVlZKiwsNPEwS3Nzc3SbMmngKkBubq4WLlzoOJl09uxZNTU1KRQK\nyfM8BYNBU1uoWR47TA3UhthYrg3UhbGzXBsmeuxosEdw8OBBffzxx8rMzNTp06f19NNP6/7775ck\nrV+/Xlu2bHGW7Z9+97Fjx3T33XdLGsjnUnl5uV5//XUlJCRo165duvbaa/XAAw+otbVVp0+fVkVF\nhdN8O3bsUH9/vy5duhSd6BctWqTW1lZ5nqfS0lKn+eCv7u5upaamuo6BKYLaEDvLtYG68O8y3nXB\n/Z9jhn366afasmWLEhMT1dHRoerqanV2dmr58uVy/XdJKBRSZmamli1bpri4OHmep5MnT+qxxx5z\nmmuQ53lKSEiQJH3//ffRSf+OO+7QCy+84DKaJOnMmTN644031N/frzVr1mjXrl2Kj4/XQw89ZCLf\n4FZWf72NamUrq3A4rPr6enV1denee+/Vgw8+GP3enj17tHr1amfZpIFb0H+3YcOG6P9B18uTMPlR\nG2JnuTZQF8aez2ptcFEXaLBHEIlEorf+0tPTtWnTJm3dulWdnZ3OJ9HXXntNBw8eVG1trVatWqU5\nc+Zo+vTpuuuuu5zmGjRr1iw1NDSooKBAt9xyi06ePKm5c+fqxx9/NHGbzfM89fX1qaenR729vQqH\nw0pJSdGff/6p/v5+1/G0bds25eTkaOPGjcMeBKqurna6ldW7776rjIwMLV68WA0NDTp69Kiee+45\nXXPNNWpra3OWa1BJScmwh6VCoZDWr1+vuLg4vf32246SYaqgNsTOcm2gLoyN5drgoi6473QMS0tL\n06lTpzRnzhxJUmJiol566SW99957OnPmjNNs8fHxKioq0pIlS7R//36lpqaamAAGrVmzRvv27VNt\nba2uv/56vfzyywoGgwoGg3r22Wddx1NBQYHKysoUiUT01FNPqbq6Wunp6Wpra1NeXp7reOro6FBl\nZeWQY2lpaSouLlZDQ4OjVAPa29ujt3EXLVqk2tpavfrqq3rxxRed5hq0cuVKtba2atWqVZo9e7Yk\nae3atXrnnXccJ8NUQW2IneXaQF0YG8u1wUVdoMEeQWlpafRW1qCEhASVlpaqsLDQUaqhgsGgysvL\n9fXXX+u6665zHScqKSlJa9eu1R9//KH29nZFIhEFAgEzb5wqKiqKTpiBQED5+flqbW1VYWGhsrOz\nHaezvZVVX1+fIpFIdBurFStWKBAIaOPGjSa2inr88ce1dOlS7d+/X8FgUE8++aSZt4hhaqA2xM5y\nbaAujI3l2uCiLvCQI2CQ5a2sPvjgA82fP1/z588fcrylpUV79+7Vjh07HCUbrqmpSXV1dero6NDu\n3btdxwGAmFmuC9LkqQ0TVRdosIFJZnD9okUWs126dEnnz5/X7NmzTeYDgLGyPrdZyzcRdcH9K7EA\nXJWPPvrIdYT/y2K26dOnR9fcWcwHAGNlfW6zlm8i6gJrsAGD/t9esJ7nRW8NumI5m2Q/HwDEwvrc\nZjmfi2w02IBB3d3dqqysHLavqed5zrdispxNsp8PAGJhfW6znM9FNhpswKCFCxeqp6cnug3YX7ne\nz9ZyNsl+PgCIhfW5zXI+F9l4yBEAAADwEQ85AgAAAD6iwQYAAAB8RIMNAAAA+IgGGwAAAPARDTYA\nAADgo/8BzG9/W/ezGIIAAAAASUVORK5CYII=\n", | |
| "text/plain": [ | |
| "<matplotlib.figure.Figure at 0x1a179a0390>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# リツイートかどうか?別に失敗したツイート長の分布を確認\n", | |
| "df_fail.hist(column='tw_len', by=['uid', 'RT'] ,figsize=(12,10), sharex=True, sharey=True)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 33, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<matplotlib.axes._subplots.AxesSubplot at 0x1a17adfe80>" | |
| ] | |
| }, | |
| "execution_count": 33, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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\nHt1xxx0644wznI4EoBfgIiYXWrp0aeLneDyuWCymESNGqLa2VrW1tbryyisdTAegN6DcXejgwYNJ\n22PHju10P4DMxbKMAQ4dOqR+/fo5HQNAL8IHqi62detW3Xvvvbr33nslHfne+7PPPutwKgC9AeXu\nYs8995weeughDRgwQJI0YsQIffjhhw6nAtAbUO4uFwgEkrazsjikAPhA1dUsy9KWLVvk8XjU1tam\nt956S9/85jedjgWgF+ADVRfbv3+/nnvuOW3atEnxeFznnHOObrnllsQyDYDMRbkDgIFYlnGhV199\n9b++ztOYAFDuLtS3b98O+7788kutWrVKTU1NlDsAlmXc7uDBg3rrrbe0atUqjR8/Xj/4wQ80aNAg\np2MBcBjl7lLNzc1aunSp1qxZo4svvljf//73uY87gATK3YWef/55vffeeyoqKtLEiRO59QCADih3\nF7ruuuvk8/nk9Xrl8XgS++PxuDwejxYvXuxgOgC9AeUOAAbiWnUAMBDlDgAGotyBr/nwww81bdq0\no76+aNEi/eUvf+nBRMDxodyBrznzzDP1u9/9zukYwP+McgcAA1HuyDhTpkzR559/ntj++lLLv//9\nb/30pz9NvLZ9+3ZNnz5dP/7xjzV//nwdPny4x/MCx4NyB46ira1Nv/3tb3XhhRfqj3/8o8aPH691\n69Y5HQtIC+UOHMXWrVvV3t6uK664Qj6fT+PGjVMwGHQ6FpAWyh04ir1792rw4MFJVwH//481BHor\nyh0Zp2/fvvryyy8T2/v27et0nN/vV2Njo75+EXcsFuv2fEBXoNyRcUaMGKG1a9fKtm3V1NTogw8+\n6HTc6aefrqysLC1btkzt7e1at26d6urqejgtcHwod2Scm2++WRs2bNDNN9+sNWvW6Lzzzut0nM/n\n0/3336/Vq1frlltuUVVVlcaOHdvDaYHjw43DAMBAzNwBwECUOwAYiHIHAANR7gBgIModAAxEuQOA\ngSh3ADAQ5Q4ABvo/WgUUxsu4yQQAAAAASUVORK5CYII=\n", | |
| "text/plain": [ | |
| "<matplotlib.figure.Figure at 0x1a17c8ec18>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# 分類に失敗したツイート中のリツイートの割合\n", | |
| "df_fail_pv = pd.DataFrame()\n", | |
| "df_fail_pv['tw_count'] = df_fail.groupby('uid')['tweet'].count()\n", | |
| "df_fail_pv['RT_count'] = df_fail.groupby('uid')['RT'].sum()\n", | |
| "df_fail_pv['RT_rate'] = df_fail_pv['RT_count'] / df_fail_pv['tw_count']\n", | |
| "df_fail_pv['RT_rate'].plot(kind='bar')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "リツイートと短いツイートは失敗しやすい傾向が有るようです。\n", | |
| "\n", | |
| "これは考えてみると当たり前で、リツイートの中身は他人のツイートなので、ツイート主の特徴を(直接には)反映しません。 \n", | |
| "\n", | |
| "また、短いツイートは特徴の表現力に乏しいと考えると自然な結果です。 \n", | |
| "\n", | |
| "(例外として、**ラジッ**とか**めるっ**という一言だけで特徴を表現できる場合もありますが…)\n", | |
| "\n", | |
| "試しに、10文字以下のツイートとRTを除いてリトライさせてみます。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 34, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "0.878587196468\n", | |
| "0.890255439924\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# 10文字以下のツイートとRTを除く\n", | |
| "df_sub = df[df['tw_len'] > 10]\n", | |
| "df_sub = df_sub[df_sub['RT'] == False]\n", | |
| "\n", | |
| "X_train, X_test, Y_train, Y_test = df_to_train_test_split(df_sub)\n", | |
| "grid_search_sub = logistic_grid_search(X_train, Y_train)\n", | |
| "\n", | |
| "print(grid_search_sub.best_score_)\n", | |
| "print(grid_search_sub.score(X_test, Y_test))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "テストセットでのスコアが約0.89まで上昇しました。 \n", | |
| "\n", | |
| "後はデータを増やす、形態素解析後の前処理を頑張るなどすればもう少し上げられそうです。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## 番外編\n", | |
| "\n", | |
| "まったくキャラの異なるツイート主[@TJO_datasci](https://twitter.com/TJO_datasci)との分類を試してみます。" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 35, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "@issei_sato 査読付き国際会議としては肥大化し過ぎてるんじゃないでしょうか(総量がジャーナルメインの分野と同等なら問題ないかもですが) Fri Mar 23 13:40:23 +0000 2018\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "tjo_list = tw_list_from_text('TJO.txt')\n", | |
| "print(tjo_list[0])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 36, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "0.920045045045\n", | |
| "0.926582278481\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# 南極にゃんこ - TJO ペアのデータフレームを作成\n", | |
| "df_n_tjo = tw_text_to_df(['NekoAntarctica', 'TJO'], ['NekoAntarctica.txt', 'TJO.txt'])\n", | |
| "\n", | |
| "# 10文字以下のツイートとRTを除外\n", | |
| "df_n_tjo = df_n_tjo[df_n_tjo['tw_len'] > 10]\n", | |
| "df_n_tjo = df_n_tjo[df_n_tjo['RT'] == False]\n", | |
| "\n", | |
| "# ロジスティック回帰で学習\n", | |
| "X_train, X_test, Y_train, Y_test = df_to_train_test_split(df_n_tjo)\n", | |
| "grid_search_ntjo = logistic_grid_search(X_train, Y_train)\n", | |
| "\n", | |
| "print(grid_search_ntjo.best_score_)\n", | |
| "print(grid_search_ntjo.score(X_test, Y_test))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "nardtree, 南極にゃんこ ペアと比較して、スコアが伸びました!キャラの違いが数字に現れたと言って良いのではないでしょうか?" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3", | |
| "language": "python", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 3 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython3", | |
| "version": "3.6.3" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 2 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment