Xử lý ngôn ngữ tự nhiên cơ bản

Xử lý ngôn ngữ tự nhiên (NLP) là một nhánh của Trí tuệ nhân tạo. Trong bài này, chúng tôi sẽ giới thiệu những vấn đề cơ bản của nó. Hãy cùng tìm hiểu nhé!

Từ rất lâu, máy tính đã hoạt động thật sự hiệu quả với những kiểu dữ liệu được chuẩn hóa hoặc có cấu trúc như bảng cơ sở dữ liệu hay những bản báo cáo tài chính với tốc độ xử lý dữ liệu nhanh hơn rất nhiều so với con người. Nhưng, trong cuộc sống hàng ngày, ngôn ngữ giao tiếp của con người không phải ngôn ngữ có cấu trúc hay ngôn ngữ nhị phân. Chúng ta sử dụng các từ ngữ, một loại của dữ liệu phi cấu trúc.

Điều đáng tiếc là máy tính chưa thể xử lý dữ liệu phi cấu trúc. Hiện nay không có một kĩ thuật nào có thể chuẩn hóa được dữ liệu. Ta có thể hiểu đơn giản, khi xây dựng một chương trình máy tính và sử dụng các ngôn ngữ lập trình như C++, Java, hay Python, về cơ bản, ta sẽ cung cấp cho máy tính một bộ quy luật để máy tình hoạt động theo. Nhưng với dữ liệu phi cấu trúc, các quy luật này khá mơ hồ và khó xác định.


Có rất nhiều ngôn ngữ tự nhiên phi cấu trúc trên Internet, đôi khi, ngay cả Google cũng không hiểu được nội dung bạn muốn tìm kiếm là gì!

Sự kết hợp giúp máy tính dẫn hiểu được ngôn ngữ tự nhiên

Chữ viết đã được con người sử dụng và lưu trữ kiến thức từ hàng ngàn năm trước. Suốt thời gian đó, bộ não của chúng ta đã tích lũy một lượng kinh nghiệm khổng lồ trong việc hiểu ngôn ngữ tự nhiên. Ví dụ, khi đọc một nội dung được viết trên giấy hoặc một bài đăng trong blog, chúng ta đều hiểu được ý nghĩa thực của bài viết trong thế giới thực. Chúng ta cảm nhận được những cảm xúc sau khi đọc nội dung và đồng thời hình dung được nó như thế nào trong cuộc sống đời thực.

Xử lý ngôn ngữ tự nhiên (NLP) là một phần của trí tuệ nhân tạo, tập trung vào việc cho phép máy tính hiểu và xử lý ngôn ngữ con người, để máy tính có thể tiến gần hơn với trình độ hiểu biết ngôn ngữ như con người. Thực tế, máy tính chưa có sự hiểu trực quan ngôn ngữ như sự hiểu biết của con người. Máy tính cũng không thể xác định những gì ngôn ngữ tự nhiên đang diễn tả. Thậm chí, trong một số trường hợp, máy tính không thể đọc hiểu giữa các dòng.

Nhưng, thời gian gần đây, những tiến bộ trong học máy đã giúp ích rất nhiều trong việc cho phép máy tính hiểu được ngôn ngữ tự nhiên. Deep Learning đã cho phép chúng ta có thể viết các chương trình như dịch ngôn ngữ, tóm tắt văn bản. Những điều này đã thêm sự hiểu biết về ngôn ngữ cho máy tính, từ đó chúng ta có thể dễ dàng xây dựng và thực hiện các phân tích trên khối lượng văn bản lớn một cách tự động.

Đầu tiên, ta hãy tìm hiểu sơ lược về NLP theo khái niệm. Phần tiếp theo, ta sẽ xử lý ngôn ngữ tự nhiên bằng Python.

Lý do thực sự khiến xử lý NLP rất khó

Quá trình đọc hiểu một ngôn ngữ phức tạp hơn nhiều so với “cái nhìn đầu tiên”. Có rất nhiều điều bạn phải biết để hiểu được ý nghĩa thực sự của đoạn văn trong thế giới thực. Ví dụ, bạn nghĩ đoạn văn sau có ý nghĩa gì?

“Steph Curry was on fire last nice. He totally destroyed the other team”

Đối với con người thì có lẽ ta sẽ hiểu được câu này một cách dễ dàng. Ta biết, Steph Curry là một cầu thủ bóng rổ; hoặc thậm chí nếu bạn chưa biết anh ấy là cầu thủ bóng rổ, thì bạn cũng hiểu được rằng anh ấy đang thi đấu một môn thể thao. Khi ta thấy những từ như “on fire” “destroyed”, ta hiểu Steph Curry đã chơi thực sự xuất sắc vào tối qua.

