{"cells":[{"metadata":{"ExecuteTime":{"end_time":"2021-03-03T13:06:17.877069Z","start_time":"2021-03-03T13:06:16.378071Z"},"execution":{"iopub.execute_input":"2021-03-03T18:56:02.298438Z","iopub.status.busy":"2021-03-03T18:56:02.297756Z","iopub.status.idle":"2021-03-03T18:56:02.303842Z","shell.execute_reply":"2021-03-03T18:56:02.303025Z"},"papermill":{"duration":0.027971,"end_time":"2021-03-03T18:56:02.304042","exception":false,"start_time":"2021-03-03T18:56:02.276071","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport random\nimport gc\n\nfrom tqdm.notebook import tqdm\n\nrandom.seed(1)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2021-03-03T18:56:02.3374Z","iopub.status.busy":"2021-03-03T18:56:02.336675Z","iopub.status.idle":"2021-03-03T18:56:11.488395Z","shell.execute_reply":"2021-03-03T18:56:11.487847Z"},"papermill":{"duration":9.17006,"end_time":"2021-03-03T18:56:11.488555","exception":false,"start_time":"2021-03-03T18:56:02.318495","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"!pip install adabelief-tf","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.read_csv(\"../input/riiid-test-answer-prediction/train.csv\",\n                       usecols=[2, 3, 4, 6],\n                       dtype={\n                              'user_id': 'int32',\n                              'content_id': 'int16',\n                              'user_answer': 'int8',\n                              }\n                      )\nlectures_df = pd.read_csv('../input/riiid-test-answer-prediction/lectures.csv')\nquestions_df = pd.read_csv('../input/riiid-test-answer-prediction/questions.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"question_id_map = {id_: i+1 for i, id_ in enumerate(questions_df[\"question_id\"])}\nlecture_id_map = {id_: i+questions_df.shape[0]+1 for i, id_ in enumerate(lectures_df[\"lecture_id\"])}\nquestions_df[\"content_id\"] = questions_df[\"question_id\"].map(question_id_map)\nlectures_df[\"content_id\"] = lectures_df[\"lecture_id\"].map(lecture_id_map)\n\ntrain_df.loc[train_df[\"user_answer\"] != -1, \"content_id\"] = train_df.loc[train_df[\"user_answer\"] != -1, \"content_id\"].map(question_id_map)\ntrain_df.loc[train_df[\"user_answer\"] == -1, \"content_id\"] = train_df.loc[train_df[\"user_answer\"] == -1, \"content_id\"].map(lecture_id_map)\n\ntrain_df[\"choice_id\"] = train_df[\"content_id\"].astype(np.int32)*4 + train_df[\"user_answer\"].astype(np.int32) * (train_df[\"user_answer\"] >= 0)\n","execution_count":null,"outputs":[]},{"metadata":{"ExecuteTime":{"end_time":"2021-03-03T13:06:48.354648Z","start_time":"2021-03-03T13:06:36.614751Z"},"execution":{"iopub.execute_input":"2021-03-03T18:56:11.943911Z","iopub.status.busy":"2021-03-03T18:56:11.943208Z","iopub.status.idle":"2021-03-03T18:56:20.359321Z","shell.execute_reply":"2021-03-03T18:56:20.357984Z"},"papermill":{"duration":8.443886,"end_time":"2021-03-03T18:56:20.35949","exception":false,"start_time":"2021-03-03T18:56:11.915604","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"import tensorflow as tf\nchoice_parts = [0] * ((lectures_df[\"content_id\"].max()+1) * 4)\nchoice_tags = [[] for _ in range((lectures_df[\"content_id\"].max()+1) * 4)]\n\nfor i, row in questions_df.iterrows():\n    tags = [] if pd.isna(row[\"tags\"]) else list(map(int, row[\"tags\"].split()))\n    for i in range(4):\n        choice_tags[i + row[\"content_id\"]*4] = [t for t in tags]\n        choice_parts[i + row[\"content_id\"]*4] = row[\"part\"]\n\nfor i, row in lectures_df.iterrows():\n    tags = [row[\"tag\"]]\n    for i in range(4):\n        choice_tags[i + row[\"content_id\"]*4] = [t for t in tags]\n        choice_parts[i + row[\"content_id\"]*4] = row[\"part\"]\n        \nchoice_parts = tf.constant(choice_parts)\nchoice_tags = tf.keras.preprocessing.sequence.pad_sequences(choice_tags, dtype=\"int16\", value=-1, padding=\"post\") + 1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"start_of_records = (lectures_df[\"content_id\"].max() + 1) * 4\nrecords = []\nrecords_ixs = {}\nfor i, (user_id, df) in tqdm(enumerate(train_df.groupby(\"user_id\")), total=train_df[\"user_id\"].nunique()):\n    records.append(np.int32(np.concatenate([[start_of_records], df[\"choice_id\"].values])))\n    records_ixs[user_id] = i","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from gc import collect\ndel train_df\ncollect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sentences = []\nfor rec in tqdm(records):\n    sentence = [str(start_of_records//4)]\n    for word in rec:\n        sentence.append(str(word//4))\n    sentences.append(sentence)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from gensim.models import word2vec\nimport logging\n\nlogging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)\n\nw2v_model = word2vec.Word2Vec(size=64, min_count=1, window=3, iter=30, sample=1e-5, ns_exponent=.5, workers=4, sg=1) \nw2v_model.build_vocab(sentences, progress_per=10000)\nw2v_model.train(sentences, total_examples=w2v_model.corpus_count, epochs=5, report_delay=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"w2v_vec = []\nfor word in range(lectures_df[\"content_id\"].max()+2):\n    word = str(word)\n    if word in w2v_model.wv.vocab:\n        w2v_vec.append(w2v_model.wv[word])\n    else:\n        w2v_vec.append(w2v_model.wv.vectors.mean(axis=0))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import umap\nembs = np.array(w2v_vec)\n\nixs = np.arange(13943)\nnp.random.shuffle(ixs)\n\nmapper = umap.UMAP(n_neighbors=15, n_components=2, metric=\"cosine\", verbose=True).fit(embs[ixs])\n\nimport matplotlib.pyplot as plt\npart = choice_parts.numpy()[np.arange(13942, dtype=np.uint16)*4]\numap_emb = mapper.transform(embs)\nfor part in range(1, 8):\n    ix = np.where((choice_parts.numpy() == part)[::4])\n    plt.scatter(umap_emb[ix, 0], umap_emb[ix, 1], s=5, label=part)\n\n\nplt.legend()\nplt.tight_layout()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"w2v_vec = []\nfor word in range(lectures_df[\"content_id\"].max()+2):\n    word = str(word)\n    if word in w2v_model.wv.vocab:\n        w2v_vec.append(w2v_model.wv[word])\n    else:\n        w2v_vec.append(w2v_model.wv.vectors.mean(axis=0))\nw2v_vec = np.array(w2v_vec)\n\npd.to_pickle(w2v_vec, \"word2vec_weight.npy\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}