HomeLập trìnhPythonGiới thiệu về...

Giới thiệu về Bag of Words và cách viết mã bằng Python cho NLP


bởi Praveen Dubey

YxESbVFNtB9LgMODW6nNKs1rMWr7z8BSuJLA
Gạch gải trắng và đen trên bề mặt đen của Pixabay

Bag of Words (BOW) là một phương pháp để trích xuất các tính năng từ tài liệu văn bản. Các tính năng này có thể được sử dụng để đào tạo các thuật toán học máy. Nó tạo ra một từ vựng gồm tất cả các từ duy nhất xuất hiện trong tất cả các tài liệu trong tập huấn luyện.

Nói một cách đơn giản, đó là một tập hợp các từ để biểu thị một câu có số lượng từ và hầu như không quan tâm đến thứ tự xuất hiện của chúng.

BOW là một cách tiếp cận được sử dụng rộng rãi với:

  1. Xử lý ngôn ngữ tự nhiên
  2. Khai thác thông tin từ tài liệu
  3. phân loại tài liệu

Ở cấp độ cao, nó bao gồm các bước sau.

qRGh8boBcLLQfBvDnWTXKxZIEAk5LNfNABHF

Các vectơ được tạo có thể là đầu vào cho thuật toán học máy của bạn.

Hãy bắt đầu với một ví dụ để hiểu bằng cách lấy một số câu và tạo các vectơ cho những câu đó.

Hãy xem xét hai câu dưới đây.

1. "John likes to watch movies. Mary likes movies too."
2. "John also likes to watch football games."

Hai câu này cũng có thể được biểu diễn bằng một tập hợp các từ.

1. ['John', 'likes', 'to', 'watch', 'movies.', 'Mary', 'likes', 'movies', 'too.']
2. ['John', 'also', 'likes', 'to', 'watch', 'football', 'games']

Hơn nữa, đối với mỗi câu, hãy loại bỏ nhiều lần xuất hiện của từ và sử dụng số lượng từ để thể hiện điều này.

1. {"John":1,"likes":2,"to":1,"watch":1,"movies":2,"Mary":1,"too":1}
2. {"John":1,"also":1,"likes":1,"to":1,"watch":1,"football":1,   "games":1}

Giả sử những câu này là một phần của tài liệu, bên dưới là tần suất từ ​​kết hợp cho toàn bộ tài liệu của chúng tôi. Cả hai câu đều được tính đến.

 {"John":2,"likes":3,"to":2,"watch":2,"movies":2,"Mary":1,"too":1,  "also":1,"football":1,"games":1}

Từ vựng trên từ tất cả các từ trong tài liệu, với số từ tương ứng của chúng, sẽ được sử dụng để tạo các vectơ cho mỗi câu.

Độ dài của vectơ sẽ luôn bằng kích thước từ vựng. Trong trường hợp này, độ dài vectơ là 11.

