Gensim - Vector & Mô hình
Ở đây, chúng ta sẽ tìm hiểu về các khái niệm cốt lõi của Gensim, tập trung chính vào vector và mô hình.
Vector là gì?
Điều gì sẽ xảy ra nếu chúng ta muốn suy ra cấu trúc tiềm ẩn trong kho tài liệu của mình? Đối với điều này, chúng ta cần biểu diễn các tài liệu theo cách mà chúng ta có thể thao tác toán học giống nhau. Một kiểu biểu diễn phổ biến là biểu diễn mọi tài liệu của kho ngữ liệu dưới dạng vectơ của các đặc trưng. Đó là lý do tại sao chúng ta có thể nói rằng vectơ là một đại diện toán học thuận tiện cho một tài liệu.
Để cung cấp cho bạn một ví dụ, hãy đại diện cho một tính năng duy nhất, trong kho tài liệu đã sử dụng ở trên, dưới dạng một cặp QA -
Q - Từ bao nhiêu lần Hello xuất hiện trong tài liệu?
A - Không (0).
Q - Văn bản có mấy đoạn?
A - Hai (2)
Câu hỏi thường được biểu diễn bằng id số nguyên của nó, do đó, biểu diễn của tài liệu này là một loạt các cặp như (1, 0.0), (2, 2.0). Biểu diễn vectơ như vậy được gọi làdensevectơ. Tại saodense, bởi vì nó bao gồm một câu trả lời rõ ràng cho tất cả các câu hỏi được viết ở trên.
Biểu diễn có thể đơn giản như (0, 2), nếu chúng ta biết trước tất cả các câu hỏi. Chuỗi câu trả lời như vậy (tất nhiên nếu các câu hỏi được biết trước) làvector cho tài liệu của chúng tôi.
Một loại đại diện phổ biến khác là bag-of-word (BoW)mô hình. Trong cách tiếp cận này, về cơ bản mỗi tài liệu được biểu diễn bằng một vectơ có chứa tần số đếm của mọi từ trong từ điển.
Để cung cấp cho bạn một ví dụ, giả sử chúng tôi có một từ điển chứa các từ ['Xin chào', 'Làm thế nào', 'là', 'bạn']. Sau đó, một tài liệu bao gồm chuỗi “Bạn khỏe không” sẽ được biểu thị bằng vectơ [0, 2, 1, 1]. Ở đây, các mục nhập của vectơ được sắp xếp theo thứ tự xuất hiện của “Xin chào”, “Làm thế nào”, “là” và “bạn”.
Tài liệu vectơ so với
Từ sự giải thích ở trên về vector, sự phân biệt giữa một tài liệu và một vector gần như được hiểu. Nhưng, để làm rõ hơn,document là văn bản và vectorlà một biểu diễn thuận tiện về mặt toán học của văn bản đó. Thật không may, đôi khi nhiều người sử dụng các thuật ngữ này thay thế cho nhau.
Ví dụ: giả sử chúng ta có một số tài liệu A tùy ý thì thay vì nói, “vectơ tương ứng với tài liệu A”, họ thường nói, “vectơ A” hoặc “tài liệu A”. Điều này dẫn đến sự mơ hồ lớn. Một điều quan trọng hơn cần lưu ý ở đây là, hai tài liệu khác nhau có thể có cùng một biểu diễn vector.
Chuyển đổi kho dữ liệu thành danh sách các vectơ
Trước khi lấy một ví dụ triển khai về việc chuyển đổi kho ngữ liệu thành danh sách các vectơ, chúng ta cần liên kết mỗi từ trong kho ngữ liệu với một ID số nguyên duy nhất. Đối với điều này, chúng tôi sẽ mở rộng ví dụ được lấy trong chương trên.
Thí dụ
from gensim import corpora
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
Đầu ra
Dictionary(25 unique tokens: ['computer', 'opinion', 'response', 'survey', 'system']...)
Nó cho thấy rằng trong kho tài liệu của chúng tôi có 25 mã thông báo khác nhau trong gensim.corpora.Dictionary.
Ví dụ triển khai
Chúng ta có thể sử dụng từ điển để chuyển các tài liệu được mã hóa thành các vectơ 5 điểm như sau:
pprint.pprint(dictionary.token2id)
Đầu ra
{
'binary': 11,
'computer': 0,
'error': 7,
'generation': 12,
'graph': 16,
'intersection': 17,
'iv': 19,
'measurement': 8,
'minors': 20,
'opinion': 1,
'ordering': 21,
'paths': 18,
'perceived': 9,
'quasi': 22,
'random': 13,
'relation': 10,
'response': 2,
'survey': 3,
'system': 4,
'time': 5,
'trees': 14,
'unordered': 15,
'user': 6,
'well': 23,
'widths': 24
}
Và tương tự, chúng ta có thể tạo đại diện từng chữ cho một tài liệu như sau:
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
Đầu ra
[
[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)],
[(2, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)],
[(11, 1), (12, 1), (13, 1), (14, 1), (15, 1)],
[(14, 1), (16, 1), (17, 1), (18, 1)],
[(14, 1), (16, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1)]
]
Model là gì?
Khi chúng ta đã vectorised kho văn bản, tiếp theo là gì? Bây giờ, chúng ta có thể biến đổi nó bằng cách sử dụng các mô hình. Mô hình có thể được đề cập đến một thuật toán được sử dụng để chuyển đổi một biểu diễn tài liệu này sang biểu diễn tài liệu khác.
Như chúng ta đã thảo luận, các tài liệu, trong Gensim, được biểu diễn dưới dạng vectơ, do đó, chúng ta có thể mô hình hóa như một phép biến đổi giữa hai không gian vectơ. Luôn luôn có một giai đoạn đào tạo trong đó các mô hình học chi tiết của các phép biến đổi đó. Mô hình đọc kho dữ liệu đào tạo trong giai đoạn đào tạo.
Khởi tạo mô hình
Hãy khởi tạo tf-idfmô hình. Mô hình này chuyển đổi vectơ từ biểu diễn BoW (Túi từ) sang một không gian vectơ khác trong đó tần số đếm được tính theo độ hiếm tương đối của mỗi từ trong ngữ liệu.
Ví dụ triển khai
Trong ví dụ sau, chúng ta sẽ khởi tạo tf-idfmô hình. Chúng tôi sẽ đào tạo nó trên kho dữ liệu của chúng tôi và sau đó biến đổi chuỗi "biểu đồ cây".
Thí dụ
from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
words = "trees graph".lower().split()
print(tfidf[dictionary.doc2bow(words)])
Đầu ra
[(3, 0.4869354917707381), (4, 0.8734379353188121)]
Bây giờ, khi chúng tôi đã tạo mô hình, chúng tôi có thể chuyển đổi toàn bộ kho tài liệu thông qua tfidf và lập chỉ mục nó, đồng thời truy vấn tính tương tự của tài liệu truy vấn của chúng tôi (chúng tôi đang cung cấp tài liệu truy vấn 'hệ thống cây') so với mỗi tài liệu trong kho tài liệu -
Thí dụ
from gensim import similarities
index = similarities.SparseMatrixSimilarity(tfidf[BoW_corpus],num_features=5)
query_document = 'trees system'.split()
query_bow = dictionary.doc2bow(query_document)
simils = index[tfidf[query_bow]]
print(list(enumerate(simils)))
Đầu ra
[(0, 0.0), (1, 0.0), (2, 1.0), (3, 0.4869355), (4, 0.4869355)]
Từ kết quả đầu ra ở trên, tài liệu 4 và tài liệu 5 có điểm giống nhau khoảng 49%.
Hơn nữa, chúng ta cũng có thể sắp xếp đầu ra này để dễ đọc hơn như sau:
Thí dụ
for doc_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True):
print(doc_number, score)
Đầu ra
2 1.0
3 0.4869355
4 0.4869355
0 0.0
1 0.0