Một số khái niệm trong xử lý ngôn ngữ tự nhiên

Natural Language Processing
  1. Part of Speech
  2. Word Segmentation
  3. Stemming và Lemmatization

Kết quả hình ảnh cho nlp

1. Part of Speech (POS)

Đây là bài mở đầu cho loạt bài về các kiến thức và kỹ thuật được sử dụng trong xử lý ngôn ngữ tự nhiên (NLP). Lý do mình viết loạt bài này là vì nhận thấy kiến thức cơ bản về NLP bằng tiếng Anh thì rất nhiều, nhưng bằng tiếng Việt thì không có bao nhiêu. Mặc dù biết rằng tiếng Anh là điều bắt buộc khi nghiên cứu nhưng những bài viết tiếng Việt sẽ giúp ích cho các bạn trẻ mới bắt đầu tìm hiểu về NLP. Hơn nữa, viết bài luôn là một cách gìn giữ kiến thức tuyệt vời, bằng cách ghi lại những gì đã tìm hiểu được, mình không chỉ giúp cho mọi người mà còn giúp chính bản thân không quên đi những kiến thức đó.

Part of Speech
Bài đầu tiên hôm nay mình sẽ nói về 1 khái niệm cực kỳ cơ bản trong NLP, đó là Part of Speech (thường hay ghi tắt là POS). Nói một cách ngắn gọn, POS là việc phân loại các từ trong một câu (danh từ, trạng từ, tính từ hay động từ, v.v..). Ví dụ một câu sau đây:
He is a good man

Câu này sẽ được gắn nhãn POS như sau (người ta thường ghi POS ngay sau từ mà nó phân loại):
He/PRP is/VBZ a/DT good/JJ man/NN

Các từ viết tắt như PRP, VBZ, DT… chính là các POS, ý nghĩa của những từ viết tắt này các bạn có thể tham khảo tại https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html
Việc phân loại từ như thế này sẽ góp phần giúp cho các chương trình xử lý ngôn ngữ tự nhiên nắm được thêm ý nghĩa của câu thay vì chỉ xem nó như là tập hợp của các ký tự. Ví dụ như cùng là một từ “can” nhưng nó có thể có nghĩa là “có thể” hoặc nghĩa là “cái lon“, như vậy POS có thể giúp máy tính phân biệt được điều này một cách dễ dàng tùy vào nội dung của câu. Trong các kỹ thuật xử lý NLP thì đây được xem là một trong những kỹ thuật cơ bản nhất vì nó được sử dụng bởi các kỹ thuật khác, vì vậy đa số các tool liên quan tới NLP thì đều có POS parser.

POS parser
Để gán nhãn POS cho các từ trong câu thì người ta sẽ sử dụng một bộ phân tích gọi là “POS parser” hay còn gọi là “POS tagger”. Các bộ parser này thường sẽ tuân theo những quy tắc nào đó hoặc là sử dụng machine learning để phân loại từ một cách hợp lý nhất dựa trên những dữ liệu training đã được gán nhãn bằng tay. Ví dụ: bằng cách cho máy tính học thật nhiều các dữ liệu mà trong đó từ “can” nếu đứng sau một danh từ thì thường có nhãn là MD (modal verb) rồi sau đó cho máy tính gãn nhãn một câu mới, nó sẽ có khả năng gán nhãn MD cho một từ can ở vị trí tương tự như dữ liệu training.

Một số bộ POS parser phổ biết là:
Stanford CoreNLP Parser: được viết bằng Java, các bạn có thể xem demo tại trang web: http://nlp.stanford.edu:8080/parser/index.jsp
NLTK: Đây là thư viện bao gồm nhiều công cụ cho NLP viết bằng Python. Tất nhiên nó cũng có sẵn POS parser. Xem ví dụ: http://www.nltk.org/book/ch05.html

Ví dụ ứng dụng:
Để đưa ra một ứng dụng chỉ sử dụng POS thì khá khó vì kỹ thuật này chủ yếu làm nền tảng cho các kỹ thuật khác mà thôi. Nhưng dù sao thì cũng nên đưa ra một ví dụ gì đó để các bạn dễ hình dung được ứng dụng của nó. Ví dụ như các bạn đang muốn làm một chương trình dịch từ tiếng Anh sang tiếng Việt bằng cách đơn giản nhất là dịch từng từ riêng lẽ (chắc chả ai làm như vậy). Giả sử các bạn có câu sau:
I fish a fish

