একটি মন্তব্য স্প্যাম মেশিন লার্নিং মডেল তৈরি করুন

১. শুরু করার আগে

এই কোডল্যাবে, আপনি কমেন্ট স্প্যামের উপর ভিত্তি করে একটি ডেটাসেট ব্যবহার করে মডেল তৈরির জন্য TensorFlow এবং TensorFlow Lite Model Maker দিয়ে বানানো কোড পর্যালোচনা করবেন। মূল ডেটাটি ক্যাগল-এ পাওয়া যাবে। এটিকে একটিমাত্র CSV ফাইলে সংগ্রহ করা হয়েছে এবং ভাঙা টেক্সট, মার্কআপ, পুনরাবৃত্ত শব্দ ও আরও অনেক কিছু সরিয়ে পরিচ্ছন্ন করা হয়েছে। এর ফলে টেক্সটের পরিবর্তে মডেলের উপর মনোযোগ দেওয়া সহজ হবে।

আপনি যে কোডটি পর্যালোচনা করবেন তা এখানে সরবরাহ করা হয়েছে, তবে গুগল কোলাবে কোডটি অনুসরণ করার জন্য বিশেষভাবে পরামর্শ দেওয়া হচ্ছে।

পূর্বশর্ত

  • এই কোডল্যাবটি এমন অভিজ্ঞ ডেভেলপারদের জন্য লেখা হয়েছে যারা মেশিন লার্নিং-এ নতুন।
  • এই কোডল্যাবটি 'মোবাইলের জন্য টেক্সট ক্লাসিফিকেশন দিয়ে শুরু করুন' পাথওয়ের একটি অংশ। আপনি যদি এখনও পূর্ববর্তী কার্যক্রমগুলো সম্পন্ন না করে থাকেন, তবে অনুগ্রহ করে থেমে যান এবং এখনই তা করুন।

আপনি যা শিখবেন

  • গুগল কোলাব ব্যবহার করে কীভাবে টেনসরফ্লো লাইট মডেল মেকার ইনস্টল করবেন
  • ক্লাউড সার্ভার থেকে আপনার ডিভাইসে ডেটা কীভাবে ডাউনলোড করবেন
  • ডেটা লোডার কীভাবে ব্যবহার করবেন
  • মডেলটি কীভাবে তৈরি করবেন

আপনার যা যা লাগবে

২. TensorFlow Lite Model Maker ইনস্টল করুন

কোলাবটি খুলুন। নোটবুকের প্রথম সেলটি আপনার জন্য TensorFlow Lite Model Maker ইনস্টল করে দেবে:

!pip install -q tflite-model-maker

এটি সম্পন্ন হয়ে গেলে, পরবর্তী কক্ষে যান।

৩. কোডটি ইম্পোর্ট করুন

পরবর্তী সেলে এমন কিছু ইম্পোর্ট রয়েছে যা নোটবুকের কোডটিতে ব্যবহার করতে হবে:

import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

এটি আরও যাচাই করবে যে আপনি TensorFlow 2.x ব্যবহার করছেন কিনা, যা Model Maker ব্যবহার করার জন্য একটি পূর্বশর্ত।

৪. ডেটা ডাউনলোড করুন

এরপর আপনি ক্লাউড সার্ভার থেকে আপনার ডিভাইসে ডেটা ডাউনলোড করবেন এবং data_file লোকাল ফাইলের দিকে নির্দেশ করার জন্য সেট করবেন:

data_file = tf.keras.utils.get_file(fname='comment-spam.csv', 
  origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv', 
  extract=False)

মডেল মেকার এই ধরনের সাধারণ CSV ফাইল থেকে মডেল প্রশিক্ষণ দিতে পারে। আপনাকে শুধু নির্দিষ্ট করে দিতে হবে কোন কলামে টেক্সট এবং কোন কলামে লেবেল থাকবে। কোডল্যাবের পরবর্তী অংশে আপনি দেখতে পাবেন কীভাবে তা করতে হয়।

৫. পূর্ব-শিক্ষিত এমবেডিং

