{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Báo cáo bài tập lớn môn Học máy\n**Giảng viên**  : Trần Quốc Long  \n**Mã học phần** : INT3405E_20  \n**Sinh viên**   : Lê Kim Long  \n**Mã sinh viên**:18020852  ","metadata":{}},{"cell_type":"markdown","source":"# 1.Mô tả bài toán\nQuora Insincere Question Classification là một bài toán của Quora đặt ra, sử dụng sự trợ giúp từ cộng đồng, giúp họ phân loại những câu hỏi không chân thành.\n\nNhiệm vụ của bài toán là sử dụng tập dữ liệu mà Quora cung cấp để phân loại đâu là những câu hỏi mang hàm ý không chân thành, mang nội dung xấu độc, gây hiểu lầm.","metadata":{}},{"cell_type":"code","source":"# Load libraries\nimport re\nimport sys\nimport math\nimport string\nimport zipfile\nimport unicodedata\nimport nltk\n\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\nfrom tqdm import tqdm\nfrom collections import Counter\nfrom gensim.models import KeyedVectors\nfrom wordcloud import WordCloud, STOPWORDS\nfrom sklearn import metrics\nfrom sklearn.metrics import f1_score\nfrom sklearn.model_selection import train_test_split\n\nfrom keras import backend as K\nfrom keras.models import Sequential, Model\nfrom keras import initializers, regularizers, constraints\nfrom keras.layers import LSTM, Dense, Bidirectional, Input, Dropout","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:16:11.618703Z","iopub.execute_input":"2022-01-08T14:16:11.619332Z","iopub.status.idle":"2022-01-08T14:16:17.452964Z","shell.execute_reply.started":"2022-01-08T14:16:11.619235Z","shell.execute_reply":"2022-01-08T14:16:17.452236Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2.Dữ liệu và phân tích dữ liệu","metadata":{}},{"cell_type":"markdown","source":"Bộ dữ liệu của Quora cũng cấp bao gồm:\n+ Train.csv : tập dữ liệu cho training \n+ Test.csv  : tập dữ liệu để test \n+ embedings : Tập embeding sẵn của một số thư viện","metadata":{}},{"cell_type":"code","source":"train_data = pd.read_csv(\"../input/quora-insincere-questions-classification/train.csv\")\ntest_data = pd.read_csv(\"../input/quora-insincere-questions-classification/test.csv\")","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:16:17.455749Z","iopub.execute_input":"2022-01-08T14:16:17.456250Z","iopub.status.idle":"2022-01-08T14:16:22.927861Z","shell.execute_reply.started":"2022-01-08T14:16:17.456212Z","shell.execute_reply":"2022-01-08T14:16:22.927127Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"số câu hỏi trong tập train:\" , train_data.shape[0])\nprint(\"số câu hỏi trong tập test:\", test_data.shape[0])\ntrain_data.head()","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:17:44.436063Z","iopub.execute_input":"2022-01-08T14:17:44.436313Z","iopub.status.idle":"2022-01-08T14:17:44.450924Z","shell.execute_reply.started":"2022-01-08T14:17:44.436284Z","shell.execute_reply":"2022-01-08T14:17:44.448598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Dữ liệu train bao gồm 1306122 câu hỏi, dữ liệu test bao gồm 375806 câu hỏi\nCác trường dữ liệu được cung cấp:\n+ qid : mã id của câu hỏi\n+ question_text: câu hỏi \n+ target : nhãn gán sẵn của dữ liệu","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(10, 5))\n\n# Our original training image\nplt.subplot(121)\nval = train_data.target.value_counts().values\nnames = ['Sincere', 'Insincere']\nplt.bar(names, val)\n\n# Our original combined mask\nplt.subplot(122)\nsizes = [train_data[train_data[\"target\"] == 0].shape[0] / train_data.shape[0],train_data[train_data[\"target\"] == 1].shape[0] / train_data.shape[0] ]\nplt.pie(sizes, labels = names , autopct='%1.1f%%', shadow=True, startangle=140)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-08T13:11:21.177959Z","iopub.execute_input":"2022-01-08T13:11:21.178799Z","iopub.status.idle":"2022-01-08T13:11:21.635641Z","shell.execute_reply.started":"2022-01-08T13:11:21.178755Z","shell.execute_reply":"2022-01-08T13:11:21.634698Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Nhận xét** : Bộ dữ liệu phân bố không đều có đến 93.8% là câu hỏi có nhãn là 0 mà chỉ có 6.2% có nhãn là 1 cho thấy bộ dữ liệu này bộ dữ liệu mất cân bằng. Từ đó chúng ta có thể thấy được độ đo có thể dùng ở bài toán này là F1 score, vì nó thích hợp cho các trường hợp dữ liệu mất cân bằng này","metadata":{}},{"cell_type":"markdown","source":"F1 score là à harmonic mean của precision và recal\n$$F1 = \\frac{2}{precision^-1 + recall^-1 }$$\nTrong đó:\n+ Precision trả lời cho câu hỏi trong các trường hợp được dự báo là positive thì có bao nhiêu trường hợp là đúng \n$$Precision = \\frac{TP}{TP+FP}$$\n+Recall đo lường tỷ lệ dự báo chính xác các trường hợp positive trên toàn bộ các mẫu thuộc nhóm positive\n$$Recall = \\frac{TP}{TP+FN}$$\n","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"## Word Clound\nWord Clound là một cách trực quan hoá dữ liệu đưa lại cho chúng ta một cách nhìn đơn giản và dễ nhìn về tần suất của các từ xuất hiện trong dữ liệu. Các từ có tần suất cao thì càng được thể hiện to và đậm và ngược lại ","metadata":{}},{"cell_type":"code","source":"# tạo từ điển các từ xuất hiện và tần suất của chúng\ndef get_word_vocabulary(text):\n    word_list = text.split()\n    word_frequency = Counter(word_list)\n    return dict(word_frequency.most_common())","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:28:07.680477Z","iopub.execute_input":"2022-01-08T14:28:07.680769Z","iopub.status.idle":"2022-01-08T14:28:07.684871Z","shell.execute_reply.started":"2022-01-08T14:28:07.680739Z","shell.execute_reply":"2022-01-08T14:28:07.684199Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Vẽ word Clound\ndef draw_word_clound(word_frequency, title, figure_size=(10,6)):\n    wordcloud.generate_from_frequencies(word_frequency)\n    plt.figure(figsize=figure_size)\n    plt.imshow(wordcloud)\n    plt.axis(\"off\")\n    plt.title(title)\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:28:08.883140Z","iopub.execute_input":"2022-01-08T14:28:08.883382Z","iopub.status.idle":"2022-01-08T14:28:08.888389Z","shell.execute_reply.started":"2022-01-08T14:28:08.883354Z","shell.execute_reply":"2022-01-08T14:28:08.887462Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Vẽ 2 word clound đối với 2 loại dữ liệu tương đương với 2 nhãn của dữ liệu\ninsincere_questions = train_data.question_text[train_data['target'] == 1]\ninsincere_sample = \" \".join(insincere_questions)\ninsincere_word_freq = get_word_vocabulary(insincere_sample)\ninsincere_word_freq = dict(list(insincere_word_freq.items())[40:])\nwordcloud = WordCloud(width= 5000,\n    height=3000,\n    max_words=200,\n    background_color='white')\n\ndraw_word_clound(insincere_word_freq, \"Most Frequent Words insincere\")","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:28:09.160993Z","iopub.execute_input":"2022-01-08T14:28:09.161361Z","iopub.status.idle":"2022-01-08T14:28:58.515753Z","shell.execute_reply.started":"2022-01-08T14:28:09.161321Z","shell.execute_reply":"2022-01-08T14:28:58.515118Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Vẽ 2 word clound đối với 2 loại dữ liệu tương đương với 2 nhãn của dữ liệu\nsincere_questions = train_data.question_text[train_data['target'] == 0]\nsincere_sample = \" \".join(sincere_questions)\nsincere_word_freq = get_word_vocabulary(sincere_sample)\nsincere_word_freq = dict(list(sincere_word_freq.items())[40:])\nwordcloud = WordCloud(width= 5000,\n    height=3000,\n    max_words=200,\n    background_color='white')\n\ndraw_word_clound(sincere_word_freq, \"Most Frequent Words sincere\")","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:28:58.516897Z","iopub.execute_input":"2022-01-08T14:28:58.517134Z","iopub.status.idle":"2022-01-08T14:29:42.841976Z","shell.execute_reply.started":"2022-01-08T14:28:58.517097Z","shell.execute_reply":"2022-01-08T14:29:42.840372Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3. Tiền xử lý dữ liệu","metadata":{}},{"cell_type":"markdown","source":"Với những bài toán có dữ liệu dạng text thì việc quang trọng trước khi đưa dữ liệu vào model là chuyển text thành vector. Trong dữ liệu được cung cấp có các bộ embeding được cung cấp sẵn. Trong bài này em sử dụng tập embeding GoogleNew để vector hoá dữ liệu","metadata":{}},{"cell_type":"code","source":"# Giải nén và load embeddings\narchive = zipfile.ZipFile('/kaggle/input/quora-insincere-questions-classification/embeddings.zip', 'r')\npath=archive.open('GoogleNews-vectors-negative300/GoogleNews-vectors-negative300.bin', 'r')\n\nembeddings_index = KeyedVectors.load_word2vec_format(path, binary=True)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:30:10.447736Z","iopub.execute_input":"2022-01-08T14:30:10.448396Z","iopub.status.idle":"2022-01-08T14:31:30.198379Z","shell.execute_reply.started":"2022-01-08T14:30:10.448359Z","shell.execute_reply":"2022-01-08T14:31:30.197661Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Sau khi load được bộ dữ liệu chúng ta có thể kiểm tra trước độ phủ của bộ dữ liệu(out of vocab)","metadata":{}},{"cell_type":"code","source":"# hàm tách từ từ câu trong dữ liệu\ndef to_vocab(lines):\n    vocab = Counter()\n    for line in tqdm(lines, position=0):\n        vocab.update(line.split())\n    return vocab\n","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:31:30.200055Z","iopub.execute_input":"2022-01-08T14:31:30.200288Z","iopub.status.idle":"2022-01-08T14:31:30.205360Z","shell.execute_reply.started":"2022-01-08T14:31:30.200257Z","shell.execute_reply":"2022-01-08T14:31:30.204430Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Hàm check độ phủ của bộ embedding\ndef check_coverage(vocab, embeddings_index):\n    embeddings_in_vocab = 0\n    embeddings_in_all_text = 0\n    oov_in_all_text = 0\n    oov = Counter()\n    \n    for word in tqdm(vocab, position=0):\n        if word in embeddings_index:\n            embeddings_in_vocab += 1\n            embeddings_in_all_text += vocab[word]    \n        else:\n            oov[word] = vocab[word]\n            oov_in_all_text += vocab[word]\n\n    print('Found embeddings for {:.2%} of vocab'.format(embeddings_in_vocab / len(vocab)))\n    print('Found embeddings for {:.2%} of all text'.format(embeddings_in_all_text / (embeddings_in_all_text + oov_in_all_text)))\n    \n    return oov","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:31:30.206793Z","iopub.execute_input":"2022-01-08T14:31:30.207107Z","iopub.status.idle":"2022-01-08T14:31:30.216248Z","shell.execute_reply.started":"2022-01-08T14:31:30.207046Z","shell.execute_reply":"2022-01-08T14:31:30.215402Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vocab = to_vocab(train_data['question_text'])\nvocab.most_common(20)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:31:30.218261Z","iopub.execute_input":"2022-01-08T14:31:30.218511Z","iopub.status.idle":"2022-01-08T14:31:36.651815Z","shell.execute_reply.started":"2022-01-08T14:31:30.218480Z","shell.execute_reply":"2022-01-08T14:31:36.651007Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"oov = check_coverage(vocab, embeddings_index)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:31:36.653101Z","iopub.execute_input":"2022-01-08T14:31:36.653417Z","iopub.status.idle":"2022-01-08T14:31:37.755992Z","shell.execute_reply.started":"2022-01-08T14:31:36.653381Z","shell.execute_reply":"2022-01-08T14:31:37.755314Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Nhận xét**: Độ phủ của tập embedding đối với tập dữ liệu khá thấp nên chúng ta cần tiến hành một số bước xử lý dữ liệu như sau:\n + Xoá các dấu câu và ký tự đặc biệt\n + Xoá các stop word\n + Xoá các số \n + Đưa một số từ viết tắt về dạng gốc\n + Chuẩn hoá lại một số từ ngữ pháp mới\n + Streaming và Lemmatization mốt số từ ở dạng 's' \"ed\" về dạng gốc của từ","metadata":{}},{"cell_type":"markdown","source":"**Xoá dấu câu và một số ký tự đặc biệt** : Sử dụng 2 từ điển string và unicodedata để xây dựng bộ từ điển dấu câu và sau đó kiểm tra với từng câu trong dữ liệu xem chúng có xuất hiện hay không. Nếu có thì giữ lại còn không thì loại bỏ khỏi câu","metadata":{}},{"cell_type":"code","source":"# Build the list of punctuations\npunctuation = [chr(i) for i in range(sys.maxunicode) if unicodedata.category(chr(i)).startswith('P')]\nfor punct in string.punctuation:\n    if punct not in punctuation:\n        punctuation.append(punct)\npunctuation_in_embeddings = [punct for punct in punctuation if punct in embeddings_index]\npunctuation_not_in_embeddings = [punct for punct in punctuation if punct not in embeddings_index]\ndef clean_punct(x):\n    for punct in punctuation_not_in_embeddings:\n        x = x.replace(punct, ' ')\n    for punct in punctuation_in_embeddings:\n        x = x.replace(punct, f' {punct} ')\n    return x","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:34:20.476307Z","iopub.execute_input":"2022-01-08T14:34:20.477118Z","iopub.status.idle":"2022-01-08T14:34:20.931943Z","shell.execute_reply.started":"2022-01-08T14:34:20.477081Z","shell.execute_reply":"2022-01-08T14:34:20.931230Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Xoá bỏ số**","metadata":{}},{"cell_type":"code","source":"def clean_numbers(x):\n    if bool(re.search(r'\\d', x)):\n        x = re.sub('[0–9]{5,}', '#####', x)\n        x = re.sub('[0–9]{4}', '####', x)\n        x = re.sub('[0–9]{3}', '###', x)\n        x = re.sub('[0–9]{2}', '##', x)\n    return x","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:34:23.733632Z","iopub.execute_input":"2022-01-08T14:34:23.734402Z","iopub.status.idle":"2022-01-08T14:34:23.739929Z","shell.execute_reply.started":"2022-01-08T14:34:23.734356Z","shell.execute_reply":"2022-01-08T14:34:23.739203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Xử lý mốt số từ viết tắt về đúng dạng của nó** : chúng ta kiểm tra một số từ có cú pháp viết tắt có trong bộ dữ liệu không, nếu không có thì thay bằng từ viết đầy đủ của chúng","metadata":{}},{"cell_type":"code","source":"contraction_dict = {\"dont\": \"do not\", \"aint\": \"is not\", \"isnt\": \"is not\", \"doesnt\": \"does not\"\n, \"cant\": \"cannot\", \"mustnt\": \"must not\", \"ll\":\"will\" , \"re\": \"are\" ,\"ll\": \"will\", \"wont\": \"will not\" ,\"hasnt\": \"has not\"\n, \"havent\": \"have not\", \"arent\": \"are not\", \"ain't\": \"is not\", \"aren't\": \"are not\"\n,\"can't\": \"cannot\", \"‘cause\": \"because\", \"could've\": \"could have\"\n, \"couldn't\": \"could not\", \"didn't\": \"did not\", \"doesn't\": \"does not\", \"don't\": \"do not\"\n, \"hadn't\": \"had not\", \"hasn't\": \"has not\", \"haven't\": \"have not\", \"he'd\": \"he would\"\n,\"he'll\": \"he will\", \"he's\": \"he is\", \"how'd\": \"how did\", \"how'd'y\": \"how do you\"\n, \"how'll\": \"how will\", \"how's\": \"how is\", \"I'd\": \"I would\", \"I'd've\": \"I would have\"\n, \"I'll\": \"I will\", \"I'll've\": \"I will have\",\"I'm\": \"I am\", \"Iam\": \"I am\", \"I've\": \"I have\"\n, \"i'd\": \"i would\", \"i'd've\": \"i would have\", \"i'll\": \"i will\", \"i'll've\": \"i will have\"\n,\"i'm\": \"i am\", \"i've\": \"i have\", \"isn't\": \"is not\", \"it'd\": \"it would\", \"it'd've\": \"it would have\"\n, \"it'll\": \"it will\", \"it'll've\": \"it will have\",\"it's\": \"it is\", \"let's\": \"let us\"\n, \"ma'am\": \"madam\", \"mayn't\": \"may not\", \"might've\": \"might have\"\n,\"mightn't\": \"might not\",\"mightn't've\": \"might not have\", \"must've\": \"must have\"\n, \"mustn't\": \"must not\", \"mustn't've\": \"must not have\", \"needn't\": \"need not\"\n, \"needn't've\": \"need not have\",\"o'clock\": \"of the clock\", \"oughtn't\": \"ought not\"\n, \"oughtn't've\": \"ought not have\", \"shan't\": \"shall not\", \"sha'n't\": \"shall not\"\n, \"shan't've\": \"shall not have\", \"she'd\": \"she would\", \"she'd've\": \"she would have\"\n, \"she'll\": \"she will\", \"she'll've\": \"she will have\", \"she's\": \"she is\"\n, \"should've\": \"should have\", \"shouldn't\": \"should not\", \"shouldn't've\": \"should not have\"\n, \"so've\": \"so have\",\"so's\": \"so as\", \"this's\": \"this is\",\"that'd\": \"that would\", \n\"that'd've\": \"that would have\", \"that's\": \"that is\", \"there'd\": \"there would\", \n\"there'd've\": \"there would have\", \"there's\": \"there is\", \"here's\": \"here is\",\"they'd\": \"they would\"\n, \"they'd've\": \"they would have\", \"they'll\": \"they will\", \"they'll've\": \"they will have\", \n\"they're\": \"they are\", \"they've\": \"they have\", \"to've\": \"to have\", \"wasn't\": \"was not\",\n\"we'd\": \"we would\", \"we'd've\": \"we would have\", \"we'll\": \"we will\", \n\"we'll've\": \"we will have\", \"we're\": \"we are\", \"we've\": \"we have\", \n\"weren't\": \"were not\", \"what'll\": \"what will\", \"what'll've\": \"what will have\", \n\"what're\": \"what are\", \"what's\": \"what is\", \"what've\": \"what have\", \"when's\": \"when is\",\n\"when've\": \"when have\", \"where'd\": \"where did\", \"where's\": \"where is\", \"where've\": \"where have\", \n\"who'll\": \"who will\", \"who'll've\": \"who will have\", \"who's\": \"who is\", \"who've\": \"who have\",\n\"why's\": \"why is\", \"why've\": \"why have\", \"will've\": \"will have\", \"won't\": \"will not\", \"won't've\": \"will not have\",\n\"would've\": \"would have\", \"wouldn't\": \"would not\", \"wouldn't've\": \"would not have\", \"y'all\": \"you all\", \n\"y'all'd\": \"you all would\",\"y'all'd've\": \"you all would have\",\"y'all're\": \"you all are\",\n\"y'all've\": \"you all have\", \"you'd\": \"you would\", \"you'd've\": \"you would have\", \n\"you'll\": \"you will\", \"youll\":\"you will\", \"you'll've\": \"you will have\", \"you're\": \"you are\", \"you've\": \"you have\"}","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:46:15.778978Z","iopub.execute_input":"2022-01-08T14:46:15.779234Z","iopub.status.idle":"2022-01-08T14:46:15.796414Z","shell.execute_reply.started":"2022-01-08T14:46:15.779205Z","shell.execute_reply":"2022-01-08T14:46:15.795610Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"count_abbreviation_word = 0\ncount_full_word = 0\nfor word in contraction_dict:\n    if word in embeddings_index:\n        count_abbreviation_word += 1\n    if contraction_dict[word] in embeddings_index:\n        count_full_word += 1\nprint(\"Số từ viết tắt có trong tập embeddings_index:\"  , count_abbreviation_word)\nprint(\"Số từ viết đầy đủ có trong tập embeddings_index:\" , count_full_word)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:46:16.919120Z","iopub.execute_input":"2022-01-08T14:46:16.919364Z","iopub.status.idle":"2022-01-08T14:46:16.926488Z","shell.execute_reply.started":"2022-01-08T14:46:16.919336Z","shell.execute_reply":"2022-01-08T14:46:16.925746Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def replace_contractions(x):\n    for word in contraction_dict:\n        if word not in embeddings_index:\n            x = x.replace(word, f'{contraction_dict[word]}')\n        else:\n            x = x.replace(word, f'{word}')\n    return x","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:46:17.149884Z","iopub.execute_input":"2022-01-08T14:46:17.150432Z","iopub.status.idle":"2022-01-08T14:46:17.156042Z","shell.execute_reply.started":"2022-01-08T14:46:17.150397Z","shell.execute_reply":"2022-01-08T14:46:17.155223Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Sửa một số từ**: Trong bộ dữ liệu có cả Anh-Anh và Anh-Mỹ nên chúng ta cần thống nhất ngữ pháp về một loại","metadata":{}},{"cell_type":"code","source":"mispell_dict = {\n    'grey': 'gray',\n    'litre': 'liter',\n    'labour': 'labor',\n    'travelling':'traveling',\n    'favour': 'favor',\n    'colour': 'color',\n    'centre': 'center',\n    'honours': 'honor',\n    'theatre': 'theater',\n    'realise': 'realize',\n    'defence': 'defense',\n    'licence': 'license',\n    'analyse': 'analyze',\n    'practise': 'practice',\n    'behaviour': 'behavior',\n    'neighbour': 'neighbor',\n    'recognise': 'recognize',\n    'organisation':'organization',  \n    'Qoura': 'Quora',\n    'quora': 'Quora',\n    'Quorans': 'Quoran',\n    'infty': 'infinity',\n    'judgement': 'judge',   \n    'isnt': 'is not',\n    'didnt': 'did not',\n    'Whatis': 'what is',\n    'doesnt': 'does not',  \n    'learnt': 'learn',\n    'modelling': 'model',\n    'cancelled': 'cancel',\n    'travelled': 'travell',\n    'travelling': 'travel',\n    'aluminium': 'alumini',\n    'counselling':'counseling',\n    '₹': 'rupee',\n    'Brexit': 'Britain exit',\n    'Paytm': 'Pay Through Mobile',\n    'KVPY': 'Kishore Vaigyanik Protsahan Yojana',\n    'GDPR': 'General Data Protection Regulation',\n    'INTJ': 'Introversion Intuition Thinking Judgment',   \n    'cheque': 'bill',\n    'upvote': 'agree',\n    'upvotes': 'agree',\n    'vape': 'cigarette',\n    'jewellery': 'jewell',\n    'Fiverr': 'freelance',\n    'programd': 'program',\n    'programme': 'program',\n    'programr': 'programer',\n    'programrs': 'programer',\n    'WeChat': 'socialmedia',\n    'Snapchat': 'socialmedia',\n    'Redmi': 'cellphone',\n    'Xiaomi': 'cellphone',\n    'OnePlus': 'cellphone',\n    'cryptos': 'crypto',\n    'bitcoin': 'crypto',\n    'Coinbase': 'crypto',\n    'bitcoins': 'crypto',\n    'ethereum': 'crypto',\n    'Ethereum': 'crypto',\n    'Blockchain': 'crypto',\n    'blockchain': 'crypto',\n    'cryptocurrency': 'crypto',\n    'cryptocurrencies': 'crypto',\n}\n## Chuẩn hoá ngữ pháp và từ mới\ndef replace_typical_misspell(sen):\n    for word in mispell_dict.keys():\n        sen = sen.replace(word, mispell_dict[word])\n    return sen","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:46:31.659275Z","iopub.execute_input":"2022-01-08T14:46:31.661892Z","iopub.status.idle":"2022-01-08T14:46:31.676979Z","shell.execute_reply.started":"2022-01-08T14:46:31.661851Z","shell.execute_reply":"2022-01-08T14:46:31.676320Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Xoá bỏ các từ stop word**:","metadata":{}},{"cell_type":"code","source":"\nstopword_list = nltk.corpus.stopwords.words('english')\ndef remove_stopwords(text, is_lower_case=True):\n    tokenizer = ToktokTokenizer()\n    tokens = tokenizer.tokenize(text)\n    tokens = [token.strip() for token in tokens]\n    if is_lower_case:\n        filtered_tokens = [token for token in tokens if token not in stopword_list]\n    else:\n        filtered_tokens = [token for token in tokens if token.lower() not in stopword_list]\n    filtered_text = ' '.join(filtered_tokens)\n    return filtered_text","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:48:24.173537Z","iopub.execute_input":"2022-01-08T14:48:24.174199Z","iopub.status.idle":"2022-01-08T14:48:24.180447Z","shell.execute_reply.started":"2022-01-08T14:48:24.174166Z","shell.execute_reply":"2022-01-08T14:48:24.179265Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Stemming vs. lemmatization**\n+ Stemming là kỹ thuật dùng để biến đổi 1 từ về dạng gốc (được gọi là stem hoặc root form) bằng cách cực kỳ đơn giản là loại bỏ 1 số ký tự nằm ở cuối từ mà nó nghĩ rằng là biến thể của từ. Ví dụ như chúng ta thấy các từ như walked, walking, walks chỉ khác nhau là ở những ký tự cuối cùng, bằng cách bỏ đi các hậu tố -ed, -ing hoặc -s, chúng ta sẽ được từ nguyên gốc là walk. Người ta gọi các bộ xử lý stemming là Stemmer.\n+ Khác với Stemming là xử lý bằng cách loại bỏ các ký tự cuối từ một cách rất heuristic, Lemmatization sẽ xử lý thông minh hơn bằng một bộ từ điển hoặc một bộ ontology nào đó. Điều này sẽ đảm bảo rằng các từ như “goes“, “went” và “go” sẽ chắc chắn có kết quả trả về là như nhau. Kể các từ danh từ như mouse, mice cũng đều được đưa về cùng một dạng như nhau. Người ta gọi bộ xử lý lemmatization là lemmatizer\n","metadata":{}},{"cell_type":"code","source":"from nltk.stem import SnowballStemmer\nfrom nltk.tokenize.toktok import ToktokTokenizer\ndef stem_text(text):\n    tokenizer = ToktokTokenizer()\n    stemmer = SnowballStemmer('english')\n    tokens = tokenizer.tokenize(text)\n    tokens = [token.strip() for token in tokens]\n    tokens = [stemmer.stem(token) for token in tokens]\n    return ' '.join(tokens)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:49:37.004999Z","iopub.execute_input":"2022-01-08T14:49:37.005254Z","iopub.status.idle":"2022-01-08T14:49:37.011241Z","shell.execute_reply.started":"2022-01-08T14:49:37.005226Z","shell.execute_reply":"2022-01-08T14:49:37.010404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from nltk.stem import WordNetLemmatizer\nfrom nltk.tokenize.toktok import ToktokTokenizer\nwordnet_lemmatizer = WordNetLemmatizer()\ndef lemma_text(text):\n    tokenizer = ToktokTokenizer()\n    tokens = tokenizer.tokenize(text)\n    tokens = [token.strip() for token in tokens]\n    tokens = [wordnet_lemmatizer.lemmatize(token) for token in tokens]\n    return ' '.join(tokens)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:49:38.023683Z","iopub.execute_input":"2022-01-08T14:49:38.024110Z","iopub.status.idle":"2022-01-08T14:49:38.029337Z","shell.execute_reply.started":"2022-01-08T14:49:38.024076Z","shell.execute_reply":"2022-01-08T14:49:38.028475Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Hàm tổng hơp** : Tổng hợp các hàm xử lý","metadata":{}},{"cell_type":"code","source":"def clean_sentence(x):\n    x = x.lower()\n    x = clean_punct(x)\n    x = clean_numbers(x)\n    x = replace_typical_misspell(x)\n    x = remove_stopwords(x)\n    x = replace_contractions(x)\n    x = stem_text(x)\n    x = lemma_text(x)\n    x = x.replace(\"'\",\"\")\n    return x","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:49:49.310394Z","iopub.execute_input":"2022-01-08T14:49:49.310920Z","iopub.status.idle":"2022-01-08T14:49:49.315610Z","shell.execute_reply.started":"2022-01-08T14:49:49.310883Z","shell.execute_reply":"2022-01-08T14:49:49.314919Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Áp dụng các bước trên vào dữ liệu\nfrom tqdm.notebook import tqdm\ntqdm.pandas()\n\ntrain_data['question_text_cleaned'] = train_data['question_text'].progress_apply(lambda x: clean_sentence(x))\ntest_data['question_text_cleaned'] = test_data['question_text'].progress_apply(lambda x: clean_sentence(x))","metadata":{"execution":{"iopub.status.busy":"2022-01-08T14:49:50.294400Z","iopub.execute_input":"2022-01-08T14:49:50.294976Z","iopub.status.idle":"2022-01-08T15:07:27.282912Z","shell.execute_reply.started":"2022-01-08T14:49:50.294939Z","shell.execute_reply":"2022-01-08T15:07:27.282256Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataframe, val_dataframe = train_test_split(train_data, test_size = 0.1, stratify = train_data['target'], random_state = 42)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T15:09:47.245803Z","iopub.execute_input":"2022-01-08T15:09:47.246520Z","iopub.status.idle":"2022-01-08T15:09:48.657229Z","shell.execute_reply.started":"2022-01-08T15:09:47.246477Z","shell.execute_reply":"2022-01-08T15:09:48.656508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 4.Vector hoá dữ liệu","metadata":{}},{"cell_type":"markdown","source":"Sau khi xử lý xong dữ liệu thì ta cần chuyển chúng thành vector bằng tập embeding","metadata":{}},{"cell_type":"code","source":"SEQ_LEN = 30\nEMB_SIZE = 300\n\ndef text_to_array(sen):\n    empyt_emb = np.zeros(EMB_SIZE)\n    sen = sen[:-1].split()[:SEQ_LEN]\n    embeds = [embeddings_index[x] for x in sen if x in embeddings_index]\n    embeds+= [empyt_emb] * (SEQ_LEN - len(embeds))\n    return np.array(embeds)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T15:09:53.507127Z","iopub.execute_input":"2022-01-08T15:09:53.507375Z","iopub.status.idle":"2022-01-08T15:09:53.513933Z","shell.execute_reply.started":"2022-01-08T15:09:53.507346Z","shell.execute_reply":"2022-01-08T15:09:53.511841Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 5.Huấn luyện Mô hình","metadata":{}},{"cell_type":"markdown","source":"Với những bài toán thuộc dạng Sequence Classification, ta có thể sử dụng thuật toán mạng Long Short-tẻm memory (LSTM) để xử lý\n Mô hình bao gồm :\n + Layer LSTM với 128 units, cho phép thông tin từ input trước được sử dụng trong tương lai.\n + Bởi vì đây là bài toán binary classification nên ta sẽ thêm output layer với 1 unit và 1 sigmoid activation function.\nCompile model với loss function binary_crossentropy và thuật toán Adam optimization.\n\nMột khi model đã được compile, nó có thể được fit.","metadata":{}},{"cell_type":"markdown","source":"Một trong những điểm yếu lớn nhất của mô hình LSTM là giới hạn của bộ nhớ, nên chúng ta cần tạo data batch generate.","metadata":{}},{"cell_type":"code","source":"\nbatch_size = 128\ndef batch_gen(train_df):\n    n_batches = math.ceil(len(train_df) / batch_size)\n    while True: \n        train_df = train_df.sample(frac=1.) \n        for i in range(n_batches):\n            texts = train_df.iloc[i * batch_size: (i + 1) * batch_size, 1]\n            text_arr = np.array([text_to_array(text) for text in texts])\n            yield text_arr, np.array(train_df[\"target\"][i * batch_size:(i + 1) * batch_size])","metadata":{"execution":{"iopub.status.busy":"2022-01-08T15:09:56.294133Z","iopub.execute_input":"2022-01-08T15:09:56.294383Z","iopub.status.idle":"2022-01-08T15:09:56.301277Z","shell.execute_reply.started":"2022-01-08T15:09:56.294353Z","shell.execute_reply":"2022-01-08T15:09:56.300186Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_size = 10000\nval_vects = np.array([\n    text_to_array(X_text) for X_text in tqdm(\n        val_dataframe[\"question_text\"][:val_size],\n        position=0\n    )\n], dtype=float)\nval_y = np.array(val_dataframe[\"target\"][:val_size], dtype='int32')\n\ntrain_data = batch_gen(train_dataframe)\nvalidation_data=(val_vects, val_y)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T15:09:58.213841Z","iopub.execute_input":"2022-01-08T15:09:58.214092Z","iopub.status.idle":"2022-01-08T15:09:59.451559Z","shell.execute_reply.started":"2022-01-08T15:09:58.214064Z","shell.execute_reply":"2022-01-08T15:09:59.450856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Sequential()\n\n# Add a long short-term memory layer with 128 units\nmodel.add(LSTM(units=128))\n\n# Add fully connected layer with a sigmoid activation function\nmodel.add(Dense(1, activation=\"sigmoid\"))\n\n# Compile neural network\nmodel.compile(loss='binary_crossentropy', # Cross-entropy\n              optimizer='adam', # Adam optimization\n              metrics=['accuracy']) # Accuracy performance metric\n","metadata":{"execution":{"iopub.status.busy":"2022-01-08T15:10:01.356730Z","iopub.execute_input":"2022-01-08T15:10:01.357185Z","iopub.status.idle":"2022-01-08T15:10:03.746967Z","shell.execute_reply.started":"2022-01-08T15:10:01.357131Z","shell.execute_reply":"2022-01-08T15:10:03.744628Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Train neural network\nhistory = model.fit(train_data,\n                    epochs=20,\n                    steps_per_epoch=1000, \n                    validation_data=validation_data,\n                    verbose=True)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T15:10:07.413276Z","iopub.execute_input":"2022-01-08T15:10:07.413641Z","iopub.status.idle":"2022-01-08T15:15:37.448909Z","shell.execute_reply.started":"2022-01-08T15:10:07.413610Z","shell.execute_reply":"2022-01-08T15:15:37.448203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 6. Visulize accurancy và loss của mô hình","metadata":{}},{"cell_type":"code","source":"# Get training and test loss histories\ntraining_loss = history.history[\"loss\"]\ntest_loss = history.history[\"val_loss\"]\n# Create count of the number of epochs\nepoch_count = range(1, len(training_loss) + 1)\n# Visualize loss history\nplt.plot(epoch_count, training_loss, \"r--\")\nplt.plot(epoch_count, test_loss, \"b-\")\nplt.legend([\"Training Loss\", \"Test Loss\"])\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"Loss\")\nplt.show()\n\n# Get training and test accuracy histories\ntraining_accuracy = history.history[\"accuracy\"]\ntest_accuracy = history.history[\"val_accuracy\"]\nplt.plot(epoch_count, training_accuracy, \"r--\")\nplt.plot(epoch_count, test_accuracy, \"b-\")\n# Visualize accuracy history\nplt.legend([\"Training Accuracy\", \"Test Accuracy\"])\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"Accuracy Score\")\nplt.show();","metadata":{"execution":{"iopub.status.busy":"2022-01-08T15:15:41.512118Z","iopub.execute_input":"2022-01-08T15:15:41.512373Z","iopub.status.idle":"2022-01-08T15:15:41.902070Z","shell.execute_reply.started":"2022-01-08T15:15:41.512344Z","shell.execute_reply":"2022-01-08T15:15:41.901378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 6. Dự đoán trong bộ dữ liệu test","metadata":{}},{"cell_type":"code","source":"pred_val_y = model.predict(val_vects, verbose=False)\n\nbest_thres = 0\nbest_thres_id = 0\n\nfor thres in np.arange(0.1, 0.901, 0.01):\n    thres = np.round(thres, 2)\n    value = metrics.f1_score(val_y, (pred_val_y>thres).astype(int))\n    if value > best_thres:\n        best_thres = value\n        best_thres_id = thres\n        \nprint(\"The best F1 score is {0} at threshold {1}\".format(best_thres, best_thres_id))","metadata":{"execution":{"iopub.status.busy":"2022-01-08T15:15:45.262134Z","iopub.execute_input":"2022-01-08T15:15:45.262398Z","iopub.status.idle":"2022-01-08T15:15:47.303447Z","shell.execute_reply.started":"2022-01-08T15:15:45.262359Z","shell.execute_reply":"2022-01-08T15:15:47.302664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def batch_gen_for_submit(test_df):\n    n_batches = math.ceil(len(test_df) / batch_size)\n    for i in range(n_batches):\n        texts = test_df.iloc[i * batch_size: (i + 1) * batch_size, 1]\n        text_arr = [text_to_array(text) for text in texts]\n        yield np.array(text_arr, dtype=float)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T15:15:49.927457Z","iopub.execute_input":"2022-01-08T15:15:49.928033Z","iopub.status.idle":"2022-01-08T15:15:49.934159Z","shell.execute_reply.started":"2022-01-08T15:15:49.927995Z","shell.execute_reply":"2022-01-08T15:15:49.933033Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_preds = []\nfor x in tqdm(batch_gen_for_submit(test_data)):\n    cc = model.predict(x, verbose=False)\n    cc = (cc > best_thres_id).astype(int)\n    for i in cc:\n        all_preds.append(i[0])","metadata":{"execution":{"iopub.status.busy":"2022-01-08T15:15:52.519307Z","iopub.execute_input":"2022-01-08T15:15:52.519904Z","iopub.status.idle":"2022-01-08T15:18:50.303273Z","shell.execute_reply.started":"2022-01-08T15:15:52.519868Z","shell.execute_reply":"2022-01-08T15:18:50.302457Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submit_df = pd.DataFrame({\"qid\": test_data[\"qid\"], \"prediction\": all_preds})\nsubmit_df.head(5)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T15:23:05.092132Z","iopub.execute_input":"2022-01-08T15:23:05.092438Z","iopub.status.idle":"2022-01-08T15:23:05.336069Z","shell.execute_reply.started":"2022-01-08T15:23:05.092406Z","shell.execute_reply":"2022-01-08T15:23:05.335347Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submit_df","metadata":{"execution":{"iopub.status.busy":"2022-01-08T15:35:40.647706Z","iopub.execute_input":"2022-01-08T15:35:40.648301Z","iopub.status.idle":"2022-01-08T15:35:40.658978Z","shell.execute_reply.started":"2022-01-08T15:35:40.648258Z","shell.execute_reply":"2022-01-08T15:35:40.658296Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submit_df.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T15:28:44.988233Z","iopub.execute_input":"2022-01-08T15:28:44.988657Z","iopub.status.idle":"2022-01-08T15:28:45.813770Z","shell.execute_reply.started":"2022-01-08T15:28:44.988624Z","shell.execute_reply":"2022-01-08T15:28:45.812928Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"![image.png](attachment:bb68475c-ed24-4125-8ed7-553431ad526c.png)","metadata":{},"attachments":{"bb68475c-ed24-4125-8ed7-553431ad526c.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAABMcAAAEQCAYAAAC0kBNnAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAGyKSURBVHhe7d0LWBRXvi78V5DmJkIDAiIgVwGJ7SVEERONRpOMmmQ0E5OMMTOJnvmSSZ7k2yfmmZNx9jfJ3jGZ2TFn72QnE0+OOhnN1Ymai5pEIooGvBHQVgSUO4iAQIPIrbl9q6qrobtpoFFQsd/fY9tdxerqquq1Vq3696pVo7oEEBERERERERER2SEH5ZmIiIiIiIiIiMjuMDhGRERERERERER2i8ExIiIiIiIiIiKyWwyOERERERERERGR3WJwjIiIiIiIiIiI7BaDY0REREREREREZLcYHCMiIiIiIiIiIrvF4BgREREREREREdktBseIiIiIiIiIiMhuMThGRERERERERER2i8ExIiIiIiIiIiKyW6O6BOX1VbvS2IiGhitobW3FECyOiIiIiIiIiIgIo0aNgrOzMzw8xmCMu7syd2hdc3CstlaH5pZmjPUYCxcXZ3mliYiIiIiIiIiIrpUUtmppacXlhstwdXGFt7da+cvQuabgmNRjrL6+HuN8feHgwCs0iYiIiIiIiIho6HV2duJSdTU8PT2HvAfZNUW0pEsppR5jDIwREREREREREdFwkWJPUgxKikUNtWuKakljjEmXUhIREREREREREQ0nKQYlxaKG2jUFx6QrMjnGGBERERERERERDTcpBnWNQ+dbxeshiYiIiIiIiIjIbjE4RkREREREREREdovBMSIiIiIiIiIislsMjhERERERERERkd1icIyIiIiIiIiIiOwWg2NERERERERERGS3GBwjIiIiIiIiIiK7xeAYERERERERERHZLQbHiIiIiIiIiIjIbjE4RkREREREREREdovBMSIiIiIiIiIislsMjhERERERERERkd1icIyIiIiIiIiIiOwWg2NERERERERERGS3GBwjIiIiIiIiIiK7xeAYERERERERERHZLQbHiEY6fQ3ytWdR2qBMD6XhXDYRERERERHRTWAEB8cakPv9JmzatAsnqzqUeeY6qk5i1yaRZn++SE1m2vTQ6/WwvuduJR3ydurblMnrqCpTyp8/Ir9RmTFManJ+xIHjafghswh6Zd5QGc5lExEREREREd0M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REREREREZLcYHCMiIiIiIiIiIrvF4BgREREREREREdktBseIiIiIiIiIiMhuMThGRERERERERER2i8ExIiIiIiIiIiKyWwyOERERERERERGR3WJwjIiIiIiIiIiI7BaDY0REREREREREZLcYHCMiIiIiIiIiIrvF4BgREREREREREdmtUV2C8nrQLpRfhIuzszJFREREREREREQ0fFpaWzEhcLwyNTSuKThWWFSMsNCJyhQREREREREREdHwGY5YFC+rJCIiIiIiIiIiu8XgGBERERERERER2S0Gx4iIiIiIiIiIyG4xOEZERERERERERHaLwTEiIiIiIiIiIrJbDI4REREREREREZHdYnCMiIiIiIiIiIjsFoNjRERERERERERktxgcIyIiIiIiIiIiu8XgGBERERERERER2S0Gx4iIiIiIiIiIyG4xOEZERERERERERHaLwTEiIiIiIiIiIrJbDI4REREREREREZHdYnCMiIiIiIiIiIjsFoNjRERERERERERktxgcIyIiIiIiIiIiu8XgGBERERERERER2S0Gx4iIiIiIiIiIyG4xOEZERERERERERHaLwTEiIiIiIiIiIrJbDI4REREREREREZHdYnCMiIiIiIiIiIjsFoNjRERERERERERktxgcIyIiIiIiIiIiu8XgGBERERERERER2S0Gx4iIiIiIiIiIyG4xOEZERERERERERHaLwTEiIiIiIiIiIrJbDI4REREREREREZHdYnCMiIiIiIiIiIjsFoNjRERERERERERktxgcIyIiIiIiIiIiu8XgGBERERERERER2S0Gx4iI6Op16KHXGx4dncq8m5z+Uh60Z0rQMELWl4iGQGcDSs5okXdJr8wYIsO1XKLhpq9G3qkslDQo0zeBhtIsaM9Xg6WJ7FabSbtamUXXz6guQXk9aIVFxQgLnahM3QCNeUj6JBmFfnfgoSXT4e+kzDdRmfEhvk4H7vjl7zDdT5lJRETXpqUS2rQUaPPq0KTMAjwQMvUOJMyIhJeV+rh/lcj88GucCF+AJxZGwk2ZO/Sqof18J45eBmLu/S3mhqoMs6XGiDgaOqpUcDTMUXSIBoponoxSQTXobeofj09EojzuEOWxJg73/3YOQpTiaNCAnL2f4VAZELbgCSyKNK8VmvKS8HFyIQLnPo6lMR7K3L7piw7ho305wNgELH9M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xE+QLrtWDVg3DUOdPQi21FNENDLY3KZQ2lgDpbOtfjDWYU6Da4v1R2nfDdw2srH+pJuDre12Y7qBzjtsbc/bmN8Hw1A2Bs7zbOeT3VDKY595vZ9z5u4yOtT1+EDrZEpeh4HLtMTW8n89MThGREQ3mB7pHz6M1668gq3/M7FXcIyIiIiIiGg4DUcs6ha4WyUREV0XunRsWff/4t1v1Vhy51QGxoiIiIiI6JbA4BgREdlGNQbBty/CqvXvmI05SERERERENJLxskoiIiIiIiIiIhoReFklERERERERERHREGJwjIiIiIiIiIiI7BaDY0REREREREREZLcYHCMiIiIiIiIiIrvF4BgREREREREREdktBseIiIiIiIiIiMhuMThGRERERERERER2i8ExIiIiIiIiIiKyWwyOERERERERERGR3WJwjIiIiIiIiIiI7BaDY0REREREREREZLcYHCMiIiIiIiIiIrvF4BgREREREREREdmtUV2C8nrQCouKERY6UZm6vn6/Y6byioiIiIiIiIiIrpe/PXxceXX9DUcsakT3HLuRXwYREREREREREY18vKySiIiIiIiIiIjsFoNjRERERERERERktxgcIyIiIiIiIiIiu8XgGBERERERERER2S0Gx4iIiIiIiIiIyG4xOEZERERERERERHaLwTEiIiIiIiIiIrJbDI4REREREREREZHdYnCMiIiIiIiIiIjsFoNjRERERERERERktxgcIyIiIiIiIiIiu8XgmKS9E20thkdnpzKPiIiIiIiIiIhuefYdHGtsQuHXxdj/Vj6S/tPw+P6vRUg/0IArLUqam1Y7yr86j71v1qJOmTMoeiUYqEwSEREREREREdkjuw2OdV6oxbEtF5B9Vg/HCE9ELvBF7AJvTIwAqo5W4NBHlaioVxLfgupOSMFAsY0NygwiIiIiIiIiIjtkn8Gx9hYU/FCDmisuiHwsAnev8MOkWWqEzfJB3IqJmPsLDzjrLiPraCPalLcQEREREREREdGtxy6DY63ndDhXCYydOw6RYZa7YBTGTPPBpAiRLuMyLpn2rGrRoyK1Esc2FWDvm0U48lUViovblT8qGhuR83kZjqW3orOmATlfFmO/lHaPDnXNUoJO1B1TlrGxFBkHrqCp+9rGdlzaL977eR0uow014rOObDwvpzudesW2Sz0721GTXoWMrUVi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mmvelTp8Kk7UV6oj0PVIqO3fpTGdgzO8+vs+xXrWtXQOnM6Svhl1XeI9zgN9eYPYZ9dCWp9m8eUPmMevUaPYFtdr3I5ryKe9GL8/F/e+vwtjGlv2jZLWpnWz5bMHJOqc+ma0DJT/bMrPxrx2LfvWuIzR8PJklzEiIiIiIhp5hiMWNWKDY/M/z8DBUpsHABpWXS/f0ys4Nuqt/cpfbwx5nYwai/CnTfnIjJmCPff53fB1MzKso3lw7GZZNyJ74+7kiMY24+1eDUI9XVD4uznKFBERERER0Y3H4NjNzLLn2M2g/jz+tK0cR9rakezoibTV8bZfFnbdWPQcIyIiIiIiIiLqw3DEoobrIjD74+WBDRFeCLuJrlRqqWqHOtADi6MCcfY3gxgv6boajbCJamwIclOmiYiIiIiIiIiuH/YcIyIiIiIiIiKiEYE9x4iIiIiIiIiIiIYQg2NERERERERERGS3GBwjIiIiIiIiIiK7xeAYERERERERERHZLQbHiIiIiIiIiIjIbjE4RkREREREREREdovBMSIiIiIiIiIislsMjhERERERERERkd1icIyIiIiIiIiIiOwWg2NERERERERERGS3GBwjIiIiIiIiIiK7xeAYERERERERERHZLQbHiIiIiIiIiIjIbjE4RkREREREREREdovBMSIiIiIiIiIislsMjhERERERERERkd1icIyIiIiIiIiIiOwWg2NERERERERERGS3GBwjIiIiIiIiIiK7xeAYERERERERERHZLQbHiIiIiIiIiIjIbjE4RkREREREREREdovBMSIiIiIiIiIislsMjhERERERERERkd1icIyIiIiIiIiIiOwWg2NERERERERERGS3GBwjIiIiIiIiIiK7dU3BsVGjRqGrq0uZIiIiIiIiIiIiGh5SDEqKRQ21awqOOTs7o7m5WZkiIiIiIiIiIiIaHlIMSopFDbVrCo55eIxBXV09Ojs7lTlERERERERERERDS+o1JsWgpFjUULum4NgYd3f5uaKiEk1NTbzEkoiIiIiIiIiIhowUa5JiThcvVsjTxljUUBolPuSaI1pXGhvR0HAFra2tDJAREREREREREdGQkMYYky6llHqMDUdgTDIkwTEiIiIiIiIiIqKR6JouqyQiIiIiIiIiIhq5gP8f6u9oc9wHRsoAAAAASUVORK5CYII="}}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}