Phần 12: NLTK Package phần 2 – Lập trình AI bằng Python

Table of Contents
6. Bag of Word (BoW) Model :
Bag of Word (BoW) 1 mô hình trong xử lý ngôn ngữ tự nhiên, về căn bản được dùng để trích xuất các tính năng từ văn bản để văn bản có thể được dùng trong mô hình hóa như ở trong các thuật toán học máy.
Hiện tại câu hỏi đặt ra là vì sao ta cần trích xuất các tính năng từ văn bản. Đó là bởi các thuật toán học máy không thể hoạt động với dữ liệu thô và chúng cần dữ liệu số để trích xuất thông tin có ý nghĩa từ đấy. Việc chuyển đổi dữ liệu văn bản thành dữ liệu số được gọi là trích xuất đối tượng hay mã hóa đối tượng.
a. Hoạt động :
Đây chính là cách tiếp cận cực kỳ đơn giản để trích xuất các tính năng từ văn bản. Giả sử ta có 1 tài liệu văn bản và ta muốn chuyển nó thành dữ liệu số hay nói muốn trích xuất các tính năng của nó thì trước tiên mô hình này trích xuất 1 từ vựng từ toàn bộ các từ trong tài liệu. Sau đó, bằng cách sử dụng ma trận thuật ngữ tài liệu, nó sẽ xây dựng 1 mô hình. Theo cách này, BoW chỉ đại diện cho tài liệu như bag of phrases. Toàn bộ thông tin về thứ tự hay cấu trúc của các từ trong tài liệu sẽ bị xóa bỏ.
b. Khái niệm về ma trận thuật ngữ doc :
Thuật toán BoW xây dựng mô hình bằng cách sử dụng ma trận thuật ngữ tài liệu. Như tên cho ta thấy, ma trận thuật ngữ tài liệu là ma trận của những số lượng từ khác nhau xuất hiện trong tài liệu. Với sự giúp đỡ của ma trận này, tài liệu văn bản có thể được biểu diễn dưới dạng sự kết hợp có trọng số của các từ khác nhau. Bằng việc đặt ngưỡng và chọn các từ có nghĩa hơn, ta sẽ có thể xây dựng biểu đồ của toàn bộ các từ trong tài liệu rằng có thể được dùng làm vectơ điểm đặc biệt. Sau đây chính là 1 ví dụ để hiểu khái niệm về ma trận thuật ngữ tài liệu:
Giả sử ta có. 2 câu :
- Câu 1 : We are utilizing the Bag of Words mannequin.
- Câu 2 : Bag of Words mannequin is used for extracting the options.
Hiện tại, bằng cách xem xét 2 câu này, ta có 13 từ khác biệt dưới đây :
- we
- are
- utilizing
- the
- bag
- of
- phrases
- mannequin
- is
- used
- for
- extracting
- options
ta cần xây dựng biểu đồ cho mỗi câu bằng cách sử dụng số từ trong mỗi câu –
- Câu 1 − [1,1,1,1,1,1,1,1,0,0,0,0,0]
- Câu 2 − [0,0,0,1,1,1,1,1,1,1,1,1,1]
141/5000Bằng cách này, ta có các vectơ điểm đặc biệt được trích xuất. Mỗi vectơ điểm đặc biệt là 13 chiều vì ta có 13 từ riêng biệt.
7. Khái niệm về thống kê :
Khái niệm về số liệu thống kê được gọi là TermFrequency-Inverse Document Frequency (tf-idf). Mỗi từ đều quan trọng trong tài liệu. Những số liệu thống kê giúp chúng tôi hiểu sự quan trọng của mỗi từ.
Term Frequency(tf) :
Nó là thước đo tần suất mỗi từ xuất hiện trong tài liệu. Nó có thể được nhận bằng cách chia số lượng của mỗi từ cho tổng số từ trong 1 tài liệu nhất định.
Inverse Document Frequency(idf) :
Nó là thước đo mức độ duy nhất của 1 từ đối với tài liệu này trong bộ tài liệu nhất định. Để tính toán idf và xây dựng 1 vectơ điểm đặc biệt riêng biệt, ta cần giảm trọng số của các từ thường xuất hiện như và và tăng trọng số của các từ hiếm.
8. Xây dựng Bag of Words Model bằng NLTK :
Trong bài này chúngta sẽ định nghĩa assortment của chuỗi bằng các sử dụng CountVectorizer để tạo vectors từ câu
Import bundle
from sklearn.feature_extraction.textual content import CountVectorizer
Định nghĩa set của câu :
Sentences = (*2*)
vectorizer_count = CountVectorizer()
features_text = vectorizer.fit_transform(Sentences).todense()
print(vectorizer.vocabulary_)
Đoạn mã trên tạo nên kết quả như hình bên dưới đây. Cho thấy rằng ta có 13 từ khác biệt trong 2 câu trên
'we': 11, 'are': 0, 'utilizing': 10, 'the': 8, 'bag': 1, 'of': 7,
'phrase': 12, 'mannequin': 6, 'is': 5, 'used': 9, 'for': 4, 'extracting': 2, 'options': 3
Đây chính là các vectơ điểm đặc biệt (dạng văn bản thành số) có thể được dùng cho học máy.
9. Xử lý vấn đề :
a. Category Prediction
Trong 1 bộ văn bản, không chỉ từ ngữ mà thể loại của từ ngữ cũng rất quan trọng; trong loại văn bản mà 1 từ chi tiết rơi vào. Ví dụ: tôi muốn dự đoán liệu 1 câu đã cho có thuộc danh mục e-mail, tin tức, thể thao, máy tính, v.v. Trong ví dụ sau, tôi sẽ sử dụng tf-idf để tạo 1 vectơ điểm đặc biệt để tìm danh mục tài liệu. Tôi sẽ sử dụng dữ liệu từ 20 tập dữ liệu nhóm tin của sklearn.
from sklearn.datasets import fetch_20newsgroups
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.textual content import TfidfTransformer
from sklearn.feature_extraction.textual content import CountVectorizer
Xác địnhcategory map. Tôi đang dùng năm classes khác nhau có tên là Religion, Autos, Sports, Electronics và Space.
category_map =
Tạo bộ coaching set:
training_data = fetch_20newsgroups(subset = 'practice',
classes = category_map.keys(), shuffle = True, random_state = 5)
Xây dựng 1 vectơ đếm và trích xuất số lượng từ :
vectorizer_count = CountVectorizer()
train_tc = vectorizer_count.fit_transform(training_data.knowledge)
print("nDimensions of coaching knowledge:", train_tc.form)
tf-idf transformer được tạo như dưới đây :
tfidf = TfidfTransformer()
train_tfidf = tfidf.fit_transform(train_tc)
Tạo bộ dữ liệu take a look at :
input_data = [
'Discovery was a space shuttle',
'Hindu, Christian, Sikh all are religions',
'We must have to drive safely',
'Puck is a disk made of rubber',
'Television, Microwave, Refrigrated all uses electricity'
]
Dữ liệu trên sẽ giúp mình đào tạo bộ phân loại Naive Bayes đa thức –
classifier = MultinomialNB().match(train_tfidf, training_data.goal)
Biến đổi dữ liệu đầu vào bằng cách sử dụng vector đếm :
input_tc = vectorizer_count.rework(input_data)
Hiện tại, ta sẽ chuyển đổi dữ liệu được vector hóa bằng cách sử dụng tfidf transformer :
input_tfidf = tfidf.rework(input_tc)
Dự đoán kết quả phân loại
predictions = classifier.predict(input_tfidf)
Output tạo nên như dưới đây :
for despatched, class in zip(input_data, predictions):
print('nInput Data:', despatched, 'n Category:',
category_map[training_data.target_names[category]])
Output :
Dimensions of coaching knowledge: (2755, 39297)
Input Data: Discovery was an area shuttle
Category: Space
Input Data: Hindu, Christian, Sikh all are religions
Category: Religion
Input Data: We should have to drive safely
Category: Autos
Input Data: Puck is a disk made from rubber
Category: Hockey
Input Data: Television, Microwave, Refrigrated all makes use of electrical energy
Category: Electronics
b. Gender Finder :
Trong câu lệnh bài toán này, 1 bộ phân loại sẽ được đào tạo để tìm giới tính (nam hay nữ) bằng cách cung cấp tên. Ta cần sử dụng heuristic để xây dựng 1 vector điểm đặc biệt và đào tạo bộ phân loại. Ta sẽ sử dụng dữ liệu được gắn nhãn từ gói scikit-studying. Đoạn mã sau để xây dựng công cụ tìm giới tính:
import random
from nltk import NaiveBayesClassifier
from nltk.classify import accuracy as nltk_accuracy
from nltk.corpus import names
Hiện tại ta cần trích xuất N ký tự cuối cùng từ ban đầu vào
def extract_features(phrase, N = 2):
last_n_letters = phrase[-N:]
return 'function': last_n_letters.decrease()
if __name__=='__main__':
Tạo dữ liệu coaching sử dụng tên label (male hay feminine) bằng NLTK
male_list = [(name, 'male') for name in names.words('male.txt')]
female_list = [(name, 'female') for name in names.words('female.txt')]
knowledge = (male_list + female_list)
random.seed(5)
random.shuffle(knowledge)
Dữ liệu take a look at được tạo như dưới đây :
namesInput = ['Rajesh', 'Gaurav', 'Swati', 'Shubha']
Xác định số lượng mẫu được dùng để practice và take a look at như dưới đây
train_sample = int(0.8 * len(knowledge))
ta cần lặp qua các độ dài khác nhau để so sánh độ chính xác –
for i in vary(1, 6):
print('nNumber of finish letters:', i)
options = [(extract_features(n, i), gender) for (n, gender) in data]
train_data, test_data = options[:train_sample],
options[train_sample:]
classifier = NaiveBayesClassifier.practice(train_data)
Độ chính xác của bộ phân loại có thể được tính như dưới đây:
accuracy_classifier = spherical(100 * nltk_accuracy(classifier, test_data), 2)
print('Accuracy = ' + str(accuracy_classifier) + '%')
Ta có thể dự đoán output :
for title in namesInput:
print(title, '==>', classifier.classify(extract_features(title, i)))
Chương trình trên sẽ tạo nên output như dưới đây :
Number of finish letters: 1
Accuracy = 74.7%
Rajesh -> feminine
Gaurav -> male
Swati -> feminine
Shubha -> feminine
Number of finish letters: 2
Accuracy = 78.79%
Rajesh -> male
Gaurav -> male
Swati -> feminine
Shubha -> feminine
Number of finish letters: 3
Accuracy = 77.22%
Rajesh -> male
Gaurav -> feminine
Swati -> feminine
Shubha -> feminine
Number of finish letters: 4
Accuracy = 69.98%
Rajesh -> feminine
Gaurav -> feminine
Swati -> feminine
Shubha -> feminine
Number of finish letters: 5
Accuracy = 64.63%
Rajesh -> feminine
Gaurav -> feminine
Swati -> feminine
Shubha -> feminine
Trong đầu ra bên trên,ta có thể nhận thấy rằng độ chính xác về mặt số lượng chữ cái cuối tối đa là 2 và nó đang giảm khi số lượng chữ cái cuối càng ngày càng tăng.