সাধারণত, মডেল মেকার ব্যবহার করার সময় আপনি একেবারে গোড়া থেকে মডেল তৈরি করেন না। আপনি বিদ্যমান মডেল ব্যবহার করেন, যেগুলোকে আপনার প্রয়োজন অনুযায়ী সাজিয়ে নেন।

এই ধরনের ল্যাঙ্গুয়েজ মডেলের ক্ষেত্রে, এতে আগে থেকে শেখা এমবেডিং ব্যবহার করা হয়। এমবেডিংয়ের মূল ধারণাটি হলো, শব্দগুলোকে সংখ্যায় রূপান্তরিত করা হয় এবং আপনার সামগ্রিক কর্পাসের প্রতিটি শব্দকে একটি সংখ্যা দেওয়া হয়। এমবেডিং হলো একটি ভেক্টর, যা কোনো শব্দের জন্য একটি 'দিক' নির্ধারণ করে তার সেন্টিমেন্ট বা ভাবার্থ নির্ণয় করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, যে শব্দগুলো কমেন্ট স্প্যাম মেসেজে ঘন ঘন ব্যবহৃত হয়, সেগুলোর ভেক্টর একই দিকে নির্দেশ করবে এবং যে শব্দগুলো ব্যবহৃত হয় না, সেগুলোর ভেক্টর বিপরীত দিকে নির্দেশ করবে।

পূর্ব-শিক্ষিত এমবেডিং ব্যবহার করে, আপনি এমন একটি কর্পাস বা শব্দ সংগ্রহ দিয়ে কাজ শুরু করতে পারেন, যেগুলোর সেন্টিমেন্ট বা অনুভূতি ইতিমধ্যেই বিশাল কোনো টেক্সট থেকে শেখা হয়েছে। এটি আপনাকে একেবারে শূন্য থেকে শুরু করার চেয়ে অনেক দ্রুত সমাধানে পৌঁছে দেবে।

মডেল মেকার ব্যবহারের জন্য বেশ কিছু আগে থেকে শেখা এমবেডিং সরবরাহ করে, কিন্তু শুরু করার জন্য সবচেয়ে সহজ এবং দ্রুততম হলো average_word_vec

এই হলো কোডটি:

spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7

num_words প্যারামিটার

আপনার মডেলে আপনি কতগুলো শব্দ ব্যবহার করতে চান, তাও আপনাকে নির্দিষ্ট করে দিতে হবে।

আপনি হয়তো ভাবতে পারেন "যত বেশি তত ভালো," কিন্তু সাধারণত প্রতিটি শব্দ কতবার ব্যবহৃত হয়েছে তার উপর ভিত্তি করে একটি সঠিক সংখ্যা থাকে। আপনি যদি পুরো কর্পাসের প্রতিটি শব্দ ব্যবহার করেন, তাহলে এমন হতে পারে যে মডেলটি এমন শব্দগুলোর গতিপথ শিখতে ও প্রতিষ্ঠা করতে চেষ্টা করছে যেগুলো মাত্র একবার ব্যবহৃত হয়েছে। আপনি যেকোনো টেক্সট কর্পাসে দেখবেন যে অনেক শব্দ কেবল একবার বা দুবারই ব্যবহৃত হয়, এবং সাধারণত আপনার মডেলে সেগুলো ব্যবহার করার কোনো মানে হয় না, কারণ সামগ্রিক অনুভূতির উপর সেগুলোর প্রভাব নগণ্য। আপনি num_words প্যারামিটারটি ব্যবহার করে আপনার মডেলকে আপনার কাঙ্ক্ষিত শব্দসংখ্যার উপর ভিত্তি করে টিউন করতে পারেন।

এখানে সংখ্যা কম হলে মডেলটি ছোট ও দ্রুত হতে পারে, কিন্তু এটি কম নির্ভুল হতে পারে, কারণ এটি কম শব্দ শনাক্ত করে। এখানে সংখ্যা বেশি হলে মডেলটি বড় ও ধীরগতির হবে। সঠিক ভারসাম্য খুঁজে বের করাই মূল বিষয়!

