Android के लिए, टेक्स्ट की कैटगरी तय करने की गाइड

MediaPipe टेक्स्ट क्लासिफ़ायर टास्क की मदद से टेक्स्ट को तय की गई कैटगरी के सेट में बांटा जा सकता है, जैसे कि सकारात्मक या नकारात्मक भावना. कैटगरी, आपके इस्तेमाल किए जाने वाले मॉडल और उस मॉडल को ट्रेनिंग देने के तरीके से तय की जाती हैं. ये निर्देश आपको बताते हैं कि Android ऐप्लिकेशन के साथ टेक्स्ट क्लासिफ़ायर कैसे इस्तेमाल किया जाता है.

डेमो में इस टास्क को देखा जा सकता है. इस टास्क की क्षमताओं, मॉडल, और कॉन्फ़िगरेशन विकल्पों के बारे में ज़्यादा जानकारी के लिए, खास जानकारी देखें.

कोड का उदाहरण

टेक्स्ट क्लासिफ़ायर के लिए उदाहरण कोड में आपके रेफ़रंस के लिए इस टास्क को आसानी से लागू करने का तरीका बताया गया है. इस कोड की मदद से, इस टास्क की जांच की जा सकती है. साथ ही, टेक्स्ट की कैटगरी तय करने वाला अपना ऐप्लिकेशन बनाया जा सकता है. GitHub पर, टेक्स्ट क्लासिफ़ायर के उदाहरण वाले कोड को ब्राउज़ किया जा सकता है.

कोड डाउनलोड करें

नीचे दिए गए निर्देशों में git वर्शन कंट्रोल कमांड लाइन टूल का इस्तेमाल करके, उदाहरण के कोड की लोकल कॉपी बनाने का तरीका बताया गया है.

उदाहरण कोड डाउनलोड करने के लिए:

  1. नीचे दिए गए निर्देश का इस्तेमाल करके, गिट रिपॉज़िटरी का क्लोन बनाएं:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. इसके अलावा, स्पार्स चेकआउट का इस्तेमाल करने के लिए अपना git इंस्टेंस कॉन्फ़िगर करें. इससे आपके पास सिर्फ़ Text Classifier उदाहरण वाले ऐप्लिकेशन की फ़ाइलें हों:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_classification/android
    

Android Studio को सेटअप करने और इस्तेमाल करने का तरीका जानने के लिए, Android के लिए सेटअप गाइड में दिए गए कोड सेटअप करने के निर्देश देखें.

मुख्य कॉम्पोनेंट

इन फ़ाइलों में, टेक्स्ट की कैटगरी तय करने वाला ऐप्लिकेशन इस्तेमाल करने के लिए ज़रूरी कोड मौजूद है:

  • TextClassifierHelper.kt - टेक्स्ट की कैटगरी तय करने वाली प्रोसेस को शुरू करता है और मॉडल चुनने का काम हैंडल करता है.
  • MainActivity.kt - ऐप्लिकेशन को लागू करता है. इसमें TextClassifierHelper और ResultsAdapter को कॉल करना भी शामिल है.
  • ResultsAdapter.kt - नतीजों को हैंडल और फ़ॉर्मैट करता है.

सेटअप

इस सेक्शन में, डेवलपमेंट एनवायरमेंट को सेट अप करने के मुख्य चरणों के बारे में बताया गया है. साथ ही, ऐसे कोड प्रोजेक्ट के बारे में भी बताया गया है जो खास तौर पर Text Classifier का इस्तेमाल करने के लिए बनाए गए हों. MediaPipe Tasks का इस्तेमाल करने के लिए डेवलपमेंट एनवायरमेंट सेट अप करने से जुड़ी सामान्य जानकारी के साथ-साथ, प्लैटफ़ॉर्म के वर्शन की ज़रूरी शर्तों के बारे में जानने के लिए, Android के लिए सेटअप गाइड देखें.

डिपेंडेंसी

टेक्स्ट क्लासिफ़ायर, com.google.mediapipe:tasks-text लाइब्रेरी का इस्तेमाल करता है. अपने Android ऐप्लिकेशन डेवलपमेंट प्रोजेक्ट की build.gradle फ़ाइल में यह डिपेंडेंसी जोड़ें. इस कोड के साथ ज़रूरी डिपेंडेंसी इंपोर्ट की जा सकती हैं:

