Thứ sáu, 17/02/2017 | 00:00 GMT+7

Cách vẽ biểu đồ tần suất từ bằng matplotlib với Python 3

Dữ liệu văn bản tồn tại ở nhiều dạng khác nhau, từ báo chí đến mạng xã hội cho đến email. Khi ta phân tích và trực quan hóa dữ liệu văn bản, ta có thể đưa ra các xu hướng chung chung có thể thay đổi cách ta diễn giải văn bản.

Trong hướng dẫn này, ta sẽ khám phá cách vẽ biểu đồ tần số từ trong một kho ngữ liệu văn bản. Chương trình ta sẽ tạo sẽ tìm kiếm thông qua một tài liệu văn bản thuần túy và sắp xếp từng từ duy nhất với tần suất của nó. Sau đó, ta sẽ vẽ biểu đồ dữ liệu mà ta tìm thấy bằng cách sử dụng matplotlib .

Yêu cầu

Để có thể sử dụng hướng dẫn này, hãy đảm bảo bạn có các yêu cầu sau:

Cuối cùng, hãy đảm bảo bạn làm theo Bước 1 - nhập matplotlib của Cách vẽ sơ đồ dữ liệu trong Python 3 của ta Sử dụng matplotlib vì điều cần thiết là phải cài đặt matplotlib cho dự án này.

Bước 1 - Cài đặt file chương trình

Bây giờ ta đã cài đặt matplotlib trên máy tính của bạn , ta có thể bắt đầu tạo dự án của bạn .

Sử dụng editor mà bạn chọn, tạo một file Python mới và gọi nó là word_freq.py . Đây sẽ là file chính của ta .

Trong chương trình này, ta sẽ nhập matplotliblớp mà ta cần (là pyplot ), chuyển cho nó bí danh plt . Về cơ bản, điều này khai báo plt là một biến toàn cục sẽ được sử dụng trong suốt tập lệnh của ta .

word_freq.py
import matplotlib.pyplot as plt 

Tiếp theo, ta sẽ nhập một số gói mặc định bằng Python. Chúng sẽ được sử dụng để cài đặt và nhận đầu vào dòng lệnh. Gói quan trọng cần lưu ý là argparse . Đây là những gì ta sẽ sử dụng để lấy thông tin từ dòng lệnh và bao gồm văn bản trợ giúp cho user .

Hãy nhập các gói mặc định sau bằng Python:

word_freq.py
import matplotlib.pyplot as plt import sys import operator import argparse 

Cuối cùng, tạo phương thức chính tiêu chuẩn và gọi. Bên trong phương thức chính là nơi ta sẽ viết hầu hết mã của bạn .

word_freq.py
import matplotlib.pyplot as plt import sys import operator import argparse   def main():  if __name__ == "__main__":   main() 

Bây giờ ta đã nhập mọi thứ và cài đặt khung cho dự án của bạn , ta có thể chuyển sang sử dụng các gói mà ta đã nhập.

Bước 2 - Cài đặt Trình phân tích cú pháp đối số

Đối với phần này, ta sẽ tạo các đối số dòng lệnh và lưu trữ chúng trong một biến để truy cập nhanh.

Trong phương thức chính của ta , hãy tạo biến phân tích cú pháp và gán nó cho hàm tạo mặc định mà argparse cung cấp. Sau đó, ta sẽ chỉ định đối số mong đợi cho từ mà ta sẽ tìm kiếm trong file . Cuối cùng, ta sẽ chỉ định đối số mong đợi cho file chứa từ trong đó. Đây sẽ là .txt .

word_freq.py
... def main():   parser = argparse.ArgumentParser()   parser.add_argument(       "word",       help="the word to be searched for in the text file."   )   parser.add_argument(       "filename",       help="the path to the text file to be searched through"   )  if __name__ == "__main__":   main() 

Hiện tại, đối số đầu tiên trong phương thức là tiêu đề của những gì ta mong đợi trong dòng lệnh. Đối số thứ hai help= "..." được sử dụng để cung cấp cho user một số thông tin về đối số dòng lệnh nên là.

Tiếp theo, ta sẽ lưu các đối số đã cho vào một biến khác mà ta sẽ gọi là args .

word_freq.py
... def main():   parser = argparse.ArgumentParser()   parser.add_argument(       "word",       help="the word to be searched for in the text file."   )   parser.add_argument(       "filename",       help="the path to the text file to be searched through"   )    args = parser.parse_args()  if __name__ == "__main__":   main() 

