12/08/2018, 14:53

Chatbot tutorial with Rails - Part 1

Chào mọi người, như đã hứa ở bài viết Simple Chatbot with ruby, ở bài này mình sẽ hướng dẫn các bạn làm thế nào để xây dựng ứng dụng chat bot đơn giản trong Ruby on Rails. Sau bài viết đó mình đã tìm hiểu là thế nào để nhúng con bot của Telegram đó vào ứng dụng của mình. Và kết quả là một đống thứ ...

Chào mọi người, như đã hứa ở bài viết Simple Chatbot with ruby, ở bài này mình sẽ hướng dẫn các bạn làm thế nào để xây dựng ứng dụng chat bot đơn giản trong Ruby on Rails. Sau bài viết đó mình đã tìm hiểu là thế nào để nhúng con bot của Telegram đó vào ứng dụng của mình. Và kết quả là một đống thứ phức tạp: cài đặt Webhook, điều hướng con bot, config tùm lum hết trơn. Vậy có cách nào đơn giản hơn không ? Làm sao để có thể xây dựng 1 con bot của mình trong khi mình chả có tí kiến thức gì về Machine Learning ? Vâng, lúc này mới thấy câu "Google is your best friend" nó đúng đến nhường nào. Mặc dù trước đó mình đã tìm nát google nhưng kết quả không khả quan hơn là mấy. Vẫn là một đống phức tạp như suy nghĩ của phụ nữ :v, và bỗng 1 hôm 1 đường link xuất hiện trong hàng triệu đường link, dẫn đường đến động bàn tơ =))

Nãy giờ chém gió đủ rồi =)) , bây giờ mình sẽ đi vào vấn đề chính. Như ở trên mình đã đề cập, đường link mà mình đã tìm ra có phải là link mà đường tăng hay xin không ? Tất nhiên là không rồi, vi đường tăng đã biết đường đến động bàn tơ từ cả mấy thế kỉ trước rồi =)). Sau khi khám phá động bàn tơ, thứ mình tìm thấy không phải là các cô yêu tinh nhện xinh đẹp, mà là một gem giúp cho chúng ta có thể tạo ra một con chatbot đơn giản, không cần phải cài đặt gì nhiều, việc của chúng ta chỉ là training cho nó hiểu tiếng người mà thôi =)) Thứ mà mình đang đề cập đến là thuật toán xử lí ngôn ngữ tự nhiên Naive Nbayes, nó là một đống các công thức lằng nhằng, nếu các bạn là nhà nghiên cứu thì có thể search google nhé, ở đây mình chỉ đề cập đến vấn đề làm thế nào để xử dụng nó thôi. Và thuật toán xử lí ngôn ngữ này đã được viết thành 1 gem, chúng ta chỉ việc cài đặt và sử dụng nó thôi. Dưới đây sẽ là một số gem mình sẽ sử dụng:

  • nbayes gem
  • devise gem
  • bootstrap gem
  • haml gem nbayes gem cung cấp cho chúng ta đầy đủ các tính năng để xử lí ngôn ngữ tự nhiên dựa trên thuật toán Naive Bayes

Init Project

Đầu tiên chúng ta sẽ tạo ra 1 project mới

rails new chatbot_example

Tiến hành caì đặt các gem:

# path: chat_bot_example/Gemfile
.
.
# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development
 
gem 'devise'
gem 'bootstrap-sass'
gem 'nbayes'
gem 'haml-rails'
 
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platform: :mri
end
.

Cài đặt devise và khởi tạo model User

$cd chat_bot_example               # Go to app folder
$bundle install                    # Fetch and install the gems
$rails generate devise:install     # Creates config file, etc.
$rails generate devise user        # Create model class, routes, etc.
$rake db:migrate                   # Create user table
$rails generate devise:views users # Creates (minimal) views

Khởi tạo trang chủ

Khởi tạo 1 home controller, add action index và sử dụng nó làm trang mặc định của website

# path: app/controllers/home_controller.rb
class HomeController < ApplicationController
  def index
  end
end

Tạo view cho trang chủ

# path: app/views/home/index.html.haml
- if user_signed_in?
  %h3 Hello user, welcome to chatbot demo
- else
  %h1 welcome to rails community

Khởi tạo layout và dữ liệu mẫu

Tạo layout

# path: app/views/layouts/application.html.haml
!!!
%html
  %head
    %meta{content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}
    %title ChatBotExample
    = csrf_meta_tags
    = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload'
    = javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
  %body
  .container
    - if user_signed_in?
      .navbar.navbar-text.pull-right
        Logged in as
        %strong
          = current_user.email
        = link_to 'Edit profile', edit_user_registration_path, class: 'navbar-link'
        |
        = link_to "Logout", destroy_user_session_path, method: :delete, class: 'navbar-link'
      .navbar.navbar-text.pull-left
        = link_to 'Home', root_path, class: 'navbar-link'
        |
        = link_to 'Phones', phones_path, class: 'navbar-link'
        |
        = link_to 'Televisions', televisions_path, class: 'navbar-link'
        |
        = link_to 'Laptops', laptops_path, class: 'navbar-link'
    - else
      .navbar.navbar-text.pull-right
        = link_to "Sign up", new_user_registration_path, class: 'navbar-link'
        |
        = link_to "Login", new_user_session_path, class: 'navbar-link'
  .container
    = yield

Sử dụng lệnh scaffold tạo ra các ví dụ, ở đây gồm televisio, phone và laptops

$rails g scaffold laptop name:string description:text price:float
$rails g scaffold television name:string description:text price:float
$rails g scaffold phone name:string description:text price:float
$rake db:migrate

Vậy là đã xong quá trình chuẩn bị, trong bài post tiếp theo mình sẽ hướng dẫn làm thế nào để tạo con chatbot cho hệ thống dựa trên dữ liệu và các routes đã có (television, phone, laptop). Đây là con chat bot đơn giản mình đã delpoy lên heroku: http://botbotex.herokuapp.com/ Kịch bản xây dựng ở đây đang ở dạng rất đơn giản. Mọi người có thể follow đoạn training dưới đây của mình để test

laptop_enquiry:
  new_laptop_enquiry:
    - create a new laptop laptops
    - open new laptop laptops
  laptop_index_enquiry:
    - show all laptop laptops
    - take me to all laptop laptops page
    - go to all laptop laptops
  laptop_count_enquiry:
    - total laptop laptops
    - count laptop laptops
 
phone_enquiry:
  new_phone_enquiry:
    - create a new phone phones
    - open new phone phones
  phone_index_enquiry:
    - show all phone phones
    - take me to all phone phones page
    - go to all phone phones
  phone_count_enquiry:
    - total phone phones
    - count phone phones
 
television_enquiry:
  new_television_enquiry:
    - create a new television televisions
    - open new television televisions
  television_index_enquiry:
    - show all television televisions
    - take me to all television televisions page
    - go to all television televisions
  television_count_enquiry:
    - total television televisions
    - count television televisions

Cảm ơn mọi người đã theo dõi

0