dependencies {
    implementation 'com.google.mediapipe:tasks-text:latest.release'
}

मॉडल

MediaPipe टेक्स्ट क्लासिफ़ायर टास्क को एक प्रशिक्षित मॉडल की ज़रूरत होती है, जो इस टास्क के साथ काम कर सके. टेक्स्ट क्लासिफ़ायर के लिए उपलब्ध ट्रेनिंग मॉडल के बारे में ज़्यादा जानकारी के लिए, टास्क की खास जानकारी मॉडल सेक्शन देखें.

कोई मॉडल चुनें और डाउनलोड करें और फिर उसे अपने प्रोजेक्ट assets डायरेक्ट्री में सेव करें:

<dev-project-root>/src/main/assets

अगर आपको मॉडल का पाथ इस्तेमाल करना है, तो BaseOptions.Builder.setModelAssetPath() तरीके का इस्तेमाल करें. कोड के उदाहरण के लिए, अगला सेक्शन देखें.

टास्क बनाएं

अनुमान लगाने के लिए टास्क तैयार करने के लिए, टेक्स्ट क्लासिफ़ायर TextClassifier.createFrom...() फ़ंक्शन में से किसी एक का इस्तेमाल करें. ट्रेन की गई मॉडल फ़ाइल के रिलेटिव या ऐब्सलूट पाथ के साथ, createFromFile() फ़ंक्शन का इस्तेमाल किया जा सकता है. नीचे दिए गए कोड का उदाहरण TextClassifier.createFromOptions() फ़ंक्शन के इस्तेमाल के बारे में बताता है. कॉन्फ़िगरेशन के उपलब्ध विकल्पों के बारे में ज़्यादा जानकारी के लिए, कॉन्फ़िगरेशन के विकल्प देखें.

नीचे दिया गया कोड इस टास्क को बनाने और कॉन्फ़िगर करने का तरीका बताता है.

// no directory path required if model file is in src/main/assets:
String currentModel = "text_classifier_model.tflite";

fun initClassifier() {
    val baseOptionsBuilder = BaseOptions.builder()
        .setModelAssetPath(currentModel)
    try {
        val baseOptions = baseOptionsBuilder.build()
        val optionsBuilder = TextClassifier.TextClassifierOptions.builder()
            .setBaseOptions(baseOptions)
        val options = optionsBuilder.build()
        textClassifier = TextClassifier.createFromOptions(context, options)
    } catch (e: IllegalStateException) { // exception handling
    }
}

कोड उदाहरण में, टास्क बनाने का एक उदाहरण दिया गया है TextClassifierHelper क्लास initClassifier() फ़ंक्शन.

कॉन्फ़िगरेशन विकल्प

इस टास्क में, Android ऐप्लिकेशन के कॉन्फ़िगरेशन के ये विकल्प मौजूद हैं:

विकल्प का नाम ब्यौरा वैल्यू रेंज डिफ़ॉल्ट मान
displayNamesLocale अगर यह उपलब्ध हो, तो टास्क के मॉडल के मेटाडेटा में दिए गए डिसप्ले नेम के लिए, लेबल की भाषा सेट करता है. अंग्रेज़ी के लिए डिफ़ॉल्ट रूप से en है. TensorFlow Lite Metadata Writer API का इस्तेमाल करके, कस्टम मॉडल के मेटाडेटा में स्थानीय भाषा के हिसाब से लेबल जोड़े जा सकते हैं स्थान-भाषा का कोड en
maxResults यह विकल्प, टॉप-स्कोर किए गए क्लासिफ़िकेशन के नतीजों की ज़्यादा से ज़्यादा संख्या को सेट करता है, ताकि नतीजे दिखाए जा सकें. अगर < 0 है, तो सभी उपलब्ध नतीजे दिखाए जाएंगे. कोई भी पॉज़िटिव नंबर -1
scoreThreshold अनुमान के स्कोर का थ्रेशोल्ड सेट करता है, जो मॉडल मेटाडेटा (अगर कोई है) में दिए गए स्कोर को बदलता है. इस वैल्यू से कम के नतीजे अस्वीकार कर दिए गए हैं. कोई भी फ़्लोट सेट नहीं किया गया है
categoryAllowlist अनुमति वाली कैटगरी के नामों की वैकल्पिक सूची सेट करता है. अगर यह खाली नहीं है, तो कैटगरी के जिन नतीजों की कैटगरी का नाम इस सेट में नहीं होगा उन्हें फ़िल्टर कर दिया जाएगा. श्रेणी के डुप्लीकेट या अज्ञात नामों पर ध्यान नहीं दिया जाता है. यह विकल्प categoryDenylist के साथ म्यूचुअली एक्सक्लूसिव है और दोनों नतीजों का इस्तेमाल करने में गड़बड़ी है. कोई भी स्ट्रिंग सेट नहीं किया गया है
categoryDenylist उन कैटगरी के नामों की वैकल्पिक सूची सेट करता है जिनकी अनुमति नहीं है. अगर यह फ़ील्ड खाली नहीं है, तो कैटगरी के जिन नतीजों की कैटगरी का नाम इस सेट में होगा उन्हें फ़िल्टर करके बाहर कर दिया जाएगा. श्रेणी के डुप्लीकेट या अज्ञात नामों पर ध्यान नहीं दिया जाता है. यह विकल्प categoryAllowlist के साथ म्यूचुअली एक्सक्लूसिव है और इसका इस्तेमाल करने पर दोनों में गड़बड़ी होगी. कोई भी स्ट्रिंग सेट नहीं किया गया है

