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