POSTag, còn được gọi là gán nhãn ngữ pháp, là quá trình đánh dấu một từ trong văn bản tương ứng với một phần của lời nói, dựa trên cả định nghĩa và ngữ cảnh, quan hệ của từ đó với các từ xung quanh và các từ liên quan trong cụm, câu, đoạn văn. Ví dụ: một số lớp từ trong tiếng Anh danh từ, giới từ, đại từ, liên từ, động từ, tính từ, trạng từ… Một trong những bước tiền xử lý bắt buộc của POSTag là phân tách từ (Word Segmentation).
Vấn đề của POS tagging là sử lý nhập nhằng, lựa chọn nhãn từ phù hợp với ngữ cảnh. Ví dụ: từ “đá” trong câu “Con ngựa này được làm bằng đá” là danh từ nhừn trong câu “Bọn trẻ đang đá bóng” thì lại là động từ.
Một số ví dụ của POSTag:
- Văn bản đầu vào: Học_sinh học sinh_học
- Kết quả sau khi đã gán nhãn từ loại: Học_sinh/N học/V sinh_học/N (Trong đó /N là danh từ, /V là động từ)
Công cụ hỗ trợ 2.3.1. VnCoreNLP
VnCoreNLP [13] là một bộ công cụ gán nhãn dành cho tiếng Việt, cung cấp các công cụ xử lý ngôn ngữ tự nhiên như: Word Segmentation, POS tagging, Named Entity Recognition và Dependency Parsing.
Các tính chất của VnCoreNLP:
- Chính xác: VnCoreNLP là bộ công cụ xử lý ngôn ngữ tiếng Việt với độ chính xác cao. Với một bộ dữ liệu chuẩn thì VnCoreNLP cho ra một kết quả cao hơn tất cả các công cụ đã từng được công bố trước đây.
26 - Dễ dàng triển khai.
Hình 13: Luồng xử lý của VnCoreNLP
2.3.2. Word2vec
Word2vec là một kỹ thuật xử lý ngôn ngữ tự nhiên. Thuật toán này sử dụng mô hình neural network để học các liên kết từ một tập dữ liệu lớn. Sau khi huấn luyện một tập đủ lớn, mô hình này có thể phát hiện được những từđồng nghĩa hoặc có thể áp dụng vào cho bài toán gợi ý từ cho một từ hoặc một phần văn bản.
Kỹ thuật này sẽ gán giá trị vector (một danh sách các số cụ thể) cho từng từ riêng biệt. Các vector này được tính toán sao cho: nếu hai từcàng tương đồng về mặt ngữnghĩa thì chỉ số cosine similarity giữa hai vector biểu diễn chúng càng cao.
Word2vec có hai model là skip-grams và CBOW:
- Skip-grams là mô hình dự đoán từ xung quanh. Ví dụ khi áp dụng windows size là 3 cho câu “I love you so much” ra sẽ thu được tập {(I, love), love}, {(love, so), you}, {(you, much), so}. Khi cho đầu vào là từ “love” thì mô hình này sẽ dự đoán ra các từ xung quanh là “I” và “you”.
27
- CBOW (continous bag of word), mô hình này ngược lại với Skip-grams, tức là đầu vào sẽ là các từ và mô hình sẽ tính toán để đưa ra dự đoán từ liên quan đến các từ đầu vào.
Trong thực nghiệm thì CBOW huấn luyện dữ liệu nhanh hơn nhưng độ chính xác lại không cao hơn skip-grams và ngược lại, và chúng ta chỉ áp dụng một trong hai mô hình để huấn luyện tập dữ liệu.
2.3.3. Elasticsearch
Như đã giới thiệu, Elasticsearch là một công cụ tìm kiếm mã nguồn mở phân tán cho tất cả các loại dữ liệu bao gồm cả văn bản, số, không gian địa lý, cấu trúc và không có cấu trúc. Elasticsearch cung cấp các RESTful API để thực hiện các tác vụ trên server riêng biệt nên có thể tích hợp dễ dàng với bất kỳ hệ thống nào.
28
Chương 3
Hệ thống tìm kiếm tri thức trên miền Wikihow
Tính toán độ tương đồng giữa hai câu văn
Trong luận văn tôi đề xuất một phương pháp tính toán độ tương đồng giữa hai câu văn dựa trên chỉ số tương đồng Jaccard Similarity.
Chỉ số Jaccard còn được gọi là hệ số tương tự, chỉ số này có thể dùng để tính toán sự giống nhau giữa các tập mẫu hữu hạn ( trong đó các phần tử không trùng lặp) và được định nghĩa là kích thước của phần giao chia cho kích thước của phần hợp của các tập mẫu.
Biểu thức toán học của chỉ số được biểu diễn như sau:
𝐽(𝐴, 𝐵) = |𝐴 ∩ 𝐵||𝐴 ∪ 𝐵| = |𝐴| + |𝐵| − |𝐴 ∩ 𝐵||𝐴 ∩ 𝐵|
Giá trị sẽ nằm trong khoảng [0, 1] và bằng 1 khi hai tập này có các phần tử giống hệt nhau. Chỉ số này có thể được áp dụng để tính toán độ tương đồng giữa hai câu văn khi ta coi mỗi từ trong câu văn là một phần tử trong tập từ mà các phần tử này không trùng lặp. Nhưng nếu như chúng ta chỉ đơn thuần tìm các phần tử trong hai tập từ cần so sánh xem có xuất hiện trong tập từ còn lại không để tính số lượng từ giao nhau của hai tập thì sẽ không giải quyết được bài toán từ đồng nghĩa. Ở đây tôi muốn nói rằng, để tính toán độ tương đồng của hai câu văn dựa trên Jaccard Similarity thì phần giao ngoài việc tính số lượng từ xuất
hiện ở cả hai câu văn dựa trên các ký tự thì phải tính toán thêm sự tương đồng về ngữ nghĩa. Vì vậy tôi đề xuất một công thức tính độtương đồng cho hai chuỗi ký tựX và Y như sau:
29 𝑆(𝑋, 𝑌) = ∑𝑛−1𝑖=0 ∑𝑚−1𝑗=0 𝑀(𝑥𝑖, 𝑦𝑗) 𝑛 + 𝑚 − ∑ ∑𝑚−1𝑀(𝑥𝑖, 𝑦𝑗) 𝑗=0 𝑛−1 𝑖=0 Trong đó:
- S(X, Y): Độ tương đồng giữa 2 chuỗi ký tự X và Y.
- x, y: Lần lượt là tập hợp các từ trong chuỗi X và Y (các từ không trùng lặp).
- n, m: Lần lượt là số lượng các từ không trùng lặp trong chuỗi ký tự X và Y.
- 𝑴(𝒙𝒊, 𝒚𝒋) : Chỉ số tương đồng về ngữa nghĩa của 2 từ 𝑥𝑖 và 𝑦𝑗 dựa trên từ điển word2vec.
Ví dụ: Cho 2 câu sau:
- X : Cách để bày tỏ tình cảm với bạn gái.
- Y : Cách để thổ lộ tình yêu với bạn gái.
Sau khi phân tách từ ta sẽ có hai tập từ tương ứng như sau: - x = {cách, để, bày_tỏ, tình_cảm, với, bạn_gái} - y = {cách, để, thổ_lộ, tình_yêu, với, bạn_gái} - n = 6, m = 6
Dễ dàng để nhận thấy hai tập x, y có tập từ chung nhau (phần giao):
{cách, để, với, bạn_gái} (4 phần tử)
Và hai tập x, y hợp với nhau (phần hợp) thành tập từ:
{cách, để, bày_tỏ, thổ_lộ, tình_cảm, tình_yêu, với, bạn_gái} (8 phần tử)
Nếu chúng ta áp dụng công thức của Jaccard Similarity thì độ tương đồng giữa 2 câu văn sẽ là:
30
Dựa vào từ điển word2vec ta sẽ có ma trận chỉ số tương đồng về ngữ nghĩa của các từ trong hai chuỗi X và Y như sau:
M(x, y) cách để thổ_lộ tình_yêu với bạn_gái
cách 1 0 0 0 0 0 để 0 1 0 0 0 0 bày_tỏ 0 0 0.619774 0 0 0 tình_cảm 0 0 0 0.705005 0 0 với 0 0 0 0 1 0 bạn_gái 0 0 0 0 0 1
Bảng 4: Ma trận chỉ sốtương đồng giữa các từ theo Word2vec
Khi đó độ tương đồng giữa hai chuỗi X và Y tính theo phương pháp đề xuất sẽ là: 𝑆(𝑋, 𝑌) = 6+6−(1+1+0.619774+0.705005+1+1)1+1+0.619774+0.705005+1+1 = 6.6752215.324779 ≈ 0.7977(2)
Nhìn vào hai kết quả tính độ tương đồng (1) và (2) thì cho thấy phương pháp đề xuất sẽ cho ra kết quả tương đồng cao hơn nếu như hai chuỗi đầu vào có chứa các từ đồng nghĩa.
Tập dữ liệu
Dữ liệu được sử dụng trong luận văn được thu thập từ website wikiHow
(https://www.wikihow.com/). Đây là một trang web cộng đồng trực tuyến mang tính chất
wiki. Được thành lập vào năm 2005 bởi Jack Herrick, tính đến năm 2017 wikiHow chứa hơn 190.000 bài viết hướng dẫn miễn phí và hơn 1.6 triệu người dùng đã đăng ký [14]. Dữ liệu được sử dụng trong luận văn này chỉ bao gồm những bài viết tiếng Việt. Dữ liệu này được trải rộng trong các lĩnh vực trong đời sống như:
31 - Nghệ thuật Giải trí
- Xe hơi và Phương tiện Khác - Máy tính và Điện tử
- Giáo dục và Truyền thông - Cuộc sống Gia đình - Tài chính và Kinh doanh - Ẩm thực và Giải trí - Sức khỏe
- Sở thích và Thủ công Mỹ nghệ - Ngày lễ và Truyền thống - Nhà ởvà Làm vườn
- Chăm sóc Cá nhân và Phong cách - Thú cưng và Động vật
- Triết học và Tôn giáo - Mối quan hệ
- Thể thao và Thẩm mỹ - Du lịch
- Thế giới Làm việc - Giới trẻ.
Trong mỗi lĩnh vực, là tập hợp các bài biết về cách làm/công thức để thực hiện các vấn đề trong cuộc sống thường ngày chúng ta hay gặp phải, ví dụ như: Cách để làm gà rán KFC, Cách để nướng hạt điều, Cách nấu cơm bàng lò vi sóng, Cách xác định hắc lào, Các điều trị nấm móng… Mỗi bài viết bao gồm một hoặc nhiều phương pháp thực hiện và các bước thực hiện cụ thể cho mỗi phương pháp thông qua văn bản và hình ảnh minh họa. Các bài
32
viết này được đóng góp và chỉnh sửa từ nhiều biên tập viên, nhà nghiên cứu và các chuyên gia.
Hình 14: Minh họa dữ liệu từ WikiHow
Tổng số lượng bài viết thu thập được là khoảng 10.000, mỗi bài viết có khoảng từ một đến bốn phương pháp khác nhau.
33
Xây dựng hệ thống
3.3.1. Thu thập dữ liệu từ wikiHow và index dữ liệu vào Elasticsearch
Hình 15: Thu thập dữ liệu và index dữ liệu vào Elasticsearch
3.3.1.1. Thu thập dữ liệu từ trang web wikiHow
Để thu thập dữ liệu từ trang web wikiHow, tôi đã xây dựng một công cụ (sau đây tôi gọi là web-crawler) có chức năng thu thập tất cả các đường link của các bài viết có trên trang web
https://wikihow.vn. Với những đường link đó, công cụ này sẽ tải dữ liệu của bài viết về và
thực hiện trích xuất các thông tin của bài viết đểlưu trữvào cơ sở dữ liệu.
Để trích xuất được các thông tin của trang web, web-crawler đã sử dụng thư viện Jsoup. Đây là một thư viện của Java, chúng làm việc với dữ liệu html. Jsoup cung cấp rất nhiều API phục vụ cho việc kéo và trích xuất dữ liệu từ các website một cách linh hoạt, thuận tiện và được sử dụng tốt với phương thức HTML5 DOM và CSS selectors. [15]
34
Để có thể lấy được các đường dẫn (link) của các bài viết một cách đầy đủ nhất, web-crawler sẽ tạo ra một queue để lưu trữ các đường link mà công cụ đã khám phá ra được trong wikiHow. Các phần tử trong queue sẽ có thông tin về url của website và kiểu của url. Kiểu của url được phân thành các dạng sau:
- Category: đây là đường dẫn của các chuyên mục, như được nói ở phần giới thiệu của wikiHow thì nó sẽ bao gồm 19 chuyên mục lớn về các lĩnh vực trong đời sống như: Nghệ thuật Giải trí, Xe hơi và Phương tiện Khác, Máy tính và Điện tử, Giáo dục và Truyền thông, Cuộc sống Gia đình…
- Page: trong mỗi chuyên mục thì thường sẽ có rất nhiều các bài viết, vì vậy wikiHow sẽ sắp xếp các bài viết này thành từng trang một và mỗi trang thì thường sẽ bao gồm nhiều nhất là 80 tiêu đề bài viết trong chuyên mục đó, và có 1 hoặc nhiều trang, tùy vào số lượng các bài viết trong chuyên mục.
- Article: đây là đường dẫn trực tiếp đến bài viết. Và sẽ là nơi chúng ta có thể lấy được thông tin đầy đủ về nội dung của bài viết.
Khởi tạo queue trên, công cụ sẽ cho vào tất cả 19 đường link của 19 chuyên mục chính trong wikiHow và được mang kiểu là category. Ta thực hiện thu thập các đường dẫn trực tiếp đến bài viết bằng cách lấy lần lượt các phần tử trong queue bên trên, nếu như phần tử được lấy ra khỏi queue:
- Có kiểu category: chúng ta sẽ sử dụng Jsop để trích xuất thông tin nội dung của trang web theo url đã lưu.
o Nếu như nhận thấy chuyện mục đó chỉ bao gồm một trang thì chúng ta sẽ tạo một bản sao(clone) từ phần tử đó và chuyển thành kiểu page và url giữ nguyên. Sau đó đẩy phẩn tử mới này vào queue.
o Nếu như chuyên mục có nhiều trang thì chúng ta sẽ lần lượt phép duyệt với một biến tăng dần rồi thay đổi tham số trên url để xem chuyên mục có bao nhiêu trang. Vòng lặp sẽ dừng khi mà biến tăng dần sẽ tạo ra một url mà trang web không tồn tại. Ví dụ: khi ta có chuyên mục “Máy tính và điện tử” có link chuyên mục là:
35 ta sẽ duyệt lần lượt các url:
https://www.wikihow.vn/Thể_loại:Máy-tính-và-Điện-tử?pg=1 https://www.wikihow.vn/Thể_loại:Máy-tính-và-Điện-tử?pg=2 https://www.wikihow.vn/Thể_loại:Máy-tính-và-Điện-tử?pg=3
…
Đến khi tham số pg trong url sẽ tạo ra một link không có nội dung. Khi đó sẽ là giới hạn của số trang trong chuyên mục hiện tại. Và tương tự như trên, ta sẽ tạo ra các phần tử mới có kiểu là page và url là các url bên trên. Sau đó đẩy phẩn tử mới này vào queue.
- Có kiểu page: khi download source code của trang web tương ứng với url của phần tử này, chúng ta sẽđược một danh sách các url của các bài viết có dạng như sau:
https://www.wikihow.vn/Lưu-tập-tin-vào-USB
https://www.wikihow.vn/Thay-đổi-ngôn-ngữ-mặc-định-trong-Google-Chrome https://www.wikihow.vn/Thay-đổi-quốc-gia-trên-YouTube
Với mỗi url trên ta sẽ tạo một phần tử có kiểu article và url tương ứng và cho vào trong queue.
- Có kiểu article: chúng ta sẽ giữ nguyên (có thể clone ra một phần tử tương ứng để push vào queue).
36
Hình 16: Mô tả luồng hoạt động của cơ chế thu thập dữ liệu trên wikiHow
Sau khi đã có tất cả các url của tất cả bài viết trên wikiHow, web-crawler sẽ tiến hành kéo nội dung của trang web về và trích xuất thông tin. Các thông tin mà chúng ta có thể thu thập được từ một bài viết thường sẽ là:
- Tiều đề bài viết, được nằm ở phía trên cùng của trang web. Sau đó sẽ là nội dung tóm tắt hoặc mô tả về bài viết (phần đánh dấu số 1 trong ảnh 18).
- Các phương pháp để thực hiện (phần đánh dấu số 2 trong ảnh 18).
- Với mỗi phương pháp thì sẽ có một bài bước tiến hành được mô tả cụ thể và kèm với đó có thể là hình ảnh (phần đánh dấu số 3 trong ảnh 18).
37
Hình 17: Bố cục của bài viết trên wikiHow
Sau khi trích xuất được nội dung của bài viết, bước tiếp theo sẽ là lưu trữ dữ liệu vào trong cơ sở dữ liệu. Cấu trúc dữ liệu sẽ bao gồm ba bảng chính:
- article: lưu thông tin chung của bài viết:
38
o summarization: mô tả ngắn gọn của bài viết.
o warning: các lưu ý.
o recommendation: một số lời khuyên.
- method: lưu thông tin chung của các phương pháp trong bài viết:
o article_id: id của bài viết (article).
o title: tiêu đề của phương pháp.
o summarization: mô tả ngắn gọn của phương pháp. - step: lưu thông tin các bước trong mỗi phương pháp thực hiện:
o mehod_id: id của phương pháp (method).
o title: mô tả chính về bước thực hiện.
o content: cách thực hiện cụ thể.
o image_url: đường dẫn ảnh minh họa trong bước thực hiện.
Hình 18: Cấu trúc lưu trữ dữ liệu bài viết của wikiHow trên database
3.3.1.2. Index dữ liệu vào công cụ ElasticSearch
Do công cụ tìm kiếm chủ yếu sẽ dựa trên nội dung của tiêu đề và phần mô tả ngắn gọn của bài viết nên hệ thống sẽ tiến hành bước tiền xử lý dữ liệu và index dữ liệu này vào trong Elasticsearch để phục vụ cho việc tìm kiếm.
Sau khi thu thập được dữ liệu bài viết trên wikiHow, hệ thống sẽ sử dụng VnCoreNLP để thực hiện phân tách các từ trong tiêu đề và phần mô tả ngắn gọn của bài viết. Như đã phân tích ở bên trên thì Elasticssearch sẽ gặp trở ngại với từđồng nghĩa trong quá trình thực hiện tìm kiếm. Chính vì vậy, dữ liệu được index vào trong Elasticsearch sẽ được tôi xử lý để đưa về một chuẩn chung. Các bước được thực hiện như sau:
39
- Xây dựng các cụm từ đồng nghĩa và xác định từ đại diện cho tập từ này dựa vào