Thứ ba, 03/01/2017 | 00:00 GMT+7

Cách làm việc với dữ liệu ngôn ngữ trong Python 3 bằng Bộ công cụ ngôn ngữ tự nhiên (NLTK)

Giao tiếp dựa trên văn bản đã trở thành một trong những hình thức biểu đạt phổ biến nhất. Ta gửi email, tin nhắn văn bản, tweet và cập nhật trạng thái của bạn hàng ngày. Do đó, dữ liệu văn bản phi cấu trúc đã trở nên cực kỳ phổ biến và việc phân tích số lượng lớn dữ liệu văn bản hiện là một cách chính để hiểu mọi người đang nghĩ gì.

Tweet trên Twitter giúp ta tìm các chủ đề tin tức thịnh hành trên thế giới. Đánh giá trên Amazon giúp user mua những sản phẩm được đánh giá tốt nhất. Những ví dụ về tổ chức và cấu trúc kiến thức đại diện cho các nhiệm vụ Xử lý Ngôn ngữ Tự nhiên (NLP).

NLP là một lĩnh vực khoa học máy tính tập trung vào sự tương tác giữa máy tính và con người. Kỹ thuật NLP được sử dụng để phân tích văn bản, cung cấp một cách để máy tính hiểu được ngôn ngữ của con người. Một vài ví dụ về ứng dụng NLP bao gồm tóm tắt tự động, phân đoạn chủ đề và phân tích tình cảm.

Hướng dẫn này sẽ giới thiệu cách sử dụng Bộ công cụ Ngôn ngữ Tự nhiên (NLTK) : một công cụ NLP cho Python.

Yêu cầu

Đối với hướng dẫn này, bạn nên cài đặt Python 3, cũng như cài đặt môi trường lập trình local trên máy tính của bạn . Nếu không đúng như vậy, bạn có thể cài đặt theo hướng dẫn cài đặt và cài đặt thích hợp cho hệ điều hành của bạn .

Để tận dụng tối đa hướng dẫn này, bạn nên làm quen với ngôn ngữ lập trình Python .

Bước 1 - Nhập NLTK

Trước khi bắt đầu làm việc bằng Python, hãy đảm bảo module NLTK đã được cài đặt. Trên dòng lệnh, kiểm tra NLTK bằng cách chạy lệnh sau:

  • python -c "import nltk"

Nếu NLTK được cài đặt , lệnh này sẽ hoàn thành mà không có lỗi. Bây giờ, hãy đảm bảo bạn đã cài đặt version mới nhất:

  • python -c "import nltk; print(nltk.__version__)"

Bạn nên cài đặt version 3.2.1, vì ta sẽ sử dụng gói Twitter của NLTK yêu cầu version này.

Nếu NLTK chưa được cài đặt , bạn sẽ nhận được thông báo lỗi:

Output
  • Traceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named 'nltk'

Thông báo lỗi cho biết NLTK chưa được cài đặt, vì vậy hãy download thư viện bằng cách sử dụng pip :

  • pip install nltk

Tiếp theo, ta sẽ download dữ liệu và các công cụ NLTK mà ta sẽ làm việc với trong hướng dẫn này.

Bước 2 - Download dữ liệu và trình gắn thẻ của NLTK

Trong hướng dẫn này, ta sẽ sử dụng repodata Twitter mà ta có thể download thông qua NLTK. Cụ thể, ta sẽ làm việc với NLTK của twitter_samples corpus. Hãy download repodata thông qua dòng lệnh, như sau:

  • python -m nltk.downloader twitter_samples

Nếu lệnh chạy thành công, bạn sẽ nhận được kết quả sau:

Output
[nltk_data] Downloading package twitter_samples to [nltk_data] /Users/sammy/nltk_data... [nltk_data] Unzipping corpora/twitter_samples.zip.

Tiếp theo, download trình gắn thẻ bán lời nói (POS). Gắn thẻ POS là quá trình gắn nhãn một từ trong văn bản tương ứng với một thẻ POS cụ thể: danh từ, động từ, tính từ, trạng từ, v.v. Trong hướng dẫn này, ta sẽ đặc biệt sử dụng averaged_perceptron_tagger bình_perceptron_tagger của NLTK. Trình gắn thẻ perceptron trung bình sử dụng thuật toán perceptron để dự đoán thẻ POS nào có nhiều khả năng được cung cấp từ. Hãy download trình gắn thẻ, như sau:

  • python -m nltk.downloader averaged_perceptron_tagger

Nếu lệnh chạy thành công, bạn sẽ nhận được kết quả sau:

Output
[nltk_data] Downloading package averaged_perceptron_tagger to [nltk_data] /Users/sammy/nltk_data... [nltk_data] Unzipping taggers/averaged_perceptron_tagger.zip.

Hãy kiểm tra lại xem tập tài liệu được download có chính xác không. Trong terminal của bạn, hãy mở môi trường tương tác Python:

  • python

Trong môi trường tương tác của Python, nhập twitter_samples corpus:

  • from nltk.corpus import twitter_samples

Kho tài liệu twitter của NLTK hiện chứa một mẫu gồm 20.000 tweet được lấy từ API truyền trực tuyến của Twitter. Các tweet đầy đủ được lưu trữ dưới dạng JSON được phân tách theo dòng. Ta có thể xem có bao nhiêu file JSON tồn tại trong repository ngữ liệu bằng phương thức twitter_samples.fileids() :

  • twitter_samples.fileids()

Đầu ra của ta sẽ như thế này:

Output
[u'negative_tweets.json', u'positive_tweets.json', u'tweets.20150430-223406.json']

Sử dụng các ID file đó, sau đó ta có thể trả về các chuỗi tweet:

  • twitter_samples.strings('tweets.20150430-223406.json')

Chạy điều này sẽ trả về rất nhiều kết quả . Nó thường trông như thế này:

Output
[u'RT @KirkKus: Indirect cost of the UK being in the EU is estimated to be costing Britain \xa3170 billion per year! #BetterOffOut #UKIP'...]

Bây giờ ta biết repodata của ta đã được download thành công. Vì vậy, hãy thoát khỏi môi trường tương tác Python bằng phím tắt ctrl + D

Bây giờ ta có thể truy cập twitter_samples corpus, ta có thể bắt đầu viết một kịch bản để tweets quá trình.

Mục tiêu của kịch bản của ta sẽ để đếm có bao nhiêu tính từ và danh từ xuất hiện trong tập hợp con tích cực của twitter_samples corpus:

  • Một danh từ , theo định nghĩa cơ bản nhất của nó, thường được định nghĩa là người, địa điểm hoặc sự vật. Ví dụ, một bộ phim , một cuốn sách và một chiếc bánh mì kẹp thịt đều là danh từ. Đếm danh từ có thể giúp xác định có bao nhiêu chủ đề khác nhau đang được thảo luận.

  • Tính từ là một từ bổ nghĩa cho một danh từ (hoặc đại từ), ví dụ: một bộ phim kinh khủng , một cuốn sách vui nhộn , hoặc một chiếc bánh mì kẹp thịt ngon lành . Việc đếm các tính từ có thể xác định loại ngôn ngữ đang được sử dụng, tức là các ý kiến có xu hướng bao gồm nhiều tính từ hơn là dữ kiện.

Sau đó, bạn có thể mở rộng tập lệnh này để đếm các tính từ tích cực ( tuyệt vời , tuyệt vời , hạnh phúc , v.v.) so với các tính từ tiêu cực ( nhàm chán , què , buồn , v.v.), được dùng để phân tích cảm xúc của các tweet hoặc đánh giá về một sản phẩm hoặc phim chẳng hạn. Tập lệnh này cung cấp dữ liệu có thể thông báo các quyết định liên quan đến sản phẩm hoặc phim đó.

Ta sẽ bắt đầu kịch bản của ta trong bước tiếp theo.

Bước 3 - Mã hóa câu

Đầu tiên, trong editor mà bạn chọn, hãy tạo tập lệnh mà ta sẽ làm việc với và gọi nó là nlp.py

Trong file của ta , trước tiên hãy nhập repodata . Sau đó, hãy tạo một biến tweets và gán cho nó danh sách các chuỗi tweet từ file positive_tweets.json .

nlp.py
from nltk.corpus import twitter_samples  tweets = twitter_samples.strings('positive_tweets.json') 

Khi ta lần đầu tiên tải danh sách các tweet của bạn , mỗi tweet được biểu thị dưới dạng một chuỗi. Trước khi ta có thể xác định những từ nào trong tweet của ta là tính từ hay danh từ, trước tiên ta cần mã hóa tweet của bạn .

Token hóa là hành động chia nhỏ một chuỗi các chuỗi thành nhiều phần như từ, từ khóa, cụm từ, ký hiệu và các phần tử khác, được gọi là mã thông báo . Hãy tạo một biến mới được gọi là tweets_tokens , mà ta sẽ chỉ định danh sách các tweet được mã hóa:

nlp.py
from nltk.corpus import twitter_samples  tweets = twitter_samples.strings('positive_tweets.json') tweets_tokens = twitter_samples.tokenized('positive_tweets.json') 

