{ "metadata": { "name": "", "signature": "sha256:6916d0fd27e612fb05dcee1f87ad67e0d7b3e74a591d1bae61db893789721881" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u6587\u66f8\u306e\u985e\u4f3c\u5ea6\u30fb\u95a2\u9023\u6027" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u6587\u66f8\u9593\u306e\u985e\u4f3c\u5ea6\u3084\u95a2\u9023\u6027\u306e\u554f\u984c\u3092\u901a\u3057\u3066\u3001\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u306e\u624b\u6cd5\u306b\u3064\u3044\u3066\u5b66\u3076\u3002 \n", "\u3053\u3053\u3067\u306f\u3001bug-of-words\u3068\u547c\u3070\u308c\u308b\u624b\u6cd5\u3092\u4f7f\u7528\u3059\u308b\u3002\u5358\u8a9e\u306e\u51fa\u73fe\u56de\u6570\u306e\u307f\u306b\u6ce8\u76ee\u3057\u305f\u624b\u6cd5\u3067\u3001\u30b7\u30f3\u30d7\u30eb\u3067\u3042\u308b\u304c\u30ed\u30d0\u30b9\u30c8\u306b\u6587\u7ae0\u3092\u5224\u5b9a\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3067\u3042\u308b\u3002bug-of-words\u6587\u66f8\u3060\u3051\u3067\u306a\u304f\u753b\u50cf\u306a\u3069\u306e\u5206\u91ce\u306b\u3082\u5fdc\u7528\u3055\u308c\u3066\u304a\u308a\u3001\u5fdc\u7528\u7bc4\u56f2\u306e\u5e83\u3044\u8003\u3048\u65b9\u3067\u3082\u3042\u308b\u3002\n", "\n", "\n", "\u305d\u308c\u3067\u306f\u3001\u30c6\u30ad\u30b9\u30c8\u30c7\u30fc\u30bf\u3092bug-of-words\u306b\u5909\u63db\u3057\u3066\u307f\u3088\u3046\u3002sklearn\u306b\u542b\u307e\u308c\u308b\u3001\u6587\u66f8\u3092\u30ef\u30fc\u30c9\u5358\u4f4d\u306e\u30d9\u30af\u30c8\u30eb\u306b\u5909\u63db\u3059\u308b\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u3046\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.feature_extraction.text import CountVectorizer\n", "vectorizer = CountVectorizer(min_df=1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "min_df\u306fCountVectorizer\u3067\u5b9a\u7fa9\u3055\u308c\u308b\u3002 \n", "http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html \n", "\u983b\u7e41\u306b\u4f7f\u308f\u308c\u3066\u3044\u306a\u3044\u30ef\u30fc\u30c9\u3092\u7121\u8996\u3059\u308b\u3068\u304d\u306b\u4f7f\u7528\u3059\u308b\u3002 \n", "\u8a2d\u5b9a\u3059\u308b\u5024\u304c\u6574\u6570\u306e\u5834\u5408\u3001\u305d\u306e\u6570\u3088\u308a\u51fa\u73fe\u56de\u6570\u306e\u5c0f\u3055\u3044\u5358\u8a9e\u306f\u7121\u8996\u3059\u308b\u3002\u5024\u304c0\u304b\u30891\u306e\u9593\u306e\u5834\u5408\u3001\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u306e\u6570\u306b\u5bfe\u3059\u308b\u5272\u5408\u306e\u95be\u5024\u3092\u793a\u3057\u3001\u95be\u5024\u3088\u308a\u5c0f\u3055\u3044\u51fa\u73fe\u983b\u5ea6\u306e\u5358\u8a9e\u3092\u7121\u8996\u3059\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(vectorizer)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CountVectorizer(analyzer=word, binary=False, charset=None, charset_error=None,\n", " decode_error=strict, dtype=, encoding=utf-8,\n", " input=content, lowercase=True, max_df=1.0, max_features=None,\n", " min_df=1, ngram_range=(1, 1), preprocessor=None, stop_words=None,\n", " strip_accents=None, token_pattern=(?u)\\b\\w\\w+\\b, tokenizer=None,\n", " vocabulary=None)\n" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u4e0a\u8a18\u306f\u3001Scikit\u304c\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u9078\u629e\u3059\u308b\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u8868\u793a\u3057\u3066\u3044\u308b\u3002 \n", "analyzer=word\u306f\u5358\u8a9e\u30ec\u30d9\u30eb\u3067\u51fa\u73fe\u56de\u6570\u304c\u6570\u3048\u3089\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u793a\u3057\u3066\u3044\u308b\u3002 \n", "token_pattern\u306f\u6b63\u898f\u8868\u73fe\u3067\u8a18\u8ff0\u3055\u308c\u3066\u3044\u3066\u3001\u5358\u8a9e\u306e\u6c7a\u5b9a\u65b9\u6cd5\u3092\u5b9a\u7fa9\u3059\u308b\u3002 " ] }, { "cell_type": "code", "collapsed": false, "input": [ "content = [\"How to format my hard disk\", \"Hard disk format problems \"]\n", "X = vectorizer.fit_transform(content)\n", "vectorizer.get_feature_names()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ "[u'disk', u'format', u'hard', u'how', u'my', u'problems', u'to']" ] } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "print X.toarray()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[[1 1 1 1 1 0 1]\n", " [1 1 1 0 0 1 0]]\n" ] } ], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "print X.toarray().transpose()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[[1 1]\n", " [1 1]\n", " [1 1]\n", " [1 0]\n", " [1 0]\n", " [0 1]\n", " [1 0]]\n" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "X\u306b\u306f\u6587\u7ae0\u306b\u542b\u307e\u308c\u308b\u5358\u8a9e\u3092\u8868\u73fe\u3057\u305f\u30d9\u30af\u30c8\u30eb\u3067\u3042\u308b\u30021\u5217\u76ee\u304c1\u3064\u3081\u30012\u5217\u76ee\u304c2\u3064\u3081\u306e\u6587\u7ae0\u306e\u30d9\u30af\u30c8\u30eb\u3067\u3042\u308b\u3002" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "\u758e\u306a\u30d9\u30af\u30c8\u30eb\u306e\u6271\u3044" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print X" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " (0, 0)\t1\n", " (1, 0)\t1\n", " (0, 1)\t1\n", " (1, 1)\t1\n", " (0, 2)\t1\n", " (1, 2)\t1\n", " (0, 3)\t1\n", " (0, 4)\t1\n", " (1, 5)\t1\n", " (0, 6)\t1\n" ] } ], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u4e0a\u8a18\u306f\u5909\u6570X\u3092\u305d\u306e\u307e\u307e\u8868\u793a\u3057\u305f\u3082\u306e\u3067\u3042\u308b\u3002\u758e\u306a\u30d9\u30af\u30c8\u30eb\u3092\u6271\u3046\u305f\u3081\u3001\u51fa\u73fe\u3057\u305f\u5358\u8a9e\u306e\u307f\u306e\u30c7\u30fc\u30bf\u3092\u4fdd\u6301\u3059\u308b\u3088\u3046\u306b\u5de5\u592b\u3055\u308c\u3066\u3044\u308b\u30021\u5217\u76ee\u304c\u6587\u7ae0\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30012\u5217\u76ee\u304c\u5358\u8a9e\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u793a\u3057\u3066\u3044\u308b\u3002 \n", "\u4f8b\u3048\u3070\u3001(0,0)\u306f1\u3064\u3081\u306e\u6587\u7ae0\u306b1\u3064\u3081\u306e\u5358\u8a9e\u304c\u542b\u307e\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u793a\u3059\u3002\u307e\u305f\u30012\u3064\u3081\u306e\u6587\u7ae0\u306b3\u3064\u3081\u306e\u5358\u8a9e\u304c\u542b\u307e\u308c\u3066\u3044\u306a\u3044\u3001\u3053\u3068\u304c\u308f\u304b\u308b\u3002\u5185\u90e8\u5b9f\u88c5\u306f coo_matrix (COOrdinate)" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "\u5358\u8a9e\u3092\u6570\u3048\u308b" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import os\n", "import sys\n", "\n", "import scipy as sp\n", "\n", "sys.path.append('/Users/masai/Documents/BuildingMachineLearningSystemsWithPython/ch03')\n", "\n", "from utils import DATA_DIR\n", "\n", "TOY_DIR = os.path.join(DATA_DIR, \"toy\")\n", "\n", "posts = [open(os.path.join(TOY_DIR, f)).read() for f in os.listdir(TOY_DIR)]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "print posts" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "['This is a toy post about machine learning. Actually, it contains not much interesting stuff.', 'Imaging databases provide storage capabilities.', 'Most imaging databases save images permanently.\\n', 'Imaging databases store data.', 'Imaging databases store data. Imaging databases store data. Imaging databases store data.']\n" ] } ], "prompt_number": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ "os\u306fos.path\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u4f7f\u3063\u3066\u30d5\u30a1\u30a4\u30eb\u306e\u5165\u51fa\u529b\u3092\u884c\u3046\u305f\u3081\u306b\u5229\u7528\u3059\u308b\u3002 \n", "sys\u3092\u5229\u7528\u3057\u3066\u3001import\u5148\u306e\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\u3092\u8ffd\u52a0\u3059\u308b\u3002 \n", "http://kannokanno.hatenablog.com/entry/20130503/1367571825" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u65e9\u901f\u3001\u4e0a\u8a18\u3067\u30ed\u30fc\u30c9\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u306e\u5358\u8a9e\u3092\u6570\u3048\u3066\u307f\u307e\u3057\u3087\u3046\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "X_train = vectorizer.fit_transform(posts)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "num_samples, num_features = X_train.shape" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "print(\"#samples: %d, #features: %d\" % (num_samples,num_features))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "#samples: 5, #features: 25\n" ] } ], "prompt_number": 22 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u4e0a\u8a18\u306f\u30015\u3064\u306e\u6587\u66f8\u306825\u500b\u306e\u5358\u8a9e\u304c\u5b58\u5728\u3059\u308b\u3053\u3068\u3092\u793a\u3059\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(vectorizer.get_feature_names())" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[u'about', u'actually', u'capabilities', u'contains', u'data', u'databases', u'images', u'imaging', u'interesting', u'is', u'it', u'learning', u'machine', u'most', u'much', u'not', u'permanently', u'post', u'provide', u'save', u'storage', u'store', u'stuff', u'this', u'toy']\n" ] } ], "prompt_number": 23 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "vectorizer\u306b\u65b0\u3057\u3044\u6587\u66f8\u3092\u8ffd\u52a0" ] }, { "cell_type": "code", "collapsed": false, "input": [ "new_post = \"imaging databases\"\n", "new_post_vec = vectorizer.transform([new_post])\n", "print(new_post_vec)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " (0, 5)\t1\n", " (0, 7)\t1\n" ] } ], "prompt_number": 24 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "NumPy\u306e\u914d\u5217\u3067\u8868\u73fe\u3059\u308b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u30d9\u30af\u30c8\u30eb\u5316\u3057\u305f\u30c7\u30fc\u30bf\u306f\u3001toarray()\u30e1\u30bd\u30c3\u30c9\u3092\u7528\u3044\u308b\u3068NumPy\u306endarray\u3067\u8868\u73fe\u3067\u304d\u308b\u3002 \n", "\u985e\u4f3c\u5ea6\u306a\u3069\u306e\u8a08\u7b97\u306b\u7528\u3044\u308b\u30d9\u30af\u30c8\u30eb\u8868\u73fe\u306f\u3001\u3053\u3061\u3089\u3067\u3042\u308b\u3002 \n", "\u30d9\u30af\u30c8\u30eb\u304c\u30b9\u30d1\u30fc\u30b9\u3067\u3042\u308b\u3053\u3068\u304c\u308f\u304b\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(new_post_vec.toarray())" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[[0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]\n" ] } ], "prompt_number": 25 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "\u985e\u4f3c\u5ea6\u306e\u8a08\u7b97" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SciPy\u3092\u7528\u3044\u3066\u30e6\u30fc\u30af\u30ea\u30c3\u30c9\u8ddd\u96e2\u3092\u8a08\u7b97\u3059\u308b\u3002procedure dist_raw\u3092\u5b9a\u7fa9\u3059\u308b\u3002scipy\u306eprocedure norm\u3092\u5229\u7528\u3059\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "import scipy as sp\n", "\n", "def dist_raw(v1, v2):\n", " delta = v1 - v2\n", " return sp.linalg.norm(delta.toarray())" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 26 }, { "cell_type": "markdown", "metadata": {}, "source": [ "linalg \u306f\u30d9\u30af\u30c8\u30eb delta \u306e\u9577\u3055\u3092\u5f97\u308b\u3002 \n", "new_post\u3068\u4ed6\u306e\u6587\u66f8\u3068\u306e\u8ddd\u96e2\u3092\u8a08\u7b97\u3057\u3066\u3001\u6700\u3082\u985e\u4f3c\u3057\u305f\u6587\u66f8\u3092\u63a2\u3059" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import sys\n", "best_doc = None\n", "best_dist = sys.maxint\n", "best_i = None\n", "for i in range(0, num_samples):\n", " post = posts[i]\n", " if post == new_post:\n", " continue\n", " post_vec = X_train.getrow(i)\n", " d = dist_raw(post_vec, new_post_vec)\n", " print \"=== Post %i with dist=%.2f: %s\" %(i, d, post)\n", " if d < best_dist:\n", " best_dist = d\n", " best_i = i\n", "print(\"Best post is %i with dist=%.2f\"%(best_i, best_dist))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "=== Post 0 with dist=4.00: This is a toy post about machine learning. Actually, it contains not much interesting stuff.\n", "=== Post 1 with dist=1.73: Imaging databases provide storage capabilities.\n", "=== Post 2 with dist=2.00: Most imaging databases save images permanently.\n", "\n", "=== Post 3 with dist=1.41: Imaging databases store data.\n", "=== Post 4 with dist=5.10: Imaging databases store data. Imaging databases store data. Imaging databases store data.\n", "Best post is 3 with dist=1.41\n" ] } ], "prompt_number": 27 }, { "cell_type": "markdown", "metadata": {}, "source": [ "sys\u306f\u3001python\u306e\u6574\u6570\u578b\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u308b\u6700\u5927\u306e\u6574\u6570\u3092\u5f97\u308b\u305f\u3081\u306b\u4f7f\u7528\u3059\u308b\u3002 \n", "best_dist\u306f\u3001\u6700\u5c0f\u306e\u30e6\u30fc\u30af\u30ea\u30c3\u30c9\u8ddd\u96e2\u3092\u683c\u7d0d\u3059\u308b\u3002 \n", "best_i\u306f\u3001\u6700\u5c0f\u306e\u30e6\u30fc\u30af\u30ea\u30c3\u30c9\u8ddd\u96e2\u3092\u8a18\u9332\u3057\u305f\u6587\u66f8\u306eindex\u3092\u683c\u7d0d\u3059\u308b\u3002 \n", "\u6587\u66f8\u306e\u6570\u3067\u30eb\u30fc\u30d7\u3059\u308b\u305f\u3081\u306b\u3001range(0, num_samples)\u3092\u5229\u7528\u3059\u308b\u3002 \n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print X_train.shape" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(5, 25)\n" ] } ], "prompt_number": 31 }, { "cell_type": "code", "collapsed": false, "input": [ "print X_train.toarray()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[[1 1 0 1 0 0 0 0 1 1 1 1 1 0 1 1 0 1 0 0 0 0 1 1 1]\n", " [0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0]\n", " [0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0]\n", " [0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]\n", " [0 0 0 0 3 3 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0]]\n" ] } ], "prompt_number": 35 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u4e0a\u8a18\u304b\u3089\u308f\u304b\u308b\u3088\u3046\u306b\u3001X_train\u306f5\u884c25\u5217\u306e\u884c\u5217\u3067\u3042\u308b\u3002 \n", "\u5404\u884c\u306f\u6587\u66f8\u306b\u5bfe\u5fdc\u3057\u3001\u305d\u308c\u305e\u308c\u306e\u6587\u66f8\u306b\u542b\u307e\u308c\u308b\u5358\u8a9e\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u4fdd\u6301\u3059\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print X_train" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " (0, 0)\t1\n", " (0, 1)\t1\n", " (1, 2)\t1\n", " (0, 3)\t1\n", " (3, 4)\t1\n", " (4, 4)\t3\n", " (1, 5)\t1\n", " (2, 5)\t1\n", " (3, 5)\t1\n", " (4, 5)\t3\n", " (2, 6)\t1\n", " (1, 7)\t1\n", " (2, 7)\t1\n", " (3, 7)\t1\n", " (4, 7)\t3\n", " (0, 8)\t1\n", " (0, 9)\t1\n", " (0, 10)\t1\n", " (0, 11)\t1\n", " (0, 12)\t1\n", " (2, 13)\t1\n", " (0, 14)\t1\n", " (0, 15)\t1\n", " (2, 16)\t1\n", " (0, 17)\t1\n", " (1, 18)\t1\n", " (2, 19)\t1\n", " (1, 20)\t1\n", " (3, 21)\t1\n", " (4, 21)\t3\n", " (0, 22)\t1\n", " (0, 23)\t1\n", " (0, 24)\t1\n" ] } ], "prompt_number": 32 }, { "cell_type": "markdown", "metadata": {}, "source": [ "0\u884c\u76ee\u3092\u53d6\u308a\u51fa\u3059" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print X_train.getrow(0)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " (0, 0)\t1\n", " (0, 1)\t1\n", " (0, 3)\t1\n", " (0, 8)\t1\n", " (0, 9)\t1\n", " (0, 10)\t1\n", " (0, 11)\t1\n", " (0, 12)\t1\n", " (0, 14)\t1\n", " (0, 15)\t1\n", " (0, 17)\t1\n", " (0, 22)\t1\n", " (0, 23)\t1\n", " (0, 24)\t1\n" ] } ], "prompt_number": 30 }, { "cell_type": "markdown", "metadata": {}, "source": [ "1\u884c\u76ee\u3092\u53d6\u308a\u51fa\u3059" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print X_train.getrow(1)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " (0, 2)\t1\n", " (0, 5)\t1\n", " (0, 7)\t1\n", " (0, 18)\t1\n", " (0, 20)\t1\n" ] } ], "prompt_number": 60 }, { "cell_type": "markdown", "metadata": {}, "source": [ "1\u884c\u76ee\u306e\u30d9\u30af\u30c8\u30eb\u8868\u73fe" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print X_train.getrow(1).toarray()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[[0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0]]\n" ] } ], "prompt_number": 61 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "\u5358\u8a9e\u306e\u51fa\u73fe\u56de\u6570\u30d9\u30af\u30c8\u30eb\u306e\u6b63\u898f\u5316" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u51fa\u73fe\u56de\u6570\u3092\u6b63\u898f\u5316\uff1a\u5358\u8a9e\u306e\u51fa\u73fe\u56de\u6570\u306b\u3088\u3063\u3066\u985e\u4f3c\u5ea6\u304c\u5897\u5927\u3057\u306a\u3044\u3088\u3046\u306b\u3059\u308b\u3002 \n", "\u305d\u306e\u305f\u3081\u306b\u306f\u3001\u8ddd\u96e2\u3092\u4e0e\u3048\u308b\u95a2\u6570\u3092\u5909\u66f4\u3059\u308b\u3002 \n", "a / sp.linalg.norm(a) \u3068\u3059\u308b\u3053\u3068\u306b\u3088\u308a\u3001\u30d9\u30af\u30c8\u30eba\u3092\u6b63\u898f\u5316\u3067\u304d\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def dist_norm(v1, v2):\n", " v1_normalized = v1 / sp.linalg.norm(v1.toarray())\n", " v2_normalized = v2 / sp.linalg.norm(v2.toarray())\n", " delta = v1_normalized - v2_normalized\n", " return sp.linalg.norm(delta.toarray())" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "import sys\n", "best_doc = None\n", "best_dist = sys.maxint\n", "best_i = None\n", "for i in range(0, num_samples):\n", " post = posts[i]\n", " if post == new_post:\n", " continue\n", " post_vec = X_train.getrow(i)\n", " d = dist_norm(post_vec, new_post_vec)\n", " print \"=== Post %i with dist=%.2f: %s\" %(i, d, post)\n", " if d < best_dist:\n", " best_dist = d\n", " best_i = i\n", "print(\"Best post is %i with dist=%.2f\"%(best_i, best_dist))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "=== Post 0 with dist=1.41: This is a toy post about machine learning. Actually, it contains not much interesting stuff.\n", "=== Post 1 with dist=0.86: Imaging databases provide storage capabilities.\n", "=== Post 2 with dist=0.92: Most imaging databases save images permanently.\n", "\n", "=== Post 3 with dist=0.77: Imaging databases store data.\n", "=== Post 4 with dist=0.77: Imaging databases store data. Imaging databases store data. Imaging databases store data.\n", "Best post is 3 with dist=0.77\n" ] } ], "prompt_number": 39 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "\u91cd\u8981\u5ea6\u306e\u4f4e\u3044\u5358\u8a9e\u3092\u53d6\u308a\u9664\u304f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u6587\u7ae0\u306e\u5206\u985e\u306b\u8ca2\u732e\u3057\u306a\u3044 stop word\u3068\u547c\u3070\u308c\u308b\u3001\u69d8\u3005\u306a\u6587\u7ae0\u306b\u3088\u304f\u542b\u307e\u308c\u308b\u5358\u8a9e\u3092\u5bfe\u8c61\u5916\u306b\u3059\u308b\u51e6\u7406\u304c\u3088\u304f\u884c\u308f\u308c\u308b\u3002 \n", "\u30c6\u30ad\u30b9\u30c8\u51e6\u7406\u306e\u305f\u3081\u306e CountVectorizer \u306b\u306f\u3001stop word \u3092\u767b\u9332\u3059\u308b\u6a5f\u80fd\u304c\u3042\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "vectorizer = CountVectorizer(min_df=1, stop_words='english')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 40 }, { "cell_type": "code", "collapsed": false, "input": [ "print vectorizer.get_stop_words()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "frozenset(['all', 'six', 'less', 'being', 'indeed', 'over', 'move', 'anyway', 'four', 'not', 'own', 'through', 'yourselves', 'fify', 'where', 'mill', 'only', 'find', 'before', 'one', 'whose', 'system', 'how', 'somewhere', 'with', 'thick', 'show', 'had', 'enough', 'should', 'to', 'must', 'whom', 'seeming', 'under', 'ours', 'has', 'might', 'thereafter', 'latterly', 'do', 'them', 'his', 'around', 'than', 'get', 'very', 'de', 'none', 'cannot', 'every', 'whether', 'they', 'front', 'during', 'thus', 'now', 'him', 'nor', 'name', 'several', 'hereafter', 'always', 'who', 'cry', 'whither', 'this', 'someone', 'either', 'each', 'become', 'thereupon', 'sometime', 'side', 'two', 'therein', 'twelve', 'because', 'often', 'ten', 'our', 'eg', 'some', 'back', 'up', 'go', 'namely', 'towards', 'are', 'further', 'beyond', 'ourselves', 'yet', 'out', 'even', 'will', 'what', 'still', 'for', 'bottom', 'mine', 'since', 'please', 'forty', 'per', 'its', 'everything', 'behind', 'un', 'above', 'between', 'it', 'neither', 'seemed', 'ever', 'across', 'she', 'somehow', 'be', 'we', 'full', 'never', 'sixty', 'however', 'here', 'otherwise', 'were', 'whereupon', 'nowhere', 'although', 'found', 'alone', 're', 'along', 'fifteen', 'by', 'both', 'about', 'last', 'would', 'anything', 'via', 'many', 'could', 'thence', 'put', 'against', 'keep', 'etc', 'amount', 'became', 'ltd', 'hence', 'onto', 'or', 'con', 'among', 'already', 'co', 'afterwards', 'formerly', 'within', 'seems', 'into', 'others', 'while', 'whatever', 'except', 'down', 'hers', 'everyone', 'done', 'least', 'another', 'whoever', 'moreover', 'couldnt', 'throughout', 'anyhow', 'yourself', 'three', 'from', 'her', 'few', 'together', 'top', 'there', 'due', 'been', 'next', 'anyone', 'eleven', 'much', 'call', 'therefore', 'interest', 'then', 'thru', 'themselves', 'hundred', 'was', 'sincere', 'empty', 'more', 'himself', 'elsewhere', 'mostly', 'on', 'fire', 'am', 'becoming', 'hereby', 'amongst', 'else', 'part', 'everywhere', 'too', 'herself', 'former', 'those', 'he', 'me', 'myself', 'made', 'twenty', 'these', 'bill', 'cant', 'us', 'until', 'besides', 'nevertheless', 'below', 'anywhere', 'nine', 'can', 'of', 'your', 'toward', 'my', 'something', 'and', 'whereafter', 'whenever', 'give', 'almost', 'wherever', 'is', 'describe', 'beforehand', 'herein', 'an', 'as', 'itself', 'at', 'have', 'in', 'seem', 'whence', 'ie', 'any', 'fill', 'again', 'hasnt', 'inc', 'thereby', 'thin', 'no', 'perhaps', 'latter', 'meanwhile', 'when', 'detail', 'same', 'wherein', 'beside', 'also', 'that', 'other', 'take', 'which', 'becomes', 'you', 'if', 'nobody', 'see', 'though', 'may', 'after', 'upon', 'most', 'hereupon', 'eight', 'but', 'serious', 'nothing', 'such', 'why', 'a', 'off', 'whereby', 'third', 'i', 'whole', 'noone', 'sometimes', 'well', 'amoungst', 'yours', 'their', 'rather', 'without', 'so', 'five', 'the', 'first', 'whereas', 'once'])\n" ] } ], "prompt_number": 43 }, { "cell_type": "markdown", "metadata": {}, "source": [ "english \u3068\u6307\u5b9a\u3059\u308b\u3060\u3051\u3067\u3001318\u500b\u306estop words\u304c\u767b\u9332\u3055\u308c\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "X_train = vectorizer.fit_transform(posts)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 44 }, { "cell_type": "code", "collapsed": false, "input": [ "print X_train.shape" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(5, 18)\n" ] } ], "prompt_number": 45 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u5358\u8a9e\u306e\u6570\u304c 27 \u304b\u3089 18 \u500b\u306b\u306a\u308b\u3002\u3064\u307e\u308a\u3001\u5148\u307b\u3069\u307e\u3067\u306f\u7121\u99c4\u304c\u3042\u3063\u305f\u3001\u3068\u3044\u3046\u308f\u3051\u3060\u3002 \n", "\u6539\u3081\u3066\u985e\u4f3c\u5ea6\u3092\u8a08\u7b97\u3059\u308b\u3068\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u308b\u3002" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u6b21\u306bquery\u7528\u306e\u30d9\u30af\u30c8\u30eb\u3092\u751f\u6210\u3059\u308b\u3002vectorizer\u3092\u4f7f\u3063\u3066\u3001\u65b0\u3057\u3044\u6587\u66f8new_post\u306e\u307f\u306e\u30d9\u30af\u30c8\u30eb\u3092\u751f\u6210\u3059\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "new_post = \"imaging databases\"\n", "new_post_vec = vectorizer.transform([new_post])\n", "print(new_post_vec)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " (0, 4)\t1\n", " (0, 6)\t1\n" ] } ], "prompt_number": 47 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u30af\u30a8\u30ea\u3068\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u6bd4\u8f03\u3057\u3066\u6587\u66f8\u9593\u306e\u985e\u4f3c\u5ea6\u3092\u8a08\u7b97\u3059\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import sys\n", "best_doc = None\n", "best_dist = sys.maxint\n", "best_i = None\n", "for i in range(0, num_samples):\n", " post = posts[i]\n", " if post == new_post:\n", " continue\n", " post_vec = X_train.getrow(i)\n", " d = dist_norm(post_vec, new_post_vec)\n", " print \"=== Post %i with dist=%.2f: %s\" %(i, d, post)\n", " if d < best_dist:\n", " best_dist = d\n", " best_i = i\n", "print(\"Best post is %i with dist=%.2f\"%(best_i, best_dist))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "=== Post 0 with dist=1.41: This is a toy post about machine learning. Actually, it contains not much interesting stuff.\n", "=== Post 1 with dist=0.86: Imaging databases provide storage capabilities.\n", "=== Post 2 with dist=0.86: Most imaging databases save images permanently.\n", "\n", "=== Post 3 with dist=0.77: Imaging databases store data.\n", "=== Post 4 with dist=0.77: Imaging databases store data. Imaging databases store data. Imaging databases store data.\n", "Best post is 3 with dist=0.77\n" ] } ], "prompt_number": 48 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "\u30b9\u30c6\u30df\u30f3\u30b0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u610f\u5473\u7684\u306b\u306f\u540c\u3058\u5358\u8a9e\u306e\u8a9e\u5f62\u5909\u5316\u3092\u30ed\u30d0\u30b9\u30c8\u306b\u540c\u4e00\u3068\u307f\u306a\u3059\u3002 \n", "Natural Language Toolkit (NLTK) \u3092\u5229\u7528\u3059\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import nltk.stem\n", "english_stemmer = nltk.stem.SnowballStemmer('english')\n", "class StemmedCountVectorizer(CountVectorizer):\n", " def build_analyzer(self):\n", " analyzer = super(StemmedCountVectorizer, self).build_analyzer()\n", " return lambda doc: (english_stemmer.stem(w) for w in analyzer(doc))\n", "vectorizer = StemmedCountVectorizer(min_df=1, stop_words='english')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 52 }, { "cell_type": "code", "collapsed": false, "input": [ "X_train = vectorizer.fit_transform(posts)\n", "new_post = \"imaging databases\"\n", "new_post_vec = vectorizer.transform([new_post])\n", "print(new_post_vec)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " (0, 4)\t1\n", " (0, 5)\t1\n" ] } ], "prompt_number": 58 }, { "cell_type": "code", "collapsed": false, "input": [ "import sys\n", "best_doc = None\n", "best_dist = sys.maxint\n", "best_i = None\n", "for i in range(0, num_samples):\n", " post = posts[i]\n", " if post == new_post:\n", " continue\n", " post_vec = X_train.getrow(i)\n", " d = dist_norm(post_vec, new_post_vec)\n", " print \"=== Post %i with dist=%.2f: %s\" %(i, d, post)\n", " if d < best_dist:\n", " best_dist = d\n", " best_i = i\n", "print(\"Best post is %i with dist=%.2f\"%(best_i, best_dist))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "=== Post 0 with dist=1.41: This is a toy post about machine learning. Actually, it contains not much interesting stuff.\n", "=== Post 1 with dist=0.86: Imaging databases provide storage capabilities.\n", "=== Post 2 with dist=0.63: Most imaging databases save images permanently.\n", "\n", "=== Post 3 with dist=0.77: Imaging databases store data.\n", "=== Post 4 with dist=0.77: Imaging databases store data. Imaging databases store data. Imaging databases store data.\n", "Best post is 2 with dist=0.63\n" ] } ], "prompt_number": 59 }, { "cell_type": "markdown", "metadata": {}, "source": [ "stemming\u3092\u884c\u3046\u3068\u3001images\u3068imaging\u304c\u540c\u4e00\u306b\u6271\u308f\u308c\u308b\u305f\u3081\u3001Post2\u3068\u306e\u8ddd\u96e2\u304c\u7e2e\u307e\u3063\u305f\u3002" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u3042\u306e\u6709\u540d\u306aTF-IDF(term frequency - inverse document frequency)\u3092\u7528\u3044\u308b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3042\u308b\u5358\u8a9e\u306b\u5bfe\u3057\u3066\u3001\u5bfe\u8c61\u306e\u6587\u66f8\u4e2d\u306b\u51fa\u73fe\u3057\u305f\u56de\u6570\u3092\u30ab\u30a6\u30f3\u30c8\u3059\u308b\u306e\u306b\u52a0\u3048\u3066\u3001\u305d\u306e\u5358\u8a9e\u304c**\u4ed6\u306e\u6587\u66f8**\u3067\u3069\u308c\u304f\u3089\u3044\u51fa\u73fe\u3059\u308b\u304b\u3092\u30ab\u30a6\u30f3\u30c8\u3057\u3066\u3001\u305d\u306e\u56de\u6570\u3067\u5272\u308b\u3002" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "= \u7279\u5b9a\u306e\u6587\u66f8\u3060\u3051\u3067\u73fe\u308c\u3084\u3059\u3044\u5358\u8a9e\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u9ad8\u304f\u3059\u308b" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import scipy as sp\n", "import math\n", "def tfidf(term, doc, docset):\n", " tf = float(doc.count(term))/sum(doc.count(w) for w in set(doc))\n", " idf = math.log(float(len(docset))/(len([doc for doc in docset if term in doc])))\n", " return tf * idf" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 66 }, { "cell_type": "markdown", "metadata": {}, "source": [ "doc\u306f\u5bfe\u8c61\u306e\u6587\u7ae0\u3002\u5358\u8a9e\u3092\u8907\u6570\u542b\u3080\u3002 \n", "docset\u306f\u4ed6\u306e\u6587\u7ae0\u3082\u542b\u3081\u305f\u6587\u7ae0\u306e\u96c6\u5408\u3002 \n", "\u4ee5\u4e0b\u306b\u4f8b\u3092\u793a\u3059\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "doc_a, doc_abb, doc_abc = [\"a\"],[\"a\", \"b\", \"b\"],[\"a\",\"b\",\"c\"]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 62 }, { "cell_type": "code", "collapsed": false, "input": [ "D=[doc_a, doc_abb, doc_abc]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 63 }, { "cell_type": "code", "collapsed": false, "input": [ "print(tfidf(\"a\", doc_a, D))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0.0\n" ] } ], "prompt_number": 69 }, { "cell_type": "markdown", "metadata": {}, "source": [ "dic_a\u306e\u5358\u8a9e\"a\"\u306b\u3064\u3044\u3066tfidf\u306f0\u3002\u3064\u307e\u308a\u305d\u306e\u4ed6\u306e\u6587\u66f8\u306b\u3082\u542b\u307e\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u5206\u985e\u306b\u5f79\u306b\u7acb\u3064\u60c5\u5831\u3067\u306f\u306a\u3044\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(tfidf(\"b\", doc_abb, D))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0.270310072072\n" ] } ], "prompt_number": 70 }, { "cell_type": "code", "collapsed": false, "input": [ "print(tfidf(\"c\", doc_a, D))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0.0\n" ] } ], "prompt_number": 72 }, { "cell_type": "code", "collapsed": false, "input": [ "print(tfidf(\"c\", doc_abc, D))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0.366204096223\n" ] } ], "prompt_number": 73 }, { "cell_type": "markdown", "metadata": {}, "source": [ "c\u306fdoc_abc\u306b\u3068\u3063\u3066\u3001\u5927\u5909\u91cd\u8981\u3067\u3042\u308b\u3053\u3068\u304c\u308f\u304b\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(tfidf(\"b\", doc_abb, D))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0.270310072072\n" ] } ], "prompt_number": 75 }, { "cell_type": "code", "collapsed": false, "input": [ "print(tfidf((\"b\"), doc_abc, D))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0.135155036036\n" ] } ], "prompt_number": 77 }, { "cell_type": "markdown", "metadata": {}, "source": [ "b\u306fdoc_abb\u306b\u3068\u3063\u3066\u3001doc_abc\u306e2\u500d\u91cd\u8981\u3067\u3042\u308b\u3053\u3068\u304c\u308f\u304b\u308b\u3002b\u306fdoc_abb\u306bdoc_abc\u306e2\u500d\u542b\u307e\u308c\u3044\u308b\u3002" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SciPy\u306b\u306f\u3001\u4e0a\u8a18\u3088\u308a\u3082\u8907\u96d1\u306a\u3053\u3068\u3092\u8003\u616e\u3057\u305fTF-IDF\u306e\u5b9f\u88c5TfidfVectorizer\u304c\u542b\u307e\u308c\u3066\u3044\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.feature_extraction.text import TfidfVectorizer\n", "class StemmedTfidfVectorizer(TfidfVectorizer):\n", " def build_analyzer(self):\n", " analyzer = super(TfidfVectorizer, self).build_analyzer()\n", " return lambda doc: (\n", " english_stemmer.stem(w) for w in analyzer(doc))\n", "vectorizer = StemmedTfidfVectorizer(min_df=1, stop_words='english')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 86 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u306evectorizer\u3092\u4f7f\u3063\u3066\u3001\u985e\u4f3c\u5ea6\u3092\u7b97\u51fa\u3059\u308b\u3068\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "X_train = vectorizer.fit_transform(posts)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 87 }, { "cell_type": "code", "collapsed": false, "input": [ "X_train.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 91, "text": [ "(5, 17)" ] } ], "prompt_number": 91 }, { "cell_type": "code", "collapsed": false, "input": [ "print X_train" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " (0, 16)\t0.353553390593\n", " (0, 15)\t0.353553390593\n", " (0, 10)\t0.353553390593\n", " (0, 8)\t0.353553390593\n", " (0, 7)\t0.353553390593\n", " (0, 6)\t0.353553390593\n", " (0, 2)\t0.353553390593\n", " (0, 0)\t0.353553390593\n", " (1, 13)\t0.524517221085\n", " (1, 11)\t0.524517221085\n", " (1, 5)\t0.295503853068\n", " (1, 4)\t0.295503853068\n", " (1, 1)\t0.524517221085\n", " (2, 12)\t0.528000507961\n", " (2, 9)\t0.528000507961\n", " (2, 5)\t0.594932552269\n", " (2, 4)\t0.297466276134\n", " (3, 14)\t0.579747589583\n", " (3, 5)\t0.4048366737\n", " (3, 4)\t0.4048366737\n", " (3, 3)\t0.579747589583\n", " (4, 14)\t0.579747589583\n", " (4, 5)\t0.4048366737\n", " (4, 4)\t0.4048366737\n", " (4, 3)\t0.579747589583\n" ] } ], "prompt_number": 94 }, { "cell_type": "markdown", "metadata": {}, "source": [ "[\u6587\u66f8index, \u5358\u8a9eindex]\u3067\u8868\u3055\u308c\u308b\u5404\u8981\u7d20\u306b\u306f\u3001\u51fa\u73fe\u56de\u6570\u3067\u306f\u306a\u304fTF-IDF \u304c\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "new_post = \"imaging databases\"\n", "new_post_vec = vectorizer.transform([new_post])\n", "print(new_post_vec)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " (0, 5)\t0.707106781187\n", " (0, 4)\t0.707106781187\n" ] } ], "prompt_number": 92 }, { "cell_type": "code", "collapsed": false, "input": [ "import sys\n", "best_doc = None\n", "best_dist = sys.maxint\n", "best_i = None\n", "for i in range(0, num_samples):\n", " post = posts[i]\n", " if post == new_post:\n", " continue\n", " post_vec = X_train.getrow(i)\n", " d = dist_norm(post_vec, new_post_vec)\n", " print \"=== Post %i with dist=%.2f: %s\" %(i, d, post)\n", " if d < best_dist:\n", " best_dist = d\n", " best_i = i\n", "print(\"Best post is %i with dist=%.2f\"%(best_i, best_dist))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "=== Post 0 with dist=1.41: This is a toy post about machine learning. Actually, it contains not much interesting stuff.\n", "=== Post 1 with dist=1.08: Imaging databases provide storage capabilities.\n", "=== Post 2 with dist=0.86: Most imaging databases save images permanently.\n", "\n", "=== Post 3 with dist=0.92: Imaging databases store data.\n", "=== Post 4 with dist=0.92: Imaging databases store data. Imaging databases store data. Imaging databases store data.\n", "Best post is 2 with dist=0.86\n" ] } ], "prompt_number": 93 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "bug of words\u306e\u6b20\u70b9" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- \u5358\u8a9e\u306e\u95a2\u9023\u6027\u3001\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u3092\u8003\u616e\u3057\u3066\u3044\u306a\u3044\n", "- \u5426\u5b9a\u7684\u306a\u610f\u5473\u3092\u6b63\u3057\u304f\u6349\u3048\u3089\u308c\u306a\u3044\uff1a\u30e6\u30cb\u30b0\u30e9\u30e0\u3067\u306f\u306a\u304f\u3001\u30d0\u30a4\u30b0\u30e9\u30e0\u3084\u30c8\u30ea\u30b0\u30e9\u30e0\u30921\u3064\u306e\u307e\u3068\u307e\u308a\u3068\u3057\u3066\u30ab\u30a6\u30f3\u30c8\u3059\u308b\u3068\u826f\u3044\n", "- \u30bf\u30a4\u30d7\u30df\u30b9\u306b\u5bfe\u5fdc\u3067\u304d\u306a\u3044" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u306b\u306f\u6587\u66f8\u306e\u5185\u5bb9\u3092\u9069\u5207\u306b\u8868\u73fe\u3057\u305f\u7279\u5fb4\u30d9\u30af\u30c8\u30eb\u304c\u5fc5\u8981\u3067\u3042\u308a\u3001\u3053\u3053\u3067\u306fbug of words\u8868\u73fe\u3092\u7528\u3044\u308b\u3002" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u306e\u7a2e\u985e" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- flat clustering\uff1a\u30af\u30e9\u30b9\u30bf\u306e\u6570\u3092\u6307\u5b9a\u3001\u985e\u4f3c\u6027\u306e\u9ad8\u3044\u30c7\u30fc\u30bf\u304c\u30b0\u30eb\u30fc\u30d4\u30f3\u30b0\u3055\u308c\u308b\n", "- hierarchical clustering\uff1a\u30af\u30e9\u30b9\u30bf\u306e\u6570\u3092\u6307\u5b9a\u3057\u306a\u3044\u307b\u3046\u304c\u8a08\u7b97\u52b9\u7387\u304c\u826f\u3044\u3001\u30af\u30e9\u30b9\u30bf\u540c\u58eb\u306e\u985e\u4f3c\u95a2\u4fc2\u306b\u3088\u3063\u3066\u968e\u5c64\u69cb\u9020\u3092\u4f5c\u6210\u3059\u308b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SciKIt\u3067\u306f\u6570\u591a\u304f\u306e\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u306e\u624b\u6cd5\u3092\u63d0\u4f9b\u3057\u3066\u3044\u308b\u3002" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "KMeans" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u3053\u3067\u7528\u3044\u308b\u6700\u3082\u3072\u308d\u304f\u4f7f\u308f\u308c\u3066\u3044\u308b\u3067\u3042\u308d\u3046\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u624b\u6cd5\u3002\u521d\u671f\u5024\u306e\u53d6\u308a\u65b9\u306b\u4f9d\u5b58\u3057\u3066\u5931\u6557\u3059\u308b\u5834\u5408\u304c\u3042\u308b\u3053\u3068\u3092\u8003\u616e\u3057\u305f\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u3082\u3042\u308b\u3002" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u306e\u5b9f\u65bd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "KMeans\u30e9\u30a4\u30d6\u30e9\u30ea\u3092import\u3057\u305f\u3089\u3001\u30af\u30e9\u30b9\u30bf\u4e2d\u5fc3\u306e\u521d\u671f\u5024\u3092\u6c7a\u5b9a\u3059\u308b\u305f\u3081\u306erandam seed\u3092\u751f\u6210\u3059\u308b\u3002 \n", "\u30af\u30e9\u30b9\u30bf\u306e\u6570\u30923\u3064\u3068\u3057\u3001clustering\u3092\u53ef\u8996\u5316\u3059\u308b\u305f\u3081\u306eplot_clustering\u3092\u4f5c\u6210\u3059\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import os\n", "import scipy as sp\n", "from scipy.stats import norm\n", "from matplotlib import pylab\n", "from sklearn.cluster import KMeans\n", "seed = 2\n", "sp.random.seed(seed) # to reproduce the data later on\n", "\n", "num_clusters = 3\n", "def plot_clustering(x, y, title, mx=None, ymax=None, xmin=None, km=None):\n", " pylab.figure(num=None, figsize=(8, 6))\n", " if km:\n", " pylab.scatter(x, y, s=50, c=km.predict(list(zip(x, y))))\n", " else:\n", " pylab.scatter(x, y, s=50)\n", "\n", " pylab.title(title)\n", " pylab.xlabel(\"Occurrence word 1\")\n", " pylab.ylabel(\"Occurrence word 2\")\n", "\n", " pylab.autoscale(tight=True)\n", " pylab.ylim(ymin=0, ymax=1)\n", " pylab.xlim(xmin=0, xmax=1)\n", " pylab.grid(True, linestyle='-', color='0.75')\n", "\n", " return pylab" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 24 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u6b63\u898f\u5206\u5e03\u306b\u5f93\u3063\u305f\u4e71\u6570\u3092\u751f\u6210\u3059\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "xw1 = norm(loc=0.3, scale=.15).rvs(20)\n", "yw1 = norm(loc=0.3, scale=.15).rvs(20)\n", "\n", "xw2 = norm(loc=0.7, scale=.15).rvs(20)\n", "yw2 = norm(loc=0.7, scale=.15).rvs(20)\n", "\n", "xw3 = norm(loc=0.2, scale=.15).rvs(20)\n", "yw3 = norm(loc=0.8, scale=.15).rvs(20)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "print xw1" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[ 0.23748632 0.29155998 -0.02042941 0.54604062 0.03098466 0.1737379\n", " 0.37543221 0.11320679 0.14130717 0.16364886 0.38271811 0.6438312\n", " 0.30623091 0.13231118 0.38085875 0.21057605 0.29713043 0.47625018\n", " 0.18781936 0.30135379]\n" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "print yw1" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[ 0.16828382 0.27653487 0.33848557 0.15168314 0.24917671 0.2645724\n", " 0.20435175 0.12185816 0.08681742 0.27697572 0.25964146 0.63470502\n", " -0.06521514 0.31690898 0.35556668 0.50394508 0.37527858 0.17336794\n", " 0.30000146 0.38135289]\n" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "2\u3064\u306e\u5358\u8a9e\u3060\u3051\u304b\u3089\u306a\u308b\u6587\u66f8\u306e\u7279\u5fb4\u30d9\u30af\u30c8\u30eb\u3092\u30013\u3064\u306e\u6b63\u898f\u5206\u5e03\u30e2\u30c7\u30eb\u306b\u5f93\u3063\u305f\u4e71\u6570\u3092\u4f7f\u3063\u3066\u64ec\u4f3c\u7684\u306b\u751f\u6210\u3057\u305f\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x = sp.append(sp.append(xw1, xw2), xw3)\n", "y = sp.append(sp.append(yw1, yw2), yw3)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u30d9\u30af\u30c8\u30eb\u3092\u7d50\u5408\u3059\u308b" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print x" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[ 0.23748632 0.29155998 -0.02042941 0.54604062 0.03098466 0.1737379\n", " 0.37543221 0.11320679 0.14130717 0.16364886 0.38271811 0.6438312\n", " 0.30623091 0.13231118 0.38085875 0.21057605 0.29713043 0.47625018\n", " 0.18781936 0.30135379 0.65297377 0.81565176 0.4197864 0.9596777\n", " 0.9201517 0.6496484 0.79170112 0.70719559 0.57562971 0.71315653\n", " 0.85005488 0.64283612 0.64364959 0.68882939 0.76502445 0.89175688\n", " 0.6047981 0.77625944 0.7324174 0.42120814 0.17157961 0.1884172\n", " 0.32370545 0.38723194 0.13941616 -0.0076778 0.40508531 0.38268284\n", " 0.1306992 0.25263327 0.25727994 0.28494132 0.2306312 0.41100444\n", " -0.06069393 0.35612359 0.2570708 0.16742971 0.37602972 -0.15154048]\n" ] } ], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "print y" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[ 0.16828382 0.27653487 0.33848557 0.15168314 0.24917671 0.2645724\n", " 0.20435175 0.12185816 0.08681742 0.27697572 0.25964146 0.63470502\n", " -0.06521514 0.31690898 0.35556668 0.50394508 0.37527858 0.17336794\n", " 0.30000146 0.38135289 0.63710253 0.68015067 0.69406446 0.74890052\n", " 0.39395154 0.70693833 0.59834866 0.48408415 0.77864446 0.81029194\n", " 0.60201246 0.82636844 0.64277253 0.70997335 0.53518916 0.93767306\n", " 0.30108258 0.68628211 0.80426794 0.39498002 0.97422822 0.85791171\n", " 0.63003001 0.86496388 0.75438703 1.18779423 1.07529991 0.86610348\n", " 0.69211192 0.71248781 0.75124256 0.71596482 0.66466309 0.71135416\n", " 0.75857308 0.72246742 0.69521151 0.66066621 1.18256574 0.57902401]\n" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "IPython Notebook\u3067\u63cf\u753b\u51fa\u6765\u308b\u3088\u3046\u306b pyplot \u3092import \u3057\u3001pylab inlune\u3092\u8a18\u8ff0\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import matplotlib.pyplot as plt\n", "%pylab inline" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "i = 1\n", "plot_clustering(x, y, \"Vectors\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nd46g1WYlAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "i += 1\n", "\n", "# 1 iteration ####################\n", "\n", "mx, my = sp.meshgrid(sp.arange(0, 1, 0.001), sp.arange(0, 1, 0.001))\n", "\n", "km = KMeans(init='random', n_clusters=num_clusters, verbose=1,\n", " n_init=1, max_iter=1,\n", " random_state=seed)\n", "km.fit(sp.array(list(zip(x, y))))\n", "plot_clustering(x, y, \"Clustering iteration 1\", km=km)\n", "c1a, c1b, c1c = km.cluster_centers_\n", "pylab.scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1],\n", " marker='x', linewidth=2, s=100, color='black')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Initialization complete\n", "Iteration 0, inertia 4.749\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 30, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "i += 1\n", "\n", "# 2 iterations ####################\n", "km = KMeans(init='random', n_clusters=num_clusters, verbose=1,\n", " n_init=1, max_iter=2,\n", " random_state=seed)\n", "km.fit(sp.array(list(zip(x, y))))\n", "\n", "Z = km.predict(sp.c_[mx.ravel(), my.ravel()]).reshape(mx.shape)\n", "\n", "plot_clustering(x, y, \"Clustering iteration 2\", km=km)\n", "c2a, c2b, c2c = km.cluster_centers_\n", "pylab.scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1],\n", " marker='x', linewidth=2, s=100, color='black')\n", "pylab.gca().add_patch(\n", " pylab.Arrow(c1a[0], c1a[1], c2a[0] - c1a[0], c2a[1] - c1a[1], width=0.1))\n", "pylab.gca().add_patch(\n", " pylab.Arrow(c1b[0], c1b[1], c2b[0] - c1b[0], c2b[1] - c1b[1], width=0.1))\n", "pylab.gca().add_patch(\n", " pylab.Arrow(c1c[0], c1c[1], c2c[0] - c1c[0], c2c[1] - c1c[1], width=0.1))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Initialization complete\n", "Iteration 0, inertia 4.749\n", "Iteration 1, inertia 3.379\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 33, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n/iMEERERERERERERERERERERERERERERERERERERERERERERERERa/t/iJc/QwDJcrEAAAAASUVO\nRK5CYII=\n", "text": [ "" ] } ], "prompt_number": 33 }, { "cell_type": "code", "collapsed": false, "input": [ "i += 1\n", "\n", "# 3 iterations ####################\n", "km = KMeans(init='random', n_clusters=num_clusters, verbose=1,\n", " n_init=1, max_iter=10,\n", " random_state=seed)\n", "km.fit(sp.array(list(zip(x, y))))\n", "\n", "Z = km.predict(sp.c_[mx.ravel(), my.ravel()]).reshape(mx.shape)\n", "\n", "plot_clustering(x, y, \"Clustering iteration 10\", km=km)\n", "pylab.scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1],\n", " marker='x', linewidth=2, s=100, color='black')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Initialization complete\n", "Iteration 0, inertia 4.749\n", "Iteration 1, inertia 3.379\n", "Iteration 2, inertia 2.600\n", "Iteration 3, inertia 2.497\n", "Iteration 4, inertia 2.447\n", "Converged at iteration 4\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 35, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n4vSSt2B+/k3ANCuWyqwBDmM65e0j+AhBRERERERERERERERERERERERERERERERERERERERERERE\nRETE2/4f8KE3IPq9ie4AAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 35 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "validation\u30c7\u30fc\u30bf\u3092\u7528\u3044\u305f\u8a55\u4fa1" ] }, { "cell_type": "heading", "level": 5, "metadata": {}, "source": [ "validation\u30c7\u30fc\u30bf 20Newsgroups DataSet" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "http://qwone.com/~jason/20Newsgroups/ \u304b\u3089\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u3082\u826f\u3044\u304c\u3001scikit\u306efetch_20newsgroups()\u3067\u4ee3\u308f\u308a\u306b\u30c7\u30fc\u30bf\u3092\u30ed\u30fc\u30c9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u3002" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u5fc5\u8981\u306a\u30c7\u30fc\u30bf\u3068scipy\u3092import" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import sklearn.datasets\n", "import scipy as sp" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 111 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u30af\u30a8\u30ea\u7528\u306e\u6587\u66f8\u3092\u5b9a\u7fa9" ] }, { "cell_type": "code", "collapsed": false, "input": [ "new_post = \\\n", " \"\"\"Disk drive problems. Hi, I have a problem with my hard disk.\n", "After 1 year it is working only sporadically now.\n", "I tried to format it, but now it doesn't boot any more.\n", "Any ideas? Thanks.\n", "\"\"\"" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 113 }, { "cell_type": "markdown", "metadata": {}, "source": [ "20newsgroups\u30c7\u30fc\u30bf\u30fb\u30bb\u30c3\u30c8\u3092\u30ed\u30fc\u30c9" ] }, { "cell_type": "code", "collapsed": false, "input": [ "all_data = sklearn.datasets.fetch_20newsgroups(subset=\"all\")\n", "print(\"Number of total posts: %i\" % len(all_data.filenames))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Number of total posts: 18846\n" ] } ], "prompt_number": 114 }, { "cell_type": "markdown", "metadata": {}, "source": [ "categoty\u3092\u6307\u5b9a\u3057\u3066train\u30c7\u30fc\u30bf\u3092\u53d6\u5f97" ] }, { "cell_type": "code", "collapsed": false, "input": [ "groups = [\n", " 'comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware',\n", " 'comp.sys.mac.hardware', 'comp.windows.x', 'sci.space']\n", "train_data = sklearn.datasets.fetch_20newsgroups(subset=\"train\",\n", " categories=groups)\n", "print(\"Number of training posts in tech groups:\", len(train_data.filenames))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "('Number of training posts in tech groups:', 3529)\n" ] } ], "prompt_number": 115 }, { "cell_type": "code", "collapsed": false, "input": [ "labels = train_data.target\n", "num_clusters=50" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 116 }, { "cell_type": "code", "collapsed": false, "input": [ "import nltk.stem" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 48 }, { "cell_type": "code", "collapsed": false, "input": [ "english_stemmer = nltk.stem.SnowballStemmer('english')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 49 }, { "cell_type": "markdown", "metadata": {}, "source": [ "vectorizer\u3092\u5b9a\u7fa9\u3057\u3066\u3001train_data\u304b\u3089\u7279\u5fb4\u91cf\u3092\u3064\u304f\u308b" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.feature_extraction.text import TfidfVectorizer\n", "class StemmedTfidfVectorizer(TfidfVectorizer):\n", "\n", " def build_analyzer(self):\n", " analyzer = super(TfidfVectorizer, self).build_analyzer()\n", " return lambda doc: (english_stemmer.stem(w) for w in analyzer(doc))\n", "\n", "vectorizer = StemmedTfidfVectorizer(min_df=10, max_df=0.5,\n", " stop_words='english', decode_error='ignore'\n", " )\n", "vectorized = vectorizer.fit_transform(train_data.data)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 52 }, { "cell_type": "code", "collapsed": false, "input": [ "num_samples, num_features = vectorized.shape\n", "print(\"#samples: %d, #features: %d\" % (num_samples, num_features))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "#samples: 3529, #features: 4712\n" ] } ], "prompt_number": 58 }, { "cell_type": "markdown", "metadata": {}, "source": [ "KMeans\u3067\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.cluster import KMeans" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 59 }, { "cell_type": "code", "collapsed": false, "input": [ "km = KMeans(n_clusters=num_clusters, n_init=1, verbose=1, random_state=3)\n", "clustered = km.fit(vectorized)\n", "print(\"km.labels=%s\" % km.labels_)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Initialization complete\n", "Iteration 0, inertia 5686.053\n", "Iteration 1, inertia 3164.888" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Iteration 2, inertia 3132.208\n", "Iteration 3, inertia 3111.713" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Iteration 4, inertia 3098.584\n", "Iteration 5, inertia 3092.191" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Iteration 6, inertia 3087.277\n", "Iteration 7, inertia 3084.100" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Iteration 8, inertia 3082.800\n", "Iteration 9, inertia 3082.234" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Iteration 10, inertia 3081.949\n", "Iteration 11, inertia 3081.843" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Iteration 12, inertia 3081.791\n", "Iteration 13, inertia 3081.752" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Iteration 14, inertia 3081.660\n", "Iteration 15, inertia 3081.617" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Iteration 16, inertia 3081.589\n", "Iteration 17, inertia 3081.571" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Converged at iteration 17\n", "km.labels=[48 23 31 ..., 6 2 22]\n" ] } ], "prompt_number": 60 }, { "cell_type": "code", "collapsed": false, "input": [ "print(\"km.labels_.shape=%s\" % km.labels_.shape)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "km.labels_.shape=3529\n" ] } ], "prompt_number": 62 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u306e\u8a55\u4fa1\u3092\u884c\u3046\u3053\u3068\u304c\u3067\u304d\u308b\u30d1\u30c3\u30b1\u30fc\u30b8 metrics \u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3059\u308b\u3002 \n", "\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u624b\u6cd5\u3092\u5909\u66f4\u3057\u305f\u5834\u5408\u3001\u4ee5\u4e0b\u306e\u6570\u5024\u3092\u78ba\u8a8d\u3059\u308b\u3068\u826f\u3044\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn import metrics\n", "# Homogeneity \u306f\uff0c\u6bd4\u8f03\u5bfe\u8c61\u3068\u306a\u308b\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u7d50\u679c\u306b\u304a\u3051\u308b\u3042\u308b\u30af\u30e9\u30b9\u30bf\u304c\uff0c\n", "# \u3082\u3046\u7247\u65b9\u306e\u6b63\u89e3\u3068\u306a\u308b\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u7d50\u679c\u306b\u304a\u3051\u308b\u3042\u308b\u30af\u30e9\u30b9\u30bf\u306b\u5c5e\u3059\u308b\u8981\u7d20\u306e\u307f\u3092\u542b\u3093\u3067\u3044\u308b\u304b\u3069\u3046\u304b\u306e\u6307\u6a19\n", "print(\"Homogeneity: %0.3f\" % metrics.homogeneity_score(labels, km.labels_))\n", "# Completeness \u306f\u3042\u308b\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u7d50\u679c\u306b\u304a\u3051\u308b\u3042\u308b\u30af\u30e9\u30b9\u30bf\u306e\u8981\u7d20\u5168\u3066\u304c\uff0c\u6bd4\u8f03\u5bfe\u8c61\u3068\u306a\u308b\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u7d50\u679c\n", "# \u306b\u304a\u3044\u3066\u540c\u3058\u30af\u30e9\u30b9\u30bf\u306b\u5c5e\u3057\u3066\u3044\u308b\u304b\u3069\u3046\u304b(\u540c\u3058\u8a9e\u7fa9\u3092\u3082\u3064\u8981\u7d20\u304c1\u3064\u306e\u30af\u30e9\u30b9\u30bf\u306b\u3069\u308c\u3060\u3051\u307e\u3068\u3081\u3089\u308c\u3066\u3044\u308b\u304b)\n", "print(\"Completeness: %0.3f\" % metrics.completeness_score(labels, km.labels_))\n", "# Homogeneity\u3068Completeness\u306f1 \u3064\u306e\u30af\u30e9\u30b9\u30bf\u306b\u5c5e\u3059\u3079\u304d\u8981\u7d20\u7fa4\u304c\u3069\u306e\u7a0b\u5ea6\u540c\u3058\u30af\u30e9\u30b9\u30bf\u306b\u5206\u985e\u3055\u308c\u3084\u3059\u3044\u304b\u3092\u691c\u8a3c\u3057\u3084\u3059\u3044\n", "\n", "# V-measure\u306fHomogeneity\u3068Completness\u306e\u8abf\u548c\u5e73\u5747\n", "print(\"V-measure: %0.3f\" % metrics.v_measure_score(labels, km.labels_))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Homogeneity: 0.445\n", "Completeness: 0.231\n", "V-measure: 0.304\n" ] } ], "prompt_number": 70 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u4ed6\u306e\u8a55\u4fa1\u6307\u6a19\u3082\u3001metrics\u306a\u3089\u7c21\u5358\u306b\u51fa\u529b\u304c\u53ef\u80fd\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Adjusted Rand Index\n", "# \u8abf\u6574Rand\u6307\u6a19\u30022\u3064\u306e\u30af\u30e9\u30b9\u30bf\u9593\u3067\u5206\u3051\u65b9\u306e\u985e\u4f3c\u5ea6\u3092\u793a\u3059\u6307\u6a19\u3002\u76f8\u95a2\u304c\u306a\u3044\u5834\u5408\u306b0\u3068\u306a\u308b\u3088\u3046\u306bAdjust\u3057\u305f\u3082\u306e\u3002\n", "print(\"Adjusted Rand Index: %0.3f\" % metrics.adjusted_rand_score(labels, km.labels_))\n", "\n", "# Adjusted Mutual Information\n", "# Mutual Information\u306f\u76f8\u4e92\u60c5\u5831\u91cf\u3068\u3088\u3070\u308c\u308b\u3002\u6587\u7ae0\u306b\u30ab\u30c6\u30b4\u30ea\u304c\u4e0e\u3048\u3089\u308c\u3066\u3044\u308b\u5834\u5408\u3001\u5358\u8a9e\u3068\u30ab\u30c6\u30b4\u30ea\u306e\u76f8\u95a2\u6027\u306e\u5f37\u3055\u3092\u6570\u5024\u5316\u3057\u3066\u3082\u306e\u3067\u3042\u308b\u3002\n", "print(\"Adjusted Mutual Information: %0.3f\" % metrics.adjusted_mutual_info_score(labels, km.labels_))\n", "\n", "# Silihouette Coefficient(\u30b7\u30eb\u30a8\u30c3\u30c8\u4fc2\u6570)\n", "# \u3042\u308b\u30af\u30e9\u30b9\u30bf\u306b\u3064\u3044\u3066\u3001\u30af\u30e9\u30b9\u30bf\u306b\u542b\u307e\u308c\u308b\u8981\u7d20\u306e\u51dd\u96c6\u6027\u3068\u4ed6\u306e\u30af\u30e9\u30b9\u30bf\u306b\u542b\u307e\u308c\u308b\u8981\u7d20\u306e\u5206\u96e2\u6027\u306e\u30d0\u30e9\u30f3\u30b9\u3092\u6570\u5024\u5316\u3057\u305f\u3082\u306e\n", "print(\"Silhouette Coefficient: %0.3f\" % metrics.silhouette_score(vectorized, labels, sample_size=1000))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Adjusted Rand Index: 0.094\n", "Adjusted Mutual Information: 0.223\n", "Silhouette Coefficient: 0.006" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 74 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u30af\u30a8\u30ea" ] }, { "cell_type": "code", "collapsed": false, "input": [ "new_post" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 76, "text": [ "\"Disk drive problems. Hi, I have a problem with my hard disk.\\nAfter 1 year it is working only sporadically now.\\nI tried to format it, but now it doesn't boot any more.\\nAny ideas? Thanks.\\n\"" ] } ], "prompt_number": 76 }, { "cell_type": "code", "collapsed": false, "input": [ "# \u30af\u30a8\u30ea\u306e\u30d9\u30af\u30c8\u30eb\u5316\n", "new_post_vec = vectorizer.transform([new_post])\n", "\n", "# \u30af\u30e9\u30b9\u30bf\u306e\u63a8\u6e2c\n", "new_post_label = km.predict(new_post_vec)[0]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 80 }, { "cell_type": "code", "collapsed": false, "input": [ "# \u540c\u3058\u30af\u30e9\u30b9\u30bf\u306b\u6240\u5c5e\u3059\u308b\u6587\u66f8\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u53d6\u5f97\n", "similar_indices = (km.labels_ == new_post_label).nonzero()[0]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 81 }, { "cell_type": "markdown", "metadata": {}, "source": [ "nonzero\u306f\u30bc\u30ed\u3067\u306a\u3044\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u8fd4\u3059" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(similar_indices)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[ 69 152 157 167 201 225 228 233 359 463 479 520 552 580 622\n", " 676 779 882 884 917 939 1114 1253 1286 1486 1531 1752 1806 1809 1986\n", " 2061 2249 2351 2412 2447 2493 2499 2510 2512 2600 2730 2800 2889 3080 3111\n", " 3145 3146 3199 3202 3278 3285 3297 3310 3350 3437 3458]\n" ] } ], "prompt_number": 78 }, { "cell_type": "markdown", "metadata": {}, "source": [ "nonzero\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3001bool\u306b\u3082\u4f7f\u7528\u3067\u304d\u308b\u3002True\u306e\u5834\u5408\u306e\u307f\u62bd\u51fa\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "np.array([True, False, True, False, False]).nonzero()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 91, "text": [ "(array([0, 2]),)" ] } ], "prompt_number": 91 }, { "cell_type": "code", "collapsed": false, "input": [ "np.array([[True, False, True], [True, True, False]]).nonzero()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 94, "text": [ "(array([0, 0, 1, 1]), array([0, 2, 0, 1]))" ] } ], "prompt_number": 94 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u8ddd\u96e2\u8a08\u7b97" ] }, { "cell_type": "code", "collapsed": false, "input": [ "sp.linalg.norm((new_post_vec - vectorized[0]).toarray())" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 98, "text": [ "1.4142135623730951" ] } ], "prompt_number": 98 }, { "cell_type": "code", "collapsed": false, "input": [ "similar = []\n", "similar_index = []\n", "for i in similar_indices:\n", " dist = sp.linalg.norm((new_post_vec - vectorized[i]).toarray())\n", " similar.append((dist, train_data.data[i]))\n", " similar_index.append((dist, i))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 100 }, { "cell_type": "code", "collapsed": false, "input": [ "similar_index" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 101, "text": [ "[(1.2613192374763227, 69),\n", " (1.3665586630895377, 152),\n", " (1.3230483856740909, 157),\n", " (1.160451955581586, 167),\n", " (1.1867577549899049, 201),\n", " (1.3601802039416646, 225),\n", " (1.3074714760135029, 228),\n", " (1.3475446115881746, 233),\n", " (1.1590572535586865, 359),\n", " (1.1503043264096682, 463),\n", " (1.3686339201024835, 479),\n", " (1.3395099562315893, 520),\n", " (1.3405036765703295, 552),\n", " (1.2554372724367662, 580),\n", " (1.3092623304321134, 622),\n", " (1.1539892053985115, 676),\n", " (1.3600124807383815, 779),\n", " (1.3072768986506598, 882),\n", " (1.3287675098520277, 884),\n", " (1.2632055766509744, 917),\n", " (1.1703009657776047, 939),\n", " (1.1063375279728889, 1114),\n", " (1.3306004461393541, 1253),\n", " (1.2005787014858564, 1286),\n", " (1.2666418605121041, 1486),\n", " (1.3162209344604823, 1531),\n", " (1.0378441731334072, 1752),\n", " (1.2793959084781283, 1806),\n", " (1.2635553685752812, 1809),\n", " (1.1716497460538475, 1986),\n", " (1.3383954097713806, 2061),\n", " (1.3440642926620332, 2249),\n", " (1.3328753056525837, 2351),\n", " (1.3233240874750281, 2412),\n", " (1.1657785603329736, 2447),\n", " (1.3457915508992047, 2493),\n", " (1.2634799816995834, 2499),\n", " (1.2571713698475409, 2510),\n", " (1.1213311970667454, 2512),\n", " (1.3077376701447476, 2600),\n", " (1.2854652478322826, 2730),\n", " (1.156361562019395, 2800),\n", " (1.2368000749072581, 2889),\n", " (1.2582262180197388, 3080),\n", " (1.2316979371219503, 3111),\n", " (1.0494693076510362, 3145),\n", " (1.3118266609870635, 3146),\n", " (1.3464766154690284, 3199),\n", " (1.3074012413334692, 3202),\n", " (1.3468022970298807, 3278),\n", " (1.1760804023305398, 3285),\n", " (1.3654831746826823, 3297),\n", " (1.3470251456011364, 3310),\n", " (1.2542702591505619, 3350),\n", " (1.1080887634209331, 3437),\n", " (1.1602070210357869, 3458)]" ] } ], "prompt_number": 101 }, { "cell_type": "code", "collapsed": false, "input": [ "len(similar)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 102, "text": [ "56" ] } ], "prompt_number": 102 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u30bd\u30fc\u30c8\u3082\u7c21\u5358\u306b\u884c\u3046\u3053\u3068\u304c\u3067\u304d\u308b" ] }, { "cell_type": "code", "collapsed": false, "input": [ "similar = sorted(similar)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 103 }, { "cell_type": "code", "collapsed": false, "input": [ "print(\"Count similar: %i\" % len(similar))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Count similar: 56\n" ] } ], "prompt_number": 104 }, { "cell_type": "code", "collapsed": false, "input": [ "# \u6700\u3082\u985e\u4f3c\n", "show_at_1 = similar[0]\n", "# \u4e2d\u9593\n", "show_at_2 = similar[int(len(similar) / 10)]\n", "# \u6700\u3082\u985e\u4f3c\u3057\u3066\u3044\u306a\u3044\n", "show_at_3 = similar[int(len(similar) / 2)]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 106 }, { "cell_type": "code", "collapsed": false, "input": [ "print(\"== #1 most similar ==\")\n", "print(show_at_1)\n", "print(\"== #2 ==\")\n", "print(show_at_2)\n", "print(\"== #3 most different ==\")\n", "print(show_at_3)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "== #1 most similar ==\n", "(1.0378441731334072, u\"From: Thomas Dachsel \\nSubject: BOOT PROBLEM with IDE controller\\nNntp-Posting-Host: sdcmvs.mvs.sas.com\\nOrganization: SAS Institute Inc.\\nLines: 25\\n\\nHi,\\nI've got a Multi I/O card (IDE controller + serial/parallel\\ninterface) and two floppy drives (5 1/4, 3 1/2) and a\\nQuantum ProDrive 80AT connected to it.\\nI was able to format the hard disk, but I could not boot from\\nit. I can boot from drive A: (which disk drive does not matter)\\nbut if I remove the disk from drive A and press the reset switch,\\nthe LED of drive A: continues to glow, and the hard disk is\\nnot accessed at all.\\nI guess this must be a problem of either the Multi I/o card\\nor floppy disk drive settings (jumper configuration?)\\nDoes someone have any hint what could be the reason for it.\\nPlease reply by email to GERTHD@MVS.SAS.COM\\nThanks,\\nThomas\\n+-------------------------------------------------------------------+\\n| Thomas Dachsel |\\n| Internet: GERTHD@MVS.SAS.COM |\\n| Fidonet: Thomas_Dachsel@camel.fido.de (2:247/40) |\\n| Subnet: dachsel@rnivh.rni.sub.org (UUCP in Germany, now active) |\\n| Phone: +49 6221 4150 (work), +49 6203 12274 (home) |\\n| Fax: +49 6221 415101 |\\n| Snail: SAS Institute GmbH, P.O.Box 105307, D-W-6900 Heidelberg |\\n| Tagline: One bad sector can ruin a whole day... |\\n+-------------------------------------------------------------------+\\n\")\n", "== #2 ==\n", "(1.1503043264096682, u'From: rpao@mts.mivj.ca.us (Roger C. Pao)\\nSubject: Re: Booting from B drive\\nOrganization: MicroTech Software\\nLines: 34\\n\\nglang@slee01.srl.ford.com (Gordon Lang) writes:\\n\\n>David Weisberger (djweisbe@unix.amherst.edu) wrote:\\n>: I have a 5 1/4\" drive as drive A. How can I make the system boot from\\n>: my 3 1/2\" B drive? (Optimally, the computer would be able to boot\\n>: from either A or B, checking them in order for a bootable disk. But\\n>: if I have to switch cables around and simply switch the drives so that\\n>: it can\\'t boot 5 1/4\" disks, that\\'s OK. Also, boot_b won\\'t do the trick\\n>: for me.)\\n>: \\n>: Thanks,\\n>: Davebo\\n>We had the same issue plague us for months on our Gateway. I finally\\n>got tired of it so I permanently interchanged the drives. The only\\n>reason I didn\\'t do it in the first place was because I had several\\n>bootable 5-1/4\\'s and some 5-1/4 based install disks which expected\\n>the A drive. I order all new software (and upgrades) to be 3-1/2 and\\n>the number of \"stupid\" install programs that can\\'t handle an alternate\\n>drive are declining with time - the ones I had are now upgraded. And\\n>as for the bootable 5-1/4\\'s I just cut 3-1/2 replacements.\\n\\n>If switching the drives is not an option, you might be able to wire up\\n>a drive switch to your computer chasis. I haven\\'t tried it but I think\\n>it would work as long as it is wired carefully.\\n\\nI did this. I use a relay (Radio Shack 4PDT) instead of a huge\\nswitch. This way, if the relay breaks, my drives will still work.\\n\\nIt works fine, but you may still need to change the CMOS before the\\ndrive switch will work correctly for some programs.\\n\\nrp93\\n-- \\nRoger C. Pao {gordius,bagdad}!mts!rpao, rpao@mts.mivj.ca.us\\n')\n", "== #3 most different ==\n", "(1.2793959084781283, u'From: vg@volkmar.Stollmann.DE (Volkmar Grote)\\nSubject: IBM PS/1 vs TEAC FD\\nDistribution: world\\nOrganization: Me? Organized?\\nLines: 21\\n\\nHello,\\n\\nI already tried our national news group without success.\\n\\nI tried to replace a friend\\'s original IBM floppy disk in his PS/1-PC\\nwith a normal TEAC drive.\\nI already identified the power supply on pins 3 (5V) and 6 (12V), shorted\\npin 6 (5.25\"/3.5\" switch) and inserted pullup resistors (2K2) on pins\\n8, 26, 28, 30, and 34.\\nThe computer doesn\\'t complain about a missing FD, but the FD\\'s light\\nstays on all the time. The drive spins up o.k. when I insert a disk,\\nbut I can\\'t access it.\\nThe TEAC works fine in a normal PC.\\n\\nAre there any points I missed?\\n\\nThank you.\\n\\tVolkmar\\n\\n---\\nVolkmar.Grote@Stollmann.DE\\n')\n" ] } ], "prompt_number": 109 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "\u30ce\u30a4\u30ba\u306b\u5bfe\u3059\u308b\u5225\u306e\u898b\u65b9" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u3092\u5b8c\u74a7\u306b\u3059\u308b\u3088\u308a\u3082\u3001\u30ce\u30a4\u30ba\u306e\u6271\u3044\u65b9\u306b\u6ce8\u610f\u305b\u3088" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "zip\u95a2\u6570\u306f\u30ea\u30b9\u30c8\u306e\u30bf\u30d7\u30eb\u3092\u30bf\u30d7\u30eb\u306e\u30ea\u30b9\u30c8\u306b\u3059\u308b \n", "\u8907\u6570\u306e\u30b7\u30fc\u30b1\u30f3\u30b9\u306b\u5bfe\u3059\u308b\u30eb\u30fc\u30d7\u304c\u30b7\u30f3\u30d7\u30eb\u306b\u66f8\u3051\u308b" ] }, { "cell_type": "code", "collapsed": false, "input": [ "post_group = zip(train_data.data, train_data.target)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 122 }, { "cell_type": "code", "collapsed": false, "input": [ "all = [(len(post[0]), post[0], train_data.target_names[post[1]])\n", " for post in post_group]\n", "graphics = sorted([post for post in all if post[2] == 'comp.graphics'])\n", "print(graphics[5:7])" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[(245, u'From: SITUNAYA@IBM3090.BHAM.AC.UK\\nSubject: test....(sorry)\\nOrganization: The University of Birmingham, United Kingdom\\nLines: 1\\nNNTP-Posting-Host: ibm3090.bham.ac.uk\\n\\n==============================================================================\\n', 'comp.graphics'), (250, u\"From: pallis@server.uwindsor.ca (PALLIS DIMITRIOS )\\nSubject: Re: Genoa Blitz 24 hits 1600x1200x256 NI !\\nLines: 3\\n\\ni am sorry, but this genoa card does nothing that the ATI ultra plus 2mb\\ncan't do, PLUS the ATI costs 330$US street price ....\\n\\n\", 'comp.graphics')]\n" ] } ], "prompt_number": 133 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u4e0a\u8a18\u306e2\u3064\u306e\u6587\u66f8\u304c\u3001\u306a\u305ccomp.graphics\u306b\u5c5e\u3059\u308b\u306e\u304b\u3001\u5206\u985e\u306e\u6c7a\u3081\u3066\u306f\u898b\u3064\u304b\u3089\u306a\u3044\u306e\u3067\u3001\u5358\u8a9e\u5316\u3092\u884c\u3046\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "noise_post = graphics[5][1]\n", "print(noise_post)\n", "analyzer = vectorizer.build_analyzer()\n", "print(list(analyzer(noise_post)))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "From: SITUNAYA@IBM3090.BHAM.AC.UK\n", "Subject: test....(sorry)\n", "Organization: The University of Birmingham, United Kingdom\n", "Lines: 1\n", "NNTP-Posting-Host: ibm3090.bham.ac.uk\n", "\n", "==============================================================================\n", "\n", "[u'situnaya', u'ibm3090', u'bham', u'ac', u'uk', u'subject', u'test', u'sorri', u'organ', u'univers', u'birmingham', u'unit', u'kingdom', u'line', u'nntp', u'post', u'host', u'ibm3090', u'bham', u'ac', u'uk']\n" ] } ], "prompt_number": 141 }, { "cell_type": "code", "collapsed": false, "input": [ "noise_post_2 = graphics[6][1]\n", "print(noise_post_2)\n", "analyzer = vectorizer.build_analyzer()\n", "print(list(analyzer(noise_post_2)))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "From: pallis@server.uwindsor.ca (PALLIS DIMITRIOS )\n", "Subject: Re: Genoa Blitz 24 hits 1600x1200x256 NI !\n", "Lines: 3\n", "\n", "i am sorry, but this genoa card does nothing that the ATI ultra plus 2mb\n", "can't do, PLUS the ATI costs 330$US street price ....\n", "\n", "\n", "[u'palli', u'server', u'uwindsor', u'ca', u'palli', u'dimitrio', u'subject', u'genoa', u'blitz', u'24', u'hit', u'1600x1200x256', u'ni', u'line', u'sorri', u'genoa', u'card', u'doe', u'ati', u'ultra', u'plus', u'2mb', u'plus', u'ati', u'cost', u'330', u'street', u'price']\n" ] } ], "prompt_number": 142 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3055\u3089\u306b\u30c8\u30fc\u30af\u30f3\u5316\u3001\u5c0f\u6587\u5b57\u306b\u5909\u63db\u3001\u30b9\u30c8\u30c3\u30d7\u30ef\u30fc\u30c9\u3092\u53d6\u308a\u9664\u3044\u305f\u7d50\u679c\u3092\u898b\u3066\u307f\u308b" ] }, { "cell_type": "code", "collapsed": false, "input": [ "useful = set(analyzer(noise_post)).intersection(vectorizer.get_feature_names())\n", "print(sorted(useful))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[u'ac', u'birmingham', u'host', u'kingdom', u'nntp', u'sorri', u'test', u'uk', u'unit', u'univers']\n" ] } ], "prompt_number": 145 }, { "cell_type": "code", "collapsed": false, "input": [ "useful_2 = set(analyzer(noise_post_2)).intersection(vectorizer.get_feature_names())\n", "print(sorted(useful))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[u'ac', u'birmingham', u'host', u'kingdom', u'nntp', u'sorri', u'test', u'uk', u'unit', u'univers']\n" ] } ], "prompt_number": 146 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3055\u3089\u306b\u3001\u4ed6\u306e\u6587\u66f8\u306b\u591a\u304f\u73fe\u308c\u308b\u5358\u8a9e\u304b\u3069\u3046\u304b\uff08\u5206\u985e\u306b\u5bc4\u4e0e\u3059\u308b\u304b\u3069\u3046\u304b\uff09\u3092\u898b\u308b\u305f\u3081\u3001TF-IDF\u3082\u898b\u308b\u5fc5\u8981\u304c\u3042\u308b\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for term in sorted(useful):\n", " print('IDF(%s)=%.2f' % (term,\n", " vectorizer._tfidf.idf_[vectorizer.vocabulary_[term]]))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "IDF(ac)=3.51\n", "IDF(birmingham)=6.77\n", "IDF(host)=1.74\n", "IDF(kingdom)=6.68\n", "IDF(nntp)=1.77\n", "IDF(sorri)=4.14\n", "IDF(test)=3.83\n", "IDF(uk)=3.70\n", "IDF(unit)=4.42\n", "IDF(univers)=1.91\n" ] } ], "prompt_number": 147 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u4e0a\u8a18\u4f8b\u3060\u3068\u3001birmingham\u3068kingdom\u306e2\u3064\u306e\u5358\u8a9e\u304c\u3001\u5206\u985e\u306b\u5927\u304d\u304f\u5bc4\u4e0e\u3057\u3066\u3044\u308b\u3053\u3068\u304c\u308f\u304b\u308b\u3002" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "\u307e\u3068\u3081" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u3053\u307e\u3067\u3001\u6587\u66f8\u306e\u985e\u4f3c\u5ea6\u3084\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u3092\u5b66\u3076\u305f\u3081\u3001\u4ee5\u4e0b\u306e\u69d8\u306a\u624b\u6cd5\u3092\u78ba\u8a8d\u3057\u305f\u3002 \n", "\n", "- \u6587\u66f8\u306e\u7279\u5fb4\u30d9\u30af\u30c8\u30eb\u306e\u751f\u6210\n", "- \u7279\u5fb4\u30d9\u30af\u30c8\u30eb\u306e\u8ddd\u96e2\n", "- \u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u306e\u624b\u6cd5\n", "- metrics\u306b\u3088\u308b\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u306e\u8a55\u4fa1\n", "- \u6587\u66f8\u306e\u30ce\u30a4\u30ba\n", "\n", "\u6539\u5584\u306e\u4f59\u5730\u304c\u3042\u308b\u9805\u76ee\u3082\u591a\u3044\u3002\n", "\n", "- \u7279\u5fb4\u30d9\u30af\u30c8\u30eb\u306e\u6570\n", "- \u7279\u5fb4\u30d9\u30af\u30c8\u30eb\u306e\u8ddd\u96e2\u3092\u5909\u66f4\u3059\u308b\uff08cos\u985e\u4f3c\u5ea6\u3084\u30d4\u30a2\u30bd\u30f3\u76f8\u95a2\u4fc2\u6570\u3001Jaccard\u4fc2\u6570\u306a\u3069\uff09\n", "- \u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u624b\u6cd5\u306e\u5909\u66f4(K-Means\u4ee5\u5916\u306b\u3082\u591a\u304f\u306e\u30af\u30e9\u30b9\u30bf\u30ea\u30f3\u30b0\u624b\u6cd5\u304c\u5b58\u5728\u3059\u308b)" ] } ], "metadata": {} } ] }