Để có biện pháp tốt, ta nên luôn kiểm tra đầu vào của bạn trong trường hợp có lỗi đánh máy trong các đối số dòng lệnh. Điều này cũng để ngăn tập lệnh của ta bị lỗi đột ngột. Do đó, ta hãy xử lý lỗi bằng cách sử dụng câu lệnh try .

word_freq.py
... def main():     ...     args = parser.parser_args()      try:         open(args.filename)      except FileNotFoundError:         sys.stderr.write("Error: " + args.filename + " does not exist!")         sys.exit(1)  if __name__ == "__main__":   main() 

Ta đang sử dụng sys.exit(1) để cho user biết rằng đã xảy ra sự cố với mã và nó không thể hoàn tất thành công.

Dự án của ta bây giờ sẽ có thể nhận các đối số dòng lệnh. Bước tiếp theo là phân tích cú pháp file đầu vào của ta .

Bước 3 - Phân tích cú pháp file

Trong bước này, ta sẽ lấy một file , đọc từng từ, ghi lại tần suất chúng xuất hiện và lưu tất cả vào một kiểu dữ liệu từ điển.

Hãy tạo một hàm có tên là word_freq() nhận hai đối số dòng lệnh (từ và tên file ), sau đó gọi hàm đó trong hàm main() .

word_freq.py
... def main():     ...     word_freq(args.word, args.filename)  def word_freq(word, filename):  if __name__ == "__main__":   main() 

Bước đầu tiên để phân tích cú pháp file là tạo một kiểu dữ liệu từ điển mà ta sẽ gọi là doc . Điều này sẽ giữ mọi từ được tìm thấy trong file và theo dõi số lần từ đó đã xuất hiện.

word_freq.py
... def word_freq( word, filename ):     doc = {}  if __name__ == "__main__":   main() 

Bước tiếp theo sẽ là lặp qua file đã cho. Điều này được thực hiện bằng cách sử dụng vòng lặp for lồng nhau .

Vòng lặp for đầu tiên được thiết kế để mở file và lấy dòng đầu tiên từ nó. Sau đó, nó lấy những gì có trong mỗi dòng và phân tách nó dựa trên một chuỗi ký tự khoảng trắng giữa các từ trong khi lưu trữ các từ thành một mảng.

Vòng lặp for thứ hai lấy mảng này và lặp qua nó để kiểm tra xem nó có trong từ điển hay không. Nếu đúng, ta cộng một số vào đó. Nếu không, thì ta tạo một mục nhập mới và khởi tạo nó như 1.

word_freq.py
... def word_freq(word, filename):     doc = {}      for line in open(filename):         split = line.split(' ')         for entry in split:             if (doc.__contains__(entry)):                 doc[entry] = int(doc.get(entry)) + 1             else:                 doc[entry] = 1  if __name__ == "__main__":   main() 

Bây giờ ta đã đi được nửa chặng đường với dự án.

Tóm lại, phương thức our main() sẽ cài đặt các đầu vào dòng lệnh và chuyển chúng vào hàm word_freq() . word_freq() nên lấy từ và tên file từ dòng lệnh và lưu từng từ duy nhất được tìm thấy trong file văn bản.

Tiếp theo, ta sẽ lấy dữ liệu này và sắp xếp nó để sử dụng trong biểu đồ của ta .

Bước 4 - Lưu trữ và sắp xếp dữ liệu

Trước khi tạo biểu đồ, ta phải đảm bảo từ đó thực sự có trong file ta đã mở. Ta có thể làm điều này với một if tuyên bố có điều kiện .

word_freq.py
... def word_freq(word, filename):     ...       else:           doc[entry] = 1     if (not word in doc):         sys.stderr.write("Error: " + word + " does not appear in " + filename)         sys.exit(1)  if __name__ == "__main__":   main() 

Bây giờ ta biết từ có trong file , ta có thể bắt đầu cài đặt dữ liệu cho biểu đồ của bạn .

Đầu tiên, ta phải bắt đầu với việc sắp xếp loại dữ liệu từ điển của ta từ cao nhất đến ít nhất và khởi tạo các biến để sử dụng sau này. Ta phải sắp xếp từ điển của bạn để nó được hiển thị một cách thích hợp trên biểu đồ.

word_freq.py
... def word_freq(word, filename):     ...     if (not word in doc):         sys.stderr.write("Error: " + word + " does not appear in " + filename)         sys.exit(1)      sorted_doc = (sorted(doc.items(), key = operator.itemgetter(1)))[::-1]     just_the_occur = []     just_the_rank = []     word_rank = 0     word_frequency = 0  if __name__ == "__main__":   main() 

