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

งาน MediaPipe Text Classifier ช่วยให้คุณจัดประเภทข้อความเป็นชุดหมวดหมู่ที่กำหนดไว้ เช่น ความรู้สึกเชิงบวกหรือลบ หมวดหมู่จะเป็นตัวกำหนดโมเดลที่คุณใช้และการฝึกโมเดลนั้น วิธีการเหล่านี้จะแสดงวิธีใช้ ตัวแยกประเภทข้อความกับแอป 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 เพิ่มทรัพยากร Dependency นี้ไปยังไฟล์ build.gradle ของโครงการการพัฒนาแอป Android ของคุณ คุณนำเข้าทรัพยากร Dependency ที่จำเป็นได้ด้วยโค้ดต่อไปนี้

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

รุ่น

งาน MediaPipe Text Classifier ต้องใช้โมเดลที่ฝึกแล้วซึ่งเข้ากันได้กับงานนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ฝึกแล้วที่พร้อมใช้งานสำหรับตัวแยกประเภทข้อความได้ที่ภาพรวมงานส่วนโมเดล

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