Nếu không biết POS của các từ, chúng ta sẽ dịch như sau:
Tôi con cá một con cá

Nhưng nếu như dùng POS, chúng ta sẽ nhận được phân loại từ như sau:
I/PRP fish/VBZ a/DT fish/NN

Rõ ràng từ fish đầu tiên là động từ còn từ fish thứ hai là danh từ, vì thế chúng ta có thể dịch chính xác hơn từ fish đầu tiên bằng cách tra từ điển và chọn chỉ phần dịch là động từ mà thôi. Khi đó kết quả dịch của chúng ta sẽ là:
Tôi câu một con cá

Rõ ràng chất lượng câu dịch đã khác chỉ nhờ vào POS. Đây chỉ là một ví dụ cực kỳ đơn giản, khi các bạn tìm hiểu thêm thì sẽ thấy rất nhiều ứng dụng của POS trong NLP. Hy vọng trong các bài sau khi chúng ta tìm hiểu thêm nhiều các kỹ thuật khác thì chúng ta sẽ hiểu rõ hơn về điều này.

2. Word Segmentation

Word Segmentation là một phần khá cơ bản trong các kỹ thuật xử lý của NLP, nhiệm vụ chính là tách một đoạn text (một chuỗi liên tiếp các ký tự) thành những từ (word hay token) riêng lẻ. Đối với tiếng Anh thì việc này khá dễ dàng vì mỗi từ trong tiếng Anh đều có ý nghĩa và đa số các trường hợp thì chỉ cần sử dụng khoảng trắng là có thể tách từ được. Tuy nhiên, các ngôn ngữ khác như tiếng Việt hay tiếng Nhật thì điều này không chính xác.
Lấy một ví dụ đơn giản, chúng ta có câu sau bằng tiếng Anh.
I like doing research very much.

Các từ của câu này chúng ta sẽ phân tích ra là: [I, like, doing, research, very, much]. Như chúng ta thấy thì mỗi từ đều có ý nghĩa của nó. Vì thế trong tiếng Anh, khi nói “word” thì chúng ta sẽ hiểu đó là từ đơn. Tuy nhiên, với câu tiếng Việt:
Tôi rất thích nghiên cứu

Nếu tách từ đúng thì chúng ta sẽ có các từ: [Tôi, rất, thích, nghiên cứu]. Ở đây, nghiên cứu chỉ là một từ duy nhất và nó là từ ghép. Rõ ràng sử dụng cách thông thường bên tiếng Anh và áp dụng vào tiếng Việt sẽ không được. Đến đây thì chắc chúng ta cũng hiểu được lý do tại sao NLP nó phụ thuộc khá nhiều vào ngôn ngữ mà chúng ta nghiên cứu.

Tại sao lại cần thiết?
Vì hầu như xử lý gì trong NLP cũng cần phải tách riêng từng từ trong câu đó ra. Ví dụ các bạn muốn gán Part of Speech thì các bạn cũng phải tách đúng các từ rồi các bạn mới gán nhãn POS được. Nếu trong ví dụ trên mà chúng ta tách thành các từ [Tôi, rất, thích, nghiên, cứu] thì rõ ràng chúng ta đã mất đi một thông tin quan trọng là danh từ nghiên cứu mà thay vào đó bằng một từ không có ý nghĩa nghiên hoặc một từ mà đứng riêng thì nghĩa khác hoàn toàn cứu. Và tất nhiên nếu áp dụng trong Machine Translation, chúng ta sẽ thấy rằng tách từ đúng thì sẽ cho kết quả dịch chính xác hơn.
Hầu hết các kỹ thuật xử lý trong NLP hiện nay đều dựa trên thành phần cơ bản là từ, vì thế có thể nói việc phân chia từ trong text rất là quan trọng đối với một ngôn ngữ. Nếu các bạn có ý định nghiên cứu cho tiếng Việt, các bạn có thể tham khảo bột tách từ khá phổ biến trong cộng đồng NLP Việt Nam: http://mim.hus.vnu.edu.vn/phuonglh/softwares/vnTokenizer. Đối với tiếng Anh, các bạn có thể sử dụng module word_tokenize trong thư viện NLTK của python

3. Stemming và Lemmatization

