[Behind-save] Các kỹ thuật trong NLP – Natural Language Toolkit


Python là một ngôn ngữ lập trình đơn giản, nhưng mạnh mẽ và được trang bị những tính năng rất thích hợp cho việc xử lý dữ liệu dạng ngôn ngữ học.

Là một ngôn ngữ hướng đối tượng, và cũng đồng thời là một ngôn ngữ động, Python được trang bị những thư viện tiêu chuẩn khổng lồ: từ web, xử lý số học, đến cả lập trình đồ họa. Python được sử dụng rộng rãi trong sản xuất, khoa học, hay giáo dục và ngày càng phổ biến và hoàn thiện.

Nhắc đến Python không thể nhắc đến Natural Language Toolkit (gọi tắt là NLTK).

NLTK là một bộ công cụ dành riêng cho Natural Language Processing và được tích hợp vào Python. Nó đang ngày càng hoàn thiện và tích hợp các công cụ mới bởi hàng nghìn lập trình viên và cộng tác viên trên khắp thế giới. NLTK bao gồm những thư viện hàm, các công cụ phân tích, các corpus, wordnet, …giúp đơn giản hóa, tiết kiệm thời gian và công sức cho các lập trình viên. Python kết hợp với NLTK là bộ công cụ hữu hiệu và mạnh mẽ nhất dành cho Natural Language Processing. http://viet.jnlp.org

Với bài viết này, chúng ta sẽ có khái niệm cơ bản về Xử lý ngôn ngữ tự nhiên. Mặt khác, tài liệu trình bày công cụ NLTK và ngôn ngữ lập trình Python. Dẫn dắt bạn chạm vào cụm từ NLTK một cách gần gũi dễ hiểu, bạn sẽ được hướng dẫn làm cách nào để cài đặt những thư viện thiết yếu cho việc xây dựng ví dụ về word cloud cơ bản. Bên cạnh đó, còn đề cập đến tokenization, stemming, lemmatization và loại bỏ stop word.

Xử lý ngôn ngữ tự nhiên (Natural Language Processing -NLP) là một lĩnh vực của khoa học máy tính (Computer Science), liên quan đến sự tương tác giữa ngôn ngữ người (natural language) với máy tính. Một vài thách thức ở NLP như tokenization, chunking, speech tagging, parsing, dịch máy – machine translation, nhận diện giọng nói – speech recognition,…

Chúng ta đang sống trong thời đại thông tin, ngoài những thông tin trên báo, sách vở, chúng ta có thể dễ dàng tìm và đọc được trên internet, thông qua một công cụ tìm kiếm phổ biến nhất là Google, chúng ta dùng Siri để hỗ trợ các công việc tương tác với máy tính bảng hay di động không cần dùng tay. Với những ai có email thì việc lọc spam là vô cùng quan trọng, với nhân viên văn phòng, làm việc với office từ Microsoft thì chức năng kiểm tra lỗi chính tả lại là chức năng đắc lực. Tất cả đều được xây dựng dựa trên Xử lý ngôn ngữ tự nhiên. Phân loại rõ rệt như sau:

+ Phát hiện lỗi chính tả (MS Word/ Các công cụ editor)

+ Công cụ tìm kiếm (Google,Bing,Yahoo,Baidu,…)

+ Công cụ giọng nói (Siri, Google Voice, Cortana)

+ Quản lý spam (các dịch vụ mail như gmail, outlook,…)

+ Hiển thị tin tức (Google, Yahoo, Facebook,…)

+ Công cụ dịch thuật (Google translate, Microsoft translate,…)

 

Để xây dựng nên những ứng dụng hữu ích cho cuộc sống con người như các loại ứng dụng trên, đòi hỏi lượng kiến thức, sự hiểu biết khá lớn về ngôn ngữ, vì chỉ có hiểu ngôn ngữ đó chúng ta mới có thể phân tích và xây dựng lên các ứng dụng có độ chính xác cao. Hiện tại, có rất nhiều công cụ mã nguồn mở sẵn có, được đầu tư phát triển một cách nghiêm túc hỗ trợ cho khó khăn trên về ngôn ngữ ví dụ như:

+ GATE

+ Mallet

+ Open NLP

+ Uima

+ Stanford toolkit

+ Genism

+ và Natural Language Tool Kit (NLTK)

 

Hầu hết những công cụ này đều viết bằng ngôn ngữ Java và có những chức năng tương tự. Chúng đều là những công cụ mạnh mẽ. Tuy nhiên, điểm khác biệt là sự tiện dùng, mà chỉ có ở NLTK, đây là một công cụ rất tốt để học tập, cũng chính bởi vì sự kết hợp của NLTK với Python. NLTK đã tích hợp hầu hết những trọng tâm của NLP. Với những đánh giá tốt về NLTK, thì đây là một trong những thư viện phổ biến nhất trong cộng đồng NLP.

chúng ta nên tự tìm hiểu và học Python. Hiện tại có rất nhiều tài liệu và video hướng dẫn về Python và mình đã học Python qua kênh Youtube của một người anh đi trước:

 https://www.youtube.com/watch?v=FgN-mHwHLyg&list=PLyiioioEJSxEh_S_XFvG0d2xKRMSWLfN_&index=1

Bạn nên sử dụng Anaconda vì nó có các thư viện đi kèm như scipy, numpy, scikit,… chúng được sử dụng cho việc phân tích dữ liệu và các ứng dụng khác có liên quan đến NLP và một vài lĩnh vực tương tự. Và NLTK cũng là một phần của nó.

Thực hành 

Mở Anaconda Prompt, gõ python à Enter. Kết quả như hình:

Thông tin đưa ra phiên bản Python bạn đã cài.

Để kiểm tra bạn đã cài công cụ NLTK chưa ta tiếp tục thực hiện các lệnh sau:

Chúng ta cùng ôn lại Python một chút:

a) Danh sách – List

Đây là một trong những cấu trúc dữ liệu thường được sử dụng trong Python. List trong Python có sự khác biệt khá nhiều nếu so sánh với những ngôn ngữ lập trình khác. Chúng ta cùng bắt đầu với những hàm quan trọng nhất mà List trong Python đã cung cấp.

Nhập các câu lệnh sau:

Và danh sách (list) có thể được truy cập bằng việc sử dụng các chỉ số.

Nhập như sau:

>>> print (‘Phan tu dau tien:’ + lst[0])

Và kết quả như hình

Bạn sẽ thấy có đoạn thông báo lỗi do không thể chuyển đổi từ kiển int sang kiểu string được. Giải quyết như sau :

Cách tốt để tìm hiểu về những kiểu dữ liệu khác nhau và các hàm là sử dụng những hàm hỗ trợ như help()dir(lst).

dir(đối tượng python) được sử dụng để đưa ra các thuộc tính của đối tượng Python. Nếu như bạn đi qua một đối tượng danh sách – list object, nó sẽ đưa ra những việc bạn có thể làm với danh sách đó.

Chúng ta tiếp tục gõ vào Anacomda Prompt như sau :

Với help(đối tượng python), chúng ta sẽ có tài liệu chi tiết cho đối tượng, và cũng đưa ra vài ví dụ về việc sử dụng đối tượng đó. helpdir có thể được sử dụng trên bất cứ kiểu dữ liệu Python nào, và là cách hay để học về những chức năng và những chi tiết khác của đối tượng. Nó cũng cung cấp những ví dụ cơ bản để làm việc.

Kiểu dữ liệu String trong Python rất giống với những ngôn ngữ khác, việc thao tác với chuỗi là một trong những tính năng chính của Python. String trong Python là việc rất dễ dàng, chẳng hạn bạn dễ dàng tách chuỗi với Python nhưng Java và C có lẽ sẽ ngược lại.

Một số ví dụ sử dụng kiểu dữ liệu string.

Split : là một phương pháp để phân chia các chuỗi dựa trên những ký tự phân cách. Nếu không được cung cấp đối số thì nó sẽ ngầm định khoảng trắng là ký tự phân cách.

Strip: Đây là phương thức loại bỏ các khoảng trắng như ‘\n’ , ‘\n\r’ từ chuỗi