Hai biến cần lưu ý là just_the_occur , là dữ liệu sẽ chứa bao nhiêu lần một từ đã xuất hiện. Biến còn lại là just_the_rank , là biến sẽ chứa dữ liệu liên quan đến thứ hạng của từ.

Bây giờ ta đã có từ điển được sắp xếp, ta sẽ lặp lại nó để tìm từ của ta và thứ hạng của nó cũng như điền vào biểu đồ của ta với dữ liệu này.

word_freq.py
... def word_freq( word, filename ):     ...    sortedDoc = (sorted(doc.items(), key = operator.itemgetter(1)))[::-1]   just_the_occur = []   just_the_rank = []   word_rank = 0   word_frequency = 0      entry_num = 1     for entry in sorted_doc:         if (entry[0] == word):             word_rank = entryNum             word_frequency = entry[1]          just_the_rank.append(entry_num)         entry_num += 1         just_the_occur.append(entry[1])  if __name__ == "__main__":   main() 

Ở đây ta phải đảm bảo cả hai biến just_the_occurjust_the_rank có cùng độ dài nếu không matplotlib sẽ không cho ta tạo biểu đồ.

Ta cũng bổ sung một if tuyên bố trong vòng lặp để tìm lời của ta (mà ta đã biết là có) và kéo ra xếp hạng và tần số của nó.

Bây giờ ta có mọi thứ ta cần để tạo biểu đồ của ta . Bước tiếp theo của ta là cuối cùng tạo ra nó.

Bước 5 - Tạo đồ thị

Đến đây, ta có thể cắm biến plt mà ta đã tạo lúc đầu. Để tạo biểu đồ, ta cần có tiêu đề, nhãn trục y, nhãn trục x, tỷ lệ và loại biểu đồ.

Trong trường hợp của ta , ta sẽ tạo một đồ thị log cơ sở 10 để tổ chức dữ liệu của ta . Các nhãn tiêu đề và trục có thể là bạn muốn nhưng càng mang tính mô tả thì càng tốt cho những người đang xem biểu đồ của bạn.

word_freq.py
... def word_freq( word, filename ):     ...   just_the_rank.append(entry_num)   entry_num += 1   just_the_occur.append(entry[1])    plt.title("Word Frequencies in " + filename)   plt.ylabel("Total Number of Occurrences")   plt.xlabel("Rank of word(\"" + word + "\" is rank " + str(word_rank) + ")")   plt.loglog(     just_the_rank,     just_the_occur,     basex=10   )   plt.scatter(     [word_rank],     [word_frequency],     color="orange",     marker="*",     s=100,     label=word   )   plt.show()  if __name__ == "__main__":   main() 

Các hàm title, plt.ylabel()plt.xlabel() là các nhãn cho mỗi trục.

Hàm plt.loglog() nhận just_the_rankjust_the_occur cho trục x và y tương ứng.

Ta thay đổi cơ sở log và đặt nó thành 10.

Sau đó, ta cài đặt âm mưu để phân tán và làm nổi bật điểm của ta . Ta đã làm cho nó một ngôi sao màu cam, với kích thước 100 để nó được phát âm. Cuối cùng, ta gắn nhãn nó với từ của ta .

Khi mọi thứ đã hoàn thành cho biểu đồ của ta , ta yêu cầu nó được hiển thị với plt.show() .

Bây giờ mã của ta cuối cùng đã hoàn thành, ta có thể chạy thử nghiệm nó.

Bước 6 - Chạy chương trình

Đối với mẫu văn bản của ta , ta cần một file văn bản để đọc, vì vậy hãy download một file từ Project Gutenberg, một dự án tình nguyện cung cấp ebook miễn phí (chủ yếu trong domain công cộng) cho người đọc.

Hãy lưu văn bản của cuốn tiểu thuyết A Tale of Two Cities của Charles Dickens dưới dạng file có tên là cities.txt với curl vào folder hiện tại chứa tập lệnh Python của ta :

  • curl http://www.gutenberg.org/files/98/98-0.txt --output cities.txt

Tiếp theo, hãy chạy mã của ta chuyển các tham số của từ mà ta chọn ( ta sẽ sử dụng “fish”) và tên của file văn bản:

  • python word_freq.py fish cities.txt

Nếu mọi thứ hoạt động chính xác, bạn sẽ thấy điều này:

Biểu đồ phân tán tần số từ trong matplotlib

Ta thấy thứ hạng của từ “cá” là 5309, và hình dung về các lần xuất hiện.

Bây giờ, bạn có thể tiếp tục thử nghiệm với các từ khác nhau và các file văn bản khác nhau. Bạn có thể tìm hiểu thêm về cách làm việc với file văn bản bằng cách đọc hướng dẫn Cách xử lý file văn bản thuần túy trong Python 3 của ta .

Cải tiến mã và mã đã hoàn thành

Đến đây, bạn nên có một chương trình hoạt động đầy đủ sẽ xác định tần suất từ của một từ nhất định trong .txt .

Dưới đây là mã hoàn thành của ta cho dự án này.

word_freq.py
import matplotlib.pyplot as plt import sys import operator import argparse   def main():     parser = argparse.ArgumentParser()     parser.add_argument(         "word",         help="the word to be searched for in the text file."     )     parser.add_argument(         "filename",         help="the path to the text file to be searched through"     )      args = parser.parse_args()      try:         open(args.filename)     except FileNotFoundError:          # Custom error print         sys.stderr.write("Error: " + args.filename + " does not exist!")         sys.exit(1)      word_freq(args.word, args.filename)   def word_freq(word, filename):     doc = {}      for line in open(filename):          # Assume each word is separated by a space         split = line.split(' ')         for entry in split:             if (doc.__contains__(entry)):                 doc[entry] = int(doc.get(entry)) + 1             else:                 doc[entry] = 1      if (word not in doc):         sys.stderr.write("Error: " + word + " does not appear in " + filename)         sys.exit(1)      sorted_doc = (sorted(doc.items(), key=operator.itemgetter(1)))[::-1]     just_the_occur = []     just_the_rank = []     word_rank = 0     word_frequency = 0      entry_num = 1     for entry in sorted_doc:          if (entry[0] == word):             word_rank = entry_num             word_frequency = entry[1]          just_the_rank.append(entry_num)         entry_num += 1         just_the_occur.append(entry[1])      plt.title("Word Frequencies in " + filename)     plt.ylabel("Total Number of Occurrences")     plt.xlabel("Rank of word(\"" + word + "\" is rank " + str(word_rank) + ")")     plt.loglog(just_the_rank, just_the_occur, basex=10)     plt.scatter(         [word_rank],         [word_frequency],         color="orange",         marker="*",         s=100,         label=word     )     plt.show()  if __name__ == "__main__":     main()  

Bây giờ mọi thứ đã hoàn tất, có một số cải tiến và sửa đổi tiềm năng mà ta có thể thực hiện đối với mã này.

Nếu ta muốn so sánh tần suất của hai từ, thì ta sẽ thêm một vị trí từ bổ sung trong các đối số dòng lệnh của bạn . Để thực hiện điều này, ta sẽ phải thêm một trình kiểm tra khác cho từ và nhiều biến hơn cho các từ.

Ta cũng có thể sửa đổi chương trình để nó so sánh thời lượng của mỗi từ với một từ khác. Để làm điều này, ta sẽ so sánh các từ theo độ dài và lưu từng độ dài duy nhất vào từ điển.

Kết luận

Ta vừa tạo một chương trình để đọc qua một file văn bản và sắp xếp dữ liệu để xem tần suất của một từ cụ thể so với những từ khác trong văn bản.

Nếu bạn quan tâm đến trực quan hóa dữ liệu, bạn cũng có thể xem Cách tạo biểu đồ thanh bằng JavaScript và hướng dẫn Thư viện D3 của ta .


Tags:

Các tin liên quan

Cách cài đặt gói pandas và làm việc với cấu trúc dữ liệu trong Python 3
2017-02-10
Cách cài đặt gói pandas và làm việc với cấu trúc dữ liệu trong Python 3
2017-02-10
Cách cài đặt gói pandas và làm việc với cấu trúc dữ liệu trong Python 3
2017-02-10
Cách viết module trong Python 3
2017-02-03
Cách cài đặt Python 3 và thiết lập môi trường lập trình trên server Ubuntu 16.04
2017-02-01
Cách khai báo module trong Python 3
2017-02-01
Hiểu Tuples trong Python 3
2017-01-19
Cách tạo các vòng lặp trong Python 3
2017-01-12
Hiểu toàn bộ danh sách trong Python 3
2017-01-12
Cách sử dụng các câu lệnh Break, Continue và Pass khi làm việc với các vòng lặp trong Python 3
2017-01-06