Biến mới này, tweets_tokens , là một danh sách trong đó mỗi phần tử trong danh sách là một danh sách các mã thông báo. Bây giờ ta có các mã thông báo của mỗi tweet, ta có thể gắn thẻ các mã thông báo bằng các thẻ POS thích hợp.

Bước 4 - Gắn thẻ các câu

Để truy cập trình gắn thẻ POS của NLTK, ta cần nhập nó. Tất cả các câu lệnh nhập phải ở đầu tập lệnh. Hãy đặt nhập mới này dưới báo cáo nhập khác của ta .

nlp.py
from nltk.corpus import twitter_samples from nltk.tag import pos_tag_sents  tweets = twitter_samples.strings('positive_tweets.json') tweets_tokens = twitter_samples.tokenized('positive_tweets.json') 

Bây giờ, ta có thể gắn thẻ cho từng mã thông báo của bạn . NLTK cho phép ta thực hiện tất cả cùng một lúc bằng cách sử dụng: pos_tag_sents() . Ta sẽ tạo một biến tweets_tagged , mà ta sẽ sử dụng để lưu trữ danh sách được gắn thẻ của bạn . Dòng mới này có thể được đặt trực tiếp vào cuối tập lệnh hiện tại của ta :

tweets_tagged = pos_tag_sents(tweets_tokens) 

Để có ý tưởng về các mã thông báo được gắn thẻ trông như thế nào, đây là phần tử đầu tiên trong danh sách tweets_tagged của ta trông như thế nào:

[(u'#FollowFriday', 'JJ'), (u'@France_Inte', 'NNP'), (u'@PKuchly57', 'NNP'), (u'@Milipol_Paris', 'NNP'), (u'for', 'IN'), (u'being', 'VBG'), (u'top', 'JJ'), (u'engaged', 'VBN'), (u'members', 'NNS'), (u'in', 'IN'), (u'my', 'PRP$'), (u'community', 'NN'), (u'this', 'DT'), (u'week', 'NN'), (u':)', 'NN')] 

Ta có thể thấy rằng tweet của ta được thể hiện dưới dạng danh sách và đối với mỗi mã thông báo, ta có thông tin về thẻ POS của nó. Mỗi cặp mã thông báo / thẻ được lưu dưới dạng một bộ mã .

Trong NLTK, chữ viết tắt của tính từJJ .

Trình gắn thẻ NLTK đánh dấu danh từ số ít ( NN ) bằng các thẻ khác với danh từ số nhiều ( NNS ). Để đơn giản hóa, ta sẽ chỉ đếm các danh từ số ít bằng cách theo dõi thẻ NN .

Trong bước tiếp theo, ta sẽ đếm số lần JJNN xuất hiện trong repository ngữ liệu của ta .

Bước 5 - Đếm thẻ POS

Ta sẽ theo dõi số lần JJNN xuất hiện bằng cách sử dụng một biến tích lũy (đếm), biến này sẽ liên tục thêm vào mỗi khi ta tìm thấy một thẻ. Đầu tiên, hãy tạo số đếm của ta ở cuối tập lệnh của ta , trước tiên ta sẽ đặt thành số không.

nlp.py
from nltk.corpus import twitter_samples from nltk.tag import pos_tag_sents  tweets = twitter_samples.strings('positive_tweets.json') tweets_tokens = twitter_samples.tokenized('positive_tweets.json')  JJ_count = 0 NN_count = 0 

Sau khi tạo các biến, ta sẽ tạo hai vòng lặp for . Vòng lặp đầu tiên sẽ lặp lại qua từng tweet trong danh sách. Vòng lặp thứ hai sẽ lặp lại qua từng cặp mã thông báo / thẻ trong mỗi tweet. Đối với mỗi cặp, ta sẽ tra cứu thẻ bằng cách sử dụng index tuple thích hợp.

Sau đó, ta sẽ kiểm tra xem thẻ có trùng với chuỗi 'JJ' hoặc 'NN' bằng cách sử dụng câu lệnh điều kiện . Nếu thẻ trùng khớp, ta sẽ thêm ( += 1 ) vào bộ tích lũy thích hợp.

nlp.py
from nltk.corpus import twitter_samples from nltk.tag import pos_tag_sents  tweets = twitter_samples.strings('positive_tweets.json') tweets_tokens = twitter_samples.tokenized('positive_tweets.json')  JJ_count = 0 NN_count = 0  for tweet in tweets_tagged:     for pair in tweet:         tag = pair[1]         if tag == 'JJ':             JJ_count += 1         elif tag == 'NN':             NN_count += 1 