डेटा तैयार करना

टेक्स्ट क्लासिफ़ायर, टेक्स्ट (String) डेटा के साथ काम करता है. यह टास्क, डेटा इनपुट की प्री-प्रोसेसिंग को हैंडल करता है. इसमें टोकनाइज़ेशन और टेंसर प्री-प्रोसेसिंग भी शामिल हैं.

सभी प्री-प्रोसेसिंग को classify() फ़ंक्शन में हैंडल किया जाता है. इनपुट टेक्स्ट को पहले से प्रोसेस करने की कोई ज़रूरत नहीं है.

String inputText = "The input text to be classified.";

टास्क चलाएं

टेक्स्ट क्लासिफ़ायर, अनुमान चलाने के लिए TextClassifier.classify() फ़ंक्शन का इस्तेमाल करता है. अपने ऐप्लिकेशन में Android यूज़र इंटरफ़ेस थ्रेड को ब्लॉक होने से बचाने के लिए, क्लासिफ़िकेशन लागू करने के लिए एक अलग एक्ज़ीक्यूशन थ्रेड इस्तेमाल करें.

नीचे दिया गया कोड बताता है कि एक अलग एक्ज़ीक्यूशन थ्रेड का इस्तेमाल करके, टास्क मॉडल की प्रोसेसिंग को कैसे एक्ज़ीक्यूट करें.

    fun classify(text: String) {
        executor = ScheduledThreadPoolExecutor(1)

        executor.execute {
            val results = textClassifier.classify(text)
            listener.onResult(results)
        }
    }

कोड के उदाहरण में, टास्क चलाने का एक उदाहरण दिया गया है TextClassifierHelper क्लास classify() फ़ंक्शन.

नतीजे मैनेज करें और दिखाएं

टेक्स्ट की कैटगरी तय करने वाला टूल, एक TextClassifierResult देता है. इसमें इनपुट टेक्स्ट के लिए संभावित कैटगरी की सूची होती है. कैटगरी, आपके इस्तेमाल किए गए मॉडल के हिसाब से तय होती हैं. इसलिए, अगर आपको अलग-अलग कैटगरी चाहिए, तो कोई दूसरा मॉडल चुनें या किसी मौजूदा मॉडल को फिर से ट्रेनिंग दें.

इस टास्क के आउटपुट डेटा का एक उदाहरण यहां दिया गया है:

TextClassificationResult:
  Classification #0 (single classification head):
    ClassificationEntry #0:
      Category #0:
        category name: "positive"
        score: 0.8904
        index: 0
      Category #1:
        category name: "negative"
        score: 0.1096
        index: 1

यह नतीजा, इनपुट टेक्स्ट पर BERT-क्लासिफ़ायर चलाकर लिया गया है: "an imperfect but overall entertaining mystery".

कोड के उदाहरण में, नतीजों को दिखाने के तरीके का उदाहरण देखा जा सकता है. उदाहरण के लिए, ResultsAdapter क्लास और ViewHolder इनर क्लास.