Saat mengembangkan bot untuk Telegram dan messenger lainnya, tugas mengenali dan memenuhi permintaan yang diungkapkan dalam bahasa manusia muncul secara berkala. Ini adalah "fitur", menurut beberapa pendapat, adalah perbedaan utama antara bot dan aplikasi baris perintah. Di bawah potongan, kerangka kerja berpemilik untuk mengeksekusi perintah ucapan sewenang-wenang dijelaskan. Deskripsi konsep utama disertai dengan contoh dalam bahasa Kotlin.
Mari kita ambil representasi semantik yang dinormalisasi sebagai dasar untuk pengenalan suara. Pilihan mereka terutama karena kesederhanaan dan kemudahan implementasi. Mari kita mulai dengan dasar-dasarnya, sebuah contoh dari sumber kerangka kerja:
/** */
typealias Rule = (String) -> Boolean
/** */
open class Semnorm(vararg val rules: Rule)
/** */
fun stem(vararg stems: String): Rule = { stems.any(it::startsWith) }
/** */
fun word(vararg words: String): Rule = { words.any(it::equals) }
/** */
fun String.matches(norm: Semnorm) = norm.rules.any { it(this) }
Sekarang kita memiliki kemampuan untuk mendefinisikan representasi semantik ternormalisasi yang telah ditentukan sebelumnya dalam bentuk objek:
object Day : Semnorm(stem("day", "", "", "", "", ""))
Kerangka kerja menempatkan mereka sejalan dengan token dari frase yang masuk, dan kalimat mulai terlihat seperti ini:
assertThat(
" 5 ".tokenize(),
equalTo(
listOf(
Token("", Ban),
Token("", null),
Token("", null),
Token("5", Number),
Token("", Minute)
)
)
)
Kami telah berurusan dengan pengenalan suara. Kode tokenizer terlampir di repositori yang tersedia di akhir artikel. Mari kita beralih ke menjalankan perintah dari pidato. Dan di sinilah hal yang paling menarik dimulai: kerangka kerja memungkinkan setiap representasi semantik untuk menggantung perilaku yang ditentukan. Sekali lagi, contoh paling sederhana tentang cara mengenali permintaan bantuan dalam dua bahasa:
object Help : ExecutableSemnorm(stem(
"", "", "", "help",
"rule", "faq", "start", "",
)) {
override fun execute(bot: Bot, m: Message) {
val faq = message.from.relatedFaq()
bot.sendMessage(m.chat.id, faq)
}
}
, ? , , , , :
object Ban : DurableSemonrm(stem(
"ban", "block", "mute", "", "",
"", "", "",
)) {
override fun execute(
bot: Bot, attackerMessage: Message, duration: Duration) {
val victimMessage = attackerMessage.replyToMessage
val victimId = victimMessage.from.id
val untilSecond = now().epochSecond + duration.inWholeSeconds
bot.restrictChatMember(
attackerMessage.chat.id, victimId, untilSecond)
}
}
? , . , :
object Week : Semnorm(stem("week", "")) {
override fun toDuration(number: Long) =
days(number) * 7
}
, :
class DurableSemnorm(vararg rules: Rule) : ExecutableSemnorm(*rules) {
final override fun execute(
token: Iterator<Token>, bot: Bot, m: Message) =
execute(bot, message, token.parseDuration())
abstract fun execute(bot: Bot, m: Message, duration: Duration)
}
, . . , , Github.