Trong quá trình xử lý ngôn ngữ tự nhiên, chúng ta sẽ có nhu cầu so sánh các từ (token) với nhau. Việc so sánh này tưởng chừng như đơn giản là lấy 2 chuỗi ký tự và dùng phép “==” để kiểm tra, nhưng thực tế thì không phải là như vậy. Đối với một số ngôn ngữ, tiêu biểu là tiếng Anh, mỗi từ có thể có nhiều biến thể khác nhau. Điều này làm cho việc so sánh giữa các từ là không thể mặc dù về mặc ý nghĩa cơ bản là như nhau. Ví dụ các từ “walks“, “walking“, “walked” đều là các biến thể của từ “walk” và đều mang ý nghĩa là “đi bộ”. Vậy làm sao để so sánh các từ như thế với nhau? Lemmatization Stemming chính là 2 kỹ thuật thường được dùng cho việc này.

Stemming
Stemming là kỹ thuật dùng để biến đổi 1 từ về dạng gốc (được gọi là stem hoặc root form) bằng cách cực kỳ đơn giản là loại bỏ 1 số ký tự nằm ở cuối từ mà nó nghĩ rằng là biến thể của từ. Ví dụ như chúng ta thấy các từ như walked, walking, walks chỉ khác nhau là ở những ký tự cuối cùng, bằng cách bỏ đi các hậu tố –ed, –ing hoặc –s, chúng ta sẽ được từ nguyên gốc là walk. Người ta gọi các bộ xử lý stemming Stemmer.
Bởi vì nguyên tắc hoạt động của stemmer rất là đơn giản như vậy cho nên tốc độ xử lý của nó rất là nhanh, và kết quả stem đôi khi không được như chúng ta mong muốn. Chẳng hạn như từ goes sẽ được stem thành từ goe (bỏ chữ s cuối từ) trong khi đó stem của từ go vẫn là go, kết quả là 2 từ “goes” và “go” sau khi được stem thì vẫn không giống nhau. Một nhược điểm khác là nếu các từ dạng bất quy tắt như went hay spoke thì stemmer sẽ không thể đưa các từ này về dạng gốc là go hay speak.
Tuy có các nhược điểm như trên nhưng trong thực tế Stemming vẫn được sử dụng khá phổ biến trong NLP vì nó có tốc độ xử lý nhanh và kết quả cuối cùng nhìn chung không hề tệ khi so với Lemmatization.

LemmatizationKhác với Stemming là xử lý bằng cách loại bỏ các ký tự cuối từ một cách rất heuristic, Lemmatization sẽ xử lý thông minh hơn bằng một bộ từ điển hoặc một bộ ontology nào đó. Điều này sẽ đảm bảo rằng các từ như “goes“, “went” và “go” sẽ chắc chắn có kết quả trả về là như nhau. Kể các từ danh từ như mouse, mice cũng đều được đưa về cùng một dạng như nhau. Người ta gọi bộ xử lý lemmatization lemmatizer
Nhược điểm của lemmatization là tốc độ xử lý khá chậm vì phải thực hiện tra cứu từ trong cơ sở dữ liệu. Trong các ứng dụng xử lý NLP mà cần độ chính xác cao hơn và thời gian không quan trọng, người ta có thể sử dụng Lemmatization.

Trong tiếng Việt
Một tin vui là đối với tiếng Việt thì chúng ta không cần phải dùng 2 kỹ thuật này vì mỗi từ tiếng Việt nó không có các biến thể khác nhau (dựa trên hiểu biết của bản thân mình). Vì thế nếu bạn đang làm một ứng dụng NLP cho tiếng Việt thì cũng đừng lo về việc này, chỉ khi nào xử lý ngôn ngữ như tiếng Anh thì chắc chắn chúng ta sẽ phải quan tâm đến chúng.
Nếu muốn tìm hiểu thêm về Stemming và Lemmatization, các bạn có thể đọc bài viết này: http://textminingonline.com/dive-into-nltk-part-iv-stemming-and-lemmatization. Bộ NLTK của Python cũng đã có sẵn các thư viện thực hiện stemming và lemmatization cho tiếng Anh nên việc tích hợp vào các ứng dụng khá dễ dàng.
(Nguồn chienuit.wordpress.com)

Một số tài nguyên:
– Thư viện các công cụ xử lý ngôn ngữ tự nhiên tiếng Việt [view]
– Tập dữ liệu để phục vụ cho mục đích nghiên cứu phân loại văn bản các bạn có thể tham khảo: Tiếng Anh, Tiếng Việt

– Xử lý tiếng Việt Wiki

– Vietnamese NLP tools, resources and techniques related on Vietnamese [view]
– http://vlsp.org.vn/
– Đề tài cấp Nhà nước về Xử lý văn bản tiếng Việt [view]

Hits: 604

Leave a Reply