Gensim - Chuyển đổi
Chương này sẽ giúp bạn tìm hiểu về các phép biến đổi khác nhau trong Gensim. Chúng ta hãy bắt đầu bằng cách tìm hiểu các tài liệu chuyển đổi.
Chuyển đổi tài liệu
Chuyển đổi tài liệu có nghĩa là biểu diễn tài liệu theo cách mà tài liệu có thể được thao tác theo phương pháp toán học. Ngoài việc suy ra cấu trúc tiềm ẩn của kho ngữ liệu, việc chuyển đổi tài liệu cũng sẽ phục vụ các mục tiêu sau:
Nó khám phá ra mối quan hệ giữa các từ.
Nó đưa ra cấu trúc ẩn trong kho ngữ liệu.
Nó mô tả các tài liệu theo một cách mới và nhiều ngữ nghĩa hơn.
Nó làm cho việc trình bày các tài liệu trở nên gọn gàng hơn.
Nó cải thiện hiệu quả vì cách biểu diễn mới tiêu tốn ít tài nguyên hơn.
Nó cải thiện hiệu quả vì trong các xu hướng dữ liệu cận biên biểu diễn mới bị bỏ qua.
Tiếng ồn cũng được giảm bớt trong biểu diễn tài liệu mới.
Hãy xem các bước thực hiện để chuyển đổi các tài liệu từ một biểu diễn không gian vectơ này sang một biểu diễn khác.
Các bước thực hiện
Để chuyển đổi tài liệu, chúng ta phải làm theo các bước sau:
Bước 1: Tạo Corpus
Bước đầu tiên và cơ bản là tạo kho ngữ liệu từ các tài liệu. Chúng tôi đã tạo kho dữ liệu trong các ví dụ trước. Hãy tạo một cái khác với một số cải tiến (loại bỏ các từ phổ biến và các từ chỉ xuất hiện một lần) -
import gensim
import pprint
from collections import defaultdict
from gensim import corpora
Bây giờ hãy cung cấp các tài liệu để tạo kho tài liệu -
t_corpus = ["CNTK trước đây được gọi là Bộ công cụ mạng tính toán", "là một bộ công cụ cấp thương mại mã nguồn mở miễn phí dễ sử dụng", "cho phép chúng tôi đào tạo các thuật toán học sâu để học giống như não người.", " Bạn có thể tìm thấy hướng dẫn miễn phí của nó trên tutorialspoint.com "," Tutorialspoint.com cũng cung cấp các hướng dẫn kỹ thuật tốt nhất về các công nghệ như máy học học sâu AI miễn phí "]
Tiếp theo, chúng ta cần thực hiện tokenise và cùng với nó, chúng ta cũng sẽ xóa các từ phổ biến -
stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
[
word for word in document.lower().split() if word not in stoplist
]
for document in t_corpus
]
Tập lệnh sau sẽ xóa những từ chỉ xuất hiện -
frequency = defaultdict(int)
for text in processed_corpus:
for token in text:
frequency[token] += 1
processed_corpus = [
[token for token in text if frequency[token] > 1]
for text in processed_corpus
]
pprint.pprint(processed_corpus)
Đầu ra
[
['toolkit'],
['free', 'toolkit'],
['deep', 'learning', 'like'],
['free', 'on', 'tutorialspoint.com'],
['tutorialspoint.com', 'on', 'like', 'deep', 'learning', 'learning', 'free']
]
Bây giờ chuyển nó cho corpora.dictionary() đối tượng để nhận các đối tượng duy nhất trong kho tài liệu của chúng tôi -
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
Đầu ra
Dictionary(7 unique tokens: ['toolkit', 'free', 'deep', 'learning', 'like']...)
Tiếp theo, dòng mã sau sẽ tạo mô hình Bag of Word cho kho tài liệu của chúng tôi -
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
Đầu ra
[
[(0, 1)],
[(0, 1), (1, 1)],
[(2, 1), (3, 1), (4, 1)],
[(1, 1), (5, 1), (6, 1)],
[(1, 1), (2, 1), (3, 2), (4, 1), (5, 1), (6, 1)]
]
Bước 2: Tạo chuyển đổi
Các phép biến đổi là một số đối tượng Python tiêu chuẩn. Chúng ta có thể khởi tạo các biến đổi này tức là các đối tượng Python bằng cách sử dụng một kho ngữ liệu được đào tạo. Ở đây chúng tôi sẽ sử dụngtf-idf mô hình để tạo ra sự chuyển đổi của kho ngữ liệu được đào tạo BoW_corpus.
Đầu tiên, chúng ta cần nhập gói mô hình từ gensim.
from gensim import models
Bây giờ, chúng ta cần khởi tạo mô hình như sau:
tfidf = models.TfidfModel(BoW_corpus)
Bước 3: Chuyển đổi vectơ
Bây giờ, trong bước cuối cùng này, các vectơ sẽ được chuyển đổi từ biểu diễn cũ sang biểu diễn mới. Như chúng ta đã khởi tạo mô hình tfidf ở bước trên, tfidf bây giờ sẽ được coi là một đối tượng chỉ đọc. Ở đây, bằng cách sử dụng đối tượng tfidf này, chúng ta sẽ chuyển đổi vectơ của mình từ túi biểu diễn từ (biểu diễn cũ) sang trọng số có giá trị thực Tfidf (biểu diễn mới).
doc_BoW = [(1,1),(3,1)]
print(tfidf[doc_BoW]
Đầu ra
[(1, 0.4869354917707381), (3, 0.8734379353188121)]
Chúng tôi đã áp dụng phép chuyển đổi trên hai giá trị của ngữ liệu, nhưng chúng tôi cũng có thể áp dụng nó cho toàn bộ ngữ liệu như sau:
corpus_tfidf = tfidf[BoW_corpus]
for doc in corpus_tfidf:
print(doc)
Đầu ra
[(0, 1.0)]
[(0, 0.8734379353188121), (1, 0.4869354917707381)]
[(2, 0.5773502691896257), (3, 0.5773502691896257), (4, 0.5773502691896257)]
[(1, 0.3667400603126873), (5, 0.657838022678017), (6, 0.657838022678017)]
[
(1, 0.19338287240886842), (2, 0.34687949360312714), (3, 0.6937589872062543),
(4, 0.34687949360312714), (5, 0.34687949360312714), (6, 0.34687949360312714)
]
Hoàn thành ví dụ triển khai
import gensim
import pprint
from collections import defaultdict
from gensim import corpora
t_corpus = [
"CNTK formerly known as Computational Network Toolkit",
"is a free easy-to-use open-source commercial-grade toolkit",
"that enable us to train deep learning algorithms to learn like the human brain.",
"You can find its free tutorial on tutorialspoint.com",
"Tutorialspoint.com also provide best technical tutorials on
technologies like AI deep learning machine learning for free"
]
stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
[word for word in document.lower().split() if word not in stoplist]
for document in t_corpus
]
frequency = defaultdict(int)
for text in processed_corpus:
for token in text:
frequency[token] += 1
processed_corpus = [
[token for token in text if frequency[token] > 1]
for text in processed_corpus
]
pprint.pprint(processed_corpus)
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
doc_BoW = [(1,1),(3,1)]
print(tfidf[doc_BoW])
corpus_tfidf = tfidf[BoW_corpus]
for doc in corpus_tfidf:
print(doc)
Các biến đổi khác nhau trong Gensim
Sử dụng Gensim, chúng ta có thể thực hiện các phép biến đổi phổ biến khác nhau, tức là các thuật toán Mô hình Không gian Vector. Một số trong số chúng như sau:
Tf-Idf (Tần suất tài liệu nghịch đảo-Tần suất thuật ngữ)
Trong quá trình khởi tạo, thuật toán mô hình tf-idf này mong đợi một kho dữ liệu huấn luyện có các giá trị nguyên (chẳng hạn như mô hình Bag-of-Words). Sau đó, tại thời điểm chuyển đổi, nó nhận một biểu diễn vectơ và trả về một biểu diễn vectơ khác.
Vectơ đầu ra sẽ có cùng chiều nhưng giá trị của các đặc trưng hiếm (tại thời điểm đào tạo) sẽ được tăng lên. Về cơ bản, nó chuyển đổi các vectơ có giá trị nguyên thành các vectơ có giá trị thực. Sau đây là cú pháp của phép biến đổi Tf-idf:
Model=models.TfidfModel(corpus, normalize=True)
LSI (Lập chỉ mục ngữ nghĩa tiềm ẩn)
Thuật toán mô hình LSI có thể chuyển đổi tài liệu từ mô hình vectơ có giá trị nguyên (chẳng hạn như mô hình Bag-of-Words) hoặc không gian có trọng số Tf-Idf thành không gian tiềm ẩn. Vectơ đầu ra sẽ có kích thước thấp hơn. Sau đây là cú pháp của phép biến đổi LSI:
Model=models.LsiModel(tfidf_corpus, id2word=dictionary, num_topics=300)
LDA (Phân bổ Dirichlet tiềm ẩn)
Thuật toán mô hình LDA là một thuật toán khác biến tài liệu từ không gian mô hình Bag-of-Words thành không gian chủ đề. Vectơ đầu ra sẽ có kích thước thấp hơn. Sau đây là cú pháp của phép biến đổi LSI:
Model=models.LdaModel(corpus, id2word=dictionary, num_topics=100)
Phép chiếu ngẫu nhiên (RP)
RP, một cách tiếp cận rất hiệu quả, nhằm mục đích giảm số chiều của không gian vectơ. Cách tiếp cận này về cơ bản là gần đúng khoảng cách Tf-Idf giữa các tài liệu. Nó thực hiện điều này bằng cách ném vào một chút ngẫu nhiên.
Model=models.RpModel(tfidf_corpus, num_topics=500)
Quy trình Dirichlet phân cấp (HDP)
HDP là một phương pháp Bayes không tham số, là một bổ sung mới cho Gensim. Chúng ta cần phải cẩn thận trong khi sử dụng nó.
Model=models.HdpModel(corpus, id2word=dictionary