স্প্যাম ফিল্টারিং মেশিন লার্নিং মডেল ব্যবহার করতে আপনার অ্যাপ আপডেট করুন

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

এই কোডল্যাবে, আপনি আগের কোডল্যাবে তৈরি করা অ্যাপটি আপডেট করবেন। মোবাইল টেক্সট ক্লাসিফিকেশন কোডল্যাব দিয়ে শুরু করুন।

পূর্বশর্ত

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

তুমি কি [নির্মাণ বা শিখবে]

  • আপনি শিখবেন কিভাবে আপনার কাস্টম মডেলটিকে আপনার অ্যাপে একীভূত করতে হয়, যা পূর্ববর্তী ধাপগুলিতে তৈরি করা হয়েছে।

তোমার যা লাগবে

  • অ্যান্ড্রয়েড স্টুডিও, অথবা iOS এর জন্য কোকোপডস

2. বিদ্যমান অ্যান্ড্রয়েড অ্যাপটি খুলুন

আপনি কোডল্যাব ১ অনুসরণ করে, অথবা এই রেপো ক্লোন করে এবং TextClassificationStep1 থেকে অ্যাপটি লোড করে এর জন্য কোড পেতে পারেন।

git clone https://github.com/googlecodelabs/odml-pathways

আপনি এটি TextClassificationOnMobile->Android পাথে খুঁজে পেতে পারেন।

সমাপ্ত কোডটি আপনার জন্য TextClassificationStep2 হিসাবেও উপলব্ধ।

একবার এটি খোলা হয়ে গেলে, আপনি ধাপ ২ এ যেতে প্রস্তুত।

৩. মডেল ফাইল এবং মেটাডেটা আমদানি করুন

"বিল্ড এ কমেন্ট স্প্যাম মেশিন লার্নিং মডেল কোডল্যাব"-এ, আপনি একটি .TFLITE মডেল তৈরি করেছেন।

তোমার মডেল ফাইলটি ডাউনলোড করা উচিত ছিল। যদি তোমার কাছে এটি না থাকে, তাহলে তুমি এই কোডল্যাবের রেপো থেকে এটি পেতে পারো, এবং মডেলটি এখানে পাওয়া যাচ্ছে।

একটি সম্পদ ডিরেক্টরি তৈরি করে এটি আপনার প্রকল্পে যুক্ত করুন।

  1. প্রজেক্ট নেভিগেটর ব্যবহার করে, নিশ্চিত করুন যে উপরে Android নির্বাচন করা আছে।
  2. অ্যাপ ফোল্ডারে ডান-ক্লিক করুন। নতুন > ডিরেক্টরি নির্বাচন করুন।

d7c3e9f21035fc15.png সম্পর্কে

  1. নতুন ডিরেক্টরি ডায়ালগে, src/main/assets নির্বাচন করুন।

2137f956a1ba4ef0.png সম্পর্কে

আপনি দেখতে পাবেন যে অ্যাপটিতে এখন একটি নতুন সম্পদ ফোল্ডার উপলব্ধ।

ae858835e1a90445.png সম্পর্কে

  1. সম্পদগুলিতে ডান ক্লিক করুন।
  2. যে মেনুটি খুলবে, তাতে আপনি (ম্যাকের ক্ষেত্রে) Finder-এ Reveal দেখতে পাবেন। এটি নির্বাচন করুন। (উইন্ডোজে এটি Explorer-এ Show লেখা থাকবে, উবুন্টুতে এটি Files-এ Show লেখা থাকবে।)

e61aaa3b73c5ab68.png সম্পর্কে

ফাইলের অবস্থান দেখানোর জন্য ফাইন্ডার চালু হবে (উইন্ডোজে ফাইল এক্সপ্লোরার , লিনাক্সে ফাইল )।

  1. এই ডিরেক্টরিতে labels.txt , model.tflite এবং vocab ফাইলগুলি কপি করুন।

14f382cc19552a56.png সম্পর্কে

  1. অ্যান্ড্রয়েড স্টুডিওতে ফিরে যান, এবং আপনি আপনার সম্পদ ফোল্ডারে সেগুলি উপলব্ধ দেখতে পাবেন।

150ed2a1d2f7a10d.png সম্পর্কে

৪. TensorFlow Lite ব্যবহার করার জন্য আপনার build.gradle আপডেট করুন।

TensorFlow Lite এবং এটি সমর্থনকারী TensorFlow Lite টাস্ক লাইব্রেরিগুলি ব্যবহার করতে, আপনাকে আপনার build.gradle ফাইলটি আপডেট করতে হবে।

