คำแนะนำในการแยกประเภทข้อความสำหรับ Android

งานตัวแยกประเภทข้อความของ MediaPipe ช่วยให้คุณ จัดประเภทข้อความเป็นชุดหมวดหมู่ที่กำหนดไว้ เช่น ความรู้สึกเชิงบวกหรือเชิงลบ หมวดหมู่จะเป็นตัวกำหนดโมเดล ที่คุณใช้และวิธีการฝึกโมเดลนั้น คำแนะนำเหล่านี้จะแสดงวิธีการใช้ ตัวแยกประเภทข้อความด้วยแอป Android

คุณสามารถดูการทำงานนี้โดยดูที่ การสาธิต สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และ ตัวเลือกการกำหนดค่าของงานนี้ โปรดดูภาพรวม

ตัวอย่างโค้ด

โค้ดตัวอย่างสำหรับตัวแยกประเภทข้อความช่วยให้การติดตั้งโค้ดนี้เรียบง่าย งานสำหรับการอ้างอิง โค้ดนี้จะช่วยให้คุณทดสอบงานนี้และเริ่มต้นใช้งาน การสร้างแอปแยกประเภทข้อความขึ้นมาเอง คุณสามารถเรียกดู โค้ดตัวอย่างตัวแยกประเภทข้อความ ใน GitHub

ดาวน์โหลดโค้ด

วิธีการต่อไปนี้แสดงวิธีสร้างสำเนาตัวอย่างในเครื่อง โดยใช้เครื่องมือบรรทัดคำสั่ง git

วิธีดาวน์โหลดโค้ดตัวอย่าง

  1. โคลนที่เก็บ Git โดยใช้คำสั่งต่อไปนี้
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. คุณสามารถกำหนดค่าอินสแตนซ์ Git ให้ใช้การชำระเงินแบบกระจัดกระจายได้ เพื่อให้คุณมีเพียงไฟล์สำหรับแอปตัวอย่างตัวแยกประเภทข้อความเท่านั้น
    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 แฮนเดิลและจัดรูปแบบผลลัพธ์

ตั้งค่า

ส่วนนี้จะอธิบายขั้นตอนสำคัญในการตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ และ เพื่อใช้ตัวแยกประเภทข้อความโดยเฉพาะ สำหรับข้อมูลทั่วไปเกี่ยวกับ การตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ของคุณสำหรับการใช้งาน MediaPipe Tasks รวมถึง โปรดดูข้อกำหนดเวอร์ชันของแพลตฟอร์ม คู่มือการตั้งค่าสำหรับ Android

การอ้างอิง

ตัวแยกประเภทข้อความใช้ไลบรารี com.google.mediapipe:tasks-text เพิ่มรายการนี้ จะขึ้นอยู่กับไฟล์ build.gradle ของโปรเจ็กต์การพัฒนาแอป Android ของคุณ คุณสามารถนำเข้าทรัพยากร Dependency ที่จำเป็นด้วยโค้ดต่อไปนี้

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 และการใช้ทั้ง 2 อย่างจะทำให้เกิดข้อผิดพลาด สตริงใดก็ได้ ไม่ได้ตั้งค่า

เตรียมข้อมูล

ตัวแยกประเภทข้อความใช้งานได้กับข้อมูลข้อความ (String) งานจะจัดการอินพุตข้อมูล การประมวลผลล่วงหน้า ซึ่งรวมถึงการแปลงเป็นโทเค็นและการประมวลผลล่วงหน้า Tensor

การประมวลผลล่วงหน้าทั้งหมดจะจัดการภายในฟังก์ชัน 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