diff --git a/Konopka_QA.ipynb b/Konopka_QA.ipynb new file mode 100644 index 0000000..7836824 --- /dev/null +++ b/Konopka_QA.ipynb @@ -0,0 +1,2332 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Importy i sprawdzenie GPU" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 1, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Available GPU True\n" + ] + } + ], + "source": [ + "import datasets\n", + "import torch\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "from transformers import AutoModelForQuestionAnswering, AutoTokenizer, pipeline\n", + "import json\n", + "import torch\n", + "\n", + "is_gpu_available = torch.cuda.is_available()\n", + "print(\"Available GPU\", is_gpu_available)" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "# The dataset" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "Check SubjQA dataset domains" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": "['books', 'electronics', 'grocery', 'movies', 'restaurants', 'tripadvisor']" + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "datasets.get_dataset_config_names(\"subjqa\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SubjQA is a question answering dataset that focuses on subjective questions and answers.\n", + "The dataset consists of roughly 10,000 questions over reviews from 6 different domains: books, movies, grocery,\n", + "electronics, TripAdvisor (i.e. hotels), and restaurants. \n", + "\n", + "FEATURES {'domain': Value(dtype='string', id=None), 'nn_mod': Value(dtype='string', id=None), 'nn_asp': Value(dtype='string', id=None), 'query_mod': Value(dtype='string', id=None), 'query_asp': Value(dtype='string', id=None), 'q_reviews_id': Value(dtype='string', id=None), 'question_subj_level': Value(dtype='int64', id=None), 'ques_subj_score': Value(dtype='float32', id=None), 'is_ques_subjective': Value(dtype='bool', id=None), 'review_id': Value(dtype='string', id=None), 'id': Value(dtype='string', id=None), 'title': Value(dtype='string', id=None), 'context': Value(dtype='string', id=None), 'question': Value(dtype='string', id=None), 'answers': Sequence(feature={'text': Value(dtype='string', id=None), 'answer_start': Value(dtype='int32', id=None), 'answer_subj_level': Value(dtype='int64', id=None), 'ans_subj_score': Value(dtype='float32', id=None), 'is_ans_subjective': Value(dtype='bool', id=None)}, length=-1, id=None)} \n", + "\n", + "SPLITS {'train': SplitInfo(name='train', num_bytes=1574953, num_examples=1165, dataset_name='subjqa'), 'test': SplitInfo(name='test', num_bytes=689440, num_examples=512, dataset_name='subjqa'), 'validation': SplitInfo(name='validation', num_bytes=312577, num_examples=230, dataset_name='subjqa')} \n", + "\n" + ] + } + ], + "source": [ + "selected_config = 'tripadvisor'\n", + "ds_builder = datasets.load_dataset_builder(\"subjqa\", selected_config)\n", + "print(ds_builder.info.description, \"\\n\")\n", + "print(\"FEATURES\", ds_builder.info.features, \"\\n\")\n", + "print(\"SPLITS\", ds_builder.info.splits, \"\\n\")" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 4, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Reusing dataset subjqa (/home/karo/.cache/huggingface/datasets/subjqa/tripadvisor/1.1.0/e5588f9298ff2d70686a00cc377e4bdccf4e32287459e3c6baf2dc5ab57fe7fd)\n" + ] + }, + { + "data": { + "text/plain": " 0%| | 0/3 [00:00\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
idtitlequestionanswers.textanswers.answer_startcontext
25440d78196c65a3bec3913e2291cd9b771fYl2TN9c23ZGLUBSD9ks5UwIs it present ?[so it's a bit of a splurge meal][177]Byblos has a really beautiful decor, that I wo...
88457b688d836d9502a076fe6a50a9cde81usa_san francisco_hotel_adagioWhere can I locate the hotel staff?[][]Stayed at the Adagio for 4 nights end of June-...
\n" + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qa_cols = [\"id\", \"title\", \"question\", \"answers.text\",\n", + " \"answers.answer_start\", \"context\"]\n", + "sample_df = dfs[\"train\"][qa_cols].sample(2, random_state=7)\n", + "sample_df" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "Sprawdzenie generowania odpowiedzi z kontekstu" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 13, + "outputs": [ + { + "data": { + "text/plain": "\"so it's a bit of a splurge meal\"" + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "start_idx = sample_df[\"answers.answer_start\"].iloc[0][0]\n", + "end_idx = start_idx + len(sample_df[\"answers.text\"].iloc[0][0])\n", + "sample_df[\"context\"].iloc[0][start_idx:end_idx]" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "Usuń obiekty które nie posiadają odpowiedzi" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 16, + "outputs": [ + { + "data": { + "text/plain": " 0%| | 0/2 [00:00 0)\n", + "subjqa['validation'] = subjqa['validation'].filter(lambda example: len(example[\"answers\"]['text']) > 0)\n", + "dfs = {split: dset.to_pandas() for split, dset in subjqa.flatten().items()}\n", + "subjqa" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 15, + "outputs": [ + { + "data": { + "text/plain": " domain nn_mod nn_asp query_mod query_asp \\\n0 tripadvisor excellent hotel friendly hotel \n1 tripadvisor neat hotel cozy hotel \n2 tripadvisor excellent value for money good value for money \n3 tripadvisor convenient place safe hotel \n4 tripadvisor helpful staff helpfull staff \n\n q_reviews_id question_subj_level ques_subj_score \\\n0 b96b8478f5202ac9534eaf75167016f7 1 0.0 \n1 ca174c824baba906d30eed207350e37e 1 0.0 \n2 5d41bfd0e2166e14eeae1c1be9085555 3 0.0 \n3 a5880d95aa1161cfaac48584ee58934d 1 0.6 \n4 902b8e2a5c10f1796abdc830c4a4acd2 2 0.0 \n\n is_ques_subjective review_id \\\n0 False tripadvisor_review_1509 \n1 False tripadvisor_review_6133 \n2 False tripadvisor_review_4872 \n3 True tripadvisor_review_4715 \n4 False tripadvisor_review_1093 \n\n id \\\n0 d1c352b70d1225245569a0a1acbf5e04 \n1 b6fbf58ca273ad8f9b47a9be6a36e707 \n2 ea95bccdd762284ad7040be8d016da4f \n3 413df1095d03e4f967d349f0490a2514 \n4 d7fdc86b464f2a797dca33b058b68078 \n\n title \\\n0 usa_san francisco_argonaut_hotel_a_kimpton_hotel \n1 usa_san francisco_best_western_tuscan_inn_fish... \n2 usa_san francisco_castle_inn \n3 usa_san francisco_castle_inn \n4 usa_san francisco_chancellor_hotel_on_union_sq... \n\n context \\\n0 Great setting at the end of the wharf (so your... \n1 My wife and I took two trips to San Fran in 20... \n2 Yep, I have to agree with all those folks who ... \n3 On first sight the Castle hotel is not great, ... \n4 Stayed at the Chancellor recently for 3 nights... \n\n question \\\n0 How was the hotel? \n1 How is the hotel? \n2 Is it value for money? \n3 Does the hotel offer good service? \n4 How do you rate the staff? \n\n answers.text answers.answer_start \\\n0 [excellent hotels] [527] \n1 [The hotel location was great] [129] \n2 [And very reasonably priced. Overall, excellen... [501] \n3 [On first sight the Castle hotel is not great] [0] \n4 [Staff very helpful] [86] \n\n answers.answer_subj_level answers.ans_subj_score answers.is_ans_subjective \n0 [1] [1.0] [True] \n1 [1] [0.75] [True] \n2 [3] [0.58] [True] \n3 [1] [0.5416667] [True] \n4 [2] [0.3] [False] ", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
domainnn_modnn_aspquery_modquery_aspq_reviews_idquestion_subj_levelques_subj_scoreis_ques_subjectivereview_ididtitlecontextquestionanswers.textanswers.answer_startanswers.answer_subj_levelanswers.ans_subj_scoreanswers.is_ans_subjective
0tripadvisorexcellenthotelfriendlyhotelb96b8478f5202ac9534eaf75167016f710.0Falsetripadvisor_review_1509d1c352b70d1225245569a0a1acbf5e04usa_san francisco_argonaut_hotel_a_kimpton_hotelGreat setting at the end of the wharf (so your...How was the hotel?[excellent hotels][527][1][1.0][True]
1tripadvisorneathotelcozyhotelca174c824baba906d30eed207350e37e10.0Falsetripadvisor_review_6133b6fbf58ca273ad8f9b47a9be6a36e707usa_san francisco_best_western_tuscan_inn_fish...My wife and I took two trips to San Fran in 20...How is the hotel?[The hotel location was great][129][1][0.75][True]
2tripadvisorexcellentvalue for moneygoodvalue for money5d41bfd0e2166e14eeae1c1be908555530.0Falsetripadvisor_review_4872ea95bccdd762284ad7040be8d016da4fusa_san francisco_castle_innYep, I have to agree with all those folks who ...Is it value for money?[And very reasonably priced. Overall, excellen...[501][3][0.58][True]
3tripadvisorconvenientplacesafehotela5880d95aa1161cfaac48584ee58934d10.6Truetripadvisor_review_4715413df1095d03e4f967d349f0490a2514usa_san francisco_castle_innOn first sight the Castle hotel is not great, ...Does the hotel offer good service?[On first sight the Castle hotel is not great][0][1][0.5416667][True]
4tripadvisorhelpfulstaffhelpfullstaff902b8e2a5c10f1796abdc830c4a4acd220.0Falsetripadvisor_review_1093d7fdc86b464f2a797dca33b058b68078usa_san francisco_chancellor_hotel_on_union_sq...Stayed at the Chancellor recently for 3 nights...How do you rate the staff?[Staff very helpful][86][2][0.3][False]
\n
" + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dfs['validation'].head()" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "Sprawdzenie typów pytań" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 17, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "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3VpRUVGaPHlyoQBw/l+lLVq0UIsWLfTuu+9q3rx5uvvuu1WhwsX/xvH29tbNN9+sBQsWuF3WffjwYc2aNUs33njj7/qI5fbbb1fTpk2VmJiojRs3uq3Lz8/Xww8/rJMnT7rdBK/gDfe345yXl1foY8DLfY3z8vKUnp7utq569eqqUaOG2xm9SpUqFep3IeHh4br22mv1/vvvu70WO3bs0JdffqlevXpdch/F6b777tPOnTs1evRoeXt76+67775gvw8++MBtHtQnn3yigwcPWsGkuMfzQgoC4JXcGdnb21sOh8PtjN7+/ftt/bUj+GM4o4OrgpeXl95991317NlTTZs21ZAhQ1SzZk39/PPPSkpKUlBQkHXpc0JCghYvXqxOnTpp6NChys3N1ZQpU9S0aVPrY5UCf/rTn5SYmKg//elPatu2rb766it9//33hZ4/MTFRSUlJat++vR588EE1adJEJ06c0KZNm7Rs2TKdOHHiio/nrbfeUp8+fXTttddqyJAhCg8P13fffadvv/22UCgbNGiQHnvsMUm67I+tnn/+eS1dulQ33nijhg4dqgoVKmjatGnKycnRxIkTr6jeAj4+Ppo3b566dOmiG2+80e3OyLNmzdKmTZv05JNPqn///tY2TZs21fXXX68xY8ZYl07Pnj1bubm5hcbkcl7jzMxM1apVS3fccYdatmypgIAALVu2TBs2bNDLL79s7a9Nmzb6+OOP9cgjj6hdu3YKCAhQnz59LnhckyZNUs+ePdWhQwc98MAD1uXlwcHBhe6nVNJ69+6tqlWrau7cuerZs2eRc52uueYa6zU4fPiwJk+erOjoaD344IOSin88L6RNmzaSpKeeekp33323fHx81KdPn4ueAevdu7deeeUV9ejRQ/fcc4+OHDmiN954Q9HR0YV+PgFJXF6O8qXg8tANGzZccH3BpbNz58694PrNmzeb/v37m6pVqxqn02lq165tBgwYYJYvX+7Wb+XKlaZNmzbG19fX1K1b10ydOtW6NPi3Tp8+bR544AETHBxsAgMDzYABA8yRI0cKXV5ujDGHDx82w4YNMxEREcbHx8eEhYWZrl27mrfffvuS9Rd1Kfvq1avNTTfdZAIDA02lSpVMixYtzJQpUwod98GDB423t7dp0KDBBcelKJs2bTLdu3c3AQEBxt/f38TGxpq1a9desLbLuby8wNGjR82jjz5qoqOjja+vr3WLgH/9618X7L93717TrVs343Q6TWhoqHnyySfN0qVL3S4vL3Cp1zgnJ8eMHj3atGzZ0hq3li1bmjfffNNtP1lZWeaee+4xlStXNpKsS82Lei2WLVtmOnbsaPz8/ExQUJDp06eP2blzp1ufgv9DR48edWsv6hL6izn/8vLfGjp0qJFkZs2aVWhdwf+xjz76yIwZM8ZUr17d+Pn5md69e7vdUqFAcY1nUZ577jlTs2ZN4+Xl5TYGkoq8ZP1f//qXqV+/vnE6naZRo0Zm+vTpF/z5LOry8vN/f5x/qwLYi8MYZl8Bl2PcuHFKSEgolxMWjx07pvDwcD3zzDN6+umnPV1OIdu3b1enTp0UERGh1atXKzg42NMllWujRo3Sv/71Lx06dEj+/v5u65KTkxUbG6u5c+fqjjvu8FCFQOlhjg5wFZgxY4by8vIueJlxWdC8eXMtWLBAe/bsUb9+/XT27FlPl1RunTlzRh9++KFuv/32QiEHuBoxRwewsRUrVmjnzp0aP368+vXrd9HvofI0l8ulM2fOeLqMcuvIkSNatmyZPvnkEx0/flwjRozwdElAmUDQAWzs2Wef1dq1a9WxY0dNmTLF0+WgBO3cuVNxcXGqXr26Xn/99SLvfQNcbZijAwAAbIs5OgAAwLYIOgAAwLau+jk6+fn5+uWXXxQYGPi7bkcOAABKnzFGmZmZqlGjhry8ij5vc9UHnV9++eV3fWcPAADwvNTUVNWqVavI9Vd90AkMDJT060D9nu/uAQAApS8jI0MRERHW+3hRrvqgU/BxVVBQEEEHAIBy5lLTTpiMDAAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbOuqv2FggWZjl8jL6e/pMgAAsI39ib09XQJndAAAgH0RdAAAgG0RdAAAgG0RdAAAgG0RdAAAgG0RdAAAgG0RdAAAgG2VWtCJj49Xv379CrUnJyfL4XAoLS2ttEoBAABXCc7oAAAA2ypzQWfevHlq2rSpnE6n6tSpo5dfftla989//lPNmjWzHs+fP18Oh0NTp0612rp166Z//OMfpVozAAAom8pU0Pnmm280YMAA3X333dq+fbvGjRunp59+WjNmzJAkuVwu7dy5U0ePHpUkrVy5UtWqVVNycrIk6dy5c1q3bp1iYmKKfI6cnBxlZGS4LQAAwJ5KNegsXLhQAQEBbkvPnj2t9a+88oq6du2qp59+Wg0aNFB8fLyGDx+uSZMmSZKaNWuma665RitXrpT06/yeRx991Hq8fv16nTt3TjfccEORNUyYMEHBwcHWEhERUYJHDAAAPKlUg05sbKy2bNnitrz77rvW+l27dqljx45u23Ts2FF79uxRXl6eHA6HOnfurOTkZKWlpWnnzp0aOnSocnJy9N1332nlypVq166d/P2L/nLOMWPGKD093VpSU1NL7HgBAIBnleq3l1eqVEnR0dFubf/73/+uaB8xMTF6++23tWrVKrVq1UpBQUFW+Fm5cqVcLtdFt3c6nXI6nVdcOwAAKH/K1Bydxo0ba82aNW5ta9asUYMGDeTt7S3p/+bpzJ0715qLExMTo2XLlmnNmjUXnZ8DAACuLmUq6Dz66KNavny5nnvuOX3//fd6//339c9//lOPPfaY1adFixaqUqWKZs2a5RZ05s+fr5ycnEIffQEAgKtXmQo6rVu31pw5czR79mw1a9ZMzzzzjJ599lnFx8dbfRwOhzp16iSHw6Ebb7xR0q/hJygoSG3btlWlSpU8VD0AAChrHMYY4+kiPCkjI+PXq69GzpGXs+hJzAAA4MrsT+xdYvsueP9OT09XUFBQkf3K1BkdAACA4kTQAQAAtkXQAQAAtkXQAQAAtlWqNwwsy3YkdL/oZCYAAFD+cEYHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYVgVPF1BWNBu7RF5Of0+XgQvYn9jb0yUAAMopzugAAADbIugAAADbIugAAADbIugAAADbIugAAADbIugAAADbKhNBx+FwaP78+Z4uAwAA2EyxBp2pU6cqMDBQubm5VltWVpZ8fHwUExPj1jc5OVkOh0N79+4tlueOj49Xv379imVfAADAHoo16MTGxiorK0sbN2602latWqWwsDClpKTozJkzVntSUpIiIyNVr1694iwBAADAUqxBp2HDhgoPD1dycrLVlpycrL59+yoqKkpff/21W3tsbKz1+NixY7rtttvk7++v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ffjhh5o8ebLefvvtUjwaAABQVpX6HB3p16AzbNgwnTt3zjqjI0kul0vDhw/X2bNnFRsbqwoVKsjX11dTpkzRQw89pB07dui5555z29czzzyjNm3aqGnTpsrJydHChQvVuHHj0j4kAABQBnnsjE52draio6MVGhpqtbtcLmVmZlqXoYeEhGjGjBmaO3eumjRposTERL300ktu+/L19dWYMWPUokULde7cWd7e3po9e3ZpHxIAACiDHMYY4+kiPCkjI0PBwcGKGDlHXk7/K9p2f2LvEqoKAABcTMH7d3p6+kXn2/JdVwAAwLYIOgAAwLYIOgAAwLYIOgAAwLYIOgAAwLY8ch+dsmhHQnfukgwAgM1wRgcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANhWBU8XUFY0G7tEXk7/ItfvT+xditUAAIDiwBkdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgW2U66DgcDs2fP9/TZQAAgHKqVILO1KlTFRgYqNzcXKstKytLPj4+iomJceubnJwsh8OhvXv3lkZpAADAxkol6MTGxiorK0sbN2602latWqWwsDClpKTozJkzVntSUpIiIyNVr1690igNAADYWKkEnYYNGyo8PFzJyclWW3Jysvr27auoqCh9/fXXbu2xsbHW42PHjum2226Tv7+/6tevr88//1ySZIxRdHS0XnrpJbfn2rJlixwOh3744YeSPSgAAFDmldocndjYWCUlJVmPk5KSFBMTI5fLZbVnZ2crJSXFLegkJCRowIAB2rZtm3r16qW4uDidOHFCDodD999/v6ZPn+72PNOnT1fnzp0VHR19wTpycnKUkZHhtgAAAHsq1aCzZs0a5ebmKjMzU5s3b5bL5VLnzp2tMz3r1q1TTk6OW9CJj4/XwIEDFR0drRdeeEFZWVlav369tW737t3W43PnzmnWrFm6//77i6xjwoQJCg4OtpaIiIiSO2gAAOBRpRZ0YmJidOrUKW3YsEGrVq1SgwYNFBISIpfLZc3TSU5OVt26dRUZGWlt16JFC+vflSpVUlBQkI4c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\n" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjoAAAGzCAYAAAAmH71NAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAABAB0lEQVR4nO3deVyU5f7/8feAOAoImqKggqK471tWpgNquWUupWWUYp06pZ7Uyso6ptQpzepk2aLWSVs0lyytTmouYK64p6aZmQuluQuoiALX749+3N9GQLEjDHP7ej4e9+PhXPf2ue4ZZt7e93XPOIwxRgAAADbk4+kCAAAACgtBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBB7jG7N69W7feequCg4PlcDg0b948T5dUaPbt2yeHw6Fp06Z5uhRcZNq0aXI4HNq3b5/VFh0drejo6Muum5iYKIfDocTExKtak8Ph0JgxY67qNuF5BB0Umpw3srymp59+2tPlXbMGDBigbdu26cUXX9THH3+sli1bXnL548ePa8SIEapTp45KlSql6667Tp06ddJ///vfIqr48mbMmKEJEyZ4ugxJ//chXJAJRe+bb74hzFxjSni6ANjf888/r8jISLe2hg0beqiaa1t6errWrFmjZ599VkOGDLns8rt27VKHDh109OhRDRw4UC1bttSpU6c0ffp03XbbbXrqqac0bty4Iqj80mbMmKHt27dr2LBhbu3VqlVTenq6/Pz8iqyWevXq6eOPP3ZrGzlypAIDA/Xss88WWR3e6Ntvvy30fXzzzTd6++238ww76enpKlGCj0W74RlFoevSpctlzxrkOHfunEqWLCkfH042FoajR49KksqWLXvZZS9cuKA777xTJ0+e1HfffafWrVtb84YPH67Y2Fi9/PLLatGihfr06VNYJf9PHA6HSpUqVaT7rFSpku699163tnHjxqlChQq52uGuZMmSHt1/Ub9WUDT4NIHH5Jzinzlzpv75z3+qSpUq8vf3V2pqqiQpKSlJnTt3VnBwsPz9/eVyubRq1apc21m5cqVatWqlUqVKqWbNmpo8ebLGjBnjdmngUmM18rou/9tvv+n+++9XpUqV5HQ61aBBA33wwQd51j979my9+OKLqlq1qkqVKqUOHTro559/zrWfpKQkde3aVeXKlVNAQIAaN26sN954Q5I0depUORwObd68Odd6L730knx9ffXbb79d8nhu3rxZXbp0UVBQkAIDA9WhQwetXbvWmj9mzBhVq1ZNkjRixAg5HA5Vr1493+3NnTtX27dv19NPP+0WciTJ19dXkydPVtmyZTV69GirPa9xF38+VhePqSjIc5yWlqZhw4apevXqcjqdqlixom655RZt2rRJ0h/jOv773/9q//791iWhnH7l97wvW7ZMbdu2VUBAgMqWLasePXpo586dbsvkvIZ+/vlnxcXFqWzZsgoODtbAgQN19uzZfI/b5RhjVL16dfXo0SPXvHPnzik4OFh///vf3Y7brFmz9Mwzzyg0NFQBAQG6/fbblZycnGv9q3E88/LZZ5/J4XBo+fLlueZNnjxZDodD27dvlyRt3bpVcXFxqlGjhkqVKqXQ0FDdf//9On78+GWPTV5jdH799Vf17NlTAQEBqlixooYPH66MjIxc665YsUJ9+vRRRESEnE6nwsPDNXz4cKWnp1vLxMXF6e2335akPC8h5vVecLm/K+n/XverVq3SY489ppCQEAUEBKhXr17Wfy7gOZzRQaFLSUnRsWPH3NoqVKhg/fuFF15QyZIl9cQTTygjI0MlS5bUsmXL1KVLF7Vo0UKjR4+Wj4+Ppk6dqvbt22vFihW6/vrrJUnbtm3TrbfeqpCQEI0ZM0aZmZkaPXq0KlWq9JfrPXz4sG644QY5HA4NGTJEISEhWrBggR544AGlpqbmujwybtw4+fj46IknnlBKSorGjx+v2NhYJSUlWcssXrxYt912m8LCwjR06FCFhoZq586d+vrrrzV06FDdeeedGjx4sKZPn65mzZq5bX/69OmKjo5WlSpV8q35hx9+UNu2bRUUFKQnn3xSfn5+mjx5sqKjo7V8+XK1bt1avXv3VtmyZTV8+HD169dPXbt2VWBgYL7b/OqrryRJ/fv3z3N+cHCwevTooQ8//FB79uxRzZo1L3do3RT0OX744Yf12WefaciQIapfv76OHz+ulStXaufOnWrevLmeffZZpaSk6Ndff9Xrr78uSZfs15IlS9SlSxfVqFFDY8aMUXp6uiZOnKg2bdpo06ZNucJf3759FRkZqbFjx2rTpk16//33VbFiRb388stX1N8cDodD9957r8aPH68TJ07ouuuus+Z99dVXSk1NzXXm58UXX5TD4dBTTz2lI0eOaMKECerYsaO2bNmi0qVLX9XjmZdu3bopMDBQs2fPlsvlcps3a9YsNWjQwLocvXjxYv3yyy8aOHCgQkND9cMPP2jKlCn64YcftHbt2isam5Senq4OHTrowIEDevTRR1W5cmV9/PHHWrZsWa5l58yZo7Nnz+qRRx5R+fLltW7dOk2cOFG//vqr5syZI0n6+9//roMHD2rx4sW5Li/mpSB/V3/2j3/8Q+XKldPo0aO1b98+TZgwQUOGDNGsWbMK3GcUAgMUkqlTpxpJeU7GGJOQkGAkmRo1apizZ89a62VnZ5tatWqZTp06mezsbKv97NmzJjIy0txyyy1WW8+ePU2pUqXM/v37rbYdO3YYX19f8+eX9969e40kM3Xq1Fx1SjKjR4+2Hj/wwAMmLCzMHDt2zG25u+++2wQHB1u15tRfr149k5GRYS33xhtvGElm27ZtxhhjMjMzTWRkpKlWrZo5efKk2zb/3L9+/fqZypUrm6ysLKtt06ZN+db9Zz179jQlS5Y0e/bssdoOHjxoypQpY9q1a5frOLzyyiuX3J4xxjRt2tQEBwdfcpl///vfRpL58ssvjTH/95zv3bvXbbmcY5WQkGCMubLnODg42AwePPiSdXTr1s1Uq1YtV3tez3vTpk1NxYoVzfHjx62277//3vj4+Jj+/ftbbaNHjzaSzP333++2zV69epny5ctfsp6LNWjQwLhcLuvxrl27jCTz7rvvui13++23m+rVq1vHJOe4ValSxaSmplrLzZ4920gyb7zxhjHm6h/PvPTr189UrFjRZGZmWm2HDh0yPj4+5vnnn3fb58U+/fRTI8l89913VlterxWXy+V2nCZMmGAkmdmzZ1ttZ86cMVFRUW6vp/z2O3bsWONwONzeHwYPHmzy++i7+L2goH9XOX3p2LGj2/EfPny48fX1NadOncpzfygaXLpCoXv77be1ePFit+nPBgwYYP2vVJK2bNmi3bt365577tHx48d17NgxHTt2TGfOnFGHDh303XffKTs7W1lZWVq0aJF69uypiIgIa/169eqpU6dOf6lWY4zmzp2r7t27yxhj7fvYsWPq1KmTUlJScp3iHzhwoNvYgrZt20qSfvnlF0l/nPreu3evhg0blmtszJ//d9u/f38dPHhQCQkJVtv06dNVunRp3XHHHfnWnJWVpW+//VY9e/ZUjRo1rPawsDDdc889WrlypXU58EqkpaWpTJkyl1wmZ35aWtoVbbugz7H0x3iipKQkHTx48Ir7cLFDhw5py5YtiouLczuT0rhxY91yyy365ptvcq3z8MMPuz1u27atjh8//peOaY7atWurdevWmj59utV24sQJLViwQLGxsbnOevTv39/tubjzzjsVFhZm1VsUx/Ouu+7SkSNH3C4/fvbZZ8rOztZdd91ltf35b/ncuXM6duyYbrjhBkm65OWxvHzzzTcKCwvTnXfeabX5+/vroYceyrXsn/d75swZHTt2TDfddJOMMXleEr6cv/J39dBDD7k9d23btlVWVpb2799/xfvH1cOlKxS666+//pKDkS++I2v37t2S/ghA+UlJSVFGRobS09NVq1atXPPr1KmT54fW5Rw9elSnTp3SlClTNGXKlDyXOXLkiNvjP4csSSpXrpwk6eTJk5KkPXv2SLr8nWa33HKLwsLCNH36dHXo0EHZ2dn69NNP1aNHj0sGjqNHj+rs2bOqU6dOrnn16tVTdna2kpOT1aBBg0vu/2JlypTJdcnxYjkBp2LFile07YI+x+XKldP48eM1YMAAhYeHq0WLFuratav69+/v9uFTUDkfOPkdq0WLFunMmTMKCAiw2i/1/AYFBV1xDTn69++vIUOGaP/+/apWrZrmzJmjCxcu6L777su17MWvcYfDoaioKGssVFEcz5yxP7NmzVKHDh0k/XHZqmnTpqpdu7a13IkTJxQfH6+ZM2fm+ltJSUm55D4utn//fkVFReUKfnk9fwcOHNBzzz2nL7/80vrb+6v7lf7a39Xl3gvgGQQdeNyf/ycmyfqf5yuvvKKmTZvmuU5gYGCeAxLzk9+4gKysrDz3fe+99+b7odG4cWO3x76+vnkuZ4wpcH0527nnnnv03nvv6Z133tGqVat08OBBj92pU79+fW3ZskUHDhzI9QaeY+vWrZJkfUhe6XG+3HMs/TFGpm3btvriiy/07bff6pVXXtHLL7+szz//XF26dLnifl2pq/X8Xuzuu+/W8OHDNX36dD3zzDP65JNP1LJlyzw/WC+nKI6n0+lUz5499cUXX+idd97R4cOHtWrVKr300ktuy/Xt21erV6/WiBEj1LRpUwUGBio7O1udO3e26rzasrKydMstt+jEiRN66qmnVLduXQUEBOi3335TXFxcoe33YoX1WsH/hqCDYidnUGtQUJA6duyY73IhISEqXbq09b/ZP9u1a5fb45z/WZ06dcqt/eJTyiEhISpTpoyysrIuue8rkdOf7du3X3ab/fv312uvvaavvvpKCxYsUEhIyGUvw4WEhMjf3z9XnyXpxx9/lI+Pj8LDw6+47u7du2vGjBn66KOP9M9//jPX/NTUVM2fP1/Nmze3gk5Bj3NBn+McYWFhGjRokAYNGqQjR46oefPmevHFF60P5oIOcM256yy/Y1WhQgW3szmF6brrrlO3bt00ffp0xcbGatWqVfl+6eHFr3FjjH7++WcrdF/t45mfu+66Sx9++KGWLl2qnTt3yhjjdtnq5MmTWrp0qeLj4/Xcc8/lW39BVatWTdu3b5cxxu05vvj527Ztm3766Sd9+OGHboPnL75MLhX8tVJYf1coeozRQbHTokUL1axZU6+++qpOnz6da37O7Zq+vr7q1KmT5s2bpwMHDljzd+7cqUWLFrmtExQUpAoVKui7775za3/nnXfcHvv6+uqOO+6wbq3Ob99Xonnz5oqMjNSECRNyBYCL/6fXuHFjNW7cWO+//77mzp2ru++++7JfYObr66tbb71V8+fPd7ut+/Dhw5oxY4Zuvvnmv3SJ5Y477lCDBg00btw4bdiwwW1edna2HnnkEZ08edLtS/ByPnD/fJyzsrJyXQYs6HOclZWV67JDxYoVVblyZbczegEBAQW6PBEWFqamTZvqww8/dHsutm/frm+//VZdu3a97Daupvvuu087duzQiBEj5Ovrq7vvvjvP5T766CO3cVCfffaZDh06ZAWTq30889OxY0ddd911mjVrlmbNmqXrr7/e7dJzzhmNi1/Xf/Vbq7t27aqDBw/qs88+s9rOnj2b6/WU136NMdbXN/xZTpC9+G/xYoX1d4WixxkdFDs+Pj56//331aVLFzVo0EADBw5UlSpV9NtvvykhIUFBQUHWrc/x8fFauHCh2rZtq0GDBikzM1MTJ05UgwYNrMsqOf72t79p3Lhx+tvf/qaWLVvqu+++008//ZRr/+PGjVNCQoJat26tBx98UPXr19eJEye0adMmLVmyRCdOnLji/rz77rvq3r27mjZtqoEDByosLEw//vijfvjhh1yhrH///nriiSckqcCXrf71r39p8eLFuvnmmzVo0CCVKFFCkydPVkZGhsaPH39F9ebw8/PT3Llz1b59e918881u34w8Y8YMbdq0Sc8884x69+5trdOgQQPdcMMNGjlypHXr9MyZM5WZmZnrmBTkOU5LS1PVqlV15513qkmTJgoMDNSSJUu0fv16vfbaa9b2WrRooVmzZumxxx5Tq1atFBgYqO7du+fZr1deeUVdunTRjTfeqAceeMC6vTw4OLjIfxqgW7duKl++vObMmaMuXbrkO9bpuuuus56Dw4cPa8KECYqKitKDDz4o6eofz/z4+fmpd+/emjlzps6cOaNXX33VbX5QUJDatWun8ePH68KFC6pSpYq+/fZb7d279y8dnwcffFBvvfWW+vfvr40bNyosLEwff/yx/P393ZarW7euatasqSeeeEK//fabgoKCNHfu3DzHxrRo0UKS9Oijj6pTp06XDJiF8XcFD/DIvV64JuTccrl+/fo85+fcOjtnzpw852/evNn07t3blC9f3jidTlOtWjXTt29fs3TpUrflli9fblq0aGFKlixpatSoYSZNmmTdGvxnZ8+eNQ888IAJDg42ZcqUMX379jVHjhzJdUupMcYcPnzYDB482ISHhxs/Pz8TGhpqOnToYKZMmXLZ+vO7lX3lypXmlltuMWXKlDEBAQGmcePGZuLEibn6fejQIePr62tq166d53HJz6ZNm0ynTp1MYGCg8ff3NzExMWb16tV51laQ28tzHD161Dz++OMmKirKlCxZ0vqKgP/85z95Lr9nzx7TsWNH43Q6TaVKlcwzzzxjFi9enOt2YGMu/xxnZGSYESNGmCZNmljHrUmTJuadd95x287p06fNPffcY8qWLWskWbea5/dcLFmyxLRp08aULl3aBAUFme7du5sdO3a4LZPzGjp69Khbe3630F/KxbeX/9mgQYOMJDNjxoxc83JeY59++qkZOXKkqVixoildurTp1q2b2y3TOa7W8byUnOfS4XCY5OTkXPN//fVX06tXL1O2bFkTHBxs+vTpYw4ePJjr76wgt5cbY8z+/fvN7bffbvz9/U2FChXM0KFDzcKFC3O9nnbs2GE6duxoAgMDTYUKFcyDDz5ovv/++1zPf2ZmpvnHP/5hQkJCjMPhcHufyOu9oCB/V/m91138tQrwDIcxjJKC/YwZM0bx8fFeOQjw2LFjCgsL03PPPadRo0Z5upxctm3bprZt2yo8PFwrV65UcHCwp0vyasOH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VatWVXJyspKTk62zOjt27NCpU6dUv359SVLz5s21a9cuRUVF5bvN0qVLq3v37urevbsGDx6sunXratu2bWrevHmR9AkAABRPhRp0MjIy9PvvvysrK0uHDx/WwoULNXbsWN12223q37+/fHx81KhRI8XGxmrChAnKzMzUoEGD5HK51LJlS0nSc889p9tuu00RERG688475ePjo++//17bt2/Xv/71L02bNk1ZWVlq3bq1/P399cknn6h06dKqVq1aYXYNAAB4gUIdo7Nw4UKFhYWpevXq6ty5sxISEvTmm29q/vz58vX1lcPh0Pz581WuXDm1a9dOHTt2VI0aNTRr1ixrG506ddLXX3+tb7/9Vq1atdINN9yg119/3QoyZcuW1Xvvvac2bdqocePGWrJkib766iuVL1++MLsGAAC8gMMYYzxdhCelpqYqODhY4cNmy8fp79Fa9o3r5tH9AwDgLXI+v1NSUhQUFJTvcvzWFQAAsC2CDgAAsC2CDgAAsC2CDgAAsC2PfGFgcbQ9vtMlBzMBAADvwxkdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWyU8XUBx0XD0Ivk4/a9onX3juhVSNQAA4GrgjA4AALAtgg4AALAtgg4AALAtgg4AALAtgg4AALAtgg4AALCtYh10HA6H5s2b5+kyAACAlyqSoDNp0iSVKVNGmZmZVtvp06fl5+en6Ohot2UTExPlcDi0Z8+eoigNAADYWJEEnZiYGJ0+fVobNmyw2lasWKHQ0FAlJSXp3LlzVntCQoIiIiJUs2bNoigNAADYWJEEnTp16igsLEyJiYlWW2Jionr06KHIyEitXbvWrT0mJsZ6fOzYMfXq1Uv+/v6qVauWvvzyS0mSMUZRUVF69dVX3fa1ZcsWORwO/fzzz4XbKQAAUOwV2RidmJgYJSQkWI8TEhIUHR0tl8tltaenpyspKckt6MTHx6tv377aunWrunbtqtjYWJ04cUIOh0P333+/pk6d6rafqVOnql27doqKisqzjoyMDKWmprpNAADAnoo06KxatUqZmZlKS0vT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zJkzatKkid5+++085xekP7Gxsfrhhx+0ePFiff311/ruu+/00EMPFVUXLutSfTx79qw2bdqkUaNGadOmTfr888+1a9cu3X777W7LFec+Xu45zPHFF19o7dq1ef6uUnHun3T5Pu7Zs0c333yz6tatq8TERG3dulWjRo1SqVKlrGW8+v3VXKOuv/56M3jwYOtxVlaWqVy5shk7dqwHq7p6jhw5YiSZ5cuXG2OMOXXqlPHz8zNz5syxltm5c6eRZNasWeOpMq9YWlqaqVWrllm8eLFxuVxm6NChxhh79O+pp54yN998c77zs7OzTWhoqHnllVestlOnThmn02k+/fTToijxf9KtWzdz//33u7X17t3bxMbGGmO8v3+SzBdffGE9Lkh/duzYYSSZ9evXW8ssWLDAOBwO89tvvxVZ7QV1cR/zsm7dOiPJ7N+/3xjjXX3Mr3+//vqrqVKlitm+fbupVq2aef3116153tQ/Y/Lu41133WXuvffefNfx9vfXa/KMzvnz57Vx40Z17NjRavPx8VHHjh21Zs0aD1Z29aSkpEj6v19n37hxoy5cuODW57p16yoiIsKr+jx48GB169bNrR+SPfr35ZdfqmXLlurTp48qVqyoZs2a6b333rPm7927V7///rtbH4ODg9W6dWuv6ONNN92kpUuX6qeffpIkff/991q5cqW6dOkiyfv7d7GC9GfNmjUqW7asWrZsaS3TsWNH+fj4KCkpqchrvhpSUlLkcDhUtmxZSd7fx+zsbN13330aMWKEGjRokGu+Hfr33//+V7Vr11anTp1UsWJFtW7d2u3ylre/v16TQefYsWPKyspSpUqV3NorVaqk33//3UNVXT3Z2dkaNmyY2rRpo4YNG0qSfv/9d5UsWdJ688nhTX2eOXOmNm3apLFjx+aaZ4f+/fLLL3r33XdVq1YtLVq0SI888ogeffRRffjhh5Jk9cNbX7dPP/207r77btWtW1d+fn5q1qyZhg0bptjYWEne37+LFaQ/v//+uypWrOg2v0SJErruuuu8ss/nzp3TU089pX79+lm/fu3tfXz55ZdVokQJPfroo3nO9/b+HTlyRKdPn9a4cePUuXNnffvtt+rVq5d69+6t5cuXS/L+99cSni4AV9/gwYO1fft2rVy50tOlXDXJyckaOnSoFi9e7Hbd2E6ys7PVsmVLvfTSS5KkZs2aafv27Zo0aZIGDBjg4er+d7Nnz9b06dM1Y8YMNWjQQFu2bNGwYcNUuXJlW/TvWnfhwgX17dtXxhi9++67ni7nqti4caPeeOMNbdq0SQ6Hw9PlFIrs7GxJUo8ePTR8+HBJUtOmTbV69WpNmjRJLpfLk+VdFdfkGZ0KFSrI19c314jxw4cPKzQ01ENVXR1DhgzR119/rYSEBFWtWtVqDw0N1fnz53Xq1Cm35b2lzxs3btSRI0fUvHlzlShRQiVKlNDy5cv15ptvqkSJEqpUqZJX90+SwsLCVL9+fbe2evXqWXc+5PTDW1+3I0aMsM7qNGrUSPfdd5+GDx9unaHz9v5drCD9CQ0NzXUDRGZmpk6cOOFVfc4JOfv379fixYutszmSd/dxxYoVOnLkiCIiIqz3nf379+vxxx9X9erVJXl3/6Q/Pg9LlChx2fceb35/vSaDTsmSJdWiRQstXbrUasvOztbSpUt14403erCyv84YoyFDhuiLL77QsmXLFBkZ6Ta/RYsW8vPzc+vzrl27dODAAa/oc4cOHbRt2zZt2bLFmlq2bKnY2Fjr397cP0lq06ZNrq8E+Omnn1StWjVJUmRkpEJDQ936mJqaqqSkJK/o49mzZ+Xj4/6W4+vra/2P0tv7d7GC9OfGG2/UqVOntHHjRmuZZcuWKTs7W61bty7ymv+KnJCze/duLVmyROXLl3eb7819vO+++7R161a3953KlStrxIgRWrRokSTv7p/0x+dhq1atLvne4+2fH9fsXVczZ840TqfTTJs2zezYscM89NBDpmzZsub333/3dGl/ySOPPGKCg4NNYmKiOXTokDWdPXvWWubhhx82ERERZtmyZWbDhg3mxhtvNDfeeKMHq/7f/PmuK2O8v3/r1q0zJUqUMC+++KLZvXu3mT59uvH39zeffPKJtcy4ceNM2bJlzfz5883WrVtNjx49TGRkpElPT/dg5QUzYMAAU6VKFfP111+bvXv3ms8//9xUqFDBPPnkk9Yy3ta/tLQ0s3nzZrN582Yjyfz73/82mzdvtu44Kkh/OnfubJo1a2aSkpLMypUrTa1atUy/fv081aVcLtXH8+fPm9tvv91UrVrVbNmyxe29JyMjw9pGce7j5Z7Di11815Uxxbt/xly+j59//rnx8/MzU6ZMMbt37zYTJ040vr6+ZsWKFdY2vPn99ZoNOsYYM3HiRBMREWFKlixprr/+erN27VpPl/SXScpzmjp1qrVMenq6GTRokClXrpzx9/c3vXr1MocOHfJc0f+ji4OOHfr31VdfmYYNGxqn02nq1q1rpkyZ4jY/OzvbjBo1ylSqVMk4nU7ToUMHs2vXLg9Ve2VSU1PN0KFDTUREhClVqpSpUaOGefbZZ90+EL2tfwkJCXn+3Q0YMMAYU7D+HD9+3PTr188EBgaaoKAgM3DgQJOWluaB3uTtUn3cu3dvvu89CQkJ1jaKcx8v9xxeLK+gU5z7Z0zB+vif//zHREVFmVKlSpkmTZqYefPmuW3Dm99fHcb86WtJAQAAbOSaHKMDAACuDQQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgW/8Pit6oS9ify/AAAAAASUVORK5CYII=\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def show_question_types_counts(dfs_split):\n", + " counts = {}\n", + " question_types = [\"What\", \"How\", \"Is\", \"Does\", \"Do\", \"Was\", \"Where\", \"Why\"]\n", + "\n", + " for q in question_types:\n", + " try:\n", + " counts[q] = dfs[dfs_split][\"question\"].str.startswith(q).value_counts()[True]\n", + " except:\n", + " counts[q] = 0\n", + " pd.Series(counts).sort_values().plot.barh()\n", + " plt.title(\"Frequency of Question Types \" + dfs_split)\n", + " plt.show()\n", + "\n", + "\n", + "show_question_types_counts(\"train\")\n", + "show_question_types_counts(\"validation\")" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "Pytania i ilości odpowiedzi" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 18, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "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i4szAwYM8NwfP368iYiIMCdOnPDarkuXLkaSeeuttzzL3G63iYqKMr179/Ys69mzp9dcnUxycrJp27at536vXr1Mr169jL+/v1m4cKExxphNmzYZSebDDz/0vN6wsDAzdOhQr+c6cOCACQ0N9Vo+ePBgI8mMHTvWa9svvvjCSDJz5sw57fhONeZ69eoVWV749dGgQQNz9OhRr3XHjh3zmhtjfv/adTqd5rHHHvNa9uev58LX8MftjDHmsssuM61bty7x+IHS4lQIKr0GDRpo0KBBeu2117R//35rz3vHHXd4/tvf319t2rSRMUa33367Z3lYWJguueQSff/990Uef8stt6hatWqe+zfddJMuvPBCLViwQJK0efNmffvtt+rfv78OHTqkn3/+WT///LOOHDmibt26acWKFUXOu991113FGvuCBQvUtm1br9MlISEhGjZsmPbs2aMdO3YU7034k61bt2rbtm3q16+fZ1m/fv30888/a9GiRUW2DwkJ0cCBAz33AwMD1bZtW6/3KywsTD/++KPWr19/yv3Gx8dr06ZNnuseVq1ape7du+vSSy/VypUrJf1+FMPhcHhe8+LFi5WVleUZX+HN399f7dq109KlS4vs58//qi88IrFo0SIdPXr0jO9PSQwePNhz5KqQ0+mUn9/v35bz8/N16NAhhYSE6JJLLtGmTZuK9bx//hqJj48/6dcnUFYIC5wTJkyYoLy8PKufEImJifG6HxoaqqCgIEVERBRZ/uuvvxZ5fKNGjbzuOxwOXXTRRdqzZ4+k38/dS7//gKlZs6bX7fXXX5fb7S5yHj82NrZYY//hhx90ySWXFFnepEkTz/rSePvtt1W1alU1aNBAu3bt0q5duxQUFKT69euf9NMhdevWLXLdRvXq1b3erzFjxigkJERt27ZVo0aNlJKSUuQak/j4eOXl5WnNmjXauXOnMjMzFR8fr86dO3uFRdOmTRUeHi7pf+/vVVddVeT9/fTTT5WZmem1j4CAANWtW9drWWxsrEaNGqXXX39dERERSkxM1Msvv3za6yuK62RzWVBQoOeee06NGjWS0+lURESEatasqa1btxZrn0FBQapZs6bXsj+/30BZ4xoLnBMaNGiggQMH6rXXXtPYsWOLrD/VRYmnu6jtZFfcn+oqfHOa6x1OpfBoxNNPP61LL730pNv8+bz8n/+F60vGGM2aNUtHjhxR06ZNi6zPzMzU4cOHvcZcnPerSZMm2rlzp+bNm6dPPvlE7733nl555RU9/PDDevTRRyVJbdq0UVBQkFasWKGYmBhFRkbq4osvVnx8vF555RW53W6tXLlSN954o+d5C9/fGTNmKCoqqsgYAgK8v/398WjBHz377LO69dZb9eGHH+rTTz/V8OHDlZqaqrVr1xYJkZI42Vw++eSTeuihh3Tbbbfp8ccfV3h4uPz8/DRy5MhifWqET4mgIiAscM6YMGGC3n77bT311FNF1lWvXl3S77/Y6Y9K+y/34ij8F3MhY4x27dqlFi1aSJIaNmwoSXK5XEpISLC673r16mnnzp1Fln/99dee9SW1fPly/fjjj3rsscc8Rz4K/frrrxo2bJg++OADr1MfxVW1alXdfPPNuvnmm3X8+HH16tVLkyZN0rhx4xQUFOQ5hbJy5UrFxMQoPj5e0u9HMtxut9LT03Xw4EGvC2gL39/IyMizfn/j4uIUFxenCRMmaPXq1erYsaNeffVVPfHEE6d8THE+YfNnc+fO1ZVXXqk33njDa3lWVlaRI2VARcWpEJwzGjZsqIEDB2rKlCk6cOCA1zqXy6WIiAitWLHCa/krr7xSZuN56623lJub67k/d+5c7d+/3/NpiNatW6thw4Z65plndPjw4SKP/+9//1vqfXfv3l2ff/651qxZ41l25MgRvfbaa6pfv/5JjzicSeFpkAceeEA33XST123o0KFq1KhRqX5Z1qFDh7zuBwYGqmnTpjLG6MSJE57l8fHxWrdunZYuXeoJi4iICDVp0sQTk4XLJSkxMVEul0tPPvmk1/MUKs77m5OTo7y8PK9lcXFx8vPzk9vtPu1jq1atWuJTJv7+/kWOfs2ZM+ekv10WqKg4YoFzyoMPPqgZM2Zo586datasmde6O+64Q2lpabrjjjvUpk0brVixQt98802ZjSU8PFydOnXSkCFDdPDgQT3//PO66KKLNHToUEmSn5+fXn/9dSUlJalZs2YaMmSI6tSpo3379mnp0qVyuVz6+OOPS7XvsWPHatasWUpKStLw4cMVHh6uN998U7t379Z777130kP+p+N2u/Xee+/p6quvVlBQ0Em36dGjh1544QVlZmYqMjKy2M99zTXXKCoqSh07dlStWrX01Vdf6aWXXlJycrLXxa/x8fGaNGmSMjIyvAKic+fOmjJliurXr+91asLlcmny5MkaNGiQWrVqpb59+6pmzZrau3ev5s+fr44dO+qll1467diWLFmie++9V3369NHFF1+svLw8zZgxQ/7+/urdu/dpH9u6dWu98847GjVqlC6//HKFhITo+uuvP+1jrrvuOj322GMaMmSIOnTooG3btik9PV0NGjQ47eOAioSwwDnloosu0sCBA/Xmm28WWffwww/rv//9r+bOnat3331XSUlJWrhwYYl+CJbE+PHjtXXrVqWmpio3N1fdunXTK6+8ouDgYM82Xbt21Zo1a/T444/rpZde0uHDhxUVFaV27drpzjvvLPW+a9WqpdWrV2vMmDF68cUXdezYMbVo0UIff/yxkpOTS/x88+fPV1ZW1ml/MF5//fV69tlnNXv2bA0fPrzYz33nnXcqPT1df//733X48GHVrVtXw4cP14QJE7y269Chg/z9/RUcHKyWLVt6lsfHx2vKlClesVGof//+ql27ttLS0vT000/L7XarTp06io+P15AhQ844tpYtWyoxMVEff/yx9u3b59n3woULdcUVV5z2sffcc482b96sadOm6bnnnlO9evXOGBbjx4/XkSNHNHPmTL3zzjtq1aqV5s+ff9LrhoCKymFKc9UZAADASXCNBQAAsIawAAAA1hAWAADAGsICAABYQ1gAAABrCAsAAGCNz3+PRUFBgX766SdVq1atVL/yFgAA+J4xRrm5uapdu/Zpf8mez8Pip59+UnR0tK93CwAALMjIyDjtH+DzeVgU/orejIwMuVwuX+8eAACUQk5OjqKjo71+1f7J+DwsCk9/uFwuwgIAgErmTJcxcPEmAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFgTUF47bj5xkfycweW1ewAAzjl70pLLewgcsQAAAPYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwJoShUVqaqouv/xyVatWTZGRkbrhhhu0c+fOshobAACoZEoUFsuXL1dKSorWrl2rxYsX68SJE7rmmmt05MiRshofAACoRAJKsvEnn3zidX/69OmKjIzUxo0b1blzZ6sDAwAAlU+JwuLPsrOzJUnh4eGn3Mbtdsvtdnvu5+TknM0uAQBABVbqizcLCgo0cuRIdezYUc2bNz/ldqmpqQoNDfXcoqOjS7tLAABQwZU6LFJSUrR9+3bNnj37tNuNGzdO2dnZnltGRkZpdwkAACq4Up0KuffeezVv3jytWLFCdevWPe22TqdTTqezVIMDAACVS4nCwhij++67T++//76WLVum2NjYshoXAACohEoUFikpKZo5c6Y+/PBDVatWTQcOHJAkhYaGqkqVKmUyQAAAUHmU6BqLyZMnKzs7W127dtWFF17oub3zzjtlNT4AAFCJlPhUCAAAwKnwt0IAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsCSivHW9/NFEul6u8dg8AAMoARywAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWBNQXjtuPnGR/JzB5bV7AICP7ElLLu8hwIc4YgEAAKwhLAAAgDWEBQAAsIawAAAA1hAWAADAGsICAABYQ1gAAABrCAsAAGANYQEAAKwhLAAAgDWEBQAAsIawAAAA1hAWAADAGsICAABYQ1gAAABrCAsAAGANYQEAAKwhLAAAgDUlDosVK1bo+uuvV+3ateVwOPTBBx+UwbAAAEBlVOKwOHLkiFq2bKmXX365LMYDAAAqsYCSPiApKUlJSUllMRYAAFDJlTgsSsrtdsvtdnvu5+TklPUuAQBAOSnzizdTU1MVGhrquUVH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mzYaMGCA57+Zm/LRsWPHIh/L/uabb1SvXj1JUmxsrKKiorzmJicnR+vWrfOam6ysLG3cuNGzzZIlS1RQUKB27dr54FWcm44ePSo/P+8fW/7+/iooKJDE3FQYvrpKdPbs2cbpdJrp06ebHTt2mGHDhpmwsDCvK9ph1913321CQ0PNsmXLzP79+z23o0ePera56667TExMjFmyZInZsGGDad++vWnfvr1nfeFHGq+55hqzefNm88knn5iaNWvykcYy8MdPhRjD3JSXzz//3AQEBJhJkyaZb7/91qSnp5vg4GDz9ttve7ZJS0szYWFh5sMPPzRbt241PXv2POlHGi+77DKzbt06s2rVKtOoUSM+0niWBg8ebOrUqeP5uOm//vUvExERYf7v//7Psw1zU/58FhbGGPPiiy+amJgYExgYaNq2bWvWrl3ry92fdySd9DZt2jTPNr/99pu55557TPXq1U1wcLC58cYbzf79+72eZ8+ePSYpKclUqVLFREREmL/+9a/mxIkTPn41574/hwVzU34+/vhj07x5c+N0Ok3jxo3Na6+95rW+oKDAPPTQQ6ZWrVrG6XSabt26mZ07d3ptc+jQIdOvXz8TEhJiXC6XGTJkiMnNzfXlyzjn5OTkmBEjRpiYmBgTFBRkGjRoYB588EGvj1czN+XPYcwffmUZAADAWeBvhQAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArPl/uYiapeA9OlwAAAAASUVORK5CYII=\n" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGzCAYAAABzfl4TAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAmjklEQVR4nO3de1yUdaLH8e+AwSAwIAEi3kC0zEtWmuYaYGkicUrzhqatekq3xPVUW8e00mwrtc09elq12znaWuua28U0L+umiJVamh1LXdYLppVIunEREAV+549ezDYOKNqPQerzfr14vZzneWae3/x4HD/O8ww4jDFGAAAAFvjV9wAAAMBPB2EBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWGBn63MzEw5HA795S9/qe+h1MqxY8c0ZMgQXX755XI4HJo7d259DwnVGDNmjOLi4jyWORwOPfHEE+e97xNPPCGHw2F1PFXHeWZmptXHBWpCWKBOLV68WA6HQ06nU19//bXX+t69e6tTp071MLKG54EHHtC6des0ZcoULVmyRP379z/vffLz8+V0OuVwOLR3714fjBL1ZcGCBVq8eHF9DwNQo/oeAH4eysrKNGvWLD3//PP1PZQGa8OGDRowYIAeeuihWt9n+fLlcjgciomJ0euvv66nnnqqDkeImpSWlqpRo7p9uV2wYIEiIyM1ZswYj+VJSUkqLS1VQEBAne4fqMI7FvCJa665Ri+//LK++eab+h6KzxUXF1t5nLy8PIWHh1/QfV577TXdeuutGjFihP70pz9ZGcelxtb81iWn01nnYVETPz8/OZ1O+fnxcg/f4EiDT0ydOlUVFRWaNWvWObc7dOiQHA5HtW/pnn2euup89D/+8Q+NGjVKYWFhioqK0uOPPy5jjI4cOaIBAwbI5XIpJiZGc+bMqXafFRUVmjp1qmJiYhQcHKzbb79dR44c8dpu27Zt6t+/v8LCwtS4cWMlJyfrww8/9Nimakx79uzRnXfeqSZNmujGG28853M+ePCghg4dqoiICDVu3Fg33HCD3nvvPff6qtNJxhjNnz9fDoejVufhDx8+rM2bN2v48OEaPny4cnJy9NFHH3ltV3U6as+ePbrpppvUuHFjNW/eXM8++6zXts8//7w6duyoxo0bq0mTJurWrZs7WHbt2iWHw6F3333Xvf2OHTvkcDh03XXXeTxOamqqevTo4bFszZo1SkxMVHBwsEJDQ5WWlqbdu3d7bDNmzBiFhITowIEDuvXWWxUaGqqRI0dKkvbt26fBgwcrJiZGTqdTLVq00PDhw1VQUFDjHE2cOFEhISEqKSnxWjdixAjFxMSooqJCkrRixQqlpaUpNjZWgYGBSkhI0G9/+1v3+nOp7hqLDz74QNdff72cTqcSEhL04osvVnvfRYsW6eabb1Z0dLQCAwPVoUMHLVy40GObuLg47d69W5s2bXIfH71795ZU8zUWy5cvV9euXRUUFKTIyEiNGjXK63Rl1Xx//fXXGjhwoEJCQhQVFaWHHnqoVs8bP0+EBXwiPj5ev/zlL+vkXYv09HRVVlZq1qxZ6tGjh5566inNnTtXt9xyi5o3b67Zs2erbdu2euihh5SVleV1/6efflrvvfeeJk+erEmTJmn9+vXq27evSktL3dts2LBBSUlJKiws1PTp0/XMM88oPz9fN998sz7++GOvxxw6dKhKSkr0zDPPaNy4cTWO/dixY/rFL36hdevWacKECXr66ad16tQp3X777Xr77bclff9W9pIlSyRJt9xyi5YsWeK+fS5Lly5VcHCw/u3f/k3du3dXQkKCXn/99Wq3/e6779S/f3916dJFc+bMUfv27TV58mStWbPGvc3LL7+sSZMmqUOHDpo7d65mzJiha665Rtu2bZMkderUSeHh4R5zvHnzZvn5+en//u//VFhYKEmqrKzURx99pKSkJPd2S5YsUVpamkJCQjR79mw9/vjj2rNnj2688UYdOnTIY6zl5eVKSUlRdHS0nnvuOQ0ePFinT59WSkqKtm7dql//+teaP3++xo8fr4MHDyo/P7/GOUpPT1dxcbFHyElSSUmJVq5cqSFDhsjf31/S94EXEhKiBx98UPPmzVPXrl01bdo0PfLII+f9Xpzt888/V79+/ZSXl6cnnnhCY8eO1fTp093f8x9auHChWrduralTp2rOnDlq2bKlJkyYoPnz57u3mTt3rlq0aKH27du7j49HH320xv0vXrxYw4YNk7+/v2bOnKlx48bprbfe0o033ug1XxUVFUpJSdHll1+u5557TsnJyZozZ45eeumlC37e+JkwQB1atGiRkWQ++eQTc+DAAdOoUSMzadIk9/rk5GTTsWNH9+2cnBwjySxatMjrsSSZ6dOnu29Pnz7dSDLjx493LysvLzctWrQwDofDzJo1y738u+++M0FBQWb06NHuZRs3bjSSTPPmzU1hYaF7+RtvvGEkmXnz5hljjKmsrDTt2rUzKSkpprKy0r1dSUmJiY+PN7fccovXmEaMGFGr+bn//vuNJLN582b3sqKiIhMfH2/i4uJMRUWFx/PPyMio1eMaY0znzp3NyJEj3benTp1qIiMjzZkzZzy2S05ONpLMH//4R/eysrIyExMTYwYPHuxeNmDAAI/vVXXS0tJM9+7d3bcHDRpkBg0aZPz9/c2aNWuMMcZ8+umnRpJZsWKF+/mGh4ebcePGeTxWbm6uCQsL81g+evRoI8k88sgjHtvu3LnTSDLLly8/5/jOVllZaZo3b+7xPI351zGQlZXlXlZSUuJ1/1/96lemcePG5tSpUx5jbN26tcd2Zx+7AwcONE6n03z55ZfuZXv27DH+/v7m7Jfl6vabkpJi2rRp47GsY8eOJjk52WvbquN848aNxhhjTp8+baKjo02nTp1MaWmpe7tVq1YZSWbatGkez0WSefLJJz0e89prrzVdu3b12hdgjDG8YwGfadOmje666y699NJLOnr0qLXHveeee9x/9vf3V7du3WSM0d133+1eHh4eriuvvFIHDx70uv8vf/lLhYaGum8PGTJEzZo10+rVqyVJn332mfbt26c777xTJ06c0PHjx3X8+HEVFxerT58+ysrKUmVlpcdj3nvvvbUa++rVq9W9e3eP0yUhISEaP368Dh06pD179tRuEs6ya9cuff755xoxYoR72YgRI3T8+HGtW7fOa/uQkBCNGjXKfTsgIEDdu3f3mK/w8HB99dVX+uSTT2rcb2Jioj799FP3dQ8ffPCBbr31Vl1zzTXavHmzpO/fxXA4HO7nvH79euXn57vHV/Xl7++vHj16aOPGjV77ue+++zxuh4WFSZLWrVtX7WmNmjgcDg0dOlSrV6/WyZMn3cuXLVum5s2be3xfgoKC3H8uKirS8ePHlZiYqJKSEv3973+v9T4rKiq0bt06DRw4UK1atXIvv+qqq5SSkuK1/Q/3W1BQoOPHjys5OVkHDx4852memmzfvl15eXmaMGGCnE6ne3laWprat2/v9e6N5H08JyYmVvt3CZA4FQIfe+yxx1ReXn7eay0uxA9fnKXv/5FxOp2KjIz0Wv7dd9953b9du3Yetx0Oh9q2bet+C37fvn2SpNGjRysqKsrj65VXXlFZWZnXC3x8fHytxv7ll1/qyiuv9Fp+1VVXuddfjNdee03BwcFq06aN9u/fr/3798vpdCouLq7a0yEtWrTwum6jSZMmHvM1efJkhYSEqHv37mrXrp0yMjK8rjFJTExUeXm5tmzZouzsbOXl5SkxMVFJSUkeYdGhQwdFRERI+tf83nzzzV7z+9e//lV5eXke+2jUqJFatGjhsSw+Pl4PPvigXnnlFUVGRiolJUXz58+v1T+86enpKi0tdV8bcvLkSa1evVpDhw71mJPdu3frjjvuUFhYmFwul6KiotwxdiH/wH/77bcqLS31Ou4kVXssfPjhh+rbt6+Cg4MVHh6uqKgoTZ069YL3W6XqmKpuX+3bt/c65pxOp6KiojyWnX1sAD/Ex03hU23atNGoUaP00ksvVXtuuqaLEs91oVjVOfDzLZMkY0wtR/ovVe9G/O53v9M111xT7TYhISEet3/4v0xfM8Zo6dKlKi4uVocOHbzW5+Xl6eTJkx5jrs18XXXVVcrOztaqVau0du1avfnmm1qwYIGmTZumGTNmSJK6desmp9OprKwstWrVStHR0briiiuUmJioBQsWqKysTJs3b9Ydd9zhftyq+V2yZIliYmK8xnD2pykCAwOr/YTDnDlzNGbMGK1YsUJ//etfNWnSJM2cOVNbt271CpEfuuGGGxQXF6c33nhDd955p1auXKnS0lKlp6e7t8nPz1dycrJcLpeefPJJJSQkyOl06tNPP9XkyZO93rGy5cCBA+rTp4/at2+v3//+92rZsqUCAgK0evVq/dd//Ved7feHajo2gJoQFvC5xx57TK+99ppmz57tta5JkyaS5HUB2cX+z702qv7HXMUYo/379+vqq6+WJCUkJEiSXC6X+vbta3XfrVu3VnZ2ttfyqrfWW7dufcGPuWnTJn311Vd68skn3e98VPnuu+80fvx4vfPOOx6nPmorODhY6enpSk9P1+nTpzVo0CA9/fTTmjJlipxOp/sUyubNm9WqVSslJiZK+v6djLKyMr3++us6duyYx4WbVfMbHR39o+e3c+fO6ty5sx577DF99NFH6tWrl1544YXz/vyOYcOGad68eSosLNSyZcsUFxenG264wb0+MzNTJ06c0FtvveUx9pycnAseY1RUlIKCgryO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YA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYM0Fh0VWVpZuu+02xcbGyuFw6J133qmDYQEAgIbogsOiuLhYXbp00fz58+tiPAAAoAFrdKF3SE1NVWpqal2MBQAANHAXHBYXqqysTGVlZe7bhYWFdb1LAABQT+r84s2ZM2cqLCzM/dWyZcu63iUAAKgndR4WU6ZMUUFBgfvryJEjdb1LAABQT+r8VEhgYKACAwPrejcAAOASwM+xAAAA1lzwOxYnT57U/v373bdzcnL02WefKSIiQq1atbI6OAAA0LBccFhs375dN910k/v2gw8+KEkaPXq0Fi9ebG1gAACg4bngsOjdu7eMMXUxFgAA0MBxjQUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsaVRfO/5iRopcLld97R4AANQB3rEAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsa1deOO01fJ7/AxlYe69CsNCuPAwAAfhzesQAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANZcUFjMnDlT119/vUJDQxUdHa2BAwcqOzu7rsYGAAAamAsKi02bNikjI0Nbt27V+vXrdebMGfXr10/FxcV1NT4AANCANLqQjdeuXetxe/HixYqOjtaOHTuUlJRkdWAAAKDhuaCwOFtBQYEkKSIiosZtysrKVFZW5r5dWFj4Y3YJAAAuYRd98WZlZaXuv/9+9erVS506dapxu5kzZyosLMz91bJly4vdJQAAuMRddFhkZGToiy++0J///OdzbjdlyhQVFBS4v44cOXKxuwQAAJe4izoVMnHiRK1atUpZWVlq0aLFObcNDAxUYGDgRQ0OAAA0LBcUFsYY/frXv9bbb7+tzMxMxcfH19W4AABAA3RBYZGRkaE//elPWrFihUJDQ5WbmytJCgsLU1BQUJ0MEAAANBwXdI3FwoULVVBQoN69e6tZs2bur2XLltXV+AAAQANywadCAAAAasLvCgEAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1hAUAALCGsAAAANYQFgAAwBrCAgAAWENYAAAAawgLAABgDWEBAACsISwAAIA1jeprx1/MSJHL5aqv3QMAgDrAOxYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYA1hAQAArCEsAACANYQFAACwhrAAAADWEBYAAMAawgIAAFhDWAAAAGsICwAAYE0jX+/QGCNJKiws9PWuAQDARar6d7vq3/Ga+DwsTpw4IUlq2bKlr3cNAAB+pKKiIoWFhdW43udhERERIUk6fPjwOQcGewoLC9WyZUsdOXJELpervofzs8Cc+x5z7nvMue/V55wbY1RUVKTY2NhzbufzsPDz+/6yjrCwMA5EH3O5XMy5jzHnvsec+x5z7nv1Nee1eUOAizcBAIA1hAUAALDG52ERGBio6dOnKzAw0Ne7/tlizn2POfc95tz3mHPfawhz7jDn+9wIAABALXEqBAAAWENYAAAAawgLAABgDWEBAACsISwAAIA1Pg2L+fPnKy4uTk6nUz169NDHH3/sy93/pD3xxBNyOBweX+3bt3evP3XqlDIyMnT55ZcrJCREgwcP1rFjx+pxxA1PVlaWbrvtNsXGxsrhcOidd97xWG+M0bRp09SsWTMFBQWpb9++2rdvn8c2//znPzVy5Ei5XC6Fh4fr7rvv1smTJ334LBqW8835mDFjvI77/v37e2zDnNfezJkzdf311ys0NFTR0dEaOHCgsrOzPbapzWvJ4cOHlZaWpsaNGys6OloPP/ywysvLfflUGozazHnv3r29jvN7773XY5tLac59FhbLli3Tgw8+qOnTp+vTTz9Vly5dlJKS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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def show_answers_counts(dfs_split):\n", + " counts = dfs[dfs_split][\"answers.text\"] \\\n", + " .groupby(dfs[dfs_split][\"answers.text\"].str.len()) \\\n", + " .count().to_dict()\n", + "\n", + " pd.Series(counts).sort_values().plot.barh()\n", + " plt.title(\"Number of Answers \" + dfs_split)\n", + " plt.show()\n", + "\n", + "\n", + "show_answers_counts(\"train\")\n", + "show_answers_counts(\"validation\")\n" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "Przykładowe pytania" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 19, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "How was the service staff?\n", + "How is the stay?\n", + "How tastefully decorated was the room?\n", + "What is the customer service?\n", + "What do you think about dinner?\n", + "What is the most expensive price of food?\n", + "Is it service ?\n", + "Is it location ?\n", + "Is it a good place to stay?\n" + ] + } + ], + "source": [ + "for question_type in [\"How\", \"What\", \"Is\"]:\n", + " for question in (\n", + " dfs[\"train\"][dfs[\"train\"].question.str.startswith(question_type)]\n", + " .sample(n=3, random_state=42)['question']):\n", + " print(question)" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "# Preprocessing" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "## Tokenizacja" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 20, + "outputs": [ + { + "data": { + "text/plain": "True" + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_ckpt = \"bert-base-cased\"\n", + "tokenizer = AutoTokenizer.from_pretrained(model_ckpt)\n", + "tokenizer.is_fast" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 21, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Token indices sequence length is longer than the specified maximum sequence length for this model (556 > 512). Running this sequence through the model will result in indexing errors\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAGwCAYAAACzXI8XAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAABRqUlEQVR4nO3deXxM1/8/8NdkmcmeSGQlG0Vi34qgKCG0fLVUy0c1lmpLLKFo09ZSLcFHUf0ErWpUa+lHq9RSSmxFECHUFkuRfESStrJIJJNlzu+P/HIZ2WMmdyZ5PR+P+3jcOffMmfc9s+Sde8+9RyGEECAiIiIyQiZyB0BERERUXUxkiIiIyGgxkSEiIiKjxUSGiIiIjBYTGSIiIjJaTGSIiIjIaDGRISIiIqNlJncA+qbRaJCUlARbW1soFAq5wyEiIqJKEELgwYMH8PDwgIlJ2cddan0ik5SUBE9PT7nDICIiompITExEw4YNy9xe6xMZW1tbAEUdYWdnJ3M0VCfkZQOfNStafzceUFrLGw8RkRHKzMyEp6en9He8LLU+kSk+nWRnZ8dEhmpGnimg+v+nMe3smMgQET2FioaFcLAvERERGS0mMkRERGS0av2pJaIaZ2IGtPnXo3UiItIb/soS6ZqZCnh5tdxR1GmFhYXIz8+XOwwiKoe5uTlMTU2fuh0mMkRUawghkJycjPT0dLlDIaJKcHBwgJub21Pd542JDJGuCQHkPyxaN7cCeCPGGlOcxLi4uMDKyoo3wSQyUEIIPHz4EKmpqQAAd3f3arfFRIZI1/IfAgs9itY/SOLl1zWksLBQSmKcnJzkDoeIKmBpaQkASE1NhYuLS7VPM/GqJSKqFYrHxFhZWckcCRFVVvH39WnGtDGRIaJahaeTiIyHLr6vTGSIiIjIaDGRISIiIqMlayJTWFiI2bNnw9fXF5aWlmjcuDE++eQTCCGkOkIIzJkzB+7u7rC0tERgYCCuX78uY9RERMbNx8cHK1askDsM0gFDei/Xr18PBweHGn9dWROZxYsXY/Xq1fjPf/6DK1euYPHixViyZAm++OILqc6SJUuwcuVKrFmzBqdOnYK1tTWCgoKQm5srY+RERLoxevRoKBQKvPPOOyW2hYSEQKFQYPTo0Tp9zZiYGLz11ls6bZPqFkNKoGRNZE6cOIHBgwfjxRdfhI+PD1555RX069cPp0+fBlB0NGbFihX46KOPMHjwYLRu3RobNmxAUlIStm/fLmfoRGVTmALNBxctiqe/ayXVfp6entiyZQtycnKkstzcXGzatAleXl46fz1nZ2de3UW1hqyJTNeuXREVFYVr164BAM6fP49jx45hwIABAIBbt24hOTkZgYGB0nPs7e3RuXNnREdHl9qmWq1GZmam1kLyuZueg4t3M6TlbnpOxU8yduYWwKsbihZzC7mjobzsspf83CrUzalc3Wpo3749PD09sW3bNqls27Zt8PLyQrt27bTq7t27F927d4eDgwOcnJwwcOBA3Lx5U9q+YcMG2NjYaJ2CnzhxIvz8/PDwYdGNGp/8b1qhUODLL7/EwIEDYWVlBX9/f0RHR+PGjRvo1asXrK2t0bVrV63XGT16NF566SWt2EJDQ9GrVy/pca9evTB58mSEhoaiXr16cHV1xdq1a5GdnY0xY8bA1tYWzzzzDH799ddy+2fVqlVo0qQJLCws4OrqildeeUXaptFoEB4eLg1RaNOmDX788Uet5+/ZswdNmzaFpaUlnn/+eaxfvx4KhUK6A/S8efPQtm1breesWLECPj4+WmVff/01/P39YWFhAT8/P6xatUradvv2bSgUCmzbtg3PP/88rKys0KZNmxJ/q44fP45evXrBysoK9erVQ1BQENLS0iq9LxVJT0/Hm2++CWdnZ9jZ2aF37944f/68tL14X7/77jv4+PjA3t4ew4cPx4MHD6Q6Dx48wMiRI2FtbQ13d3csX74cvXr1QmhoKICi9/XOnTuYNm0aFApFiSuP9u3bB39/f9jY2KB///64d+9elfahqmRNZN5//30MHz4cfn5+MDc3R7t27RAaGoqRI0cCKLpLJwC4urpqPc/V1VXa9qTw8HDY29tLi6enp353gsp0Nz0HvZcexsAvjklL76WH60YyQ4ZjoUfZy39Hadf99zNl1/3+Fe26K1qVXq+axo4di8jISOnxN998gzFjxpSol52djenTp+PMmTOIioqCiYkJXn75ZWg0GgDAG2+8gRdeeAEjR45EQUEBdu/eja+//hobN24s9yjMJ598gjfeeANxcXHw8/PDv/71L7z99tsICwvDmTNnIITApEmTqrxf3377LerXr4/Tp09j8uTJmDBhAoYNG4auXbvi7Nmz6NevH0aNGiUlWU86c+YMpkyZgvnz5yM+Ph579+5F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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def compute_input_length(row):\n", + " inputs = tokenizer(row[\"question\"], row[\"context\"])\n", + " inputs_length = len(inputs[\"input_ids\"])\n", + " del inputs\n", + " return inputs_length\n", + "\n", + "\n", + "dfs[\"train\"][\"n_tokens\"] = dfs[\"train\"].apply(compute_input_length, axis=1)\n", + "\n", + "fig, ax = plt.subplots()\n", + "dfs[\"train\"][\"n_tokens\"].hist(bins=100, grid=False, ec=\"C0\", ax=ax)\n", + "plt.xlabel(\"Number of tokens in question-context pair\")\n", + "ax.axvline(x=384, ymin=0, ymax=1, linestyle=\"--\", color=\"C1\",\n", + " label=\"Maximum sequence length\")\n", + "plt.legend()\n", + "plt.ylabel(\"Count\")\n", + "plt.show()" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "Użycie stride w celu pozyskania okna z kontekstem i okrojenia wielkości tesktu, prezentacja działania" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 22, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[CLS] How many employees does the company have? [SEP] We had a great two night stay in Dec 2008. Hotel staff were very accomodating with our 18 month old - providing a cot, toy and stroller for him. The staff were friendly and upbeat. Our room was also upgraded. Our only dissappointment was the food at the downstairs restaurant - way too expensive and did not meet expectations. [SEP]\n", + "[CLS] Was the atmosphere of the tourist areas of san fransisco peaceful? [SEP] My wife and I stayed here on our honeymoon for 2 nights in early March and had a great stay. I had booked a room at another hotel on hotels. com on Jan. 6th though. Then 4 days before we were to start our honeymoon in San Fran., hotels. com send me an e - mail to say they had to change my reservation from a hotel downtown to a hotel at the [SEP]\n", + "[CLS] Was the atmosphere of the tourist areas of san fransisco peaceful? [SEP]. com on Jan. 6th though. Then 4 days before we were to start our honeymoon in San Fran., hotels. com send me an e - mail to say they had to change my reservation from a hotel downtown to a hotel at the airport. I rufused and was given a refund and no hotel. There was a huge 30, 000 person convention in town at the same [SEP]\n", + "[CLS] Was the atmosphere of the tourist areas of san fransisco peaceful? [SEP] - mail to say they had to change my reservation from a hotel downtown to a hotel at the airport. I rufused and was given a refund and no hotel. There was a huge 30, 000 person convention in town at the same time so all the hotels were full. I got lucky though and was able to book a bay view room at The Argonaut. This was the best [SEP]\n", + "[CLS] Was the atmosphere of the tourist areas of san fransisco peaceful? [SEP]nd and no hotel. There was a huge 30, 000 person convention in town at the same time so all the hotels were full. I got lucky though and was able to book a bay view room at The Argonaut. This was the best thing that could of happened to us! This place was amazing! We arrived at the hotel around 12 : 30pm and were able to check in right away [SEP]\n", + "[CLS] Was the atmosphere of the tourist areas of san fransisco peaceful? [SEP] and was able to book a bay view room at The Argonaut. This was the best thing that could of happened to us! This place was amazing! We arrived at the hotel around 12 : 30pm and were able to check in right away! The staff were all so nice and called us by name whenever they saw us. The room was amazing! We had a beautiful view of Alcatraz [SEP]\n", + "[CLS] Was the atmosphere of the tourist areas of san fransisco peaceful? [SEP]! We arrived at the hotel around 12 : 30pm and were able to check in right away! The staff were all so nice and called us by name whenever they saw us. The room was amazing! We had a beautiful view of Alcatraz Island and could even see the golden gate. Internet worked great and the TV was fine. It's not a big fancy TV, but we didn'[SEP]\n", + "[CLS] Was the atmosphere of the tourist areas of san fransisco peaceful? [SEP] whenever they saw us. The room was amazing! We had a beautiful view of Alcatraz Island and could even see the golden gate. Internet worked great and the TV was fine. It's not a big fancy TV, but we didn't fly all the way to San Fran. to watch TV anyway. What made our stay so great was the concierge. There was a wonderful [SEP]\n", + "[CLS] Was the atmosphere of the tourist areas of san fransisco peaceful? [SEP] and the TV was fine. It's not a big fancy TV, but we didn't fly all the way to San Fran. to watch TV anyway. What made our stay so great was the concierge. There was a wonderful young lady there that recommended 2 wonderful resturants for dinners and an amazing dim sum resturant for lunch. We enjoyed San Fran. way [SEP]\n", + "[CLS] Was the atmosphere of the tourist areas of san fransisco peaceful? [SEP] TV anyway. What made our stay so great was the concierge. There was a wonderful young lady there that recommended 2 wonderful resturants for dinners and an amazing dim sum resturant for lunch. We enjoyed San Fran. way more then we ever thought we would and we owe that to The Argonaut Hotel and there staff. We can't wait to come visit again. [SEP]\n", + "[CLS] How is the employee service on this hotel? [SEP] Spent one night at The Argonaut and wish that we could have stayed longer. We even missed the free wine hour but what the heck, the staff was so pleasant and not in a superficial,'I don't mean it'kind of way. Valet was on top of their game and was very helpful with directions or anything we might need. The roofm was super clean and I was looking for dirt in the areas [SEP]\n", + "[CLS] How is the employee service on this hotel? [SEP] a superficial,'I don't mean it'kind of way. Valet was on top of their game and was very helpful with directions or anything we might need. The roofm was super clean and I was looking for dirt in the areas that sometimes don't get the best housekeeping job. I couldn't find as much as a crumb! We were on the fourth floor in a two queen bedded room [SEP]\n", + "[CLS] How is the employee service on this hotel? [SEP] was super clean and I was looking for dirt in the areas that sometimes don't get the best housekeeping job. I couldn't find as much as a crumb! We were on the fourth floor in a two queen bedded room as we were traveling with our two children. We were upgraded to a Cannery / Alcatraz view because of our membership in Kimpton's In Touch program but it was really just [SEP]\n", + "[CLS] How is the employee service on this hotel? [SEP] were on the fourth floor in a two queen bedded room as we were traveling with our two children. We were upgraded to a Cannery / Alcatraz view because of our membership in Kimpton's In Touch program but it was really just a view of the Mexican restaurant below unless you really, really cranked your head. Still nice to receive. We also had a note welcoming us and a big bottle of water but didn [SEP]\n", + "[CLS] How is the employee service on this hotel? [SEP] Kimpton's In Touch program but it was really just a view of the Mexican restaurant below unless you really, really cranked your head. Still nice to receive. We also had a note welcoming us and a big bottle of water but didn't drink it because it didn't say it was complementary. Overall a great experience and I wouldn't hesitate to return whenever I am in the San Francisco area. Great decor [SEP]\n", + "[CLS] How is the employee service on this hotel? [SEP] a note welcoming us and a big bottle of water but didn't drink it because it didn't say it was complementary. Overall a great experience and I wouldn't hesitate to return whenever I am in the San Francisco area. Great decor. This was our first stay in a Kimtpon property but I am going to seek them out from now on. [SEP]\n", + "[CLS] How is attraction? [SEP] This is a great hotel! I loved the nautical decoration! The room was immaculate, very comfortable and we didn't have any issues with noise. The location is great, especially for a quick stay as you are close to the tourist attractions. There are countless kiosks in the area for different tours and attractions. We took the cable car tour around San Fran and over the Golden Gate Bridge. The ferry to Alcatraz is a 10 - [SEP]\n", + "[CLS] How is attraction? [SEP] you are close to the tourist attractions. There are countless kiosks in the area for different tours and attractions. We took the cable car tour around San Fran and over the Golden Gate Bridge. The ferry to Alcatraz is a 10 - 15 minute walk away from the hotel. There are loads of restaurants nearby. The restaurant attached to the hotel was great for breakfast. I would definitely recommend this hotel. [SEP]\n" + ] + } + ], + "source": [ + "context = subjqa[\"train\"][2:6][\"context\"]\n", + "question = subjqa[\"train\"][2:6][\"question\"]\n", + "\n", + "inputs = tokenizer(\n", + " question,\n", + " context,\n", + " max_length=100,\n", + " truncation=\"only_second\",\n", + " stride=50,\n", + " return_overflowing_tokens=True,\n", + " return_offsets_mapping=True,\n", + ")\n", + "for ids in inputs[\"input_ids\"]:\n", + " print(tokenizer.decode(ids))" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 23, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The 4 examples gave 18 features.\n", + "Here is where each comes from: [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3].\n" + ] + } + ], + "source": [ + "print(f\"The 4 examples gave {len(inputs['input_ids'])} features.\")\n", + "print(f\"Here is where each comes from: {inputs['overflow_to_sample_mapping']}.\")" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 24, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[31, 0, 0, 0, 0, 0, 0, 0, 0, 61, 41, 0, 0, 0, 0, 0, 70, 27]\n", + "[31, 0, 0, 0, 0, 0, 0, 0, 0, 72, 45, 0, 0, 0, 0, 0, 70, 27]\n" + ] + } + ], + "source": [ + "answers = subjqa[\"train\"][2:6][\"answers\"]\n", + "start_positions = []\n", + "end_positions = []\n", + "\n", + "for i, offset in enumerate(inputs[\"offset_mapping\"]):\n", + " sample_idx = inputs[\"overflow_to_sample_mapping\"][i]\n", + " sequence_ids = inputs.sequence_ids(i)\n", + " answer = answers[sample_idx]\n", + "\n", + " # Find start and end of context\n", + " context_start = sequence_ids.index(1)\n", + " context_end = len(sequence_ids) - 2\n", + " start_char = 0\n", + " end_char = 0\n", + " if len(answer['answer_start']) > 0:\n", + " for idx, answer_start in enumerate(answer['answer_start']):\n", + " tmp_start_char = answer_start\n", + " tmp_end_char = answer_start + len(answer['text'][idx])\n", + " # Answer inside context\n", + " if offset[context_start][0] <= tmp_start_char and offset[context_end][1] >= tmp_end_char:\n", + " idx_c = context_start\n", + " while idx_c <= context_end and offset[idx_c][0] <= tmp_start_char:\n", + " idx_c += 1\n", + " start_char = idx_c - 1\n", + "\n", + " idx_c = context_end\n", + " while idx_c >= context_start and offset[idx_c][1] >= tmp_end_char:\n", + " idx_c -= 1\n", + " end_char = idx_c + 1\n", + " break\n", + "\n", + " start_positions.append(start_char)\n", + " end_positions.append(end_char)\n", + "\n", + "print(start_positions)\n", + "print(end_positions)" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 25, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Theoretical answer: 18, labels give: 18\n" + ] + } + ], + "source": [ + "idx = 0\n", + "sample_idx = inputs[\"overflow_to_sample_mapping\"][idx]\n", + "answer = answers[sample_idx][\"text\"][0]\n", + "\n", + "start = start_positions[idx]\n", + "end = end_positions[idx]\n", + "labeled_answer = tokenizer.decode(inputs[\"input_ids\"][idx][start: end + 1])\n", + "\n", + "print(f\"Theoretical answer: {answer}, labels give: {labeled_answer}\")\n", + "del inputs\n" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "Przygotowanie do stride" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 47, + "outputs": [], + "source": [ + "\n", + "def preprocess_train_data(examples, max_length=384, stride=128):\n", + " questions = [q.strip() for q in examples[\"question\"]]\n", + " print(tokenizer.__class__.__name__)\n", + " inputs = tokenizer(\n", + " questions,\n", + " examples[\"context\"],\n", + " max_length=max_length,\n", + " truncation=\"only_second\",\n", + " stride=stride,\n", + " return_overflowing_tokens=True,\n", + " return_offsets_mapping=True,\n", + " padding=\"max_length\",\n", + " )\n", + " answers = examples[\"answers\"]\n", + " start_positions = []\n", + " end_positions = []\n", + "\n", + " for i, offset in enumerate(inputs[\"offset_mapping\"]):\n", + " sample_idx = inputs[\"overflow_to_sample_mapping\"][i]\n", + " sequence_ids = inputs.sequence_ids(i)\n", + " answer = answers[sample_idx]\n", + "\n", + " # Find start and end of context\n", + " context_start = sequence_ids.index(1)\n", + " context_end = len(sequence_ids) - 2\n", + " start_char = 0\n", + " end_char = 0\n", + " if len(answer['answer_start']) > 0:\n", + " for idx, answer_start in enumerate(answer['answer_start']):\n", + " tmp_start_char = answer_start\n", + " tmp_end_char = answer_start + len(answer['text'][idx])\n", + " # Answer inside context\n", + " if offset[context_start][0] <= tmp_start_char and offset[context_end][1] >= tmp_end_char:\n", + " idx_c = context_start\n", + " while idx_c <= context_end and offset[idx_c][0] <= tmp_start_char:\n", + " idx_c += 1\n", + " start_char = idx_c - 1\n", + "\n", + " idx_c = context_end\n", + " while idx_c >= context_start and offset[idx_c][1] >= tmp_end_char:\n", + " idx_c -= 1\n", + " end_char = idx_c + 1\n", + " break\n", + "\n", + " start_positions.append(start_char)\n", + " end_positions.append(end_char)\n", + " inputs[\"start_positions\"] = start_positions\n", + " inputs[\"end_positions\"] = end_positions\n", + " return inputs" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 27, + "outputs": [ + { + "data": { + "text/plain": " 0%| | 0/2 [00:00 max_answer_length\n", + " if (\n", + " end_index < start_index\n", + " or end_index - start_index + 1 > max_answer_length\n", + " ):\n", + " continue\n", + "\n", + " answer = {\n", + " \"text\": context[offsets[start_index][0]: offsets[end_index][1]],\n", + " \"logit_score\": start_logit[start_index] + end_logit[end_index],\n", + " }\n", + " answers.append(answer)\n", + "\n", + " # Select the answer with the best score\n", + " if len(answers) > 0:\n", + " best_answer = max(answers, key=lambda x: x[\"logit_score\"])\n", + " predicted_answers.append(\n", + " {\"id\": example_id, \"prediction_text\": best_answer[\"text\"]}\n", + " )\n", + " else:\n", + " predicted_answers.append({\"id\": example_id, \"prediction_text\": \"\"})\n", + "\n", + " theoretical_answers = [\n", + " {\"id\": ex[\"id\"], \"answers\": {\n", + " 'text': ex[\"answers\"]['text']\n", + " if len(ex[\"answers\"]['text']) != 0\n", + " else [\"\"],\n", + " 'answer_start': ex[\"answers\"][\"answer_start\"]\n", + " if len(ex[\"answers\"][\"answer_start\"]) != 0\n", + " else [0]\n", + " }} for ex in examples\n", + " ]\n", + " metrics = metric.compute(predictions=predicted_answers, references=theoretical_answers)\n", + " for i in range(3):\n", + " print(\"QUESTION:\\t\", examples[i]['question'])\n", + " print(\"PREDICTED:\", predicted_answers[i]['prediction_text'])\n", + " print(\"ACTUAL:\", theoretical_answers[i]['answers']['text'])\n", + " print(metrics)\n", + "\n", + " return predicted_answers, theoretical_answers, metrics" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 50, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "def predict_from_trained():\n", + " eval_set = subjqa[\"validation\"].map(\n", + " preprocess_validation_examples,\n", + " batched=True,\n", + " remove_columns=subjqa[\"validation\"].column_names,\n", + " )\n", + " eval_set_for_model = eval_set.remove_columns([\"example_id\", \"offset_mapping\"])\n", + " eval_set_for_model.set_format(\"torch\")\n", + " batch_size = 8\n", + " all_start_logits = []\n", + " all_end_logits = []\n", + " for i in range(0, int(eval_set_for_model.num_rows / batch_size.__ceil__())+1):\n", + " batch = {k: eval_set_for_model[k][batch_size*i:batch_size*(i+1)].to(device) for k in eval_set_for_model.column_names}\n", + " with torch.no_grad():\n", + " outputs = trained_model(**batch)\n", + " all_start_logits.append(outputs.start_logits.cpu().numpy())\n", + " all_end_logits.append(outputs.end_logits.cpu().numpy())\n", + " start_logits = np.concatenate(all_start_logits, axis=0)\n", + " end_logits = np.concatenate(all_end_logits, axis=0)\n", + " _=compute_metrics(start_logits, end_logits, eval_set, subjqa[\"validation\"])\n" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "### distilbert-base-cased-distilled-squad trained" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 51, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading cached processed dataset at /home/karo/.cache/huggingface/datasets/subjqa/tripadvisor/1.1.0/e5588f9298ff2d70686a00cc377e4bdccf4e32287459e3c6baf2dc5ab57fe7fd/cache-bfb7935e995d8aee.arrow\n" + ] + }, + { + "data": { + "text/plain": " 0%| | 0/265 [00:00", + "text/html": "\n
\n \n \n [ 2/762 : < :, Epoch 0.00/3]\n
\n \n \n \n \n \n \n \n \n \n
StepTraining Loss

" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Saving model checkpoint to data/bert-finetuned-subjqa/checkpoint-254\n", + "Configuration saved in data/bert-finetuned-subjqa/checkpoint-254/config.json\n", + "Model weights saved in data/bert-finetuned-subjqa/checkpoint-254/pytorch_model.bin\n", + "tokenizer config file saved in data/bert-finetuned-subjqa/checkpoint-254/tokenizer_config.json\n", + "Special tokens file saved in data/bert-finetuned-subjqa/checkpoint-254/special_tokens_map.json\n", + "Saving model checkpoint to data/bert-finetuned-subjqa/checkpoint-508\n", + "Configuration saved in data/bert-finetuned-subjqa/checkpoint-508/config.json\n", + "Model weights saved in data/bert-finetuned-subjqa/checkpoint-508/pytorch_model.bin\n", + "tokenizer config file saved in data/bert-finetuned-subjqa/checkpoint-508/tokenizer_config.json\n", + "Special tokens file saved in data/bert-finetuned-subjqa/checkpoint-508/special_tokens_map.json\n", + "Saving model checkpoint to data/bert-finetuned-subjqa/checkpoint-762\n", + "Configuration saved in data/bert-finetuned-subjqa/checkpoint-762/config.json\n", + "Model weights saved in data/bert-finetuned-subjqa/checkpoint-762/pytorch_model.bin\n", + "tokenizer config file saved in data/bert-finetuned-subjqa/checkpoint-762/tokenizer_config.json\n", + "Special tokens file saved in data/bert-finetuned-subjqa/checkpoint-762/special_tokens_map.json\n", + "\n", + "\n", + "Training completed. Do not forget to share your model on huggingface.co/models =)\n", + "\n", + "\n" + ] + }, + { + "data": { + "text/plain": "TrainOutput(global_step=762, training_loss=0.7420042443463183, metrics={'train_runtime': 336.3364, 'train_samples_per_second': 18.107, 'train_steps_per_second': 2.266, 'total_flos': 1193472936391680.0, 'train_loss': 0.7420042443463183, 'epoch': 3.0})" + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from transformers import TrainingArguments\n", + "from transformers import Trainer\n", + "\n", + "\n", + "args = TrainingArguments(\n", + " output_dir=\"data/bert-finetuned-subjqa\",\n", + " overwrite_output_dir=True,\n", + " evaluation_strategy=\"no\",\n", + " save_strategy=\"epoch\",\n", + " learning_rate=2e-5,\n", + " num_train_epochs=3,\n", + " weight_decay=0.01,\n", + " fp16=True,\n", + ")\n", + "trainer = Trainer(\n", + " model=model,\n", + " args=args,\n", + " train_dataset=train_dataset,\n", + " eval_dataset=validation_dataset,\n", + " tokenizer=tokenizer,\n", + ")\n", + "trainer.train()" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 54, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "The following columns in the test set don't have a corresponding argument in `BertForQuestionAnswering.forward` and have been ignored: example_id, offset_mapping. If example_id, offset_mapping are not expected by `BertForQuestionAnswering.forward`, you can safely ignore this message.\n", + "***** Running Prediction *****\n", + " Num examples = 327\n", + " Batch size = 8\n" + ] + }, + { + "data": { + "text/plain": "", + "text/html": "\n

\n \n \n [ 1/41 : < :]\n
\n " + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": " 0%| | 0/265 [00:00", + "text/html": "\n
\n \n \n [ 2/750 : < :, Epoch 0.00/3]\n
\n \n \n \n \n \n \n \n \n \n
StepTraining Loss

" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Saving model checkpoint to data/roberta-finetuned-subjqa/checkpoint-250\n", + "Configuration saved in data/roberta-finetuned-subjqa/checkpoint-250/config.json\n", + "Model weights saved in data/roberta-finetuned-subjqa/checkpoint-250/pytorch_model.bin\n", + "tokenizer config file saved in data/roberta-finetuned-subjqa/checkpoint-250/tokenizer_config.json\n", + "Special tokens file saved in data/roberta-finetuned-subjqa/checkpoint-250/special_tokens_map.json\n", + "Saving model checkpoint to data/roberta-finetuned-subjqa/checkpoint-500\n", + "Configuration saved in data/roberta-finetuned-subjqa/checkpoint-500/config.json\n", + "Model weights saved in data/roberta-finetuned-subjqa/checkpoint-500/pytorch_model.bin\n", + "tokenizer config file saved in data/roberta-finetuned-subjqa/checkpoint-500/tokenizer_config.json\n", + "Special tokens file saved in data/roberta-finetuned-subjqa/checkpoint-500/special_tokens_map.json\n", + "Saving model checkpoint to data/roberta-finetuned-subjqa/checkpoint-750\n", + "Configuration saved in data/roberta-finetuned-subjqa/checkpoint-750/config.json\n", + "Model weights saved in data/roberta-finetuned-subjqa/checkpoint-750/pytorch_model.bin\n", + "tokenizer config file saved in data/roberta-finetuned-subjqa/checkpoint-750/tokenizer_config.json\n", + "Special tokens file saved in data/roberta-finetuned-subjqa/checkpoint-750/special_tokens_map.json\n", + "\n", + "\n", + "Training completed. Do not forget to share your model on huggingface.co/models =)\n", + "\n", + "\n" + ] + }, + { + "data": { + "text/plain": "TrainOutput(global_step=750, training_loss=0.4630465749104818, metrics={'train_runtime': 337.0904, 'train_samples_per_second': 17.755, 'train_steps_per_second': 2.225, 'total_flos': 1172895816798720.0, 'train_loss': 0.4630465749104818, 'epoch': 3.0})" + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "args = TrainingArguments(\n", + " output_dir=\"data/roberta-finetuned-subjqa\",\n", + " overwrite_output_dir=True,\n", + " evaluation_strategy=\"no\",\n", + " save_strategy=\"epoch\",\n", + " learning_rate=2e-5,\n", + " num_train_epochs=3,\n", + " weight_decay=0.01,\n", + " fp16=True,\n", + ")\n", + "trainer = Trainer(\n", + " model=model,\n", + " args=args,\n", + " train_dataset=roberta_train_dataset,\n", + " eval_dataset=roberta_validation_dataset,\n", + " tokenizer=tokenizer,\n", + ")\n", + "trainer.train()" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 58, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "The following columns in the test set don't have a corresponding argument in `RobertaForQuestionAnswering.forward` and have been ignored: example_id, offset_mapping. If example_id, offset_mapping are not expected by `RobertaForQuestionAnswering.forward`, you can safely ignore this message.\n", + "***** Running Prediction *****\n", + " Num examples = 321\n", + " Batch size = 8\n" + ] + }, + { + "data": { + "text/plain": "", + "text/html": "\n

\n \n \n [ 1/41 : < :]\n
\n " + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": " 0%| | 0/265 [00:00