{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "small_sent_analysis.ipynb", "provenance": [], "collapsed_sections": [], "machine_shape": "hm", "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "accelerator": "GPU" }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "id": "hqrbjC8slEbB", "colab_type": "text" }, "source": [ "### ছোট্ট একটা সেন্টিমেন্ট অ্যানালাইসিস\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "f-CTYZ3cdska", "colab_type": "text" }, "source": [ "আমরা প্রায় বইয়ের শেষ পর্যায়ে চলে এসেছি। বাকি আছে দুটো মডেল সামনে। দুটোই সেন্টিমেন্ট অ্যানালাইসিসের ওপর। প্রথমটা একটা বেসিক মডেল, যেটা যে কেউ বুঝতে পারবেন। খুব সহজভাবে উপস্থাপন করা হয়েছে যেটা আগের সব শেখা বিষয়গুলোর কিছুটা কম্পাইলেশন। একদম ছোট একটা ডাটাসেট দিয়ে তৈরি করা, যা সহজেই ভেতরের কম্প্লেক্সিটি বুঝতে সাহায্য করবে। তবে শুরুতেই সেন্টিমেন্ট অ্যানালাইসিস কি আর কেনই বা এটা নিয়ে এতো তোলপাড়?\n", "\n", "কিছুদিন আগ পর্যন্ত একটা ব্র্যান্ডের ভ্যালুয়েশন নির্ভর করত তার ব্যাপারে মানুষজন একে অপরকে কি বলছে? আমরা যাকে বলছি ‘ওয়ার্ড অফ মাউথ’। আমরা একটা জিনিস কেনার আগে বন্ধুবান্ধবকে জিজ্ঞাসা করে কিনতাম। অথবা ওই জিনিসটার ওপর পেপারে যদি কেউ লেখালিখি করে সেটার ওপর ভিত্তি করে একটা সিদ্ধান্ত নিয়ে ফেলতাম। কোম্পানিগুলো বড় বড় সেলিব্রেটিকে ব্যবহার করত তাদের প্রোডাক্টের অ্যাডভার্টাইজমেন্ট এ। খেয়াল আছে পিয়ারসনের কথা? ছোটবেলার টিভিতে ওই ব্র্যান্ডগুলোর জিংগেল এখনো মনে আছে।\n", "\n", "এখন কি করি? একটা প্রোডাক্ট কেনার আগে ইন্টারনেটে দেখি তার ব্যাপারে ‘রিভিউ’ কেমন? বিশেষ করে প্রতিটা প্রোডাক্টের সাথে ‘ইউজার রিভিউ’ একটা বিশাল জিনিস। এতে বেড়েছে ট্রান্সপারেন্সি। একটা বাজে জিনিস গুছিয়ে দিয়ে পার পাবেনা কোম্পানি। একজন ব্যবহারকারী হিসেবে যেভাবে আমরা একটা প্রোডাক্ট নিয়ে ইন্টারনেটে রিসার্চ করি, সে ধরনের কাছাকাছি রিসার্চ করে থাকে বর্তমান কোম্পানিগুলো। তার প্রোডাক্টগুলো বাজারে কেমন চলছে, পাশাপাশি সেগুলোর ব্যাপারে ব্যবহারকারীরা কি বলছেন অথবা সামনের প্রোডাক্টে কি ধরনের ‘রিভিশন’ বা মডিফিকেশন আসতে পারে সেগুলোর ইনপুট আসবে ইন্টারনেটের বিভিন্ন রিভিউ থেকে। তবে সেটা সমস্যা হয়ে দাঁড়ায় যখন কোম্পানিটি তার ব্র্যান্ডের সোশ্যাল সেন্টিমেন্ট নিয়ে কাজ শুরু করেন। এত মানুষ, হাজারো কমেন্ট, অনেক ধরনের রিঅ্যাকশন এই সবকিছুকে প্রসেস করতে গেলে সেই রিসোর্স ম্যানেজ করবে কে? সেখানে চলে এসেছে ডিপ লার্নিং। মানুষের মনের খবর জানতে সেন্টিমেন্ট অ্যানালাইসিস এর নতুন জগৎ।\n", "\n", "আমরা যখন একটা ব্যাপারে প্রচুর তথ্য পাই, তখন সেগুলোকে অ্যানালাইসিস করার জন্য আমাদেরকে ‘লাইন বাই লাইন’ পড়তে হবে। আর এখন যেভাবে সোশ্যাল মিডিয়া, ব্লগ, হাজারো ইলেকট্রনিক পাবলিকেশন মিনিটে অগুনিত ইউজার জেনারেটেড কনটেন্ট তৈরি করছে, সেখানে ডিপ লার্নিং ছাড়া এই ধরনের ডাটা প্রসেস করা দুষ্কর। শুধুমাত্র ডাটা প্রসেসিং নয় - এর মধ্যে টেক্সটগুলোর কন্টেক্সটুয়াল মাইনিং থেকে কোন তথ্যটি দরকার আর কোন তথ্যটি নয়, সেটা জানতে ডিপ লার্নিংকে বুঝতে হবে কিভাবে মানুষ তার মনের ভাব প্রকাশ করে। কে কি শব্দ বলল, শব্দটা বাক্যের কোথায় আছে, আগের এবং পরের বাক্যের সাথে এর সংযোগ/সিমিলারিটি কতটুকু সেটা বের করতে সেন্টিমেন্ট অ্যানালাইসিস বিশাল কাজ করে।\n", "\n", "শুধুমাত্র কোম্পানিগুলো নয়, এখন অনেক দেশ তাদের জনগণের যেকোন বিষয়ে মনোভাব বোঝার জন্য এই সেন্টিমেন্ট অ্যানালাইসিস ব্যবহার করে থাকে। সরকারের প্রচুর সেবা যেহেতু জনগণের জন্য টার্গেট করে তৈরি করা, সেখানে সরকার তো জানতে চাইতেই পারেন - তাদের সার্ভিস ডেলিভারী প্লাটফর্মগুলো কিভাবে কাজ করছে, কেমন পারফর্ম করছে? সেন্টিমেন্ট অ্যানালাইসিস কিছু ধারনা আগে পেয়েছি আগের চ্যাপ্টারে। তবে সেটার আরো ভালো ধারণা নেবার চেষ্টা করব নিচের কোড থেকে। \n", "\n", "সাধারণ ‘টেক্সট’ থেকে মানুষের মতো করে বোঝার সিস্টেম চলে এসেছে এখন। সেখানে সেন্টিমেন্ট অ্যানালাইসিসে যেকোনো একটা টেক্সট থেকে সেই ব্যাপারটা ‘পজিটিভ’ না ‘নেগেটিভ’ নাকি একেবারে ‘নিউট্রাল’ - সেটার একটা ধারণা দিতে পারে এই জিনিস। এর পাশাপাশি চলে এসেছে ‘ইনটেন্ট অ্যানালাইসিস’ যেটা আসলে সেন্টিমেন্ট অ্যানালাইসিসের আরেক ধাপ ওপরে - যা ওই টেক্সট থেকে ব্যবহারকারীর ‘ইনটেনশন’ মনোভাব নিয়ে একটা প্রেডিকশন দিতে পারে। ওই টেক্সট থেকে বলে দিতে পারে উনি এরপর কি করতে পারেন।\n", "\n", "শুরুতেই ডেটা প্রি-প্রসেসিং। আর, একটা ছোট্ট ডাটাসেট। অ্যাক্যুরেসি ইম্পর্ট্যান্ট কিছু নয়, শুরুতে ফ্রেমওয়ার্কটা বুঝেলেই হবে।" ] }, { "cell_type": "code", "metadata": { "id": "HdpW5GsyquyK", "colab_type": "code", "outputId": "221f8ec1-7b40-48cb-e12a-482e3b71fd3f", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "try:\n", " # শুধুমাত্র টেন্সর-ফ্লো ২.x ব্যবহার করবো \n", " %tensorflow_version 2.x\n", "except Exception:\n", " pass\n", "\n", "import tensorflow as tf\n", "keras = tf.keras" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "TensorFlow 2.x selected.\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "5a8NwbxoqbYi", "colab_type": "code", "colab": {} }, "source": [ "# বাড়তি ওয়ার্নিং ফেলে দিচ্ছি, আপনাদের কাজের সময় লাগবে না \n", "import warnings\n", "warnings.filterwarnings(\"ignore\")" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "b_uejXCRh2NC", "colab_type": "text" }, "source": [ "# ডেটা প্রি-প্রসেসিং" ] }, { "cell_type": "code", "metadata": { "id": "jeun9eX-hwxc", "colab_type": "code", "colab": {} }, "source": [ "# আমরা কিছু লাইব্রেরি যোগ করে নিচ্ছি \n", "import gensim, re\n", "import numpy as np\n", "import pandas as pd\n", "\n", "# একটা ডেটা ডিকশনারি বানাই, আমাদের পছন্দ মতো বাক্য \n", "\n", "data = ['আমি মেশিন লার্নিং শিখতে পছন্দ করি',\n", " 'আমার বই পড়তে ভালো লাগে না',\n", " 'পাইথন শিখতে কষ্ট',\n", " 'এই বইটা বেশ ভালো লাগছে',\n", " 'আমার ন্যাচারাল ল্যাঙ্গুয়েজ প্রসেসিং পছন্দ']\n", "\n", "labels = ['positive', 'negative', 'negative', 'positive', 'positive']\n", "\n", "# আমাদের ডেটাকে কিছুটা প্রি-প্রসেস করি, বাংলা ইউনিকোড রেঞ্জের বাইরে সবকিছু ফেলে দিচ্ছি \n", "\n", "text = [re.sub(r'[^\\u0980-\\u09FF ]+', '', sentence) for sentence in data]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "jGjtt-73SFL2", "colab_type": "code", "outputId": "7a70b28b-3d55-4f47-cfd0-66be64dd397f", "colab": { "base_uri": "https://localhost:8080/", "height": 105 } }, "source": [ "# দেখি সে কি দেখায়?\n", "text" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['আমি মেশিন লার্নিং শিখতে পছন্দ করি',\n", " 'আমার বই পড়তে ভালো লাগে না',\n", " 'পাইথন শিখতে কষ্ট',\n", " 'এই বইটা বেশ ভালো লাগছে',\n", " 'আমার ন্যাচারাল ল্যাঙ্গুয়েজ প্রসেসিং পছন্দ']" ] }, "metadata": { "tags": [] }, "execution_count": 3 } ] }, { "cell_type": "markdown", "metadata": { "id": "nKMotPUziPWW", "colab_type": "text" }, "source": [ "# টোকেনাইজার" ] }, { "cell_type": "code", "metadata": { "id": "wIxMgUi_iR0Q", "colab_type": "code", "colab": {} }, "source": [ "# আরো কিছু লাইব্রেরি যোগ করি \n", "from sklearn.model_selection import train_test_split\n", "from tensorflow.keras.preprocessing.text import Tokenizer\n", "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", "\n", "# আমাদের টোকেনাইজার কতগুলো ফিচার এক্সট্র্যাক্ট করবে?\n", "features = 500\n", "tokenizer = Tokenizer(num_words = features)\n", "\n", "# আমাদের টোকেনাইজারকে পুরো টেক্সটে ফিট করতে হবে \n", "tokenizer.fit_on_texts(text)\n", "\n", "# আমাদের টোকেনাইজার চেনে সেরকম শব্দ নিয়ে আসতে হবে \n", "word_index = tokenizer.word_index\n", "\n", "# ম্যাট্রিক্স এর মধ্যে টোকেনকে ফেলি \n", "X = tokenizer.texts_to_sequences(text)\n", "X = pad_sequences(X)\n", "\n", "# লেবেল তৈরি করি \n", "y = np.asarray(pd.get_dummies(labels))" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "mb8G1_fv0yri", "colab_type": "code", "outputId": "6d6dec7c-39f5-48f9-c420-3c1810d1a3b4", "colab": { "base_uri": "https://localhost:8080/", "height": 197 } }, "source": [ "# লেবেল দেখি কি আছে ভেতরে?\n", "\n", "pd.get_dummies(labels)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", " | negative | \n", "positive | \n", "
---|---|---|
0 | \n", "0 | \n", "1 | \n", "
1 | \n", "1 | \n", "0 | \n", "
2 | \n", "1 | \n", "0 | \n", "
3 | \n", "0 | \n", "1 | \n", "
4 | \n", "0 | \n", "1 | \n", "