Trong bài tutorial Làm sạch dữ liệu Twitter, ta đã sử dụng API của Language Tool để sửa lỗi chính tả các từ viết sai hoặc dùng không đúng. Tính tới thời điểm hiện tại (12/2018), có lẽ Language Tool là công cụ soát lỗi chính tả tốt nhất có cung câp API để giúp lập trình viên tích hợp vào ứng dụng của mình. Tuy nhiên qua quá trình sử dụng, ta có thể thấy điểm hạn chế về độ chính xác của Language Tool API. Một số công cụ khác có độ chính xác cao hơn (như Grammaly, Ginger,…) lại không cung cấp API nhưng cho phép người dùng sử dụng bằng cách truy cập vào website của họ. Do đó, để sử dụng các công cụ này ta có thể sử dụng Selenium giả lập tương tác của người dùng và trích xuất kết quả trả về.

Selenium là một trình duyệt tự động, được phát triển với mục đích ban đầu nhằm kiểm tra (testing) các ứng dụng web một cách tự động. Tuy nhiên ta có thể sử dụng Selenium trong bất kỳ bài toán nào phù hợp với khả năng của nó. Hiểu một cách đơn giản, Selenium sẽ giả lập tất cả các hoạt động của người dùng một cách hoàn toàn tự động. Ví dụ khi ta muốn đăng một bài post lên Facebook cá nhân thì trước hết ta phải mở một trình duyệt, nhập địa chỉ Facebook, nhập địa chỉ email và password, nhấn vào nút login rồi đăng tải bài viết. Tương tự như vậy, ta có thể sử dụng Selenium để giả lập tất cả các hoạt động này: Selenium sẽ tự động mở một trình duyệt (tùy thuộc vào việc thiết lập thuộc tính của người dùng mà Selenium có thể mở bằng trình duyệt Chrome, FireFox,Opera …), tự động truy cập vào địa chỉ URL đã được thiết lập sẵn, tự động nhập địa chỉ email, password, tự động nhấp với nút login và tự động đăng bài viết với nội dung định sẵn.

Để giúp các bạn dễ hình dung cách sử dụng và phương thức hoạt động của Selenium, chúng ta sẽ thực hành viết một chương trình sử dụng Selenium soát lỗi chính tả trên trang Ginger Spell Checker (Gramarly có thể cho kết quả chính xác hơn nhưng việc cấu hình Selenium phức tạp hơn và ta cần có tài khoản Premium trả phí để truy cập kết quả trả về dưới dạng pdf. Các bạn có thể tham khảo chương trình viết bằng ngôn ngữ Python sử dụng Selenium để lấy kết quả từ Gramarly tại đây).

Trước hết ta cần thêm dependency của Selenium vào file pom.xml như sau:

Ngoài ra, Selenium cần một trình duyệt web để truy cập các trang web. Do đó ta cần download webdriver tương ứng tại đây (nếu các bạn muốn sử dụng Firefox thì các bạn chọn Mozilla GeckoDriver, Chome thì dùng Google Chrome Driver,..). Trong bài này, chúng ta sẽ chạy Selenium sử dụng Chrome. Sau khi download Google Chrome Driver, các bạn nhấn chuột phải vào thư mực src/main/resources, chọn New -> Directory để tạo thư mục mang tên SeleniumWebDriver. Sau đó bạn copy file chromedriver.com vừa download vào trong thư mục này.

Tiếp theo ta tạo một Java class với tên GingerSelenium. Trong hàm main của class này ta cấu hình Selenium sử dụng Chrome bằng cách thiết lập thuộc tính của Chrome với đường dẫn tới file chromedriver.com như sau:

Ta cấu hình Selenium để truy cập vào trang của Ginger như sau:

Sau khi truy cập và một trang web đã được thiết lập sẵn, Selenium giả lập thao tác của người dùng bằng cách tìm các phần tử của trang web dựa trên định danh của phần tử đó (có thể là ID, name, class,css,.. hoặc có thể kết hợp nhiều thuộc tính như (class,css), (name, class),..) rồi thực hiện các thao tác được định sẵn. Để xác định ID của một phần tử nào đó trên một trang web, các bạn có thể sử dụng Inspect trong Google Chrome. Ví dụ khi bạn dùng Chrome để truy cập trang web Ginger Spell Checker.

Các bạn muốn biết ID của nút ‘Try it’, thì các bạn di chuyển con trỏ chuột lên vị trí của ‘Try it’ rồi nhấn chuột phải, chọn Inspect.

Một cửa sổ hiện ra, trong phần Elements có đoạn bôi xanh, thể hiện thông số của phần tử được lựa chọn. Ta có thể thấy ID của ‘Try it’ ở đây là ‘GingerWidget-submitButton’.