অ্যান্ড্রয়েড প্রোজেক্টগুলিতে প্রায়ই একাধিক থাকে, তাই অ্যাপ লেভেল ওয়ান খুঁজে বের করতে ভুলবেন না। অ্যান্ড্রয়েড ভিউতে প্রোজেক্ট এক্সপ্লোরারে, আপনার গ্র্যাডল স্ক্রিপ্টস বিভাগে এটি খুঁজুন। এখানে দেখানো সঠিক প্রোজেক্টটি .app দিয়ে লেবেল করা হবে:

6426051e614bc42f.png সম্পর্কে

এই ফাইলটিতে আপনাকে দুটি পরিবর্তন করতে হবে। প্রথমটি নীচের দিকে নির্ভরতা বিভাগে। TensorFlow Lite টাস্ক লাইব্রেরির জন্য একটি টেক্সট implementation যোগ করুন, যেমন:

implementation 'org.tensorflow:tensorflow-lite-task-text:0.1.0'

এটি লেখার পর থেকে সংস্করণ নম্বরটি পরিবর্তিত হতে পারে, তাই সর্বশেষ তথ্যের জন্য https://www.tensorflow.org/lite/inference_with_metadata/task_library/nl_classifier দেখতে ভুলবেন না।

টাস্ক লাইব্রেরিগুলির জন্য ন্যূনতম 21 SDK সংস্করণ প্রয়োজন। android > default config এ এই সেটিংটি খুঁজুন এবং এটি 21 এ পরিবর্তন করুন:

c100b68450b8812f.png সম্পর্কে

এখন তোমার সব নির্ভরতা শেষ, তাই কোডিং শুরু করার সময় এসেছে!

৫. একটি হেল্পার ক্লাস যোগ করুন

আপনার অ্যাপ যেখানে মডেল ব্যবহার করে, সেখানে ইনফারেন্স লজিককে ইউজার ইন্টারফেস থেকে আলাদা করতে, মডেল ইনফারেন্স পরিচালনা করার জন্য আরেকটি ক্লাস তৈরি করুন। এটিকে "সহায়ক" ক্লাস বলুন।

  1. আপনার MainActivity কোডটি যে প্যাকেজের নামে আছে তার উপর ডান ক্লিক করুন।
  2. নতুন > প্যাকেজ নির্বাচন করুন।

d5911ded56b5df35.png

  1. স্ক্রিনের মাঝখানে আপনি একটি ডায়ালগ দেখতে পাবেন যেখানে আপনাকে প্যাকেজের নাম লিখতে বলা হবে। বর্তমান প্যাকেজের নামের শেষে এটি যোগ করুন। (এখানে, এটিকে helpers বলা হয়।)

3b9f1f822f99b371.png সম্পর্কে

  1. এটি হয়ে গেলে, প্রজেক্ট এক্সপ্লোরারের হেল্পার্স ফোল্ডারে ডান ক্লিক করুন।
  2. New > Java Class নির্বাচন করুন এবং এটিকে TextClassificationClient বলুন। পরবর্তী ধাপে আপনি ফাইলটি সম্পাদনা করবেন।

তোমার TextClassificationClient হেল্পার ক্লাসটি দেখতে এরকম হবে (যদিও তোমার প্যাকেজের নাম ভিন্ন হতে পারে।)

package com.google.devrel.textclassificationstep1.helpers;

public class TextClassificationClient {
}
  1. এই কোডটি দিয়ে ফাইলটি আপডেট করুন:
package com.google.devrel.textclassificationstep2.helpers;

import android.content.Context;
import android.util.Log;
import java.io.IOException;
import java.util.List;

import org.tensorflow.lite.support.label.Category;
import org.tensorflow.lite.task.text.nlclassifier.NLClassifier;

public class TextClassificationClient {
    private static final String MODEL_PATH = "model.tflite";
    private static final String TAG = "CommentSpam";
    private final Context context;

    NLClassifier classifier;

    public TextClassificationClient(Context context) {
        this.context = context;
    }

    public void load() {
        try {
            classifier = NLClassifier.createFromFile(context, MODEL_PATH);
        } catch (IOException e) {
            Log.e(TAG, e.getMessage());
        }
    }

    public void unload() {
        classifier.close();
        classifier = null;
    }

    public List<Category> classify(String text) {
        List<Category> apiResults = classifier.classify(text);
        return apiResults;
    }

}

