Một hệ thống trên sẽ bao gồm các bước:
- Bước 1: Tiền xử lý dữ liệu. Ở bước này, dữ liệu cần được “làm sạch” bao gồm chuẩn hoá dữ liệu, chuẩn hoá dạng kí tự viết hoa, không viết hoa, chuyển từ viết sai chính tả thành đúng chính tả...
- Bước 2: Trích chọn thông tin. Trong học máy bước này được gọi là trích xuất đặc trưng và sử dụng mô hình BoW để xây dựng vecto hoá đặc trưng kết hợp với TF-IDF để xác định giá trị các phần tử trong vecto.
- Bước 3: hệ thống sẽ huấn luyện mô hình trên dữ liệu đã được trích xuất - Bước 4: sử dụng các phương pháp Machine Learning để học ra một mô
hình phân lớp.
2.1.1. Thuật toán Bag-of-Words (BoW)
Đây là một trong những phương pháp được sử dụng thường xuyên trong xử lý ngôn ngữ tự nhiên và bài toán phân loại văn bản. Ý tưởng của BoW là phân tích và phân nhóm dựa theo Bag-of-Words (corpus). Trong đó, mỗi văn bản di trong tập ngữ liệu đang xét, tập này có n câu văn bản và m từ xuất hiện không lặp lại (theo từng cặp), sẽ được mô hình hóa như là một vector trọng số của các đặc trưng:
sau:
“Hoa”, “thích”, “xem”, “phim”, “Nam”, “thích”, “đọc”, “sách” “Nam”, “cũng”, “thích”, “chơi”, “đá”, “banh”
Mỗi khoá là từ và mỗi giá trị là số lần xuất hiện của từ đó trong văn bản đã cho. Ta có:
Bow1 = {“Hoa”: 1, “thích”: 2, “xem”: 1, “phim”: 1, “Nam”: 1, “đọc”: 1, “sách”: 1}
Bow2 = {“Nam”: 1, “cũng”: 1, “thích”: 1, “chơi”: 1, “đá”: 1, “banh”: 1} Gộp thành một túi (3) = (1) + (2)
Ta có một tài liệu khác giống với sự tổng hợp hai tài liệu trên như sau:
(3) Hoa thích xem phim. Nam thích đọc sách. Nam cũng thích chơi đá banh. Sau khi chuyển thành “một túi” như trên, ta có:
Bow3 = {“Hoa”: 1, “thích”: 3, “xem”: 1, “phim”: 1, “Nam”: 2, “đọc”: 1, “sách”: 1, “cũng”: 1, “chơi”: 1, “đá”: 1, “banh”: 1}
Với ví dụ trên ta sẽ được kết quả khi ghi lại tần số xuất hiện các thuật ngữ của các từ riêng biệt
(1) [1, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0] (2) [0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1] Code trên Python:
docA = "Hoa thích xem phim. Nam thích doc sach"
docB = "Nam cung thich choi da banh"
bowA = docA.split(" "} boι-jB = docB.split(" ")
#Create dictionary
WDrddict = set(boưA).union{set{bowB))
WordDictA = diet.fromkeys(worc_dictJ 0)
WordDictE = diet.fromkeys(worc_dict, 0)
ỉtcount the word in bads
for word in b□wA:
WOrdDictA[word]+=1 I ■; ■
for word in bowE:
tf_bowA = compute_TF(wordDictA, bowA)
tf_bowB = compute_TF(WOrdDictB, bowB)
tf-bowB∣ { ' xe∣ii' : 0.0, 'doc, : 0.0, ,Nam': 0.16666666666666666, 'Hoa' : 0.0, ■ sach ' : θ.θ, WordDictA {'xem': Gj 'doc , : Gj ,Nam,: lj 'Hoa' : Gj ,sach,: θj 1thich': 1, ’choi 1: lj 'bantι,: 1^ ,P him.,: 6j ,da,: lj ,cung': 1}
Hình 9: Kết quả của mô hình Bag-of-Words khi chạy trên Python
Có thể thấy rằng, danh sách (vecto) này không sắp xếp theo thứ tự của các từ trong câu gốc. Tần số các từ xuất hiện không nhất thiết đại diện cho văn bản. Có những từ tần số xuất hiện rất cao nhưng lại không quan trọng. Chính vì vậy, việc xét theo tần số các từ khi phân loại văn bản rất có thể cho kết quả sai. Và giải pháp chính là sử dụng một phương pháp thống kê có tên TF-IDF kết hợp với giải pháp
“túi đựng từ” Bag-of-Words.
2.1.2. Thuật toán IT-IDF
IF- IDF là tên viết tắt của tần số tài liệu nghịch đảo tần số, là một thống kê
nhằm phản ánh tầm quan trọng của một từ đối với tài liệu. Đây chính là phương
pháp sinh ra để cải thiện những nhược điểm của phương pháp BoW.
Để xác định trọng số (sự quan trọng) của các từ trong văn bản, hiện nay thuật toán đánh giá từ khóa dựa trên sự kết hợp của độ đo cục bộ và toàn cục là TF-IDF cho một kết quả khá tốt.
Cách tính như sau:
TF (Term Frequency) là tần số xuất hiện của 1 từ trong 1 văn bản:
∣∣; = f(t,d~)
∑tf∈df(t' ,á)
Trong đó: f(t,d) : số lần t xuất hiện trong d
∑t,∈df(t', d) : tổng số từ trong
d Với ví dụ phần 2.1.1, ta sẽ được kết quả như sau:
^calculate TF
def comput∈TF(worddict, bow)::
tf_dict = {}
bơw_count = len(bow)
for word, count in Worddict.items():
tf_dict[word] = couπt∕float(bowcouπt)
"da,: β.16666666666666666,
Hình 10: Kết quả tính TF trên Python
Tiếp theo là IDF (Inverse Document Frequency) tần số nghịch của 1 từ trong tập văn bản. Mục đích của việc tính IDF là làm giảm giá trị các từ xuất hiện nhiều
import pandas as pd
def compute_TFIDF(tf_bow, ɪdfs): tfidf = {}
for word, val in tfbow.items(): tfidf[word] = val*idfs[word] return tfɪdf
tfidf_bowA = compute_TFIDF(tf_bowA, idfs)
tfidfbowB = compute TFIDF(tfbowB, idfs) df « pd.DataFrame([tfidf_bowA, tfidf-bowB])
df ’ ’
Hoa Nam banh Choi cung da doc phim. sach thich xem
O 0.085643 0.0 0.000000 0.000000 0.000000 0.000000 0.086643 0.086643 0.086643 0.0 0.086643
1 0.000000 0.0 0.115525 0.115525 0.115525 0.115525 0.000000 0.000000 0.000000 0.0 0.000000
IDF = log —ɪɪ-
∣{d∈D: t∈d}∣
Trong đó : |D| là tổng số văn bản trong tập d
∣{d ∈ D : t ∈ d}| là số văn bản có chứa từ t
Hình 11: Kết quả tính IDF trên Python
Công thức TF-IDF :
bản dj thì trọng số của từ đó trong vector đại diện sẽ là giá trị TF - IDF (tj, dj) ngược lại là 0.
2.1.3. Thuật toán học có giám sát Multi-Class SVM
SVM (Support Vecto Machine) là một thuật toán thuộc nhóm Supervised Learning (Học có giám sát) đã và đang được ứng dụng trong rất nhiều lĩnh vực như: nhận diện khuôn mặt (Osuna, Freund và Girosi, 1997), phân loại văn bản (Joachims, 1997), nhận diện chữ viết tay, phân loại Email - lọc thư tay. Trong bài khoá luận này, sẽ đề cập đến ứng dụng dùng để phân chia dữ liệu thành các nhóm riêng biệt.
Phát biểu bài toán :
- Input : các dữ liệu đầu vào
- Output : phân loại dữ liệu đầu vào thành hai nhóm riêng biệt theo màu xanh đỏ (như hình)
Hình 13: Mô hình thuật toán SVW hai chiều
Có thể tìm được rất nhiều đường thẳng để phân chia hai màu xanh đỏ thành hai lớp riêng biệt. Nhưng làm sao để xác định được đường thẳng đó có tối ưu hay không ? Ket quả nghiên cứu cho ra rằng, đường thẳng tối ưu đó là đường làm cho hai lớp dữ liệu cách xa nhau và cách xa chính đường thẳng đó nhât.
Để tính toán tối ưu, trong SVM sử dụng thuật ngữ Margin. Margin là khoảng cách giữa đường thẳng đến 2 điểm dữ liệu gần nhất tương ứng với 2 phân lớp.
Hình 14: Mô hình đường thẳng tối ưu trong SVM
Giả sử phương trình đường phân chia cần tìm có dạng :
W1X1 + W2X2 + b = 0
2
Cách tính margin: margin = J 2+ 2
Tuy nhiên với những bộ dữ liệu phức tạp không thể tìm được đường thẳng phân chia trên mặt phẳng, ta phải ánh xạ chúng vào không gian n chiều để phân lớp.
Input Space Feature Space
Hình 15: Mô hình thuật toán SVM trong không gian
Trong trường hợp này, phương trình siêu phẳng có dạng: WTX + b = 0 Khi đó, margin = ɪ
Ý tưởng của phương pháp này là cho trước một tập mẫu huấn luyện đã được biểu diễn trong không gian vecto, trong đó mỗi dữ liệu là một điểm. Phương pháp này sẽ tìm ra một siêu phẳng f tốt nhất để chia các điểm đó thành 2 lớp riêng biệt. Chất lượng của siêu phẳng này sẽ được quyết định bởi khoảng cách, gọi là Margin (lề), của điểm dữ liệu gần nhất của mỗi lớp đến mặt phẳng này. Khi đó, khoảng cách lề càng lớn thì mặt phẳng quyết định càng tốt, việc phân loại chính xác.
Áp dụng thuật toán vào bài toán phân loại câu hỏi:
Ví dụ: tập huấn luyện T được biểu diễn trong không gian vecto đặc trưng, gồm có 15 intents tương ứng với 15 lớp cần huấn luyện. Trong đó mỗi tài liệu là một điểm thì phương pháp này sẽ tìm ra các siêu phẳng giúp phân chia các điểm trên không gian thành 15 lớp riêng biệt.
Các câu hội thoại tiếp theo sẽ sử dụng chính mô hình phân lớp trên để phân lớp.
2.2. Bài toán trích xuất thông tin
Sau khi intent đã được xác định, bước tiếp theo cần xác định được các thông tin khác trong câu truy vấn của khách hàng. Các thông tin cần được xác định thường là các thực thể ví dụ như: vị trí, thời gia, khoảng cách, địa chỉ liên lạc... Thành phần hiểu ngôn ngữ trong các hệ thống bot thường được tích hợp thành phần nhận dạng thực thể giúp phát hiện ra các thực thể có trong mỗi hội thoại.
Bài toán phổ biến trong trích xuất thông tin là bài toán gán nhãn chuỗi. Phát biểu bài toán:
- Input: một dãy các từ {x1, X2, ..., Xn}
- Output: một dãy các nhãn tương ứng đầu vào {y1,y2, ---,yn}
Hiện nay, có rất nhiều hướng tiếp cận mô hình gán nhãn chuỗi và CRFs
(Conditional Random Fields) là một thuật toán huấn luyện mô hình gán nhãn chuỗi
rất thành công.
2.2.1. Thuật toán CRFs
CRFs là mô hình trạng thái tuyến tính vô hướng (máy trạng thái hữu hạn được huấn luyện có điều kiên) và tuân theo tính chất Markov thứ nhất. CRFs đã được chứng minh rất thành công cho các bài toán gán nhãn cho chuỗi như tách từ, gán nhãn cụm từ, xác định thực thể, gán nhãn cụm danh từ...
Gọi o = (o1, 02, .., OT) là một chuỗi dữ liệu quan sát cần được gán nhãn.
Gọi s là tập trạng thái, mỗi trạng thái liên kết với một nhãn l∈L . Đặt s = (s1, S2,., ST ) là một chuỗi trạng thái nào đó, CRFs xác định xác suất điều kiện của một chuỗi trạng thái khi biết chuỗi quan sát như sau:
p(s∣o) = ⅛eχp [ ∑τ
t=1∑kΛkfk(St-1,St,0,t)](1)
Gọi Z(o) = ∑(s,)exp[ ∑t=1∑kΛkfk(st-1,st,o,t)] là thừa số chuẩn hóa trên toàn bộ các chuỗi nhãn có thể.
fk xác định một hàm đặc trưng
Λklà trọng số liên kết với mỗi đặc trưng fk .
Mục đích của việc học máy với CRFs là ước lượng trọng số này. Ở đây, ta có hai đặc trưng fk: đặc trưng trạng thái (per-state) và đặc trưng chuyển (transition).
fkkper~state∖st,o,t) = δ(st,l)xk(o,t) (2) ∕kαransltl°n∖¾-1.⅛t)= S(st-1,l)δ(st,l) (3)
Ở đây δ là Kronecker-δ. Mỗi đặc trưng trạng thái (2) kết hợp nhãn l của trạng thái hiện tại St và một từ ngữ cảnh - một hàm nhị phân Xk (o, t) xác định các ngữ cảnh quan trọng của quan sát o tại vị trí t. Một đặc trưng chuyển (3) biểu diễn sự phụ thuộc chuỗi bằng cách kết hợp nhãn l của trạng thái trước st-1và nhãn l của trạng thái hiện tại St .
Người ta thường huấn luyện CRFs bằng cách cực đại hóa hàm likelihood theo dữ liệu huấn luyện sử dụng các kĩ thuật tối ưu như L-BFGS. Việc lập luận (dựa trên mô hình đã học) là tìm ra chuỗi nhãn tương ứng của một chuỗi quan sát đầu vào. Đối với CRFs, người ta thường sử dụng thuật toán quy hoạch động điển hình là Viterbi để thực hiện lập luận với dữ liệu mới.
2.3. Bài toán quản lý hội thoại (DM)
Thành phần DM có chức năng là:
Hình 16: Chức năng của thành phần quản lý hội thoại
UnderThe Hood
Rasa Core: Dialogue Handling
previous
Action
Thành phần dialogue state được lưu lại và dựa vào tập luật hội thoại (dialogue policy) để quyết định hành động tiếp theo cho câu trả lời của bot trong một kịch bản hội thoại hay hành động (action) chỉ phụ thuộc vào trạng thái dialogue state trước của nó.
Hiện nay, có nhiều nghiên cứu mới áp dụng mô hình RNN vào quản lý hội thoại giúp cho hệ thống bot ngày càng thông minh hơn.
Ứng dụng RNN vào quản lý hội thoại: Thuật toán RNN được áp dụng cho chức năng theo dõi trạng thái hay ngữ cảnh hội thoại dialogue state trong DM.
2.3.1. Mô hình word-based DST
Như đã biết thành phần DM có nhiệm vụ quan trọng nhất đó là quản lý các trạng thái hay ngữ cảnh của hội thoại để quyết định được hành động tiếp theo. Vậy việc quyết định action tiếp theo thì dựa vào đâu? Đó chính là dữ liệu đầu vào của người dùng, dữ liệu các slot được lưu trong bộ nhớ và trạng thái của các action ở trước. Với khả năng lưu được các thông tin trong việc xử lý các bài toán dạng chuỗi thì mạng RNN được ứng dụng trong việc xác định ngữ cảnh và quyết định action tiếp nhờ vào các thông tin lưu được trong bộ nhớ mạng RNN.
Hình 18: Mô hình word- based DST với mạng RNN [4]
User Utterance: là câu dữ liệu đầu vào của người dùng
Hidden: là lớp ẩn được sử dụng trong thành phần NLU để vector hóa ngôn ngữ,
phân loại ý định và trích xuất được các thông tin người dùng
Memory: là bộ nhớ lưu các giá trị vector hóa ngôn ngữ và ngữ cảnh hội thoại bao
gồm cả slot
Slot: thông tin được trích xuất được lưu lại trong các câu nói người dùng
Action State: trạng thái action trước. Nó mang tính ngữ cảnh ở trong đoạn hội thoại
2.3.2. Mô hình Global-Locally Self-Attentive DST (GLAD)
Với các mô hình theo dõi trạng thái hội thoại khác thường xác định intent người dùng trực tiếp trên danh sách các đoạn hội thoại đã trainning cho bot sẽ gặp vấn đề về nhập nhằng xác định 1 intent trong các đoạn hội thoại có sử dụng cùng 1 intent. Tức là với cùng 1 câu nói người dùng xác định được 1 intent thì intent đó có thể được dùng nhiều trong các đoạn hội thoại. Với tư tưởng xác định cả ngữ cảnh
cho từng đoạn hội thoại thì việc xác định intent năm trong đoạn hội thoại nào sẽ tăng thêm độ chính xác.
Hình 19: Mô hình Global-Locally Self-Attentive DST (GLAD) [4]
Các tham số đầu vào cho phần local và global là các giá trị intent người dùng (X), các slot và action state (C)
Hình 20: Global-locally self-attentive encoder modul [4]
Việc dùng các slot trong mô hình cần lưu ý là sau kết thúc mỗi hội thoại thì nên xóa các slot không dùng nữa để tránh nhập nhăng xác định ví trí chính xác intent của người dùng trong danh sách các đoạn hội thoại mà bot được đào tạo.
2.4. Tóm tắt chương 2
Nội dung chương 2 đã đề cập đến 3 bài toán quan trọng khi xây dựng một hệ thống chatbot cũng như một số thuật toán tiêu biểu: thuật toán Bag-of-Words, TD-
IDF, CRFs, mô hình word-based DST vàs mô hình Global-Locally Sefl-Attentive DST. Đây là những thuật toán được ứng dụng khi phân loại văn bản, gãn nhãn cho chuỗi như tách từ, xác định thực thể...
Trong chương tiếp theo, bài khoá luận sẽ hướng tới xây dựng một mô hình giải quyết bài toán và các bước cụ thể.
CHƯƠNG 3: ỨNG DỤNG MÃ NGUỒN MỞ RASA XÂY DỰNG HỆ THỐNG CHATBOT HỖTRỢNGƯỜIDÙNG
3.1. Bài toán
“Hệ thống chatbot hỗ trợ quản lý bán hàng” là một hệ thống được sinh ra giúp cho các doanh nghiệp cải thiện dịch vụ khách hàng, tiếp cận và chăm sóc khách hàng một cách rất hiệu quả, tiết kiệm chi phí và mang lại nguồn lợi nhuận cao. Đó chính là các giải pháp mà doanh nghiệp cần nếu muốn phát triển trong tương lai. Ở Việt Nam hiện nay đã có rất nhiều bot hỗ trợ quản lý bán hàng được xây dựng trên các nền tảng như Chatfuel, Messnow, ManyChat...
Trong những năm trở lại đây, Rasa là một trong những nền tảng được dùng để xây dựng hỗ trợ khách hàng và ngành dịch vụ. Cùng với Dialogflow đây là hai nền tảng đứng đầu trong danh sách ưu tiên hiện nay. Tuy nhiên, Rasa là nền tảng mã nguồn mở, là frameword duy nhất cho phép chatbot đối thoại tinh vi hơn, có tương tác, được huấn luyện dựa trên học có giám sát. Vì vậy nên tôi đã lựa chọn xây dựng bài toán trên nền tảng mã nguồn mở Rasa.
Bài toán “xây dựng hệ thống chatbot hỗ trợ quản lý bán hàng trên ứng dụng mã nguồn mở rasa” có chức năng trả lời những truy vấn của khách hàng về sản phẩm, dịch vụ của doanh nghiệp như:
- Tôi muốn biết giá sản phẩm?
- Thông tin của sản phẩm?
- Chương trình khuyến mại hôm nay là gì?
- Cửa hàng có bao nhiêu cơ sở? Sơ đồ phát triển bài toán:
Hình 21: Sơ đồ phát triển bài toán
Hệ thống Chatbot này hoạt động giúp cho doanh nghiệp cải thiện dịch vụ khách hàng, chăm sóc khách hàng, bán được sản phẩm và tăng lợi nhuận. Bên cạnh