Tujuan dari proyek ini adalah untuk menyederhanakan akses sepenuhnya ke kemampuan NLP (Natural Language Processing) untuk pengembang aplikasi. Ide utama dari sistem ini adalah untuk mencapai keseimbangan antara kemudahan masuk ke masalah NLP dan dukungan untuk berbagai kemampuan perpustakaan industri. Tujuan dari proyek ini adalah tanpa kompromi - kesederhanaan tanpa penyederhanaan yang berlebihan.
Pada saat versi 0.7.1, proyek ini berada dalam tahap inkubasi komunitas Apache dan tersedia di https://nlpcraft.apache.org .
Fitur sistem utama
- Pemodelan semantik. Mekanisme bawaan sederhana untuk mengenali elemen model dalam teks kueri yang tidak memerlukan pembelajaran mesin.
- Java API yang memungkinkan Anda mengembangkan model dalam bahasa apa pun yang kompatibel dengan Java - Java, Scala, Kotlin, Groovy, dll.
- Pendekatan Model-as-a-Code yang memungkinkan Anda membuat dan mengedit model menggunakan alat yang sudah dikenal oleh developer.
- Kemampuan untuk berinteraksi dengan semua jenis perangkat yang memiliki API - chatbots, asisten suara, perangkat rumah pintar, dll., Serta menggunakan sumber data khusus apa pun, dari basis data hingga sistem SaaS, tertutup atau terbuka.
- Satu set alat NLP tingkat lanjut, termasuk sistem untuk bekerja dengan memori jangka pendek, templat dialog, dll.
- Integrasi dengan banyak penyedia komponen NER ( Apache OpenNlp , Stanford NLP , Google Natural Language API , Spacy )
Batasan - versi 0.7.1 saat ini hanya mendukung bahasa Inggris.
Mari kita sepakati beberapa istilah dan konsep yang digunakan dalam presentasi selanjutnya.
Terminologi
- Entitas Bernama adalah entitas bernama. Dengan kata sederhana, ini adalah objek atau konsep yang dikenali dalam teks. Definisi lengkapnya ada di sini . Entitas dapat bersifat umum seperti tanggal, negara, dan kota, atau khusus model.
- Komponen NER (Named Entity Recognition) - komponen perangkat lunak yang bertanggung jawab untuk mengenali entitas dalam teks.
- Intent, . — , . — , .
- Data model
NER , .. Json Yaml .
- Data probe
. , , .. Data Probe, Data Probe .
- Server REST
Menyediakan REST API untuk aplikasi kustom
Contoh menggunakan NlpCraft
Menggunakan contoh sistem kontrol rumah pintar, pertimbangkan urutan pekerjaan dengan NlpCraft. Sistem kontrol yang kami kembangkan harus memahami perintah seperti "Nyalakan lampu di seluruh rumah" atau "Matikan lampu di dapur". Harap dicatat bahwa NlpCraft tidak berurusan dengan pengenalan ucapan dan menerima teks yang sudah disiapkan sebagai argumen.
Kita harus:
- Tentukan entitas bernama apa yang kita butuhkan dalam pekerjaan kita dan bagaimana kita dapat menemukan teksnya.
- Buat maksud untuk kumpulan entitas yang berbeda, yaitu berbagai jenis perintah.
Untuk mengembangkan sebuah contoh, kita membutuhkan tiga entitas - dua tanda aksi, "on" dan "off", dan sebuah tempat aksi.
Sekarang kita harus mendesain model, yaitu menentukan mekanisme untuk menemukan elemen-elemen ini dalam teks. Secara default, NlpCraft menggunakan mesin pencari daftar sinonim untuk entitas non-standar. Untuk membuat tugas menyusun daftar sinonim sesederhana dan senyaman mungkin, NlpCraft menyediakan seperangkat alat termasuk makro dan Synonym DSL.
Di bawah ini adalah konfigurasi lightswitch_model.yaml statis , yang menyertakan definisi dari tiga entitas dan satu maksud kita.
id: "nlpcraft.lightswitch.ex"
name: "Light Switch Example Model"
version: "1.0"
description: "NLI-powered light switch example model."
macros:
- name: "<ACTION>"
macro: "{turn|switch|dial|control|let|set|get|put}"
- name: "<ENTIRE_OPT>"
macro: "{entire|full|whole|total|*}"
- name: "<LIGHT>"
macro: "{all|*} {it|them|light|illumination|lamp|lamplight}"
enabledBuiltInTokens: [] # This example doesn't use any built-in tokens.
elements:
- id: "ls:loc"
description: "Location of lights."
synonyms:
- "<ENTIRE_OPT> {upstairs|downstairs|*} {kitchen|library|closet|garage|office|playroom|{dinning|laundry|play} room}"
- "<ENTIRE_OPT> {upstairs|downstairs|*} {master|kid|children|child|guest|*} {bedroom|bathroom|washroom|storage} {closet|*}"
- "<ENTIRE_OPT> {house|home|building|{1st|first} floor|{2nd|second} floor}"
- id: "ls:on"
groups:
- "act"
description: "Light switch ON action."
synonyms:
- "<ACTION> {on|up|*} <LIGHT> {on|up|*}"
- "<LIGHT> {on|up}"
- id: "ls:off"
groups:
- "act"
description: "Light switch OFF action."
synonyms:
- "<ACTION> <LIGHT> {off|out}"
- "{<ACTION>|shut|kill|stop|eliminate} {off|out} <LIGHT>"
- "no <LIGHT>"
intents:
- "intent=ls term(act)={groups @@ 'act'} term(loc)={id == 'ls:loc'}*"
Secara singkat tentang konten:
- , “ls:loc”, : “ls:on” “ls:off”, “act” .
- Synonym DSL . , , “ls:on” “turn”, “turn it”, “turn all it” .., “ls:loc” — “light”, “entire light”, “entire light upstairs” .. 7700 .
- Pencarian berdasarkan sinonim dalam teks dilakukan dengan mempertimbangkan bentuk awal kata ( lemma dan stemma ), adanya stop words , kemungkinan penataan ulang kata dalam frasa, dll.
- Model tersebut mendefinisikan satu maksud bernama " ls ". Kondisi pemicu maksud - permintaan harus berisi satu entitas dari grup " tindakan " dan mungkin berisi beberapa entitas dari jenis " ls: loc ". Sintaks lengkap Intents DSL dapat ditemukan di sini .
Untuk semua kesederhanaannya, jenis pemodelan ini sangat kuat dan fleksibel.
Harap dicatat bahwa jika perlu, komponen khusus model NER dapat diprogram oleh pengguna NlpCraft dengan cara lain, menggunakan jaringan saraf atau pendekatan dan algoritma lain. Contohnya adalah kebutuhan akan algoritma pengenalan entitas waktu-hari, non-deterministik, dll.
Bagaimana pertandingan itu bekerja:
- Teks permintaan pengguna dibagi menjadi beberapa komponen (kata, token),
- kata-kata dibawa ke dalam bentuk dasar (lemma dan stemma), bagian-bagian pidato dan informasi tingkat rendah lainnya ditemukan untuk mereka.
- Selanjutnya, berdasarkan token dan kombinasinya, entitas bernama dicari di teks permintaan.
- Entitas yang ditemukan dicocokkan dengan template dari semua maksud yang ditentukan dalam model, dan jika maksud yang sesuai ditemukan, fungsi yang sesuai akan dipanggil.
Contoh fungsi maksud " ls " berikut ditulis di Java, tetapi bisa juga bahasa pemrograman lain yang kompatibel dengan Java.
public class LightSwitchModel extends NCModelFileAdapter {
public LightSwitchModel() throws NCException {
super("lightswitch_model.yaml");
}
@NCIntentRef("ls")
NCResult onMatch(
@NCIntentTerm("act") NCToken actTok,
@NCIntentTerm("loc") List<NCToken> locToks
) {
String status = actTok.getId().equals("ls:on") ? "on" : "off";
String locations =
locToks.isEmpty() ?
"entire house" :
locToks.stream().
map(p -> p.meta("nlpcraft:nlp:origtext").toString()).
collect(Collectors.joining(", "));
// Add HomeKit, Arduino or other integration here.
// By default - just return a descriptive action string.
return NCResult.text(
String.format("Lights are [%s] in [%s].", status, locations)
);
}
}
Apa yang terjadi di tubuh fungsi:
- Konfigurasi statis yang kami definisikan di atas menggunakan file lightswitch_model.yaml dibaca menggunakan NCModelFileAdapter.
- Sebagai argumen masukan, fungsi menerima sekumpulan data dari entitas yang cocok dengan templat maksudnya.
- Elemen grup " tindakan " menentukan tindakan spesifik yang akan dilakukan.
- Dari daftar " ls: loc " , informasi diambil tentang tempat atau tempat tertentu di mana tindakan harus dilakukan.
Data yang diterima cukup untuk mengakses API dari sistem yang kami kelola.
Dalam artikel ini, kami tidak akan memberikan contoh detail integrasi dengan API tertentu. Juga di luar cakupan contoh akan mengelola konteks percakapan, memperhitungkan dialog, bekerja dengan memori jangka pendek dari sistem, mengkonfigurasi mekanisme pencocokan maksud, masalah integrasi dengan penyedia NER standar, utilitas untuk memperluas daftar sinonim, dll. dll.
Sistem serupa
"Analog" terdekat dan paling terkenal Amazon Alexa dan Google DialogFlow memiliki sejumlah perbedaan yang signifikan dari sistem ini. Di satu sisi, mereka lebih mudah digunakan, karena mereka bahkan tidak memerlukan IDE untuk contoh awal mereka. Di sisi lain, kemampuan mereka sangat terbatas dan dalam banyak hal mereka kurang fleksibel.
Kesimpulan
Dengan bantuan beberapa baris kode, kami dapat memprogram prototipe sistem kontrol pencahayaan yang sederhana namun cukup berfungsi di rumah pintar, yang memahami banyak perintah dalam berbagai format. Sekarang Anda dapat dengan mudah memperluas kemampuan model tersebut. Misalnya, untuk melengkapi daftar sinonim entitas atau menambahkan sesuatu yang baru yang diperlukan untuk fungsionalitas tambahan, seperti "intensitas cahaya", dll. Perubahan akan memakan waktu beberapa menit dan tidak memerlukan pelatihan model tambahan.
Saya harap berkat posting ini, Anda bisa mendapatkan pemahaman pertama, meskipun dangkal, tentang sistem Apache NlpCraft.