1. ก่อนเริ่มต้น
Codelab นี้เป็นกิจกรรม #2 ในเส้นทางการเริ่มต้นใช้งานการแยกประเภทข้อความบนอุปกรณ์เคลื่อนที่
ใน Codelab นี้ คุณจะได้สร้างแอปรับส่งข้อความแบบง่ายๆ จากนั้นในระหว่างเส้นทาง คุณจะอัปเดตแอปนี้โดยใช้โมเดลแมชชีนเลิร์นนิงที่จะกรองสแปมที่ไม่ต้องการออกจากข้อความในแอป
ข้อกำหนดเบื้องต้น
- ความรู้พื้นฐานเกี่ยวกับการพัฒนา Android โดยใช้ Kotlin และการพัฒนา iOS ด้วย Swift (มีหรือไม่ก็ได้)
สิ่งที่คุณจะสร้าง
- แอปรับส่งข้อความที่ใช้งานง่าย
สิ่งที่ต้องมี
- สำหรับ Android คุณจะต้องมี Android Studio ในการเริ่มต้นใช้งาน โปรดตรวจสอบว่าได้ติดตั้งและอัปเดตอย่างเต็มรูปแบบแล้วก่อนดำเนินการต่อ
- คุณจะต้องใช้ Xcode สำหรับ iOS ซึ่งดูได้ใน App Store (หากคุณต้องการเขียนเฉพาะแอป iOS ให้ข้ามไปยังขั้นตอนที่ 5 เลย
รับโค้ด
หากคุณไม่ต้องการทำตามขั้นตอนทีละขั้นตอน และเห็นโค้ดสุดท้ายสำหรับเส้นทางนี้ รหัสจะอยู่ที่
git clone https://github.com/googlecodelabs/odml-pathways
ในส่วนนี้ ให้ค้นหาไดเรกทอรี TextClassificationOnMobile และคุณจะเห็นไดเรกทอรีย่อยของ Android และ iOS ภายในไดเรกทอรีเหล่านี้ ไดเรกทอรีเหล่านี้จะมีไดเรกทอรีย่อย TextClassificationStep1 ซึ่งมีแอปดังกล่าวอยู่ใน Android และ iOS ตามลำดับ
2. สร้างโปรเจ็กต์ใหม่ใน Android Studio
- เปิด Android Studio
- เลือกสร้างโปรเจ็กต์ใหม่ คุณจะเห็นกล่องโต้ตอบที่ขอให้คุณเลือกเทมเพลตของโครงการ
- เลือกกิจกรรมที่ว่างเปล่า แล้วคลิกถัดไป ขั้นตอนถัดไป ระบบจะขอให้คุณกำหนดค่าโปรเจ็กต์ เลือกอะไรก็ได้ที่คุณต้องการ แต่ตรวจสอบว่าภาษานั้นเป็น Kotlin และ SDK ขั้นต่ำคือ API 23
- คลิกเสร็จสิ้น เมื่อดำเนินการเสร็จแล้ว Android Studio จะเปิดขึ้นพร้อมกับโปรเจ็กต์ของคุณ ระบบอาจใช้เวลาสักครู่ในการซิงค์แบบ Gradle เพื่อให้แน่ใจว่าทุกอย่างเรียบร้อยดี โดยเฉพาะอย่างยิ่งหากคุณใช้ Android Studio เป็นครั้งแรก
3. สร้างอินเทอร์เฟซผู้ใช้
อินเทอร์เฟซผู้ใช้สำหรับแอป Android สร้างขึ้นโดยใช้ไฟล์ XML ที่เรียกว่าไฟล์เลย์เอาต์
- เปิดไฟล์ คลิกแอป > ความละเอียด > เลย์เอาต์ > activity_main.xml โดยใช้ตัวสำรวจใน Android Studio
ที่ด้านบนขวาของหน้าจอ คุณจะเห็นตัวเลือกที่มีแท็บสำหรับ Code, Split และ Design ดังนี้
ดูให้แน่ใจว่า "รหัส" ก่อนที่จะไปยังขั้นตอนถัดไป
- แทนที่โค้ดด้วย XML นี้:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Enter a string:"></TextView>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txtInput"></EditText>
</LinearLayout>
<TextView
android:id="@+id/txtOutput"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Output Goes here"
android:textSize="36sp"></TextView>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnSendText"
android:text="Send"></Button>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
ซึ่งจะทำให้คุณมีอินเทอร์เฟซผู้ใช้แบบพื้นฐานซึ่งมีพื้นที่อินพุตพร้อม TextView ซึ่งขอให้คุณ Enter a String และ EditText ชื่อ txtInput ซึ่งสามารถใช้ป้อนสตริงได้ ส่วนด้านล่างคือ TextView ที่จะแสดงผลเอาต์พุตและมีปุ่มที่ให้ผู้ใช้กดเพื่อทริกเกอร์การแยกประเภท
ขั้นตอนถัดไปคือการเขียนโค้ดที่จะเปิดใช้งานอินเทอร์เฟซผู้ใช้นี้
4. เชื่อมต่อตัวควบคุมและสร้างแอป
คุณสามารถแก้ไขโค้ดของกิจกรรมนี้ได้โดยค้นหาไฟล์รหัส MainActivity
- ใน Android Studio คลิกแอป > java > MainActivity
- เปิดไฟล์ MainActivity เพื่อเข้าถึงตัวแก้ไขโค้ด แทนที่ทุกอย่างในไฟล์นี้ ยกเว้นบรรทัดแรกที่ขึ้นต้นด้วย "package" ด้วยโค้ดนี้
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
class MainActivity : AppCompatActivity() {
lateinit var txtInput: EditText
lateinit var btnSendText: Button
lateinit var txtOutput: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
txtInput = findViewById(R.id.txtInput)
txtOutput = findViewById(R.id.txtOutput)
btnSendText = findViewById(R.id.btnSendText)
btnSendText.setOnClickListener {
var toSend:String = txtInput.text.toString()
txtOutput.text = toSend
}
}
}
โค้ดนี้จะเชื่อมต่อการควบคุมในเลย์เอาต์กับ txtInput
, txtOutput
และ btnSendText
เพื่อให้จัดการตัวควบคุมในโค้ดได้ จากนั้นตั้งค่า OnClickListener
สำหรับปุ่มดังกล่าว เพื่อที่เมื่อผู้ใช้แตะปุ่ม ระบบจะอ่านข้อความจาก txtInput
แปลงเป็นสตริง แล้วตั้งค่าพร็อพเพอร์ตี้ txtOutput.text
เป็นสตริงนั้น
5. สร้างแอปพื้นฐานบน iOS
ขั้นตอนต่อไปนี้ต้องมีความคุ้นเคยกับ Xcode และการพัฒนา iOS ด้วย Swift
หากไม่ต้องการดำเนินการตามขั้นตอนการสร้าง คุณสามารถโคลนที่เก็บและเปิดแอปได้โดยตรง โดยมีชื่อว่า TextClassificationStep1 และอยู่ในโฟลเดอร์ iOS ในที่เก็บ
โดยต้องเริ่มต้นด้วย Xcode
- สร้างแอปใหม่โดยใช้เทมเพลตพื้นฐานดังนี้
- เลือกตัวเลือกสำหรับโปรเจ็กต์ใหม่ ตั้งชื่อและตัวระบุองค์กรให้กับผลิตภัณฑ์ คุณสามารถพิมพ์สิ่งที่ต้องการ หรือทำตามพร้อมกับตัวอย่างด้านล่าง (แต่อย่าลืมตั้งค่าอินเทอร์เฟซเป็น Storyboard และ Life Cycle เป็น UIKitApp Delegate ดังที่แสดงในภาพ)
6. แก้ไขสตอรีบอร์ด
- เปิด Main.storyboard คุณจะเห็นพื้นผิวการออกแบบซึ่งคุณเพิ่มตัวควบคุมได้
- หากต้องการเพิ่มการควบคุม ให้คลิกปุ่ม + ที่ด้านบนของหน้าต่าง Xcode
- ใช้เพื่อวางตัวควบคุม TextView, ตัวควบคุมปุ่ม และตัวควบคุมป้ายกำกับบนพื้นผิวการออกแบบ ซึ่งควรมีหน้าตาเช่นนี้
- ใช้ผู้ช่วยเพื่อเปิดมุมมองเคียงข้างกันโดยมีสตอรีบอร์ดและไฟล์ ViewController.swift เปิดอยู่ Assistant จะเป็นไอคอนขนาดเล็กที่ด้านขวาบนของหน้าจอตามที่แสดงไว้ที่นี่
- กดปุ่ม Control แล้วลากตัวควบคุม TextView ไปยังส่วนโค้ด คุณจะเห็นลูกศรสีน้ำเงินเมื่อลาก
- วางรหัสไว้ใต้ประกาศชั้นเรียน คุณจะได้รับป๊อปอัปที่ถามประเภทการเชื่อมต่อ ซึ่งควรมีหน้าตาเช่นนี้
- เลือก Outlet และตั้งชื่อเป็น txtInput
- ทำเช่นเดียวกันสำหรับป้ายกำกับ จากนั้นทำให้การเชื่อมต่อประเภทเป็น Outlet แล้วตั้งชื่อเป็น txtOutput
- สุดท้าย ให้ลากปุ่มไปด้านบน แต่ครั้งนี้เลือก Action เป็นประเภทการเชื่อมต่อ (อย่าใช้ Outlet เป็นประเภทการเชื่อมต่อ)
- ตั้งชื่อการดำเนินการเป็น btnSendText
เมื่อเสร็จแล้ว รหัสที่ด้านบนสุดของชั้นเรียนควรมีลักษณะดังนี้
@IBOutlet weak var txtInput: UITextView!
@IBOutlet weak var txtOutput: UILabel!
@IBAction func btnSendText(_ sender: Any) {
}
7. เขียนโค้ดแอป iOS พื้นฐานให้เสร็จ
เนื่องจากมุมมองนี้ใช้ UITextView จึงจะตอบสนองต่อเหตุการณ์ในมุมมองนี้ได้ มุมมองนี้จึงต้องเป็น UITextViewDelegate
ซึ่งทำได้โดยเปลี่ยนการประกาศของชั้นเรียนเป็น
class ViewController: UIViewController, UITextViewDelegate {
จากนั้น ในฟังก์ชัน view DidLoad ให้ตั้งค่าผู้มอบสิทธิ์สำหรับ UITextView (ซึ่งคุณเรียกว่า txtInput เมื่อคุณตั้งค่าเต้ารับ) เป็นคลาสนี้ ดังนี้
override func viewDidLoad() {
super.viewDidLoad()
txtInput.delegate = self
}
สุดท้าย คุณต้องจัดการกับการนำแป้นพิมพ์ออกจากจอแสดงผลเมื่อผู้ใช้กด Enter บนแป้นพิมพ์ ซึ่งทำผ่านการมอบสิทธิ์ที่คุณเพิ่งตั้งค่า และคุณใช้เมธอดนี้บน ViewController เพื่อจัดการได้
func textView(_ textView: UITextView, shouldChangeTextIn range:
NSRange, replacementText text: String) -> Bool {
if (text == "\n") {
textView.resignFirstResponder()
return false
}
return true
}
สำหรับแอปนี้ การทำงานของปุ่มเป็นเรื่องเล็กน้อย เราจะผ่านสิ่งที่ผู้ใช้พิมพ์ไปยังเอาต์พุต คุณจะเห็นว่าโมเดล NLP กรองข้อความนี้ได้อย่างไรในภายหลัง แต่ตอนนี้เราจะต่อสายไฟเข้าด้วยกันเพื่อจำลองการปล่อยผ่านสัญญาณ
คุณได้สร้างการกระทำ btnSendText ไว้แล้ว ตอนนี้สิ่งที่คุณต้องทำก็คือเพิ่มโค้ดลงในโค้ดนั้น ดังนี้
@IBAction func btnSendText(_ sender: Any) {
txtOutput.text = "Sent :" + txtInput.text
}
8. ยินดีด้วย
คุณดำเนินการ Codelab นี้เสร็จสมบูรณ์แล้ว
ถัดไปในเส้นทาง คุณจะได้เรียนรู้วิธีสร้างโมเดล NLP ซึ่งคุณจะต้องนำกลับมายังแอปนี้อีกเพื่อใช้ในการกรองข้อความของผู้ใช้เพื่อหาสแปมความคิดเห็น