Sau khi hoàn thành hai vòng lặp, ta sẽ có tổng số tính từ và danh từ trong repository ngữ liệu của bạn . Để xem tập lệnh của ta tìm được bao nhiêu tính từ và danh từ, ta sẽ thêm câu lệnh in vào cuối tập lệnh.

nlp.py
...  for tweet in tweets_tagged:     for pair in tweet:         tag = pair[1]         if tag == 'JJ':             JJ_count += 1         elif tag == 'NN':             NN_count += 1  print('Total number of adjectives = ', JJ_count) print('Total number of nouns = ', NN_count) 

Đến đây, chương trình của ta sẽ có thể xuất ra số lượng tính từ và danh từ được tìm thấy trong repository ngữ liệu.

Bước 6 - Chạy Tập lệnh NLP

Lưu file nlp.py của bạn và chạy nó để xem ta tìm thấy bao nhiêu tính từ và danh từ:

  • python nlp.py

Hãy kiên nhẫn, có thể mất vài giây để tập lệnh chạy. Nếu mọi việc suôn sẻ, khi ta chạy tập lệnh của bạn , ta sẽ nhận được kết quả sau:

Output
Total number of adjectives = 6094 Total number of nouns = 13180

Nếu kết quả của bạn trông giống nhau, nghĩa là bạn đã hoàn thành hướng dẫn này. Xin chúc mừng!

Mã hoàn thành

Đối với mã đã hoàn thành của ta , ta nên thêm một số comment để những người khác và tương lai của ta dễ dàng theo dõi hơn. Tập lệnh của ta trông như thế này:

nlp.py
# Import data and tagger from nltk.corpus import twitter_samples from nltk.tag import pos_tag_sents  # Load tokenized tweets tweets_tokens = twitter_samples.tokenized('positive_tweets.json')  # Tag tagged tweets tweets_tagged = pos_tag_sents(tweets_tokens)  # Set accumulators JJ_count = 0 NN_count = 0  # Loop through list of tweets for tweet in tweets_tagged:     for pair in tweet:         tag = pair[1]         if tag == 'JJ':             JJ_count += 1         elif tag == 'NN':             NN_count += 1  # Print total numbers for each adjectives and nouns print('Total number of adjectives = ', JJ_count) print('Total number of nouns = ', NN_count) 

Ta đã sử dụng repodata Twitter được download thông qua NLTK trong hướng dẫn này, nhưng bạn có thể đọc trong dữ liệu của riêng mình. Để tự làm quen với việc đọc file bằng Python, hãy xem hướng dẫn của ta về “Cách xử lý file văn bản thuần túy trong Python 3” .

Bạn cũng có thể quan tâm đến việc làm việc với dữ liệu Twitter thực. Bạn có thể tìm hiểu thêm về cách truy cập API Twitter bằng cách đọc “ Cách tạo ứng dụng Twitter ”. Sau đó, bạn có thể xem hướng dẫn của ta về “Cách tạo Twitterbot với Python 3 và Thư viện Tweepy” , cho biết cách sử dụng thư viện Tweepy Python để thu thập các tweet bao gồm một thẻ băm nhất định. Dữ liệu bạn thu thập sau đó có thể được phân tích bằng NLTK.

Từ đây, bạn có thể mở rộng mã để đếm cả danh từ số nhiều và số ít, thực hiện phân tích tình cảm của các tính từ hoặc trực quan hóa dữ liệu bằng Python và matplotlib .

Kết luận

Trong hướng dẫn này, bạn đã học một số kỹ thuật Xử lý ngôn ngữ tự nhiên để phân tích văn bản bằng thư viện NLTK trong Python. Đến đây bạn có thể download kho tài liệu, mã hóa, gắn thẻ và đếm các thẻ POS bằng Python. Bạn có thể sử dụng hướng dẫn này để tạo điều kiện thuận lợi cho quá trình làm việc với dữ liệu văn bản của bạn bằng Python.


Tags:

Các tin liên quan

Cách tạo Twitterbot bằng Python 3 và Thư viện Tweepy
2016-11-30
Cách tạo ứng dụng Twitter bằng Python
2016-11-23
Cách tạo ứng dụng Twitter bằng Python
2016-11-23
Hiểu Logic Boolean trong Python 3
2016-11-17
Cách tạo chương trình máy tính bằng Python 3
2016-11-16
Cách tạo chương trình máy tính bằng Python 3
2016-11-16
Cách sử dụng các phương thức danh sách trong Python 3
2016-11-11
Các hàm Python 3 tích hợp để làm việc với các số
2016-11-08
Cách vẽ dữ liệu trong Python 3 bằng matplotlib
2016-11-07
Hiểu danh sách trong Python 3
2016-11-02