Google thường xử lý và trả lời các câu hỏi theo 3 dạng câu trả lời bao gồm: câu trả lời trực tiếp, câu trả lời ngắn, câu trả lời dài:
- Câu trả lời trực tiếp thường sẽ là các câu hỏi có chứa các từ: “ai”, “cái gì”, “ởđâu”, “khi nào”… Đối với những câu hỏi thế này Google sẽ cung cấp một câu trả lời trực tiếp từ một nguồn đáng tin cậy và mang nội dung lên trên đoạn trích nổi bật để người dùng có thể thấy nhanh nhất.
Hình 8: Câu trả lời trực tiếp của Google
- Câu trả lời ngắn thường xuất hiện những cụm từ như: “tại sao”, “có thể”… Các thông tin sẽ được Google tính toán theo các tiêu chí để chọn ra một câu trả lời ngắn tốt nhất và hiển thị vào đoạn trích nổi bật.
20
Hình 9: Câu trả lời ngắn của Google
- Câu trả lời dài: thường xuất hiện với các cụm từ như: “làm thế nào”, “cách để”, “tại sao”… Các câu trả lời ở dạng này sẽthường có thông tin chi tiết cho người dùng có thể hình dung được cụ thể được thông tin mà họ đang tìm kiếm.
21
Nền tảng về xử lý ngôn ngữ tự nhiên 2.2.1. Tìm kiếm ngữnghĩa (Semantic search)
Tìm kiếm ngữ nghĩa là một cụm từ để chỉ các công cụ tìm kiếm có thể hiểu được các truy vấn ngôn ngữ tự nhiên và có thể nhiều hơn thế với việc hiểu được ngữ cảnh của người tìm kiếm tại thời điểm họ nhập truy vấn. Một ví dụ đơn giản như: nếu như truy vấn là “lượng nguyên liệu tiêu thụ của jaguar” thì cơ khả năng lớn từ “jaguar” là họ đang tìm kiếm thông tin của một chiếc xe hơn là muốn tìm một con vật.
Các yếu tố chính của tìm kiếm ngữ nghĩa: - Hiểu ngôn ngữ tự nhiên
- Ngữ cảnh của luồng truy vấn - Ngữ cảnh của người dùng - Nhận biết thực thể
Hình 11: Bốn yếu tố quan trọng trong Semantic search
Việc hiểu rõ hơn về ý định tìm kiếm của người dùng sẽ tối đa hóa khả năng người dùng có được trải nghiệm tìm kiếm tốt nhất. Và đấy chính là cách mà các công cụ tìm kiếm nổi tiếng
22
trên thế giới như Google, Bing, Baidu… có thể mang lại cho bạn những thông tin sát nhất với thứ mà bạn đang cần.
2.2.2. TF-IDF
TF-IDF là viết tắt của từ term frequency – inverse document frequency, đây là một chỉ số để đánh giá mức độ quan trọng của một từ đối với một văn bản hoặc một tập tài liệu. TF- IDF thường được sử dụng trong các bài toán truy hồi thông tin và khai phá dữ liệu [2] [3] [4].
2.2.2.1. TF – term frequency
Đây là tần số xuất hiện một từ trong một văn bản, được tính bằng công thức:
𝑡𝑓(𝑡, 𝑑) = max {𝑓(𝑤, 𝑑) ∶ 𝑤 ∈ 𝑑}𝑓(𝑡, 𝑑) Trong đó:
- f(t,d): số lần xuất hiện từ t trong văn bản d
- max {𝑓(𝑤, 𝑑) ∶ 𝑤 ∈ 𝑑}: số lần xuất hiện nhiều nhất của một từ bất kỳ trong văn bản
- giá trị của tf(t,d) sẽ thuộc khoảng [0, 1]
2.2.2.2. IDF – inverse document frequency
Đây là tần số nghịch của một từ trong tập văn bản, chỉ số này nhằm để giảm giá trị của những từ phổ biến. Mỗi từ chỉ có một giá trị IDF trong một văn bản và được tính bằng công thức:
𝑖𝑑𝑓(𝑡, 𝐷) = 𝑙𝑜𝑔 |{𝑑 ∈ 𝐷 ∶ 𝑡 ∈ 𝑑}||𝐷| Trong đó:
- |D|: tổng số văn bản trong tập D
- |{𝑑 ∈ 𝐷 ∶ 𝑡 ∈ 𝑑}|: số văn bản chứa từ nhất định, với điều kiện t xuất hiện trong văn bản d tức là: 𝑡𝑓(𝑡, 𝑑) ≠ 0. Nếu từđó không xuất hiện ở bất cứ1 văn bản nào trong
23
tập thì mẫu số sẽ bằng 0 => phép chia cho không không hợp lệ, vì thế người ta thường thay bằng mẫu thức 1 + |{𝑑 ∈ 𝐷 ∶ 𝑡 ∈ 𝑑}|.
2.2.2.3. Giá trị TF-IDF
𝑡𝑓𝑖𝑑𝑓(𝑡, 𝑑, 𝐷) = 𝑡𝑓(𝑡, 𝑑) 𝑥 𝑖𝑑𝑓(𝑡, 𝐷)
Những từ có giá trị TF-IDF cao là những từ xuất hiện nhiều trong văn bản này, và xuất hiện ít trong các văn bản khác. Việc này giúp lọc ra những từ phổ biến và giữ lại những từ có giá trị cao (từ khoá của văn bản đó).
2.2.3. Phân tách từ (word segmentation)
Phân tách từ là bài toán phân tách một chuỗi ký tự đầu vào thành các từ độc lập.
Trong tiếng Anh và một số ngôn ngữ khác sử dụng chữ cái Latin, dấu cách gần như là một phương pháp tốt để phân tách các từ trong câu. Tuy nhiên, không phải tất cả các ngôn ngữ đầu có dấu phân cách như vậy. Trong tiếng Thái Lan, tiếng Lào, cụm từ và câu được phân cách nhưng từ thì lại không. Trong tiếng Trung Quốc và tiếng Nhật Bản, có dấu phân cách câu nhưng lại không có phân cách từ. Còn tiếng Việt lại được phân cách bằng âm tiết. Vì vậy, bài toán phân tách từ gặp khá nhiều khó khăn.
Ví dụ:
Ngôn ngữ Văn bản đầu vào Kết quả
English I am looking for my pen. I am looking_for my_pen
Vietnamese Học sinh học sinh học Học_sinh học sinh_học
Japanese 私は日本人です 私_は日_本_人で_す
…
Bảng 3: Phân tách từ trong các ngôn ngữ khác nhau
24
Hình 12: Các phương pháp tiếp cận của bài toán phân tách từ
Các phương pháp này được phân loại thành 3 nhóm chính:
- Dict-based: là tạo ra một từ điển và phân tách văn bản đầu vào thành các từ có trong từ điển đó. Hai kỹ thuật tiếp cận hiệu quả nhất của phương pháp này là Maximun Matching và Longest Matching.
- Statiscal: dựa vào việc sử dụng một tập dữ liệu cực lớn đã được gán nhãn. Một số phương pháp phổ biến như N-gram Language Model [6], Hidden Markov Model (HMM) [7], Conditional Random Fields (CRFs) [8] và Maximum Entropy (ME) [9]. - Hybrid: là sự kết hợp của nhiều phương pháp khác nhau để tận dụng ưu điểm của mỗi phương pháp và hạn chế nhược điểm của chúng. Đã có nhiều mô hình hybrid được công bố và áp dụng cho nhiều ngôn ngữ khác nhau. Chúng bao gồm các kỹ thuật dictionary-based (Maximun Matching, Longest Matching), statistics-based (N-
25
gram, CRFs, ME) và các thuật toán học máy (Support Vector Machines - SVMs, Genetic Algorithm – GA) [10] [11] [12].
2.2.4. Gán nhãn từ loại (Part of speech tagging – POSTag)
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