wordvec_dim প্যারামিটার

wordved_dim প্যারামিটারটি হলো প্রতিটি শব্দের জন্য ভেক্টরে আপনি যে সংখ্যক ডাইমেনশন ব্যবহার করতে চান, তা নির্দেশ করে। গবেষণা থেকে প্রাপ্ত সাধারণ নিয়মটি হলো, এটি শব্দসংখ্যার চতুর্থ মূল। উদাহরণস্বরূপ, আপনি যদি ২০০০টি শব্দ ব্যবহার করেন, তবে ৭ একটি ভালো সূচনা বিন্দু হতে পারে। আপনি যদি ব্যবহৃত শব্দসংখ্যা পরিবর্তন করেন, তবে এটিও পরিবর্তন করতে পারবেন।

seq_len প্যারামিটার

ইনপুট মানের ক্ষেত্রে মডেলগুলো সাধারণত খুবই অনমনীয় হয়। একটি ল্যাঙ্গুয়েজ মডেলের জন্য এর অর্থ হলো, মডেলটি একটি নির্দিষ্ট, স্থির দৈর্ঘ্যের বাক্যগুলোকে শ্রেণিবদ্ধ করতে পারে। এটি seq_len প্যারামিটার বা সিকোয়েন্স লেংথ দ্বারা নির্ধারিত হয়।

যখন আপনি শব্দকে সংখ্যায় (বা টোকেনে) রূপান্তর করেন, তখন একটি বাক্য এই টোকেনগুলোর একটি অনুক্রমে পরিণত হয়। তাই আপনার মডেলকে (এই ক্ষেত্রে) ২০টি টোকেনযুক্ত বাক্য শ্রেণীবদ্ধ ও শনাক্ত করার জন্য প্রশিক্ষণ দেওয়া হবে। বাক্যটি এর চেয়ে দীর্ঘ হলে, তা ছেঁটে ফেলা হবে। এর চেয়ে ছোট হলে, বাক্যটিতে অতিরিক্ত অংশ যোগ করা হবে। কর্পাসে আপনি একটি নির্দিষ্ট <PAD> টোকেন দেখতে পাবেন, যা এই কাজের জন্য ব্যবহৃত হবে।

৬. একটি ডেটা লোডার ব্যবহার করুন

কিছুক্ষণ আগে আপনি CSV ফাইলটি ডাউনলোড করেছেন। এখন একটি ডেটা লোডার ব্যবহার করে এটিকে এমন ট্রেনিং ডেটাতে পরিণত করার সময় এসেছে যা মডেলটি চিনতে পারবে:

data = DataLoader.from_csv(
    filename=data_file,
    text_column='commenttext',
    label_column='spam',
    model_spec=spec,
    delimiter=',',
    shuffle=True,
    is_training=True)

train_data, test_data = data.split(0.9)

আপনি যদি CSV ফাইলটি কোনো এডিটরে খোলেন, তাহলে দেখতে পাবেন যে প্রতিটি লাইনে মাত্র দুটি মান রয়েছে এবং ফাইলের প্রথম লাইনে টেক্সটের মাধ্যমে এগুলোর বর্ণনা দেওয়া আছে। সাধারণত, এরপর প্রতিটি এন্ট্রিকে একটি কলাম হিসেবে গণ্য করা হয়।

আপনি দেখতে পাবেন যে প্রথম কলামের বর্ণনাকারী হলো commenttext , এবং প্রতিটি লাইনের প্রথম এন্ট্রিটি হলো কমেন্টের টেক্সট। একইভাবে, দ্বিতীয় কলামের বর্ণনাকারী হলো spam , এবং আপনি দেখতে পাবেন যে প্রতিটি লাইনের দ্বিতীয় এন্ট্রিটি হলো True বা False, যা নির্দেশ করে যে ওই টেক্সটটি কমেন্ট স্প্যাম হিসেবে বিবেচিত হবে কি না। অন্যান্য প্রোপার্টিগুলো আপনার পূর্বে তৈরি করা model_spec সেট করে, সাথে একটি ডিলিমিটার ক্যারেক্টারও থাকে, যা এই ক্ষেত্রে একটি কমা, কারণ ফাইলটি কমা দ্বারা বিভক্ত। আপনি এই ডেটা মডেলটিকে প্রশিক্ষণ দেওয়ার জন্য ব্যবহার করবেন, তাই is_Training ' True সেট করা হয়েছে।

