Nui Blog (ngxson)

Trời tính không bằng máy tính

blog, chatbot, facebook

#23: Tìm “đối” bằng Machine Learning?

Các đây 1 tuần, Chatbot CNH đã tung ra phiên bản thử nghiệm Alpha của hệ thống ghép đôi mới (ứng dụng Machine Learning). Tuy nhìn ngoài tưởng chừng như ko có nhiều thay đổi, nhưng thực chất bên trong mã nguồn của chatbot đã được lập trình lại hoàn toàn. Trong bài này, mình sẽ chia sẻ 1 chút về nguyên lý mới mà chatbot đang thử nghiệm.

Trước hết, chúng ta cùng nhắc lại nguyên lý cũ mà chatbot dùng để ghép cặp:

  • Trong chatbot có 1 “hàng chờ”
  • Khi 1 người bấm “Tìm đối chat”, chatbot sẽ tìm xem trong hàng chờ đó có ai phù hợp không
  • Nếu có, chatbot sẽ bỏ 2 người ra khỏi hàng chờ và ghép họ vào thành 1 đôi

“Hàng chờ” ở thời điểm có 4 bạn nữ

Tuy nguyên lý này chạy nhanh, nhưng nó có 1 vấn đề lớn, đó là “hàng chờ” thường có khá ít người, và vì vậy việc ghép đôi thường rất lộn xộn (ai vào trc thì được ghép trc)

Vì vậy, mình đã thay đổi quy trình như sau:

  • Vẫn có 1 “hàng chờ”
  • Khi 1 người bấm “Tìm đối chat”, chatbot sẽ thêm người đó vào hàng chờ (nhưng không ghép đôi luôn)
  • Sau 1 khoảng thời gian nhất định, chatbot mới thực hiện ghép đôi như sau:
  • Đối với mỗi người trong hàng chờ, lập cho họ 1 danh sách các “ứng viên” mà người này có thể ghép đôi (dựa theo xu hướng giới tính)
  • Xếp hạng “mức độ phù hợp” với mỗi “ứng viên” trong danh sách, và ghép cặp người đó với “ứng viên” phù hợp nhất (dựa theo sở thích, tính cách – sẽ nói sau đây)
  • Sau khi đã có kết quả từ bước trên, chatbot mới thực hiện ghép đôi và thông báo cho mọi người biết để bắt đầu chat

Quy trình mới này dù lâu hơn 1 chút, nhưng sẽ làm tăng chất lượng cho việc ghép cặp, nhờ đó sẽ tăng khả năng người dùng tìm đc “đối” phù hợp với bản thân hơn.

Xử lý dữ liệu về tính cách

Đây là phần mà mình tập trung vào thử nghiệm ở phiên bản Alpha này. Hiện tại, mỗi người sẽ cần chọn 5 từ miêu tả bản thân, và “vector tính cách” của người này sẽ được tính toán dựa theo 5 từ đó.

Nhưng vì sao lại là VECTOR ?

Mình xin giới thiệu 1 ý tưởng khá hay, đó là “word vector”.

Hãy tưởng tượng mỗi từ trong từ điển ứng với 1 điểm trên mặt phẳng 2 chiều, ví dụ ở đây có 3 từ: “trai”, “gái” và “già”

Giờ nếu hãy tưởng tượng, 1 người con trai già thì bình thường bạn sẽ gọi là gì… tất nhiên là “ông” rồi. Hành động này cũng giống như việc bạn làm phép tính vector: O.trai + O.già = O.ông (với O là gốc trục tọa độ)

Và tương tự, O.nữ + O.già = O.bà, dễ hiểu đúng ko nào?

Vậy làm thế nào để có “tọa độ” của các từ này? Thực chất trên internet họ đã lập trình sẵn các phần mềm để đưa input là một đống các bài viết (lấy từ báo, tạp chí, trang web,…), và phần mềm sẽ tìm ra “logic” của các từ ngữ.

Vì không có nhiều thời gian tìm hiểu sâu, mình xin được phép dùng pre-trained model “UETsegmenter” bởi anh phongnt570 (xin chân thành cảm ơn anh!). Model này sử dụng 1 vector 300 chiều cho mỗi 1 từ (thay vì 2 chiều như trong ví dụ trên)

Quay lại với chatbot, để tính toán “vector tính cách” , mình cộng tổng tất cả các vector của các từ mà người đó đã chọn. Và kết quả là ta nhận đc 1 vector 300 chiều biểu diễn “tọa độ” của người đó

Để tính “chỉ số phù hợp” của người đó (gọi là bạn A) và 1 bạn khác (gọi là bạn B), mình chỉ cần đơn giản là tính khoảng cách giữa 2 điểm trong không gian, sử dụng công thức euclidienne distance

Cách làm này tuy hiện tại vẫn chưa cho kết quả chính xác hoàn toàn, nhưng nó sẽ mở ra rất nhiều cơ hội như:

  • Mình có thể thêm các tùy chọn 1 cách rất dễ dàng (ví dụ thêm câu hỏi gu âm nhạc, thích nuôi chó hay mèo,…)
  • Cộng tổng các vector thì hơi đơn giản, nên về sau mình có thể có 1 cách khác phức tạp hơn để tính ra “vector tính cách” (ví dụ như dùng convolutional neural network)
  • Mình sẽ hoàn toàn ko phải code những thứ quá “thủ công”. Tất cả dữ liệu (gọi là training data) có thể đc lấy từ khảo sát, và máy sẽ tự động “học” tất cả những logic này.

Lời kết: Hãy inbox page Chatbot CNH để trải nghiệm hệ thống ghép đôi thú vị này!!

Theme by Anders Norén