Để biểu diễn các câu gốc của chúng ta trong một vectơ, mỗi vectơ được khởi tạo với tất cả các số không — [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Tiếp theo là lặp lại và so sánh với từng từ trong từ vựng của chúng tôi và tăng giá trị vectơ nếu câu có từ đó.

John likes to watch movies. Mary likes movies too.[1, 2, 1, 1, 2, 1, 1, 0, 0, 0]
John also likes to watch football games.[1, 1, 1, 1, 0, 0, 0, 1, 1, 1]

Ví dụ, trong câu 1 từ likes xuất hiện ở vị trí thứ hai và xuất hiện hai lần. Vì vậy, phần tử thứ hai của vectơ của chúng tôi cho câu 1 sẽ là 2: [1, 2, 1, 1, 2, 1, 1, 0, 0, 0]

Đọc thêm  Cách tự động định dạng mã Python của bạn bằng màu đen

Vectơ luôn tỷ lệ thuận với kích thước từ vựng của chúng ta.

Một tài liệu lớn trong đó từ vựng được tạo rất lớn có thể dẫn đến một vectơ có nhiều giá trị 0. Đây được gọi là một véc tơ thưa thớt. Các vectơ thưa thớt yêu cầu nhiều bộ nhớ và tài nguyên tính toán hơn khi lập mô hình. Số lượng lớn các vị trí hoặc kích thước có thể khiến quá trình lập mô hình trở nên rất khó khăn đối với các thuật toán truyền thống.

Mã hóa thuật toán BOW của chúng tôi

Đầu vào cho mã của chúng tôi sẽ là nhiều câu và đầu ra sẽ là các vectơ.

Mảng đầu vào là thế này:

["Joe waited for the train", "The train was late", "Mary and Samantha took the bus",
"I looked for Mary and Samantha at the bus station",
"Mary and Samantha arrived at the bus station early but waited until noon for the bus"]

Bước 1: Mã hóa một câu

Chúng tôi sẽ bắt đầu bằng cách xóa từ dừng khỏi câu.

Ngưng từ là những từ không chứa đủ ý nghĩa để sử dụng nếu không có thuật toán của chúng tôi. Chúng tôi không muốn những từ này chiếm dung lượng trong cơ sở dữ liệu của chúng tôi hoặc chiếm thời gian xử lý quý giá. Đối với điều này, chúng tôi có thể loại bỏ chúng một cách dễ dàng bằng cách lưu trữ một danh sách các từ mà bạn coi là từ dừng.

Token hóa là hành động chia một chuỗi các chuỗi thành các phần như từ, từ khóa, cụm từ, ký hiệu và các thành phần khác được gọi là mã thông báo. Mã thông báo có thể là các từ, cụm từ riêng lẻ hoặc thậm chí cả câu. Trong quá trình mã hóa, một số ký tự như dấu chấm câu bị loại bỏ.

def word_extraction(sentence):    ignore = ['a', "the", "is"]    words = re.sub("[^\w]", " ",  sentence).split()    cleaned_text = [w.lower() for w in words if w not in ignore]    return cleaned_text

Để triển khai mật khẩu mạnh mẽ hơn, bạn có thể sử dụng python nltk thư viện. Nó có một tập hợp các từ được xác định trước cho mỗi ngôn ngữ. Đây là một ví dụ:

import nltkfrom nltk.corpus import stopwords set(stopwords.words('english'))

Bước 2: Áp dụng mã thông báo cho tất cả các câu

def tokenize(sentences):    words = []    for sentence in sentences:        w = word_extraction(sentence)        words.extend(w)            words = sorted(list(set(words)))    return words

Phương thức lặp lại tất cả các câu và thêm từ được trích xuất vào một mảng.

Đọc thêm  Sắp xếp danh sách Python – Cách sắp xếp danh sách trong Python

Đầu ra của phương pháp này sẽ là:

['and', 'arrived', 'at', 'bus', 'but', 'early', 'for', 'i', 'joe', 'late', 'looked', 'mary', 'noon', 'samantha', 'station', 'the', 'took', 'train', 'until', 'waited', 'was']

Bước 3: Xây dựng vốn từ vựng và tạo vectơ

Sử dụng các phương pháp được xác định trong bước 1 và 2 để tạo từ vựng tài liệu và trích xuất các từ trong câu.

def generate_bow(allsentences):        vocab = tokenize(allsentences)    print("Word List for Document \n{0} \n".format(vocab));
for sentence in allsentences:        words = word_extraction(sentence)        bag_vector = numpy.zeros(len(vocab))        for w in words:            for i,word in enumerate(vocab):                if word == w:                     bag_vector[i] += 1                            print("{0}\n{1}\n".format(sentence,numpy.array(bag_vector)))

Đây là đầu vào được xác định và thực thi mã của chúng tôi:

tất cả các câu = ["Joe waited for the train train", "The train was late", "Mary and Samantha took the bus",
"I looked for Mary and Samantha at the bus station",
"Mary and Samantha arrived at the bus station early but waited until noon for the bus"]
generate_bow(allsentences)

Các vectơ đầu ra cho mỗi câu là:

Output:
Joe waited for the train train[0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 2. 0. 1. 0.]
The train was late[0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1.]
Mary and Samantha took the bus[1. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1. 0. 0. 0. 0.]
I looked for Mary and Samantha at the bus station[1. 0. 1. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 1. 1. 0. 0. 0. 0. 0. 0.]
Mary and Samantha arrived at the bus station early but waited until noon for the bus[1. 1. 1. 2. 1. 1. 1. 0. 0. 0. 0. 1. 1. 1. 1. 0. 0. 0. 1. 1. 0.]

Bạn có thể thấy, mỗi câu được so sánh với danh sách từ của chúng tôi được tạo ở Bước 1. Dựa trên sự so sánh, giá trị thành phần vectơ có thể được tăng lên. Các vectơ này có thể được sử dụng trong các thuật toán ML để phân loại và dự đoán tài liệu.

Chúng tôi đã viết mã của mình và tạo các vectơ, nhưng bây giờ hãy hiểu thêm một chút về từ vựng.

Thông tin chi tiết về túi từ

Mô hình BOW chỉ xem xét liệu một từ đã biết có xuất hiện trong tài liệu hay không. Nó không quan tâm đến ý nghĩa, bối cảnh và thứ tự xuất hiện của chúng.

Đọc thêm  Cách tìm nhanh các vấn đề về loại trong mã Python của bạn bằng Pytype

Điều này mang lại cái nhìn sâu sắc rằng các tài liệu tương tự sẽ có số lượng từ tương tự nhau. Nói cách khác, các từ trong hai tài liệu càng giống nhau thì các tài liệu càng giống nhau.

Hạn chế của BOW

  1. Ý nghĩa ngữ nghĩa: cách tiếp cận BOW cơ bản không xem xét nghĩa của từ trong tài liệu. Nó hoàn toàn bỏ qua bối cảnh mà nó được sử dụng. Cùng một từ có thể được sử dụng ở nhiều nơi dựa trên ngữ cảnh hoặc các từ gần đó.
  2. kích thước véc tơ: Đối với một tài liệu lớn, kích thước vectơ có thể rất lớn, dẫn đến tốn nhiều thời gian và tính toán. Bạn có thể cần bỏ qua các từ dựa trên mức độ liên quan đến trường hợp sử dụng của bạn.

Đây là một phần giới thiệu nhỏ về phương pháp BOW. Mã này cho thấy nó hoạt động như thế nào ở mức độ thấp. Còn nhiều điều nữa để hiểu về BOW. Ví dụ: thay vì tách câu của chúng ta thành một từ đơn (1-gam), bạn có thể tách thành cặp hai từ (bi-gam hoặc 2-gam). Đôi khi, biểu diễn bi-gam dường như tốt hơn nhiều so với sử dụng 1-gam. Chúng thường có thể được biểu diễn bằng cách sử dụng ký hiệu N-gram. Tôi đã liệt kê một số tài liệu nghiên cứu trong phần tài nguyên để có thêm kiến ​​thức chuyên sâu.

Bạn không cần phải viết mã BOW bất cứ khi nào bạn cần. Nó đã là một phần của nhiều khuôn khổ có sẵn như CountVectorizer trong sci-kit learn.

Mã trước đây của chúng tôi có thể được thay thế bằng:

from sklearn.feature_extraction.text import CountVectorizervectorizer = CountVectorizer()X = vectorizer.fit_transform(allsentences)print(X.toarray())

Việc hiểu cách các thư viện trong framework hoạt động và hiểu các phương pháp đằng sau chúng luôn là một điều tốt. Bạn càng hiểu rõ các khái niệm, bạn càng có thể sử dụng các khung tốt hơn.

Cảm ơn đã đọc bài viết. Mã được hiển thị có sẵn trên GitHub của tôi.

Bạn có thể theo dõi tôi trên Medium, Twittervà LinkedIn, Đối với bất kỳ câu hỏi nào, bạn có thể liên hệ với tôi qua email ( praveend806 [at] gmail [dot] com).

Tài nguyên để đọc thêm về túi từ

  1. Wikipedia-BOW
  2. Hiểu mô hình Bag-of-Words: Khung thống kê
  3. Các mô hình và ứng dụng túi từ bảo toàn ngữ nghĩa





Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status