Upper/Lower: Chúng ta có thể chuyễn chuỗi hoa thành thường và ngược lại.

Replace: sẽ giúp bạn thay thế một chuỗi con từ chuỗi

Và còn rất nhiều hàm khác nữa tại : https://docs.python.org/2/library/string.html

b) Biểu thức chính quy (Regular Expression – Regex)

Một kỹ năng quan trọng khác cho một người tìm hiểu NLP là làm việc với biểu thức chính quy, đây là chuỗi ký tự đặc biệt được dùng làm mẫu (pattern), để phân tích sự trùng khớp của một tập hợp các chuỗi nào đó. Regex được sử dụng trong nhiều ngôn ngữ lập trình như PHP, C#, Perl, Python, … kiểm tra tính hợp lệ các dữ liệu đầu vào. Những biểu thức thường dùng:

+ Dấu chấm câu: Biểu thức phù hợp với bất cứ đơn ký tự nào trừ ‘\n’

+ \w: phù hợp với một ký tự hoặc một chữ số và gạch dưới [a-z A-Z 0-9 _]

+ \W: phù hợp với bất kỳ ký tự.

+ \s: ký tự là 1 khoảng trắng – space, xuống dòng, trở lại, tab, hình thái [\n\r\t\f].

+ \S: ký tự không khoảng trắng.

+ \t: thực hiện chức năng tab.

+ \n: ký tự xuống dòng.

+ \r: ký tự trả về

+ \d: bất kỳ số nào [0-9].

+ ^: bắt đầu một chuỗi

+ $: Kết thúc một chuỗi

+ \: ký tự đặc biệt

c) Dictionaries

Cấu trúc dữ liệu được sử dụng phổ biến khác là Dictionaries. Là những cấu trúc dữ liệu được lập chỉ mục bởi các khóa, được sử dụng rộng rãi bởi nhiều ngôn ngữ lập trình cho việc thực hiện nhiều thuật toán. Python dictionaries là một trong những thể hiện của bảng băm trong bất cứ ngôn ngữ lập trình nào. Dictionaries rất dễ dàng xây dựng một cấu trúc dữ liệu phức tạp mà đối với ngôn ngữ khác là một vấn đề lớn. Cho phép lập trình viên tập trung vào thuật toán thay vì cấu trúc dữ liệu.

NLTK

Chúng ta cùng tìm hiểu NLTK qua một vài ví dụ cơ bản. Và đầu tiên sẽ phân tích vài nội dung text. Ví dụ sau, bằng việc lấy nội dung từ trang chủ Python.

Nhận thấy không có bất cứ dấu hiệu nào về những loại chủ đề được đề cập tại URL, vì vậy, chúng ta phải phân tích dự liệu thăm dò. Thông thường trong một miền văn bản, phân tích dữ liệu thăm dò có nhiều ý nghĩa, nhưng sẽ đi với một trường hợp đơn giản của các loại từ. Những chủ đề là gì ? Chúng diễn ra như thế nào ? Quá trình sẽ liên quan đến vài level của các bước tiền xử lý. Chúng ta sẽ cố gắng thực hiện trước tiên bằng Python, sau chúng ta sẽ sử dụng NLTK.

Bắt đầu với việc clean các thẻ html. Một cách để làm điều này là chỉ chọn token bao gồm cả số và ký tự. Bất cứ ai đã làm việc với biểu thức chính quy nên chuyển chuỗi html vào danh sách các token

Bạn có thể thấy, có các thẻ html dư thừa và những ký tự không mong muốn khác khi chúng ta dùng phương thức trên. Một phiên bản tối ưu hơn giải quyết việc trên như sau :

Chúng ta thấy sự khác biệt và trông dễ nhìn hơn rất nhiều, và bạn vẫn có thể làm hơn vậy nữa, vẫn có thể loại bỏ thêm một số thẻ html khác. Bây giờ, thay vì dùng những câu lệnh trên, chúng ta sẽ sử dụng NLTK để giải quyết vấn đề tương tự. NLTK có một hàm chức năng là clean_html() , nó có thể làm gọn hơn những cách trước như sau :