Nhưng, máy tính lại có xu hướng hiểu mọi thứ chỉ theo nghĩa đen. Hãy xem xét theo góc độ hiểu của máy tính, ta sẽ hiểu “Steph Curry” là tên một người, một địa điểm hoặc một danh từ riêng nào khác dựa theo cách viết hoa từ này. Nhưng sau đó, ta thấy rằng Steph Curry “on fire”, như vậy máy tính sẽ hiểu ai đó đã “thắp” Steph Curry vào ngày hôm qua. Sau đó, máy tính sẽ hiểu ông Curry đã tiêu diệt hết những đội khác theo nghĩa đen… và những đội đó sẽ không còn tồn tại với cách hiểu này nữa.

Trong thực tế, không hẳn máy tính không hỗ trợ được con người trong xử lý ngôn ngữ tự nhiên. Với Machine Learning, ngày nay, con người đã thực hiện một số việc một cách thông minh hơn để nhanh chóng trích xuất và hiểu về các tài liệu ngôn ngữ tự nhiên. Dưới đây, chúng tôi sẽ mô tả cách máy tính xử lý ngôn ngữ tự nhiên NLP bằng Python.

NLP với ngôn ngữ lập trình Python

Để hiểu về quy trình xử lý ngôn ngữ tự nhiên, chúng ta sẽ sử dụng văn bản lấy từ Wikipedia làm ví dụ:

Amazon.com, Inc., doing business as Amazon, is an American electronic commerce and cloud computing company based in Seattle, Washington, that was founded by Jeff Bezos on July 5, 1994. The tech giant is the largest Internet retailer in the world as measured by revenue and market capitalization, and second largest after Alibaba Group in terms of total sales. The amazon.com website started as an online bookstore and later diversified to sell video downloads/streaming, MP3 downloads/streaming, audiobook downloads/streaming, software, video games, electronics, apparel, furniture, food, toys, and jewelry. The company also produces consumer electronics — Kindle e-readers, Fire tablets, Fire TV, and Echo — and is the world’s largest provider of cloud infrastructure services (IaaS and PaaS). Amazon also sells certain low-end products under its in-house brand AmazonBasics.

Một vài yêu cầu

Trước tiên, bạn cần cài một vài thư viện hữu ích trong Python hỗ trợ xử lý NLP.

### Installing spaCy, general Python NLP lib
pip3 install spacy
### Downloading the English dictionary model for spaCy
python3 -m spacy download en_core_web_lg
### Installing textacy, basically a useful add-on to spaCy
pip3 install textacy

Entity Analysis (Phân tích thực thể)

Sau khi hoàn thành cài đặt, ta thực hiện phân tích thực thể cho văn bản. Phân tích thực thể sẽ tìm nhanh trong văn bản và xác định các từ quan trọng hoặc những thực thể khác trong văn bản. Những từ “quan trọng” máy tính tìm được chúng ta hi vọng là những từ thực sự có ý nghĩa và mang ngữ nghĩa trong đoạn văn.

Dưới đây là phân tích thực thể trên Python.

 #coding:utf-8
 import spacy
 ### Load spaCy's English NLP model
 nlp = spacy.load('en_core_web_lg')
 ### The text we want to examine
 text = "Amazon.com, Inc., doing business as Amazon, is an American electronic commerce and cloud computing company based in Seattle, Washington, that was founded by Jeff Bezos on July 5, 1994. The tech giant is the largest Internet retailer in the world as measured by revenue and market capitalization, and second largest after Alibaba Group in terms of total sales. The amazon.com website started as an online bookstore and later diversified to sell video downloads/streaming, MP3 downloads/streaming, audiobook downloads/streaming, software, video games, electronics, apparel, furniture, food, toys, and jewelry. The company also produces consumer electronics - Kindle e-readers, Fire tablets, Fire TV, and Echo - and is the world's largest provider of cloud infrastructure services (IaaS and PaaS). Amazon also sells certain low-end products under its in-house brand AmazonBasics." 
 ### Parse the text with spaCy
 ### Our 'document' variable now contains a parsed version of text.
 document = nlp(text)
 ### print out all the named entities that were detected
 for entity in document.ents:
       print(entity.text, entity.label_)     

Áp dụng mô hình học máy trong thư viện spaCy để trích xuất các thực thể văn bản, ta được kết quả:

Amazon.com, Inc. ORG
Amazon ORG
American NORP
Seattle GPE
Washington GPE
Jeff Bezos PERSON
July 5, 1994 DATE
second ORDINAL
Alibaba Group ORG
amazon.com ORG
Fire TV ORG
Echo -  LOC
PaaS ORG
Amazon ORG
AmazonBasics ORG

