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 đó, hệ thống sẽ giúp cho các doanh nghiệp xây dựng các cuộc hội thoại theo lớp, theo ngữ cảnh và nhiều tương tác qua lại.
Phát biểu bài toán:
- Input: truy vấn của người dùng
- Output: phản hồi của bot Khi đó:
+ Thành phần NLU sẽ đảm nhiệm vai trò vecto hoá ngôn ngữ, xác định intent và trích xuất thông tin của người dùng.
Hình 23: Các bước xử lý trong NLU [5]
Để giải quyết câu hỏi trên, bộ phận NLU sẽ xử lý ngôn ngữ, sử dụng các thuât toán như tách từ Tokenizer, phân tích cú pháp, gán nhãn từ loại, nhận dạnh tên thực thể sau đó đối chiếu với tập dữ liệu đã được gán nhãn trước đó và đưa ra ý định của người dùng intent là “ask_gia_san_pham” và trích xuất thông tin entity với tên sản phẩm là “điện thoại S20” và giathanh là “giá sản phẩm”
+ Thành phần DM sẽ tiếp nhận thông tin về intent và entity ở trên để đưa ra xác định action xử lý cho câu đầu vào trên. Trong ví dụ này DM sẽ đưa ra action là “Action_utter_ask_gia_san_pham”.
# Configuration for Rasq NLU.
# https ://rasa. com/docs/rasa/nlu/components/
language: vi∣
+ Cuối cùng, thành phần NLG sẽ sinh ra câu trả lời dựa vào dữ liệu các mẫu câu template đã được xây dựng trước đó.
3.3. Ứng dụng rasa xây dựng chatbot
3.3.1. Các bước xây dựng Chatbot trên nền tảng ứng dụng Rasa
về cơ bản, Rasa có 2 thành phần chính quan trọng cấu thành là :
- Rasa NLU: có tác dụng xử lý thông tin, xác định intent và trích xuất thông tin của người dùng.
- Rasa Core: dự đoán hành động chatbot cần làm để trả lời người dùng. Ngoài ra, còn có Rasa X. Hiểu một cách đơn giản thì đây chính là giao diện
của toàn Rasa.
Các bước thực hiện khi xây dựng Chatbot trên nền tảng rasa:
Hình 24: Các bước xây dựng Chatbot trên rasa
- Khi tin nhắn của khách hàng được gửi đến, thông điệp được nhận và sẽ chuyển đến một Interpreter. Trong đó, bộ phận NLU sẽ xử lý thông điệp nhận được và chuyển đổi thông điệp đó thành một từ điển bao gồm : văn bản gốc,ý định và các thực thể.
- Tracker là đối tượng theo dõi trạng thái hội thoại. Nó nhận được thông báo rằng một tin nhắn mới đã đến.
- Policy sẽ nhận được trạng thái hiện tại của Tracker và ra quyết định chọn Action tiếp theo.
- Action được chọn sẽ được ghi lại bởi Tracker.
- Một tin nhắn phản hồi sẽ được gửi lại đến khách hàng.
Trên đây là toàn bộ quá trình xử lý của rasa, Rasa NLU sẽ lo phần 1, 2. Còn lại các phần 3, 4, 5, 6 sẽ do Rasa Core đảm nhiệm.
3.3.2. Xây dựng dữ liệu cho chatbot
Rasa đưa ra 2 phương pháp chính xây dựng dữ liệu trainning cho bot:
- Pretrained Embeddings (Intent_classifier_sklearn) : Việc phân loại ý định người dùng sẽ dựa trên các tập dữ liệu được lọc trước, sau đó được sử dụng để thể hiện từng từ trong thông điệp người dùng dưới dạng từ nhúng (word embedding) hay biểu diễn ngôn ngữ dưới dạng vector(word2vec). Các tập dữ liệu này có thể được cung cấp từ Spacy hoặc MITIE ...
- Supervised Embeddings (Intent_classifier_tensorflow_embedding): Nhúng được giám sát. Với phương pháp này thì người dùng sẽ phải tự xây dựng dữ