এই ক্লাসটি টেনসরফ্লো লাইট ইন্টারপ্রেটারকে একটি র‍্যাপার প্রদান করবে, মডেলটি লোড করবে এবং আপনার অ্যাপ এবং মডেলের মধ্যে ডেটা আদান-প্রদান পরিচালনার জটিলতা তুলে ধরবে।

load() পদ্ধতিতে, এটি মডেল পাথ থেকে একটি নতুন NLClassifier টাইপ তৈরি করবে। মডেল পাথটি কেবল মডেলের নাম, model.tfliteNLClassifier টাইপটি টেক্সট টাস্ক লাইব্রেরির অংশ, এবং এটি আপনার স্ট্রিংকে টোকেনে রূপান্তর করে, সঠিক সিকোয়েন্স দৈর্ঘ্য ব্যবহার করে, মডেলে পাস করে এবং ফলাফল বিশ্লেষণ করে আপনাকে সাহায্য করে।

(এগুলি সম্পর্কে আরও তথ্যের জন্য, "বিল্ড এ কমেন্ট স্প্যাম মেশিন লার্নিং মডেল" আবার দেখুন।)

শ্রেণীবিভাগটি classify পদ্ধতিতে করা হয়, যেখানে আপনি এটিকে একটি স্ট্রিং পাস করেন এবং এটি একটি List ফেরত পাঠায়। মেশিন লার্নিং মডেল ব্যবহার করে কন্টেন্ট শ্রেণীবদ্ধ করার সময় যেখানে আপনি নির্ধারণ করতে চান যে একটি স্ট্রিং স্প্যাম কিনা, নির্ধারিত সম্ভাব্যতা সহ সমস্ত উত্তর ফেরত দেওয়া সাধারণ। উদাহরণস্বরূপ, যদি আপনি এটিকে স্প্যামের মতো দেখতে একটি বার্তা পাঠান, তাহলে আপনি 2টি উত্তরের একটি তালিকা পাবেন; একটিতে স্প্যাম হওয়ার সম্ভাবনা থাকবে এবং অন্যটিতে স্প্যাম না হওয়ার সম্ভাবনা থাকবে। স্প্যাম/নট স্প্যাম হল বিভাগ, তাই ফেরত দেওয়া List এই সম্ভাব্যতা থাকবে। আপনি পরে এটি বিশ্লেষণ করবেন।

এখন যেহেতু আপনার কাছে হেল্পার ক্লাস আছে, আপনার MainActivity এ ফিরে যান এবং এটি আপডেট করে আপনার লেখাকে শ্রেণীবদ্ধ করুন। আপনি পরবর্তী ধাপে এটি দেখতে পাবেন!

৬. পাঠ্য শ্রেণীবদ্ধ করুন

আপনার MainActivity তে আপনাকে প্রথমে আপনার তৈরি করা হেল্পারগুলি আমদানি করতে হবে!

  1. MainActivity.kt এর উপরে, অন্যান্য আমদানির সাথে, যোগ করুন:
import com.google.devrel.textclassificationstep2.helpers.TextClassificationClient
import org.tensorflow.lite.support.label.Category
  1. এরপর, আপনাকে হেল্পারগুলি লোড করতে হবে। onCreate এ, setContentView লাইনের ঠিক পরে, হেল্পার ক্লাসটি ইনস্ট্যান্টিয়েট এবং লোড করতে এই লাইনগুলি যোগ করুন:
val client = TextClassificationClient(applicationContext)
client.load()

এই মুহূর্তে, আপনার onClickListener বোতামটি এইরকম দেখাবে:

btnSendText.setOnClickListener {
     var toSend:String = txtInput.text.toString()
     txtOutput.text = toSend
 }
  1. এটিকে এইরকম দেখতে আপডেট করুন:
btnSendText.setOnClickListener {
    var toSend:String = txtInput.text.toString()
    var results:List<Category> = client.classify(toSend)
    val score = results[1].score
    if(score>0.8){
        txtOutput.text = "Your message was detected as spam with a score of " + score.toString() + " and not sent!"
    } else {
        txtOutput.text = "Message sent! \nSpam score was:" + score.toString()
    }
    txtInput.text.clear()
}

এটি ব্যবহারকারীর ইনপুট আউটপুট করা থেকে শুরু করে প্রথমে শ্রেণীবদ্ধ করার কার্যকারিতা পরিবর্তন করে।

  1. এই লাইনের সাহায্যে, আপনি ব্যবহারকারীর প্রবেশ করানো স্ট্রিংটি মডেলে পাঠাবেন, ফলাফলগুলি ফিরে পাবেন:
var results:List<Category> = client.classify(toSend)