মডেলটি পরীক্ষা করার জন্য আপনাকে ডেটার একটি অংশ আলাদা করে রাখতে হবে। ডেটাটিকে ভাগ করুন, যার ৯০% প্রশিক্ষণের জন্য এবং বাকি ১০% পরীক্ষা/মূল্যায়নের জন্য থাকবে। যেহেতু আমরা এটি করছি, তাই আমাদের নিশ্চিত করতে হবে যে পরীক্ষার ডেটা যেন এলোমেলোভাবে নির্বাচিত হয় এবং ডেটাসেটের 'সর্বনিম্ন' ১০% না হয়। এজন্য ডেটা লোড করার সময় এটিকে এলোমেলো করতে shuffle=True ব্যবহার করতে হবে।

৭. মডেলটি তৈরি করুন

পরবর্তী সেলটিতে শুধু মডেলটি তৈরি করতে হবে, এবং এটি মাত্র এক লাইনের কোড:

# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50, 
                               validation_data=test_data)

এটি মডেল মেকার ব্যবহার করে একটি টেক্সট ক্লাসিফায়ার মডেল তৈরি করে, এবং এতে আপনি যে ট্রেনিং ডেটা ব্যবহার করতে চান (ধাপ ৪-এ সেট আপ করা অনুযায়ী), মডেলের স্পেসিফিকেশন (ধাপ ৪-এ সেট আপ করা অনুযায়ী), এবং ইপোকের সংখ্যা, এই ক্ষেত্রে ৫০, নির্দিষ্ট করে দেন।

মেশিন লার্নিং-এর মূল নীতি হলো এটি এক ধরনের প্যাটার্ন মেলানোর প্রক্রিয়া। প্রাথমিকভাবে, এটি শব্দগুলোর জন্য আগে থেকে প্রশিক্ষিত ওয়েটগুলো লোড করে এবং সেগুলোকে একসাথে দলবদ্ধ করার চেষ্টা করে। এর মাধ্যমে ভবিষ্যদ্বাণী করা হয় যে, দলবদ্ধ অবস্থায় কোন শব্দগুলো স্প্যাম নির্দেশ করে এবং কোনগুলো করে না। প্রথমবার এই অনুপাতটি প্রায় ৫০:৫০ হওয়ার সম্ভাবনা থাকে, কারণ মডেলটি তখন সবেমাত্র কাজ শুরু করে।

b94b00f0b155db3d.png

এরপর এটি এর ফলাফল পরিমাপ করবে, এবং এর পূর্বাভাসকে সূক্ষ্মভাবে পরিমার্জন করার জন্য অপটিমাইজেশন কোড চালাবে, তারপর আবার চেষ্টা করবে। এটাই একটি ইপক। সুতরাং, epochs=50 উল্লেখ করলে, এটি সেই "লুপ"টি ৫০ বার চালাবে।

85f1d21c0b64d654.png

যখন আপনি ৫০তম ইপকে পৌঁছাবেন, মডেলটি আরও অনেক উচ্চ স্তরের নির্ভুলতা দেখাবে। এক্ষেত্রে এটি ৯৯% দেখাচ্ছে!

ডানদিকে, আপনি ভ্যালিডেশন অ্যাক্যুরেসির পরিসংখ্যান দেখতে পাবেন। এগুলি সাধারণত ট্রেনিং অ্যাক্যুরেসির চেয়ে কিছুটা কম হবে, কারণ এগুলি নির্দেশ করে যে মডেলটি পূর্বে 'না দেখা' ডেটাকে কীভাবে শ্রেণীবদ্ধ করে। এটি আমাদের পূর্বে আলাদা করে রাখা ১০% টেস্ট ডেটা ব্যবহার করে।