03 chữ cái bên cạnh dòng văn bản là nhãn của thực thể mà ta đang xem xét. Có vẻ như mô hình đã hoạt động khá tốt. Ví dụ như “Jeff Bezos” thực sự là một danh từ chỉ người; ngày được xác định chính xác; “Amazon” là tên một tổ chức; “Seattle” và “Washington” đều là các địa danh. Tuy nhiên, “Fire TV” và “Echo” là tên sản phẩm chứ không phải tên tổ chức. Đồng thời cũng thiếu những sản phẩm mà Amazon đang bán như “video downloads/streaming, MP3 downloads/streaming, audiobook downloads/streaming, phần mềm, video games, điện tử, may mặc, đồ nội thất, thực phẩm, đồ chơi, và trang sức,” có thể do những từ này được đặt trong cùng một danh sách lớn, không được đánh giá cao nên máy tính đã đánh giá là không quan trọng.

Nhìn chung, mô hình đã hoàn thành phần nào được công việc của mình. Thử tưởng tượng, một bộ dữ liệu khổng lồ với hàng trăm trang văn bản, mô hình NLP này có thể giúp bạn nhanh chóng có được cái nhìn tổng quan về bộ tài liệu và xác định những thực thể quan trọng.

Thao tác trên các thực thể

Giờ chúng ta hãy thử với mội ví dụ mang tính ứng dụng hơn. Giả sử bạn có cùng khối lượng văn bản như trên, nhưng bạn muốn xóa tất cả tên người/ tổ chức một cách tự động vì lo ngại quyền riêng tư. Trong thư viện spaCy sẽ có chức năng scrub hữu ích giúp ta xóa sạch danh mục thực thể mà ta không muốn xuất hiện. Dưới đây là kết quả:

# coding: utf-8
import spacy
### Load spaCy's English NLP model
nlp = spacy.load('en_core_web_lg')
### The text we want to examine
text = "Amazon.com, Inc., doing business as Amazon, is an American electronic commerce and cloud computing company based in Seattle, Washington, that was founded by Jeff Bezos on July 5, 1994. The tech giant is the largest Internet retailer in the world as measured by revenue and market capitalization, and second largest after Alibaba Group in terms of total sales. The amazon.com website started as an online bookstore and later diversified to sell video downloads/streaming, MP3 downloads/streaming, audiobook downloads/streaming, software, video games, electronics, apparel, furniture, food, toys, and jewelry. The company also produces consumer electronics - Kindle e-readers, Fire tablets, Fire TV, and Echo - and is the world's largest provider of cloud infrastructure services (IaaS and PaaS). Amazon also sells certain low-end products under its in-house brand AmazonBasics."
 ### Replace a specific entity with the word "PRIVATE"
def replace_entity_with_placeholder(token):
 if token.ent_iob != 0 and (token.ent_type_ == "PERSON" or token.ent_type_ == "ORG"):
        return "[PRIVATE] "
    else:
        return token.string
### Loop through all the entities in a piece of text and apply entity replacement
def scrub(text):
    doc = nlp(text)
    for ent in doc.ents:
        ent.merge()
    tokens = map(replace_entity_with_placeholder, doc)
    return "".join(tokens)

Điều này thực sự tuyệt vời! Bình thường, ta có thể sử dụng chức năng ctrl + f trên máy tính để tìm và thay thế các từ trong tài liệu một cách thủ công. Nhưng với NLP, ta đã có thể thay thế các thực thể cụ thể sau khi xem xét đến ý nghĩa thật sự của chúng.

Trích xuất thông tin từ văn bản

Thư viện được cài đặt textacy thực hiện một số thuật toán trích xuất thông tin văn bản dựa trên danh mục các thực thể được lấy ra từ thư viện spaCy. Thư viện này đã cho phép người dùng thật sự có thể phân tích chuyên sâu hơn.

Một trong những thuật toán sử dụng có tên gọi là “Semi-structured Statement Extraction”. Thuật toán này cơ bản phân tích các thông tin mà mô hình NLP trong thư viện spaCy đã trích xuất và dựa vào đó, ta có thể lấy một số thông tin cụ thể hơn về các thực thể xác định. Tóm lại, ta có thể trích xuất thông tin thực sự về những thực thể ta đã lựa chọn.

Áp dụng ví dụ với Python, ta sử dụng dữ liệu đầu vào là một bản giới thiệu của trang Wikipedia về thủ đô Washington.