এখানে মাত্র দুটি বিভাগ আছে, False এবং True

. (TensorFlow এগুলোকে বর্ণানুক্রমিকভাবে সাজায়, তাই False হবে আইটেম 0, এবং True হবে আইটেম 1।)

  1. মানটি True হওয়ার সম্ভাবনার স্কোর পেতে, আপনি results[1].score এভাবে দেখতে পারেন:
    val score = results[1].score
  1. একটি থ্রেশহোল্ড মান বেছে নেওয়া হয়েছে (এই ক্ষেত্রে 0.8), যেখানে আপনি বলবেন যে যদি True বিভাগের স্কোর থ্রেশহোল্ড মান (0.8) এর উপরে হয়, তাহলে বার্তাটি স্প্যাম। অন্যথায়, এটি স্প্যাম নয় এবং বার্তাটি পাঠানো নিরাপদ:
    if(score>0.8){
        txtOutput.text = "Your message was detected as spam with a score of " + score.toString() + " and not sent!"
    } else {
        txtOutput.text = "Message sent! \nSpam score was:" + score.toString()
    }
  1. এখানে মডেলটির কার্যক্ষমতা দেখুন। "আমার ব্লগে যান জিনিস কিনতে!" বার্তাটি স্প্যামের উচ্চ সম্ভাবনা হিসাবে চিহ্নিত করা হয়েছিল:

1fb0b5de9e566e.png সম্পর্কে

এবং বিপরীতভাবে, "আরে, মজার টিউটোরিয়াল, ধন্যবাদ!" স্প্যাম হওয়ার সম্ভাবনা খুব কম বলে মনে করা হয়েছিল:

73f38bdb488b29b3.png সম্পর্কে

৭. টেনসরফ্লো লাইট মডেল ব্যবহার করার জন্য আপনার iOS অ্যাপ আপডেট করুন।

আপনি কোডল্যাব ১ অনুসরণ করে, অথবা এই রেপো ক্লোন করে এবং TextClassificationStep1 থেকে অ্যাপটি লোড করে এর জন্য কোড পেতে পারেন। আপনি এটি TextClassificationOnMobile->iOS পাথে খুঁজে পেতে পারেন।

সমাপ্ত কোডটি আপনার জন্য TextClassificationStep2 হিসাবেও উপলব্ধ।

"বিল্ড এ কমেন্ট স্প্যাম মেশিন লার্নিং মডেল কোডল্যাব"-এ, আপনি একটি খুব সহজ অ্যাপ তৈরি করেছেন যা ব্যবহারকারীকে UITextView এ একটি বার্তা টাইপ করতে এবং কোনও ফিল্টারিং ছাড়াই এটি একটি আউটপুটে প্রেরণ করতে দেয়।

এখন আপনি সেই অ্যাপটি আপডেট করবেন যাতে পাঠানোর আগে টেক্সটে মন্তব্য স্প্যাম সনাক্ত করার জন্য একটি TensorFlow Lite মডেল ব্যবহার করা যায়। শুধু একটি আউটপুট লেবেলে টেক্সট রেন্ডার করে এই অ্যাপে পাঠানোর অনুকরণ করুন (কিন্তু একটি আসল অ্যাপে একটি বুলেটিন বোর্ড, একটি চ্যাট, বা অনুরূপ কিছু থাকতে পারে)।

শুরু করার জন্য, আপনার ধাপ ১ থেকে অ্যাপটি প্রয়োজন হবে, যা আপনি রেপো থেকে ক্লোন করতে পারবেন।

TensorFlow Lite অন্তর্ভুক্ত করার জন্য, আপনি CocoaPods ব্যবহার করবেন। যদি আপনার কাছে ইতিমধ্যেই এগুলি ইনস্টল না থাকে, তাহলে আপনি https://cocoapods.org/ এ থাকা নির্দেশাবলী ব্যবহার করে এটি করতে পারেন।

  1. CocoaPods ইনস্টল হয়ে গেলে, TextClassification অ্যাপের জন্য .xcproject এর মতো একই ডিরেক্টরিতে Podfile নামে একটি ফাইল তৈরি করুন। এই ফাইলের বিষয়বস্তু দেখতে এরকম হওয়া উচিত:
target 'TextClassificationStep2' do
  use_frameworks!

  # Pods for NLPClassifier
    pod 'TensorFlowLiteSwift'

end

আপনার অ্যাপের নাম "TextClassificationStep2" এর পরিবর্তে প্রথম লাইনে থাকা উচিত।