Như vậy khi import NLTK, vấn đề muốn giải quyết sẽ triệt để và dễ dàng hơn rất nhiều.

Hãy thử lấy sự sắp xếp tần số xuất hiện của các luật. Đầu tiên, chúng ta làm theo cách thông thường, và sau đó sẽ so sánh với cách làm với NLTK :

Một cách tiếp cận tốt hơn và hiệu quả hơn là sử dụng hàm chức năng FreqDist() của NLTK.

Sau đây là sơ đồ cho sự phân bố tần suất

Trong hầu hết các nhiệm vụ NLP và tìm kiếm thông tin, người ta thường loại bỏ các từ ngữ không cần thiết, các mạo từ, những stop word. Bây giờ chúng ta chạy lại ví dụ :

Trông gọn hơn rồi, bạn có thể truy cập Wordle http://www.wordle.net/advanced và đặt sự phân bố trong một form của CSV và bạn sẽ có kết quả như word cloud sau :

Text Wrangling và Cleansing

Text Wrangling là gì

Thật sự khó để định nghĩa thuật ngữ text.data wrangling. Ở đây chúng ta sẽ định nghĩa chúng như là tất cả tiến trình trước và tất cả những sức nặng lên bạn trước khi bạn có một máy tính có thể đọc được và định dạng văn bản từ dữ liệu thô. Tiến trình này liên quan đến data munging, text cleansing, tiền xử lý cụ thể, tokenization, stemming hoặc lemmatization và loại bỏ stop word. Hãy bắt đầu với một ví dụ cơ bản của việc phân tích cú pháp một tập tin CSV.

Tại đây chúng ta đang thử phân tích một CSV, dòng code trên sẽ là một danh sách với các cột của CSV. Chúng ta có thể tùy chỉnh để làm việc trên bất kỳ dấu phân cách và ký tự trích dẫn. Bây giờ khi chúng ta có các chuỗi thô, chúng ta có thể áp dụng những loại text wrangling khác. Một dòng tiến trình rõ ràng cho một số loại tài liệu được chấp nhận được trình bày ở sơ đồ khối sau:

Các nguồn dữ liệu phổ biến nhất đã được trình bày ở trên. Hầu hết các trường hợp, dữ liệu đang ở định dạng dữ liệu. Ở bước tiếp theo, sơ đồ đã liệt kê những gói Python sử dụng phổ biến nhất xung quanh những định dạng dữ liệu.  Một ví dụ, trong trường hợp của một tập tin CSV, module CSV của Python là cách tốt nhất xử lý CSV. Nó cho phép bạn làm việc với các bộ tách khác nhau, những ký tự trích dẫn khác nhau, …

Những tập tin khác được sử dụng là json:

Chúng ta chỉ tải một file json đang sử dụng mô đun json. Python cho phép bạn chọn và xử lý nó theo chuỗi thô. Hãy nhìn sơ đồ khối để biết chi tiết về tất cả những nguồn dữ liệu, và gói parsing của chúng trong Python. Trước khi bạn viết parser để phân tích những định dạng tài liệu khác nhau, hãy nhìn dòng thứ hai cho những parser có thể trong Python. Khi bạn hiểu về một cuỗi thô, các bước tiền xử lý được áp dụng như một dòng chảy hoặc bạn có thể loại bỏ vài số trong chúng. Chúng ta sẽ nói về Tokenization, các stemmer và các lemmatizer trong phần chi tiết tiếp theo. Chúng ta sẽ nói về các biến thể và khi nào sử dụng.

Text cleansing

Chúng ta đã phân tích văn bản từ một biến của những nguồn dữ liệu, thách thức ở đây là nghĩa của dữ liệu thô này. Text cleansing được thực hiện trên văn bản, tùy thuộc vào nguồn dữ liệu, hiệu suất phân tích,…. Trong Phần I, chúng ta đươc biết về cách làm sạch html bằng hàm chức năng html_clean, có thể được gán nhãn như text cleansing. Trong trường hợp khác, nơi mà chúng ta đang phân tích một file PDF, có thể có những ký tự không mong muốn, những ký tự là ASCII không được loại bỏ,… Với một dữ liệu nguồn (gốc) như xml, chúng ta có thể chỉ quan tâm đến một số yếu tố cụ thể của cây. Với những cơ sở dữ liệu chúng ta có thể phải thực hiện thao tác tách và đôi khi chỉ quan tâm đến các cột cụ thể. Tóm lại, quá trình nào đó thực hiện với mục đích lọc văn bản thì có thể gọi là text cleansing. Không có ranh giới rõ ràng giữa data munging, text cleansing và data wrangling, chúng có thể được dùng thay thế cho nhau

