コマンドの認識

Telegram やその他のメッセンジャー向けのボットを開発する場合、人間の言語で表現された要求を認識して実行するというタスクが定期的に発生します。一部の意見によると、ボットとコマンド ライン アプリケーションの主な違いはこの「機能」です。カットの下には、任意の音声コマンドを実行するための独自のフレームワークが説明されています。主要な概念の説明には、Kotlin 言語の例が付いています。





音声認識の基礎として、正規化された意味表現を取り上げましょう。彼らの選択は、主に実装の単純さと容易さによるものです。フレームワークのソースからの例として、基本から始めましょう:





/**      */
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) }
      
      



これで、事前定義された正規化された意味表現をオブジェクトの形式で定義できるようになりました。





object Day : Semnorm(stem("day", "", "", "", "", ""))
      
      



フレームワークはそれらを入力フレーズのトークンに合わせて配置し、文は次のようになります。





assertThat(
  "   5 ".tokenize(), 
  equalTo(
   listOf(
     Token("", Ban), 
     Token("", null),
     Token("", null), 
     Token("5", Number),
     Token("", Minute)
   )
  )
)
      
      



音声認識を扱ってきました。トークナイザー コードは、記事の最後にあるリポジトリに添付されています。スピーチからコマンドの実行に移りましょう。そして、ここから最も興味深いことが始まります。フレームワークは、各セマンティック表現が指定された動作をハングアップすることを許可します。ここでも、2 つの言語でヘルプ リクエストを認識する方法の最も単純な例を示します。





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.








All Articles