টার্মিনাল ব্যবহার করে, সেই ডিরেক্টরিতে যান এবং pod install চালান। যদি এটি সফল হয়, তাহলে আপনার কাছে Pods নামে একটি নতুন ডিরেক্টরি থাকবে এবং আপনার জন্য একটি নতুন .xcworkspace ফাইল তৈরি হবে। আপনি ভবিষ্যতে .xcproject এর পরিবর্তে এটি ব্যবহার করবেন।

যদি এটি ব্যর্থ হয়, তাহলে দয়া করে নিশ্চিত করুন যে আপনার Podfile একই ডিরেক্টরিতে আছে যেখানে .xcproject ছিল। ভুল ডিরেক্টরিতে থাকা পডফাইল, অথবা ভুল টার্গেট নাম, সাধারণত প্রধান অপরাধী!

৮. মডেল এবং ভোকাব ফাইল যোগ করুন

যখন আপনি TensorFlow Lite Model maker দিয়ে মডেলটি তৈরি করেছিলেন, তখন আপনি মডেলটি ( model.tflite হিসাবে) এবং vocab ( vocab.txt হিসাবে) আউটপুট করতে সক্ষম হয়েছিলেন।

  1. ফাইন্ডার থেকে আপনার প্রজেক্ট উইন্ডোতে টেনে এনে রেখে আপনার প্রজেক্টে এগুলি যুক্ত করুন। লক্ষ্যমাত্রায় যোগ করুন চেক করা আছে কিনা তা নিশ্চিত করুন:

1ee9eaa00ee79859.png সম্পর্কে

আপনার কাজ শেষ হয়ে গেলে, আপনার প্রকল্পে এগুলি দেখতে পাবেন:

b63502b23911fd42.png সম্পর্কে

  1. আপনার প্রোজেক্টটি নির্বাচন করে (উপরের স্ক্রিনশটে, এটি নীল আইকন TextClassificationStep2 ) এবং Build Phases ট্যাবটি দেখে দুবার পরীক্ষা করুন যে সেগুলি বান্ডেলে যোগ করা হয়েছে (যাতে সেগুলি একটি ডিভাইসে স্থাপন করা হয়):

20b7cb603d49b457.png সম্পর্কে

৯. শব্দভাণ্ডার লোড করুন

NLP শ্রেণীবিভাগ করার সময়, মডেলটিকে ভেক্টরে এনকোড করা শব্দ দিয়ে প্রশিক্ষণ দেওয়া হয়। মডেলটি নির্দিষ্ট নাম এবং মান সহ শব্দগুলিকে এনকোড করে যা মডেল প্রশিক্ষণের সময় শেখা হয়। অনুগ্রহ করে মনে রাখবেন যে বেশিরভাগ মডেলের বিভিন্ন শব্দভাণ্ডার থাকবে এবং প্রশিক্ষণের সময় তৈরি হওয়া আপনার মডেলের জন্য ভোকাব ব্যবহার করা গুরুত্বপূর্ণ। এটি হল vocab.txt ফাইল যা আপনি আপনার অ্যাপে যোগ করেছেন।

এনকোডিং দেখতে আপনি Xcode-এ ফাইলটি খুলতে পারেন। "song" এর মতো শব্দগুলি 6 তে এবং "love" 12 তে এনকোড করা হয়। ক্রমটি আসলে ফ্রিকোয়েন্সি অর্ডার , তাই "I" ডেটাসেটে সবচেয়ে সাধারণ শব্দ ছিল, তারপরে "check"।

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

আসুন কোডটি অন্বেষণ করি। শব্দভাণ্ডার লোড করে শুরু করি।

  1. অভিধান সংরক্ষণের জন্য একটি ক্লাস লেভেল ভেরিয়েবল সংজ্ঞায়িত করুন:
var words_dictionary = [String : Int]()
  1. তারপর এই অভিধানে শব্দভাণ্ডার লোড করার জন্য ক্লাসে একটি func তৈরি করুন:
func loadVocab(){
    // This func will take the file at vocab.txt and load it into a has table
    // called words_dictionary. This will be used to tokenize the words before passing them
    // to the model trained by TensorFlow Lite Model Maker
    if let filePath = Bundle.main.path(forResource: "vocab", ofType: "txt") {
        do {
            let dictionary_contents = try String(contentsOfFile: filePath)
            let lines = dictionary_contents.split(whereSeparator: \.isNewline)
            for line in lines{
                let tokens = line.components(separatedBy: " ")
                let key = String(tokens[0])
                let value = Int(tokens[1])
                words_dictionary[key] = value
            }
        } catch {
            print("Error vocab could not be loaded")
        }
    } else {
        print("Error -- vocab file not found")

    }
}
  1. আপনি viewDidLoad মধ্যে থেকে এটি কল করে এটি চালাতে পারেন:
override func viewDidLoad() {
    super.viewDidLoad()
    txtInput.delegate = self
    loadVocab()
}

১০. একটি স্ট্রিংকে টোকেনের ক্রমানুসারে রূপান্তর করুন

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

একটি NLP মডেল সাধারণত একটি নির্দিষ্ট সিকোয়েন্স দৈর্ঘ্য গ্রহণ করে। ragged tensors ব্যবহার করে তৈরি মডেলগুলির ক্ষেত্রে ব্যতিক্রম রয়েছে, তবে বেশিরভাগ ক্ষেত্রেই আপনি এটি স্থির দেখতে পাবেন। আপনার মডেল তৈরি করার সময় আপনি এই দৈর্ঘ্যটি নির্দিষ্ট করেছিলেন। আপনার iOS অ্যাপে একই দৈর্ঘ্য ব্যবহার করতে ভুলবেন না।

আপনার আগে ব্যবহৃত TensorFlow Lite Model Maker-এর Colab-এ ডিফল্ট ছিল 20, তাই এখানেও এটি সেট আপ করুন:

let SEQUENCE_LENGTH = 20

এই func যোগ করুন যা স্ট্রিংটি নেবে, এটিকে ছোট হাতের অক্ষরে রূপান্তর করবে এবং যেকোনো বিরামচিহ্ন বাদ দেবে:

func convert_sentence(sentence: String) -> [Int32]{
// This func will split a sentence into individual words, while stripping punctuation
// If the word is present in the dictionary it's value from the dictionary will be added to
// the sequence. Otherwise we'll continue

// Initialize the sequence to be all 0s, and the length to be determined
// by the const SEQUENCE_LENGTH. This should be the same length as the
// sequences that the model was trained for
  var sequence = [Int32](repeating: 0, count: SEQUENCE_LENGTH)
  var words : [String] = []
  sentence.enumerateSubstrings(
    in: sentence.startIndex..<sentence.endIndex,options: .byWords) {
            (substring, _, _, _) -> () in words.append(substring!) }
  var thisWord = 0
  for word in words{
    if (thisWord>=SEQUENCE_LENGTH){
      break
    }
    let seekword = word.lowercased()
    if let val = words_dictionary[seekword]{
      sequence[thisWord]=Int32(val)
      thisWord = thisWord + 1
    }
  }
  return sequence
}

মনে রাখবেন যে সিকোয়েন্সটি Int32 এর হবে। এটি ইচ্ছাকৃতভাবে বেছে নেওয়া হয়েছে কারণ যখন TensorFlow Lite-এ মান পাস করার কথা আসে, তখন আপনি নিম্ন-স্তরের মেমোরি নিয়ে কাজ করবেন এবং TensorFlow Lite একটি স্ট্রিং সিকোয়েন্সের পূর্ণসংখ্যাগুলিকে 32-বিট পূর্ণসংখ্যা হিসাবে বিবেচনা করে। এটি মডেলে স্ট্রিং পাস করার সময় আপনার জীবনকে (কিছুটা) সহজ করে তুলবে।

১১. শ্রেণীবিভাগ করুন

একটি বাক্যকে শ্রেণীবদ্ধ করার জন্য, প্রথমে বাক্যের শব্দের উপর ভিত্তি করে এটিকে টোকেনের ক্রমানুসারে রূপান্তর করতে হবে। এটি ধাপ ৯-এ করা হবে।

এখন তুমি বাক্যটি নিবে এবং মডেলটিকে দেবে, মডেলটিকে বাক্যটির উপর অনুমান করতে বলবে এবং ফলাফলগুলি বিশ্লেষণ করবে।

এটি TensorFlow Lite ইন্টারপ্রেটার ব্যবহার করবে, যা আপনাকে আমদানি করতে হবে:

import TensorFlowLite

আপনার ক্রম অনুসারে একটি func দিয়ে শুরু করুন, যা Int32 ধরণের একটি অ্যারে ছিল:

func classify(sequence: [Int32]){
  // Model Path is the location of the model in the bundle
  let modelPath = Bundle.main.path(forResource: "model", ofType: "tflite")
  var interpreter: Interpreter
  do{
    interpreter = try Interpreter(modelPath: modelPath!)
  } catch _{
    print("Error loading model!")
    return
  }

এটি বান্ডেল থেকে মডেল ফাইলটি লোড করবে এবং এর সাথে একজন দোভাষীকে আহ্বান করবে।

পরবর্তী ধাপে সিকোয়েন্সে সংরক্ষিত অন্তর্নিহিত মেমোরিটি myData, যাতে এটি একটি টেনসরের কাছে প্রেরণ করা যায়। টেনসরফ্লো লাইট পড, সেইসাথে ইন্টারপ্রেটার বাস্তবায়নের সময়, আপনি একটি টেনসর টাইপ অ্যাক্সেস পেয়েছিলেন।

কোডটি এভাবে শুরু করুন (এখনও classify func তে আছে):

let tSequence = Array(sequence)
let myData = Data(copyingBufferOf: tSequence.map { Int32($0) })
let outputTensor: Tensor

copyingBufferOf করার সময় যদি কোনও ত্রুটি পান, তাহলে চিন্তা করবেন না। এটি পরে একটি এক্সটেনশন হিসেবে প্রয়োগ করা হবে।

এখন ইন্টারপ্রেটারে টেনসর বরাদ্দ করার সময়, আপনার তৈরি করা ডেটা বাফারটি ইনপুট টেনসরে কপি করার সময়, এবং তারপর ইন্টারপ্রেটারকে অনুমান করার জন্য আহ্বান করুন:

do {
  // Allocate memory for the model's input `Tensor`s.
  try interpreter.allocateTensors()

  // Copy the data to the input `Tensor`.
  try interpreter.copy(myData, toInputAt: 0)

  // Run inference by invoking the `Interpreter`.
  try interpreter.invoke()

একবার আমন্ত্রণ সম্পূর্ণ হয়ে গেলে, আপনি ফলাফল দেখতে ইন্টারপ্রেটারের আউটপুট দেখতে পারেন।

এগুলো হবে কাঁচা মান (প্রতি নিউরনে ৪ বাইট) যা আপনাকে পড়তে হবে এবং রূপান্তর করতে হবে। যেহেতু এই নির্দিষ্ট মডেলটিতে ২টি আউটপুট নিউরন রয়েছে, তাই আপনাকে ৮ বাইটে পড়তে হবে যা পার্সিংয়ের জন্য Float32-এ রূপান্তরিত হবে। আপনি নিম্ন স্তরের মেমরি নিয়ে কাজ করছেন, তাই unsafeData

// Get the output `Tensor` to process the inference results.
outputTensor = try interpreter.output(at: 0)
// Turn the output tensor into an array. This will have 2 values
// Value at index 0 is the probability of negative sentiment
// Value at index 1 is the probability of positive sentiment
let resultsArray = outputTensor.data
let results: [Float32] = [Float32](unsafeData: resultsArray) ?? []

এখন স্প্যামের মান নির্ধারণের জন্য ডেটা বিশ্লেষণ করা তুলনামূলকভাবে সহজ। মডেলটিতে 2টি আউটপুট রয়েছে, প্রথমটিতে বার্তাটি স্প্যাম না হওয়ার সম্ভাবনা রয়েছে, এবং দ্বিতীয়টিতে এটি স্প্যাম হওয়ার সম্ভাবনা রয়েছে। তাই আপনি results[1] দেখে স্প্যামের মান খুঁজে পেতে পারেন:

let positiveSpamValue = results[1]
var outputString = ""
if(positiveSpamValue>0.8){
    outputString = "Message not sent. Spam detected with probability: " + String(positiveSpamValue)
} else {
    outputString = "Message sent!"
}
txtOutput.text = outputString

সুবিধার জন্য, সম্পূর্ণ পদ্ধতিটি এখানে দেওয়া হল:

func classify(sequence: [Int32]){
  // Model Path is the location of the model in the bundle
  let modelPath = Bundle.main.path(forResource: "model", ofType: "tflite")
  var interpreter: Interpreter
  do{
    interpreter = try Interpreter(modelPath: modelPath!)
    } catch _{
      print("Error loading model!")
      Return
  }
  
  let tSequence = Array(sequence)
  let myData = Data(copyingBufferOf: tSequence.map { Int32($0) })
  let outputTensor: Tensor
  do {
    // Allocate memory for the model's input `Tensor`s.
    try interpreter.allocateTensors()

    // Copy the data to the input `Tensor`.
    try interpreter.copy(myData, toInputAt: 0)

    // Run inference by invoking the `Interpreter`.
    try interpreter.invoke()

    // Get the output `Tensor` to process the inference results.
    outputTensor = try interpreter.output(at: 0)
    // Turn the output tensor into an array. This will have 2 values
    // Value at index 0 is the probability of negative sentiment
    // Value at index 1 is the probability of positive sentiment
    let resultsArray = outputTensor.data
    let results: [Float32] = [Float32](unsafeData: resultsArray) ?? []

    let positiveSpamValue = results[1]
    var outputString = ""
    if(positiveSpamValue>0.8){
      outputString = "Message not sent. Spam detected with probability: " + 
                      String(positiveSpamValue)
    } else {
      outputString = "Message sent!"
    }
    txtOutput.text = outputString

  } catch let error {
    print("Failed to invoke the interpreter with error: \(error.localizedDescription)")
  }
}

১২. সুইফট এক্সটেনশন যোগ করুন

উপরের কোডটিতে Data টাইপের একটি এক্সটেনশন ব্যবহার করা হয়েছে যাতে আপনি Int32 অ্যারের কাঁচা বিটগুলিকে Data তে কপি করতে পারেন। এই এক্সটেনশনের কোডটি এখানে দেওয়া হল:

extension Data {
  /// Creates a new buffer by copying the buffer pointer of the given array.
  ///
  /// - Warning: The given array's element type `T` must be trivial in that it can be copied bit
  ///     for bit with no indirection or reference-counting operations; otherwise, reinterpreting
  ///     data from the resulting buffer has undefined behavior.
  /// - Parameter array: An array with elements of type `T`.
  init<T>(copyingBufferOf array: [T]) {
    self = array.withUnsafeBufferPointer(Data.init)
  }
}

নিম্ন স্তরের মেমোরি নিয়ে কাজ করার সময়, আপনি "অনিরাপদ" ডেটা ব্যবহার করেন এবং উপরের কোডটির জন্য আপনাকে অনিরাপদ ডেটার একটি অ্যারে শুরু করতে হবে। এই এক্সটেনশনটি এটি সম্ভব করে তোলে:

extension Array {
  /// Creates a new array from the bytes of the given unsafe data.
  ///
  /// - Warning: The array's `Element` type must be trivial in that it can be copied bit for bit
  ///     with no indirection or reference-counting operations; otherwise, copying the raw bytes in
  ///     the `unsafeData`'s buffer to a new array returns an unsafe copy.
  /// - Note: Returns `nil` if `unsafeData.count` is not a multiple of
  ///     `MemoryLayout<Element>.stride`.
  /// - Parameter unsafeData: The data containing the bytes to turn into an array.
  init?(unsafeData: Data) {
    guard unsafeData.count % MemoryLayout<Element>.stride == 0 else { return nil }
    #if swift(>=5.0)
    self = unsafeData.withUnsafeBytes { .init($0.bindMemory(to: Element.self)) }
    #else
    self = unsafeData.withUnsafeBytes {
      .init(UnsafeBufferPointer<Element>(
        start: $0,
        count: unsafeData.count / MemoryLayout<Element>.stride
      ))
    }
    #endif  // swift(>=5.0)
  }
}

১৩. iOS অ্যাপটি চালান

অ্যাপটি চালান এবং পরীক্ষা করুন।

যদি সবকিছু ঠিকঠাক থাকে, তাহলে আপনার ডিভাইসে অ্যাপটি এইভাবে দেখতে পাবেন:

74cbd28d9b1592ed.png সম্পর্কে

যেখানে "অনলাইন ট্রেডিং শিখতে আমার বই কিনুন!" বার্তাটি পাঠানো হয়েছিল, সেখানে অ্যাপটি .৯৯% সম্ভাব্যতা সহ একটি স্প্যাম সনাক্তকরণ সতর্কতা ফেরত পাঠায়!

১৪. অভিনন্দন!

আপনি এখন একটি খুব সহজ অ্যাপ তৈরি করেছেন যা ব্লগ স্প্যাম করার জন্য ব্যবহৃত ডেটার উপর প্রশিক্ষিত একটি মডেল ব্যবহার করে মন্তব্য স্প্যামের জন্য টেক্সট ফিল্টার করে।

সাধারণ ডেভেলপার জীবনচক্রের পরবর্তী ধাপ হল আপনার নিজস্ব সম্প্রদায়ে পাওয়া তথ্যের উপর ভিত্তি করে মডেলটি কাস্টমাইজ করতে কী কী প্রয়োজন তা অন্বেষণ করা। পরবর্তী পাথওয়ে অ্যাক্টিভিটিতে আপনি এটি কীভাবে করবেন তা দেখতে পাবেন।