5be7967ec70e4302.png

৮. মডেলটি রপ্তানি করুন

আপনার প্রশিক্ষণ সম্পন্ন হয়ে গেলে, আপনি মডেলটি এক্সপোর্ট করতে পারবেন।

TensorFlow তার নিজস্ব ফরম্যাটে একটি মডেলকে প্রশিক্ষণ দেয়, এবং মোবাইল অ্যাপে ব্যবহারের জন্য এটিকে TFLITE ফরম্যাটে রূপান্তর করতে হয়। Model Maker আপনার জন্য এই জটিলতাটি সামলে নেয়।

কেবলমাত্র একটি ডিরেক্টরি নির্দিষ্ট করে মডেলটি এক্সপোর্ট করুন:

model.export(export_dir='/mm_spam')

ওই ডিরেক্টরির ভেতরে আপনি একটি model.tflite ফাইল দেখতে পাবেন। এটি ডাউনলোড করুন। পরবর্তী কোডল্যাবে আপনার এটি প্রয়োজন হবে, যেখানে আপনি এটি আপনার অ্যান্ড্রয়েড অ্যাপে যুক্ত করবেন!

iOS বিবেচনা

আপনি এইমাত্র যে .tflite মডেলটি এক্সপোর্ট করেছেন, তা অ্যান্ড্রয়েডের জন্য ভালোভাবে কাজ করে, কারণ মডেলটির মেটাডেটা এর ভেতরেই এমবেড করা থাকে এবং অ্যান্ড্রয়েড স্টুডিও সেই মেটাডেটা পড়তে পারে।

এই মেটাডেটা খুবই গুরুত্বপূর্ণ, কারণ এতে মডেলের শনাক্ত করা শব্দগুলোকে প্রতিনিধিত্বকারী টোকেনের একটি ডিকশনারি থাকে। আপনার কি মনে আছে, আগে শিখেছিলেন যে শব্দগুলো টোকেনে পরিণত হয় এবং এই টোকেনগুলোকে তাদের সেন্টিমেন্টের জন্য ভেক্টর দেওয়া হয়? আপনার মোবাইল অ্যাপের এই টোকেনগুলো জানার প্রয়োজন হবে। উদাহরণস্বরূপ, যদি "dog" শব্দটিকে 42-এ টোকেনাইজ করা হয় এবং আপনার ব্যবহারকারীরা কোনো বাক্যে "dog" টাইপ করেন, তাহলে মডেলের বোঝার জন্য আপনার অ্যাপকে "dog"-কে 42-এ রূপান্তর করতে হবে। একজন অ্যান্ড্রয়েড ডেভেলপার হিসেবে, আপনার কাছে একটি 'TensorFlow Lite Task Library' থাকবে যা এটি ব্যবহার করা সহজ করে তোলে, কিন্তু iOS-এ আপনাকে ভোকাবুলারি প্রসেস করতে হবে, তাই এটি আপনার কাছে উপলব্ধ থাকা প্রয়োজন। Model Maker, export_format প্যারামিটারটি নির্দিষ্ট করে আপনার জন্য এটি এক্সপোর্ট করতে পারে। সুতরাং, আপনার মডেলের জন্য লেবেল এবং ভোকাব পেতে, আপনি এটি ব্যবহার করতে পারেন:

model.export(export_dir='/mm_spam/', 
             export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])

৯. অভিনন্দন

এই কোডল্যাবটিতে আপনার মডেল তৈরি এবং এক্সপোর্ট করার জন্য পাইথন কোড দেখানো হয়েছে। এটি শেষে আপনি একটি .tflite ফাইল পাবেন।

পরবর্তী কোডল্যাবে আপনি দেখতে পাবেন, কীভাবে এই মডেলটি ব্যবহার করার জন্য আপনার অ্যান্ড্রয়েড অ্যাপটি সম্পাদনা করতে হয়, যাতে আপনি স্প্যাম মন্তব্য শ্রেণীবদ্ধ করা শুরু করতে পারেন।