# coding: utf-8
import spacy
import textacy.extract
### Load spaCy's English NLP model
nlp = spacy.load('en_core_web_lg')
### The text we want to examine
text = """Washington, D.C., formally the District of Columbia and commonly referred to as Washington or D.C., is the capital of the United States of America.[4] Founded after the American Revolution as the seat of government of the newly independent country, Washington was named after George Washington, first President of the United States and Founding Father.[5] Washington is the principal city of the Washington metropolitan area, which has a population of 6,131,977.[6] As the seat of the United States federal government and several international organizations, the city is an important world political capital.[7] Washington is one of the most visited cities in the world, with more than 20 million annual tourists.[8][9]
The signing of the Residence Act on July 16, 1790, approved the creation of a capital district located along the Potomac River on the country's East Coast. The U.S. Constitution provided for a federal district under the exclusive jurisdiction of the Congress and the District is therefore not a part of any state. The states of Maryland and Virginia each donated land to form the federal district, which included the pre-existing settlements of Georgetown and Alexandria. Named in honor of President George Washington, the City of Washington was founded in 1791 to serve as the new national capital. In 1846, Congress returned the land originally ceded by Virginia; in 1871, it created a single municipal government for the remaining portion of the District.
Washington had an estimated population of 693,972 as of July 2017, making it the 20th largest American city by population. Commuters from the surrounding Maryland and Virginia suburbs raise the city's daytime population to more than one million during the workweek. The Washington metropolitan area, of which the District is the principal city, has a population of over 6 million, the sixth-largest metropolitan statistical area in the country.
All three branches of the U.S. federal government are centered in the District: U.S. Congress (legislative), President (executive), and the U.S. Supreme Court (judicial). Washington is home to many national monuments and museums, which are primarily situated on or around the National Mall. The city hosts 177 foreign embassies as well as the headquarters of many international organizations, trade unions, non-profit, lobbying groups, and professional associations, including the Organization of American States, AARP, the National Geographic Society, the Human Rights Campaign, the International Finance Corporation, and the American Red Cross.
A locally elected mayor and a 13‑member council have governed the District since 1973. However, Congress maintains supreme authority over the city and may overturn local laws. D.C. residents elect a non-voting, at-large congressional delegate to the House of Representatives, but the District has no representation in the Senate. The District receives three electoral votes in presidential elections as permitted by the Twenty-third Amendment to the United States Constitution, ratified in 1961."""
### Parse the text with spaCy
### Our 'document' variable now contains a parsed version of text.
document = nlp(text)
### Extracting semi-structured statements
statements = textacy.extract.semistructured_statements(document, "Washington")
print("**** Information from Washington's Wikipedia page ****")
count = 1
for statement in statements:
    subject, verb, fact = statement
    print(str(count) + " - Statement: ", statement)
    print(str(count) + " - Fact: ", fact)
    count += 1
 **** Information from Washington's Wikipedia page ****
1 - Statement:  (Washington, is, the capital of the United States of America.[4)
1 - Fact:  the capital of the United States of America.[4
2 - Statement:  (Washington, is, the principal city of the Washington metropolitan area, which has a population of 6,131,977.[6)
2 - Fact:  the principal city of the Washington metropolitan area, which has a population of 6,131,977.[6
3 - Statement:  (Washington, is, home to many national monuments and museums, which are primarily situated on or around the National Mall)
3 - Fact:  home to many national monuments and museums, which are primarily situated on or around the National Mall 

Mô hình NLP đã đưa thông tin hữu ích sau:

  • Washington là thủ đô nước Hoa Kỳ
  • Dân số Washington và thực tế là đô thị
  • Có rất nhiều di tích và bảo tàng quốc gia

Ý nghĩa thực sự của đoạn này là những nội dung trích rút ra đều chính xác và có ý nghĩa quan trọng trong khối văn bản.

Hiểu sâu hơn về NLP                     

Chúng ta đã đi một vòng rồi. Tuy nhiên, NLP là rất rộng và phần tìm hiểu vừa rồi của chúng ta vừa rồi chỉ là một mảng nhỏ.

Cụ thể, ta có thể đưa ra rất nhiều ứng dụng khác của NLP như dịch ngôn ngữ, chatbot hay phân tích cụ thể và chuyên sâu trên các tài liệu văn bản. Ngày nay, để xử lý ngôn ngữ tự nhiên, các kỹ thuật được áp dụng chủ yếu là các thuật toán học sâu (Deep Learning) như mạng Nơ-ron (RNNs) hay mạng Long-Short Term Memory (LSTMs).

Trên đây là bài giới thiệu tổng quan về xử lý ngôn ngữ tự nhiên. Với những ai mới tìm hiểu, các bạn có thể tham khảo qua các tài liệu về thư viện spaCy và textacy. Bạn sẽ thấy rất nhiều các ví dụ về cách xử lý văn bản để phân tích cú pháp và trích xuất thông tin từ văn bản. Sau bước cơ bản trên, hãy bắt đầu với Deep Learning để thực hiện những thứ tốt hơn!

Hãy thường xuyên truy cập trituenhantao.io để có thêm thông tin về những vấn đề nóng của Trí tuệ nhân tạo cũng như Xử lý ngôn ngữ tự nhiên nhé!