Tách câu -sentence splitter

Một vài ứng dụng NLP yêu cầu việc tách một văn bản thô lớn vảo câu để lấy thông tin nhiều hơn. Câu là thành phần của một cuộc đối thoại. Khi nói đến máy tính, đây là nhiệm vụ khó hơn. Một sentence splitter điển hình đơn giản như việc tách các chuỗi dựa vào dấu chấm, phức tạp hơn như một bộ phân loại, xác định câu.

Chúng ta thử tách chuỗi văn bản thô vào trong danh sách các câu. Sent_tokenize, sử dụng một thuật toán phân tích được xây dựng trong NLTK. Nếu ứng dụng của bạn yêu cầu một sentence splitter tùy chỉnh, có những cách như chúng ta có thể huấn luyện một sentence splitter của riêng mình.

Sentence splitter trên phù hợp với 17 ngôn ngữ. Bạn chỉ cần xác định đối tượng tương ứng.

Tokenization

Là quá trình phân chia một sentence thành các tokens. Với segmented language như tiếng Anh, có thể tokenize dễ dàng với dấu cách (whitespace). Tuy nhiên, với những ngôn ngữ như tiếng Việt, tiếng Trung hay tiếng Ả Rập, tokenization khó hơn nhiều vì không có biên giới rõ ràng giữa các từ như tiếng Anh. Hơn thế nữa mọi ký tự trong ngôn ngữ tượng hình như tiếng Trung, tiếng Ả Rập đều có thể tồn tại như một từ đơn ký tự hoặc cũng có thể kết hợp với nhau để tạo thành từ đa ký tự.

Stemming

Theo nghĩa đen, là quá trình cắt giảm các nhánh của một cây gốc. Hiệu quả với việc sử dụng một số quy tắc cơ bản, bất cứ token nào có thể được cắt giảm. Stemming là chi tiết của một quá trình dựa trên nguyên tắc thô mà chúng ta muốn. Ví dụ, từ eat sẽ có các giá trị như eating, eaten, eats,… Vài ứng dụng, nó không có sự khác biệt giữa eateaten. Có những trường hợp ngôn ngữ phức tạp hoặc các nhiệm vụ phức tạp, chúng ta cần sử dụng lemmatization để thay thế, mạnh mẽ nhanh chóng hơn.

Lemmatization

Là một cách có phương pháp chuyển đổi tất cả các ngữ pháp, biến thể của từ gốc. Sử dụng ngữ cảnh và một phần của lời nói để xác định cách thức biến thể của từ và thực hiện các quy luật bình thường hóa khác nhau.

Loại bỏ stop word

Là một trong các bước tiền xử lý thường được sử dụng trên các ứng dụng NLP khác nhau. Ý tưởng đơn giản là loại bỏ những từ thường xuất hiện. Thông thường, các mạo từ và đại từ thì được phân loại như là stop word. Những từ này không có ý nghĩa trong những nhiệm vụ NLP cho việc tìm kiếm và phân loại thông tin.

Để thực hiện quá trình loại bỏ stop word, ta sử dụng NLTK stop word.

Chúng ta đã tìm hiểu về stemming và lemmatization, và các kiểu dữ liệu của các stemmer có thể được sử dụng. Chúng ta cũng tìm hiểu về quá trình loại bỏ stop word.

Mình dừng tại đây, bạn hãy research thêm để có kiến thức xác thực và chuyên sâu hơn.


Cảm ơn bạn đã theo dõi blog.
Nhiều ngày tốt lành!

Advertisements

Cho mình biết cảm nhận của bạn nhé

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s