{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.\n\n%matplotlib inline\nimport matplotlib.pyplot as plt\nfrom itertools import combinations, chain\nfrom collections import defaultdict, Counter","execution_count":1,"outputs":[{"output_type":"stream","text":"['labels.csv', 'train', 'test', 'train.csv', 'sample_submission.csv']\n","name":"stdout"}]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"df_train = pd.read_csv(\"../input/train.csv\")\ndf_labels = pd.read_csv(\"../input/labels.csv\")","execution_count":2,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train.head()","execution_count":3,"outputs":[{"output_type":"execute_result","execution_count":3,"data":{"text/plain":"                 id        attribute_ids\n0  1000483014d91860          147 616 813\n1  1000fe2e667721fe       51 616 734 813\n2  1001614cb89646ee                  776\n3  10041eb49b297c08  51 671 698 813 1092\n4  100501c227f8beea  13 404 492 903 1093","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>id</th>\n      <th>attribute_ids</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1000483014d91860</td>\n      <td>147 616 813</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1000fe2e667721fe</td>\n      <td>51 616 734 813</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>1001614cb89646ee</td>\n      <td>776</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>10041eb49b297c08</td>\n      <td>51 671 698 813 1092</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>100501c227f8beea</td>\n      <td>13 404 492 903 1093</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_labels.head()","execution_count":4,"outputs":[{"output_type":"execute_result","execution_count":4,"data":{"text/plain":"   attribute_id          attribute_name\n0             0        culture::abruzzi\n1             1     culture::achaemenid\n2             2         culture::aegean\n3             3         culture::afghan\n4             4  culture::after british","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>attribute_id</th>\n      <th>attribute_name</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>0</td>\n      <td>culture::abruzzi</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1</td>\n      <td>culture::achaemenid</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2</td>\n      <td>culture::aegean</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>3</td>\n      <td>culture::afghan</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>4</td>\n      <td>culture::after british</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"culture_id_to_name = {row[\"attribute_id\"]: row[\"attribute_name\"] for i, row in df_labels.iterrows() if row[\"attribute_name\"].startswith(\"culture\")}\ntag_id_to_name = {row[\"attribute_id\"]: row[\"attribute_name\"] for i, row in df_labels.iterrows() if row[\"attribute_name\"].startswith(\"tag\")}","execution_count":5,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_train_dict(attribute_ids):\n    attribute_ids = [int(i) for i in attribute_ids.split(\" \")]\n    \n    c = [culture_id_to_name[attribute_id] for attribute_id in attribute_ids if attribute_id in culture_id_to_name.keys()]\n    t = [tag_id_to_name[attribute_id] for attribute_id in attribute_ids if attribute_id in tag_id_to_name.keys()]\n    \n    return {\"cultures\": c, \"tags\": t}","execution_count":6,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dict = [get_train_dict(a) for a in df_train.attribute_ids]","execution_count":7,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"tag_nums = [len(d[\"tags\"]) for d in train_dict]\nprint(max(tag_nums))\nplt.hist(tag_nums, np.arange(0, 10))","execution_count":8,"outputs":[{"output_type":"stream","text":"9\n","name":"stdout"},{"output_type":"execute_result","execution_count":8,"data":{"text/plain":"(array([2.2000e+02, 4.0440e+04, 3.0884e+04, 2.0853e+04, 1.0334e+04,\n        6.2290e+03, 2.1600e+02, 4.7000e+01, 1.4000e+01]),\n array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),\n <a list of 9 Patch objects>)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"culture_nums = [len(d[\"cultures\"]) for d in train_dict]\nprint(max(culture_nums))\nplt.hist(culture_nums, np.arange(0, 5))","execution_count":9,"outputs":[{"output_type":"stream","text":"4\n","name":"stdout"},{"output_type":"execute_result","execution_count":9,"data":{"text/plain":"(array([11872., 87679.,  9166.,   520.]),\n array([0, 1, 2, 3, 4]),\n <a list of 4 Patch objects>)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"sorted_culture_pairs = Counter(chain.from_iterable([combinations(d[\"cultures\"], 2) for d in train_dict])).most_common()\nsorted_culture_pairs[:20]","execution_count":10,"outputs":[{"output_type":"execute_result","execution_count":10,"data":{"text/plain":"[(('culture::british', 'culture::london'), 838),\n (('culture::french', 'culture::paris'), 808),\n (('culture::attic', 'culture::greek'), 676),\n (('culture::italian', 'culture::venice'), 515),\n (('culture::german', 'culture::meissen'), 402),\n (('culture::british', 'culture::staffordshire'), 388),\n (('culture::french', 'culture::sevres'), 317),\n (('culture::greek', 'culture::south italian'), 270),\n (('culture::florence', 'culture::italian'), 252),\n (('culture::italian', 'culture::naples'), 206),\n (('culture::augsburg', 'culture::german'), 173),\n (('culture::italian', 'culture::rome'), 155),\n (('culture::austrian', 'culture::vienna'), 145),\n (('culture::british', 'culture::chelsea'), 133),\n (('culture::cypriot', 'culture::roman'), 132),\n (('culture::eastern mediterranean', 'culture::greek'), 119),\n (('culture::british', 'culture::worcester'), 118),\n (('culture::apulian', 'culture::greek'), 116),\n (('culture::greek', 'culture::laconian'), 116),\n (('culture::apulian', 'culture::south italian'), 115)]"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"sorted_tag_pairs = Counter(chain.from_iterable([combinations(d[\"tags\"], 2) for d in train_dict])).most_common()\nsorted_tag_pairs[:20]","execution_count":11,"outputs":[{"output_type":"execute_result","execution_count":11,"data":{"text/plain":"[(('tag::men', 'tag::women'), 5715),\n (('tag::flowers', 'tag::leaves'), 3169),\n (('tag::men', 'tag::portraits'), 2881),\n (('tag::portraits', 'tag::women'), 2569),\n (('tag::actresses', 'tag::women'), 1442),\n (('tag::men', 'tag::trees'), 1347),\n (('tag::inscriptions', 'tag::men'), 1347),\n (('tag::men', 'tag::profiles'), 1295),\n (('tag::actresses', 'tag::portraits'), 1279),\n (('tag::horse riding', 'tag::men'), 1087),\n (('tag::flowers', 'tag::textile fragments'), 1019),\n (('tag::landscapes', 'tag::trees'), 977),\n (('tag::trees', 'tag::women'), 906),\n (('tag::profiles', 'tag::women'), 835),\n (('tag::birds', 'tag::flowers'), 794),\n (('tag::leaves', 'tag::textile fragments'), 772),\n (('tag::flowers', 'tag::utilitarian objects'), 729),\n (('tag::houses', 'tag::trees'), 724),\n (('tag::inscriptions', 'tag::women'), 707),\n (('tag::horses', 'tag::men'), 700)]"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"culture_tag_pair_to_cnt = defaultdict(int)\n\nfor d in train_dict:\n    for c in d[\"cultures\"]:\n        for t in d[\"tags\"]:\n            culture_tag_pair_to_cnt[(c, t)] += 1\n\nsorted_culture_tag_pairs = sorted(culture_tag_pair_to_cnt.items(), key=lambda x: x[1], reverse=True)\nsorted_culture_tag_pairs[:20]","execution_count":12,"outputs":[{"output_type":"execute_result","execution_count":12,"data":{"text/plain":"[(('culture::french', 'tag::men'), 3486),\n (('culture::american', 'tag::women'), 2607),\n (('culture::french', 'tag::women'), 2460),\n (('culture::american', 'tag::portraits'), 2396),\n (('culture::british', 'tag::men'), 2117),\n (('culture::italian', 'tag::men'), 1982),\n (('culture::french', 'tag::flowers'), 1947),\n (('culture::american', 'tag::men'), 1762),\n (('culture::japan', 'tag::men'), 1448),\n (('culture::american', 'tag::actresses'), 1446),\n (('culture::french', 'tag::leaves'), 1425),\n (('culture::british', 'tag::women'), 1411),\n (('culture::german', 'tag::men'), 1329),\n (('culture::japan', 'tag::women'), 1260),\n (('culture::italian', 'tag::women'), 1147),\n (('culture::egyptian', 'tag::hieroglyphs'), 1018),\n (('culture::japan', 'tag::trees'), 950),\n (('culture::french', 'tag::portraits'), 833),\n (('culture::japan', 'tag::flowers'), 809),\n (('culture::british', 'tag::flowers'), 793)]"},"metadata":{}}]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}