Chương 1 đã trình bày sơ lược về bài toán NER tiếng Việt trong lĩnh vực bất động sản (lý do cũng như mục tiêu đạt được của bài toán) và các nghiên cứu liên quan Nguyễn Thu Hoài – K21HTTTA 9 Khóa luận tốt nghiệp Học viện Ngân hàng đến bài toán. Trong chương tiếp theo, đề tài sẽ trình bày các kiến thức cơ bản trong xử lý ngôn ngữ tự nhiên bao gồm các kĩ thuật xử lý cơ bản, các mô hình mạng thần kinh nhân tạo để xây dựng NER và một số mô hình pretrain NER cho văn bản tiếng Việt. Nguyễn Thu Hoài – K21HTTTA 10 Khóa luận tốt nghiệp Học viện Ngân hàng CHƯƠNG 2 KIẾN THỨC CƠ BẢN TRONG XỬ LÝ NGÔN NGỮ TỰ NHIÊN Xử lý ngôn ngữ tự nhiên (NLP) ngày càng được phát triển mạnh mẽ, ứng dụng nhiều vào đời sống và trên vô số các lĩnh vực khác nhau. Trong đó, Nhận diện thực thể định danh (NER) là một trong các kỹ thuật dựa trên NLP để xác định các đề cập đến các thực thể định danh từ văn bản.
Chương 2 này sẽ trình bày các kỹ thuật cơ bản trong xử lý ngôn ngữ tự nhiên nói chung, một số mạng nơ-ron nhân tạo cho bài toán NER nói riêng và bên cạnh đó là một số mô hình pretrain NER cho dữ liệu tiếng Việt. Các kĩ thuật xử lý ngôn ngữ tự nhiên 2. Xử lý dữ liệu thô 2. Xử lý văn bản với Unicode Trong thực tế có rất nhiều ngôn ngữ, dó đó, ta sẽ cần xử lý các ngôn ngữ khác nhau và các bộ ký tự khác nhau.
Unicode hỗ trợ hơn một triệu ký tự. Mỗi ký tự này được gán một số, được gọi là mã ký tự. Trong Python, các mã ký tự này được viết ở dạng \𝑢𝑋𝑋𝑋𝑋, trong đó XXXX là số ở dạng thập lục phân 4 chữ số. Trong một chương trình, các mã ký tự Unicode có thể được thao tác trực tiếp, nhưng khi các ký tự Unicode được lưu trữ trong tệp hoặc hiển thị trên một thiết bị đầu cuối, chúng phải được mã hóa thành một hoặc nhiều byte.
Một số bảng mã (chẳng hạn như ASCII và Latin-2) sử dụng một byte duy nhất, vì vậy chúng chỉ có thể hỗ trợ một tập con của Unicode, phù hợp với một ngôn ngữ duy nhất. Các bảng mã khác (chẳng hạn như UTF-8) sử dụng nhiều byte và có thể đại diện cho toàn bộ Unicode. Văn bản trong tệp sẽ ở một bảng mã cụ thể, vì vậy chúng ta cần một số cơ chế để dịch nó sang Unicode. Dịch sang Unicode được gọi là giải mã (decode).
Ngược lại, để ghi Unicode ra một tệp hoặc một thiết bị đầu cuối, trước tiên chúng ta cần dịch nó sang một bảng mã phù hợp, quá trình biến đổi từ Unicode sang bộ mã khác được gọi là mã hóa [16]. Nguyễn Thu Hoài – K21HTTTA 11 Khóa luận tốt nghiệp Học viện Ngân hàng Hình 2.1: Mã hóa và giải mã Unicode 2. Biểu thức chính quy (Regular Expression) Biểu thức chính quy (gọi tắt là RegEx) được định nghĩa là một chuỗi ký tự đặc biệt giúp so khớp hoặc tìm các chuỗi hay bộ chuỗi khác bằng cách sử dụng chuỗi đó làm mẫu (pattern). Ví dụ: trích xuất tất cả các thẻ bắt đầu bằng # từ một tweet, lấy ID email hoặc số điện thoại, v.
Biểu thức chính quy yêu cầu hai thứ, một là mẫu mà ta muốn tìm kiếm và hai là một tập văn bản hoặc một chuỗi mà chúng ta cần tìm kiếm mẫu trong đó. Biểu thức chính quy được sử dụng trong các tác vụ khác nhau, chẳng hạn như: tiền xử lý dữ liệu, so khớp pattern, trích rút nội dung trang web, trích xuất dữ liệu, v. Cụ thể có thể kể đến là: loại bỏ các thẻ HTML, biểu tượng cảm xúc, để xác thực các trường dữ liệu (ví dụ: ngày tháng, địa chỉ email, URL, chữ viết tắt, v.), để lọc một văn bản cụ thể từ toàn bộ kho ngữ liệu (ví dụ: thư rác, các trang web không được phép, v. Sau đây là một số khái niệm cơ bản về biểu thức chính quy, đó là một số cú pháp cơ bản ta cần biết.
- Bộ ký tự trong biểu thức chính quy: Bộ ký tự biểu thức chính quy được biểu thị bằng một cặp dấu ngoặc [] sẽ khớp với bất kỳ ký tự nào được bao gồm trong dấu ngoặc. Ví dụ: biểu thức chính quy 𝑐𝑜𝑛[𝑠𝑐]𝑒𝑛[𝑠𝑐]𝑢𝑠 sẽ so khớp với bất kỳ cách viết nào Nguyễn Thu Hoài – K21HTTTA 12 Khóa luận tốt nghiệp Học viện Ngân hàng tương đồng như: “concensus”, “consencus” và “concencus”. - Các đại lượng tùy chọn trong Biểu thức chính quy: Trong Biểu thức chính quy, các đại lượng tùy chọn được biểu thị bằng dấu chấm hỏi. Nó chỉ ra rằng một ký tự có thể xuất hiện 0 hoặc 1 lần.
Ví dụ: cụm từ thông dụng ℎ𝑒𝑙𝑙? 𝑜 sẽ phù hợp với “helo” cũng như “hello”. - Chữ trong biểu thức chính quy: Trong biểu thức chính quy, các chữ là các ký tự đơn giản nhất mà sẽ khớp với văn bản chính xác của các chữ. Ví dụ: regex “xoài” sẽ hoàn toàn khớp với “xoài” nhưng cũng sẽ khớp với “xoài” trong văn bản “Tôi thích xoài”. Các đại lượng cố định trong biểu thức chính quy: Trong biểu thức chính quy, đại lượng cố định được biểu thị bằng dấu ngoặc nhọn {}.
Nó chứa chính xác số lượng hoặc phạm vi số lượng ký tự được so khớp. Ví dụ: biểu thức chính quy ℎ𝑎𝑝{2}𝑦 sẽ khớp với “happy”, trong khi biểu thức chính quy ℎ𝑎𝑝{2,4}𝑦 sẽ khớp với “happy”, “happpy” hoặc “happppy”. - Sự thay thế trong Biểu thức Chính quy: Sự thay thế được biểu thị bằng ký hiệu ống dẫn, cho phép kết hợp một trong hai biểu thức phụ. Ví dụ: regex 𝑡á𝑜|𝑥𝑜à𝑖 sẽ khớp với “táo” hoặc “xoài”.
- Chốt trong biểu thức chính quy: Chốt (mũ ^ và đô la ký hiệu $) được sử dụng trong biểu thức chính quy để đối sánh văn bản ở đầu và cuối của một chuỗi tương ứng. Ví dụ: regex ^𝑡ô𝑖 𝑠ố𝑛𝑔 𝑐ℎ𝑢𝑛𝑔 𝑣ớ𝑖 𝑔𝑖𝑎 đì𝑛ℎ$ sẽ hoàn toàn khớp với văn bản “tôi sống chung với gia đình” nhưng không sẽ khớp với “Hiện nay, tôi sống chung với gia đình” hoặc “tôi sống chung với gia đình ở Hà Nội”. Dấu ^ đảm bảo rằng văn bản phù hợp bắt đầu bằng “tôi” và $ đảm bảo văn bản phù hợp kết thúc bằng “đình”. - Các ký tự đại diện trong Biểu thức chính quy: các ký tự đại diện được biểu thị bằng dấu chấm và nó có thể khớp với bất kỳ ký tự đơn nào (chữ cái, số, ký hiệu hoặc khoảng trắng) trong một đoạn văn bản.
Ví dụ: biểu thức chính quy …. sẽ khớp với “thích”, “ghét” hoặc bất kỳ văn bản 4 ký tự nào khác. - Dải biểu thức chính quy: Phạm vi biểu thức chính quy được sử dụng để chỉ định một dải ký tự có thể được đối sánh. Các phạm vi biểu thức chính quy phổ biến bao Nguyễn Thu Hoài – K21HTTTA 13 Khóa luận tốt nghiệp Học viện Ngân hàng gồm: + [A-Z]: khớp với bất kỳ chữ cái in hoa; + [a-z]: khớp với bất kỳ chữ cái in thường; + [0-9]: khớp với bất kỳ các chữ số; + [A-Za-z]: khớp với bất kỳ chữ cái không phân biệt viết hoa hay viết thường.
- Các lớp ký tự viết tắt trong biểu thức chính quy: Các lớp ký tự viết tắt đơn giản hóa việc viết các biểu thức chính quy. Ví dụ: \𝑤 đại diện cho phạm vi regex [A-Za-z0- 9_], \𝑑 đại diện cho [0-9], \𝑊 đại diện cho [^A-Za-z0-9_] khớp với bất kỳ ký tự nào không được bao gồm bởi \𝑤, \𝐷 đại diện cho [^0-9] khớp với bất kỳ ký tự nào không được bao gồm bởi \ d. - Dấu sao Kleene & Dấu cộng Kleene: trong Biểu thức chính quy Trong Biểu thức chính quy, dấu sao Kleene (∗) chỉ ra rằng ký tự đứng trước có thể xuất hiện 0 hoặc nhiều lần. Ví dụ: ℎ𝑒𝑙 ∗ 𝑜 sẽ khớp với “heo”, “helo”, “helllo”, v.
Dấu cộng Kleene (+) chỉ ra rằng ký tự đứng trước có thể xuất hiện 1 hoặc nhiều lần. Ví dụ: hel+o sẽ khớp với “helo”, “hello” và “hellllo”, v.v nhưng không khớp với “heo”. Phân đoạn (Segmentation) Phân đoạn về cơ bản là tách một cụm từ, câu, đoạn văn hoặc toàn bộ tài liệu văn bản thành các đơn vị nhỏ hơn, chẳng hạn như các từ hoặc thuật ngữ riêng lẻ. Mỗi đơn vị nhỏ hơn này được gọi là token.
Phân đoạn câu (Sentence Segmentation) Phân đoạn câu là việc chia một văn bản thành các câu thành phần của nó. Ví dụ với đoạn sau: “Tôi cần bán Nhà hàng - Cửa hàng - Ki ốt diện tích thực 110 m2 với giá đề xuất từ 1. Nhà ở vị trí thuận lợi tọa lạc gần Thị Trấn Long Điền, Tỉnh Bà Rịa - Vũng Tàu.” sẽ được phân đoạn thành từng câu “Tôi cần bán Nhà hàng - Cửa hàng - Ki ốt diện tích thực 110 m2 với giá đề xuất từ 1.” và “Nhà ở vị trí thuận lợi tọa lạc gần Thị Trấn Long Điền, Tỉnh Bà Rịa - Vũng Tàu. Ý tưởng ở đây trông rất đơn giản.
Trong tiếng Anh và một số ngôn ngữ khác, chúng ta có thể tách các câu ra bất cứ khi nào chúng ta nhìn thấy dấu câu [17] vì các câu trong hầu hết các ngôn ngữ viết được phân tách bởi các dấu câu. Tuy nhiên các quy tắc sử dụng cụ thể cho dấu câu không phải lúc nào cũng Nguyễn Thu Hoài – K21HTTTA 14 Khóa luận tốt nghiệp Học viện Ngân hàng được xác định một cách rõ ràng, ví dụ như trong tiếng Anh, ta có thể dùng ký tự dừng cho cả các chữ viết tắt. Ngoài ra, trong các ngôn ngữ khác nhau, các câu và câu phụ thường được phân cách bằng các dấu câu khác nhau. Thậm chí, một số ngôn ngữ như tiếng Thái, họ không sử dụng dấu chấm (hoặc bất kỳ dấu câu nào khác) để đánh dấu ranh giới câu.
Do đó, việc phân đoạn câu thành công cho một ngôn ngữ nhất định đòi hỏi sự hiểu biết về các cách sử dụng khác nhau của các ký tự dấu câu trong ngôn ngữ đó. Phạm vi của vấn đề này rất khác nhau tùy theo ngôn ngữ, cũng như số lượng dấu câu khác nhau cần được xem xét. Phân tách từ (Word Tokenization) Trước khi xử lý ngôn ngữ tự nhiên, chúng ta cần xác định các từ tạo thành một chuỗi ký tự. Đó là lý do tại sao tách từ là bước cơ bản nhất để tiếp tục với NLP cho dữ liệu văn bản.
Điều này rất quan trọng vì ý nghĩa của văn bản có thể dễ dàng được giải thích bằng cách phân tách các từ có trong văn bản. Ví dụ với chuỗi “Bán mảnh đất , giá thực_tế chỉ 1.75 tỷ diện_tích khoảng 150 m2”, sau khi phân tách ta thu được [“Bán”, “mảnh”, “đất”, “,”, “giá”, “thực_tế”, “chỉ”, “1.