Sau khi tìm được ID, ta cấu hình Selenium làm việc với phần tử mang ID đó như sau:

Ta sử dụng WebDriverWait ở đây do nhiều trường hợp khi ta click vào một phần tử thì cần một thời gian nhất định để trang web có thể load được phần tử đó (tùy thuộc vào tốc độ internet và tốc độ load phần tử của trang web)

Quay trở lại việc sử dụng Ginger, sau khi truy cập vào trang Ginger Spell Checker, ta di chuyển con chuột lên chữ ‘Express’, nhấn chuột phải chọn Inspect ta biết được ID của khu vực text này là GingerWidget-originalHtmlText. Ta cần click vào phần tử này để có thể điền đoạn text cần kiểm tra. Việc này được thực hiện trong Selenium như sau:

Tiếp theo ta cần biết ID của phần tử dùng để nhập text, do đó sau khi click ta tiếp tục nhấn chuột phải chọn Inspect và biết được ID là GingerWidget-originalHtmlText. Ta nhập đoạn text cần kiểm tra bằng cách sử dụng hàm sendKeys() như sau (hàm Thread.sleep() được sử dụng để giúp ta có thể quan sát việc duyệt trình duyệt của Selenium):

Sau đó ta cần nhấp chuột vào nút ‘Go’ để kiểm tra chính tả cho đoạn text vừa nhập vào. Việc này được thực hiện bằng việc tìm ID của nút ‘Go’ và giả lập thao tác click như sau:

Ginger trả kết quả kiểm tra ở phần ngay dưới khu vực nhập text.

Để lấy kết quả, ta tìm ID của phần tử này và trích xuất giá trị của nó như sau:

Như vậy, ta đã hoàn thành việc cấu hình Selenium giả lập thao tác người dùng để kiểm tra lỗi chính ta một đoạn text trên Ginger. Ta sẽ so sách kết quả của Ginger với kết quả của việc sử dụng Language Tool trong bài trước để đánh giá độ chính xác của hai trường hợp (qua kiểm tra thì việc sửa lỗi chính tả sử dụng trang web online của Language Tool cho kết quả chính xác hơn việc sử dụng API của nó).

Full code của chương trình được viết ở bên dưới (code đã được chỉnh sửa so với hướng dẫn ở trên để có thể kiểm tra nhiều đoạn text khác nhau nhưng nguyên tắc sử dụng Selenium thì không thay đổi).

Chạy chương trình trên ta được kết quả:

Ở câu đầu tiên, LanguageTool không phát hiện ra có lỗi chính tả nào, trong khi Ginger phát hiện từ village nên được để ở số nhiều (do có từ many). Tuy nhiên cả hai không phát hiện được việc thiếu động từ ‘to be’ trong câu (nên dùng are still struggling)

Ở câu thứ 2, cả hai công cụ đều phát hiện từ viết sai là ‘preserved’. Tuy nhiên Ginger còn phát hiện từ dùng không đúng là ‘has’ (nên dùng ‘is’)

Ở câu tiếp theo, cả hai công cụ đều chỉnh lại chữ viết hoa ‘The’ nhưng không phát hiện các từ viết sai là ‘are’ (nên là ‘is), well-know (nên là well-known) và finestes (nên là finest)

Ở câu cuối, cả hai công cụ đều phát hiện từ viết sai là ‘domesti’. Tuy nhiên Ginger còn phát hiện từ viết sai là ‘prouded’ (nên dùng ‘proud’) và chỉnh sửa đúng từ wod thành world thay vì won như LanguageTool

Như vậy, ta có thể thấy Ginger trả về kết quả chính xác hơn so với việc sử dụng API của LanguageTool. Tuy vậy, Ginger cần nhiều thời gian hơn do sử dụng Selenium và cả hai công cụ đều không thể hoàn toàn phát hiện lỗi chính tả trong một số trường hợp (Gramarly cho kết quả chính xác hơn nhưng cũng không thể phát hiện ra hết các lỗi chính tả)

Ngoài ra, nếu ta không muốn mở trình duyệt web trong khi chạy chương trình thì ta có thể thiết lập chế ‘headless’ trong Chrome. Chế độ này còn cho phép ta chạy chương trình nhanh hơn vì không cần phải mở một trình duyệt và không mất thời gian để trình duyệt load CSS, JavaScript,….Để thiết lập chế độ này ta thay dòng webDriver= new ChromeDriver() ở full code bên trên bằng đoạn code bên dưới:

Tháng Mười Hai 1, 2018
ITechSeeker