Gensim - Hướng dẫn nhanh

Chương này sẽ giúp bạn hiểu lịch sử và các tính năng của Gensim cùng với các công dụng và ưu điểm của nó.

Gensim là gì?

Gensim = “Generate Similar”là một thư viện xử lý ngôn ngữ tự nhiên (NLP) nguồn mở phổ biến được sử dụng để lập mô hình chủ đề không có giám sát. Nó sử dụng các mô hình học thuật hàng đầu và máy học thống kê hiện đại để thực hiện các nhiệm vụ phức tạp khác nhau như -

  • Xây dựng vectơ tài liệu hoặc từ
  • Corpora
  • Thực hiện xác định chủ đề
  • Thực hiện so sánh tài liệu (truy xuất các tài liệu tương tự về ngữ nghĩa)
  • Phân tích tài liệu văn bản thuần túy cho cấu trúc ngữ nghĩa

Ngoài việc thực hiện các tác vụ phức tạp trên, Gensim, được triển khai bằng Python và Cython, được thiết kế để xử lý các bộ sưu tập văn bản lớn bằng cách sử dụng luồng dữ liệu cũng như các thuật toán trực tuyến gia tăng. Điều này làm cho nó khác với những gói phần mềm học máy chỉ nhắm mục tiêu xử lý trong bộ nhớ.

Lịch sử

Năm 2008, Gensim bắt đầu như một bộ sưu tập các tập lệnh Python khác nhau cho Toán học Kỹ thuật số của Séc. Ở đó, nó phục vụ để tạo ra một danh sách ngắn các bài báo tương tự nhất với một bài báo cụ thể. Nhưng vào năm 2009, RARE Technologies Ltd. đã phát hành bản phát hành đầu tiên. Sau đó, vào cuối tháng 7 năm 2019, chúng tôi đã có bản phát hành ổn định (3.8.0).

Các tính năng khác nhau

Sau đây là một số tính năng và khả năng được cung cấp bởi Gensim:

Khả năng mở rộng

Gensim có thể dễ dàng xử lý kho tài liệu lớn và quy mô web bằng cách sử dụng các thuật toán đào tạo trực tuyến gia tăng của nó. Nó có thể mở rộng về bản chất, vì không cần toàn bộ kho dữ liệu đầu vào phải nằm trọn vẹn trong Bộ nhớ truy cập ngẫu nhiên (RAM) tại bất kỳ thời điểm nào. Nói cách khác, tất cả các thuật toán của nó đều không phụ thuộc vào bộ nhớ đối với kích thước kho dữ liệu.

Mạnh mẽ

Gensim có bản chất mạnh mẽ và đã được nhiều người cũng như tổ chức sử dụng trong nhiều hệ thống khác nhau trong hơn 4 năm. Chúng ta có thể dễ dàng cắm vào kho dữ liệu hoặc luồng dữ liệu đầu vào của riêng mình. Nó cũng rất dễ mở rộng với các Thuật toán Không gian Vector khác.

Nền tảng bất khả tri

Như chúng ta biết rằng Python là một ngôn ngữ rất linh hoạt vì là Python Gensim thuần túy chạy trên tất cả các nền tảng (như Windows, Mac OS, Linux) hỗ trợ Python và Numpy.

Triển khai Đa lõi hiệu quả

Để tăng tốc độ xử lý và truy xuất trên các cụm máy, Gensim cung cấp các triển khai đa lõi hiệu quả của các thuật toán phổ biến khác nhau như Latent Semantic Analysis (LSA), Latent Dirichlet Allocation (LDA), Random Projections (RP), Hierarchical Dirichlet Process (HDP).

Nguồn mở và sự hỗ trợ dồi dào của cộng đồng

Gensim được cấp phép theo giấy phép GNU LGPL do OSI phê duyệt, cho phép nó được sử dụng miễn phí cho cả mục đích cá nhân cũng như thương mại. Bất kỳ sửa đổi nào được thực hiện trong Gensim đều có nguồn mở và cũng có rất nhiều sự hỗ trợ của cộng đồng.

Công dụng của Gensim

Gensim đã được sử dụng và trích dẫn trong hơn nghìn ứng dụng thương mại và học thuật. Nó cũng được trích dẫn bởi nhiều bài báo nghiên cứu và luận văn của sinh viên. Nó bao gồm các triển khai song song được truyền trực tuyến của những điều sau:

fastText

fastText, sử dụng mạng nơ-ron để nhúng từ, là một thư viện để học cách nhúng từ và phân loại văn bản. Nó được tạo ra bởi phòng thí nghiệm Nghiên cứu AI (FAIR) của Facebook. Về cơ bản, mô hình này cho phép chúng ta tạo một thuật toán có giám sát hoặc không được giám sát để thu được các biểu diễn vectơ cho các từ.

Word2vec

Word2vec, được sử dụng để sản xuất nhúng từ, là một nhóm các mô hình mạng nơ ron nông và hai lớp. Các mô hình được đào tạo cơ bản để tái tạo các ngữ cảnh ngôn ngữ của từ.

LSA (Phân tích ngữ nghĩa tiềm ẩn)

Đây là một kỹ thuật trong NLP (Xử lý ngôn ngữ tự nhiên) cho phép chúng ta phân tích mối quan hệ giữa một tập hợp các tài liệu và các điều khoản chứa chúng. Nó được thực hiện bằng cách tạo ra một tập hợp các khái niệm liên quan đến các tài liệu và điều khoản.

LDA (Phân bổ Dirichlet tiềm ẩn)

Nó là một kỹ thuật trong NLP cho phép các nhóm quan sát được giải thích bởi các nhóm không được quan sát. Các nhóm không được quan sát này giải thích, tại sao một số phần của dữ liệu lại giống nhau. Đó là lý do, nó là một mô hình thống kê tổng hợp.

tf-idf (tần suất tài liệu nghịch đảo tần số thuật ngữ)

tf-idf, một thống kê số trong việc truy xuất thông tin, phản ánh tầm quan trọng của một từ đối với một tài liệu trong kho ngữ liệu. Nó thường được các công cụ tìm kiếm sử dụng để chấm điểm và xếp hạng mức độ liên quan của một tài liệu với một truy vấn của người dùng. Nó cũng có thể được sử dụng để lọc từ dừng trong phân loại và tóm tắt văn bản.

Tất cả chúng sẽ được giải thích chi tiết trong các phần tiếp theo.

Ưu điểm

Gensim là một gói NLP thực hiện mô hình hóa chủ đề. Những ưu điểm quan trọng của Gensim như sau:

  • Chúng tôi có thể nhận được các cơ sở của mô hình chủ đề và nhúng từ trong các gói khác như ‘scikit-learn’‘R’, nhưng các cơ sở do Gensim cung cấp để xây dựng các mô hình chủ đề và nhúng từ là vô song. Nó cũng cung cấp các phương tiện tiện lợi hơn cho việc xử lý văn bản.

  • Một ưu điểm đáng kể khác của Gensim là nó cho phép chúng tôi xử lý các tệp văn bản lớn ngay cả khi không tải toàn bộ tệp vào bộ nhớ.

  • Gensim không yêu cầu chú thích tốn kém hoặc gắn thẻ tài liệu bằng tay vì nó sử dụng các mô hình không được giám sát.

Chương này làm sáng tỏ về các điều kiện tiên quyết để cài đặt Gensim, các phụ thuộc cốt lõi của nó và thông tin về phiên bản hiện tại của nó.

Điều kiện tiên quyết

Để cài đặt Gensim, chúng ta phải cài đặt Python trên máy tính của mình. Bạn có thể truy cập liên kết www.python.org/downloads/ và chọn phiên bản mới nhất cho hệ điều hành của mình, tức là Windows và Linux / Unix. Bạn có thể tham khảo liên kết www.tutorialspoint.com/python3/index.htm để biết hướng dẫn cơ bản về Python. Gensim được hỗ trợ cho Linux, Windows và Mac OS X.

Mã phụ thuộc

Gensim nên chạy trên bất kỳ nền tảng nào hỗ trợ Python 2.7 or 3.5+NumPy. Nó thực sự phụ thuộc vào phần mềm sau:

Python

Gensim được thử nghiệm với các phiên bản Python 2.7, 3.5, 3.6 và 3.7.

Numpy

Như chúng ta đã biết, NumPy là một gói dành cho tính toán khoa học với Python. Nó cũng có thể được sử dụng như một nơi chứa dữ liệu chung đa chiều hiệu quả. Gensim phụ thuộc vào gói NumPy để bẻ khóa số. Để có hướng dẫn cơ bản về Python, bạn có thể tham khảo liên kết www.tutorialspoint.com/numpy/index.htm .

smart_open

smart_open, một thư viện Python 2 & Python 3, được sử dụng để phát trực tuyến hiệu quả các tệp rất lớn. Nó hỗ trợ truyền trực tuyến từ / đến các kho lưu trữ như S3, HDFS, WebHDFS, HTTP, HTTPS, SFTP hoặc hệ thống tệp cục bộ. Gensim phụ thuộc vàosmart_open Thư viện Python để mở tệp trong bộ lưu trữ từ xa cũng như tệp nén.

Phiên bản hiện tại

Phiên bản hiện tại của Gensim là 3.8.0 được phát hành vào tháng 7 năm 2019.

Cài đặt bằng thiết bị đầu cuối

Một trong những cách đơn giản nhất để cài đặt Gensim là chạy lệnh sau trong thiết bị đầu cuối của bạn:

pip install --upgrade gensim

Cài đặt bằng Môi trường Conda

Một cách thay thế để tải xuống Gensim là sử dụng condaMôi trường. Chạy lệnh sau trongconda thiết bị đầu cuối -

conda install –c conda-forge gensim

Cài đặt bằng gói nguồn

Giả sử, nếu bạn đã tải xuống và giải nén gói nguồn, thì bạn cần chạy các lệnh sau:

python setup.py test
python setup.py install

Ở đây, chúng ta sẽ tìm hiểu về các khái niệm cốt lõi của Gensim, với trọng tâm chính là các tài liệu và kho dữ liệu.

Các khái niệm cốt lõi của Gensim

Sau đây là các khái niệm và thuật ngữ cốt lõi cần thiết để hiểu và sử dụng Gensim:

  • Document - ZIt đề cập đến một số văn bản.

  • Corpus - Nó đề cập đến một tập hợp các tài liệu.

  • Vector - Biểu diễn toán học của một tài liệu được gọi là véc tơ.

  • Model - Nó đề cập đến một thuật toán được sử dụng để chuyển đổi vectơ từ biểu diễn này sang biểu diễn khác.

Tài liệu là gì?

Như đã thảo luận, nó đề cập đến một số văn bản. Nếu chúng ta đi vào một số chi tiết, nó là một đối tượng của kiểu chuỗi văn bản được gọi là‘str’ trong Python 3. Ví dụ, trong Gensim, một tài liệu có thể là bất kỳ thứ gì như:

  • Tweet ngắn gồm 140 ký tự
  • Một đoạn văn, tức là bài báo hoặc bài báo nghiên cứu tóm tắt
  • Bài báo
  • Book
  • Novel
  • Theses

Trình tự văn bản

Loại trình tự văn bản thường được gọi là ‘str’ trong Python 3. Như chúng ta biết rằng trong Python, dữ liệu dạng văn bản được xử lý bằng chuỗi hoặc cụ thể hơn ‘str’các đối tượng. Các chuỗi về cơ bản là chuỗi bất biến của các điểm mã Unicode và có thể được viết theo những cách sau:

  • Single quotes - Ví dụ, ‘Hi! How are you?’. Nó cũng cho phép chúng tôi nhúng dấu ngoặc kép. Ví dụ,‘Hi! “How” are you?’

  • Double quotes - Ví dụ, "Hi! How are you?". Nó cũng cho phép chúng tôi nhúng các dấu ngoặc kép. Ví dụ,"Hi! 'How' are you?"

  • Triple quotes - Nó có thể có ba dấu nháy đơn như, '''Hi! How are you?'''. hoặc ba dấu ngoặc kép như,"""Hi! 'How' are you?"""

Tất cả các khoảng trắng sẽ được bao gồm trong chuỗi ký tự.

Thí dụ

Sau đây là một ví dụ về Tài liệu trong Gensim -

Document = “Tutorialspoint.com is the biggest online tutorials library and it’s all free also”

Corpus là gì?

Ngữ liệu có thể được định nghĩa là một tập hợp lớn và có cấu trúc gồm các văn bản có thể đọc được bằng máy được tạo ra trong một môi trường giao tiếp tự nhiên. Trong Gensim, một tập hợp các đối tượng tài liệu được gọi là kho ngữ liệu. Số nhiều của ngữ liệu làcorpora.

Vai trò của Corpus trong Gensim

Một kho văn bản trong Gensim phục vụ hai vai trò sau:

Đóng vai trò là đầu vào để đào tạo một mô hình

Vai trò đầu tiên và quan trọng của kho ngữ liệu trong Gensim, là đầu vào để đào tạo một mô hình. Để khởi tạo các thông số bên trong của mô hình, trong quá trình đào tạo, mô hình tìm kiếm một số chủ đề và chủ đề phổ biến từ kho dữ liệu đào tạo. Như đã thảo luận ở trên, Gensim tập trung vào các mô hình không được giám sát, do đó nó không yêu cầu bất kỳ sự can thiệp nào của con người.

Phục vụ như Trình trích xuất chủ đề

Sau khi mô hình được đào tạo, nó có thể được sử dụng để trích xuất các chủ đề từ các tài liệu mới. Ở đây, các tài liệu mới là những tài liệu không được sử dụng trong giai đoạn đào tạo.

Thí dụ

Kho tài liệu có thể bao gồm tất cả các tweet của một người cụ thể, danh sách tất cả các bài báo của một tờ báo hoặc tất cả các bài nghiên cứu về một chủ đề cụ thể, v.v.

Thu thập Corpus

Sau đây là một ví dụ về kho tài liệu nhỏ chứa 5 tài liệu. Ở đây, mọi tài liệu là một chuỗi bao gồm một câu đơn.

t_corpus = [
   "A survey of user opinion of computer system response time",
   "Relation of user perceived response time to error measurement",
   "The generation of random binary unordered trees",
   "The intersection graph of paths in trees",
   "Graph minors IV Widths of trees and well quasi ordering",
]

Tiền xử lý Thu thập Corpus

Sau khi chúng tôi thu thập tài liệu, một số bước xử lý trước nên được thực hiện để giữ cho kho dữ liệu đơn giản. Chúng tôi chỉ cần loại bỏ một số từ tiếng Anh thường được sử dụng như 'the'. Chúng tôi cũng có thể loại bỏ các từ chỉ xuất hiện một lần trong ngữ liệu.

Ví dụ: tập lệnh Python sau được sử dụng để viết thường mỗi tài liệu, chia nó theo khoảng trắng và lọc ra các từ dừng:

Thí dụ

import pprint
t_corpus = [
   "A survey of user opinion of computer system response time", 
   "Relation of user perceived response time to error measurement", 
   "The generation of random binary unordered trees", 
   "The intersection graph of paths in trees", 
   "Graph minors IV Widths of trees and well quasi ordering",
]
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]
	
pprint.pprint(processed_corpus)
]

Đầu ra

[['survey', 'user', 'opinion', 'computer', 'system', 'response', 'time'],
['relation', 'user', 'perceived', 'response', 'time', 'error', 'measurement'],
['generation', 'random', 'binary', 'unordered', 'trees'],
['intersection', 'graph', 'paths', 'trees'],
['graph', 'minors', 'iv', 'widths', 'trees', 'well', 'quasi', 'ordering']]

Tiền xử lý hiệu quả

Gensim cũng cung cấp chức năng để xử lý trước tập tin hiệu quả hơn. Theo kiểu xử lý trước như vậy, chúng ta có thể chuyển đổi một tài liệu thành một danh sách các mã thông báo viết thường. Chúng tôi cũng có thể bỏ qua các mã thông báo quá ngắn hoặc quá dài. Chức năng như vậy làgensim.utils.simple_preprocess(doc, deacc=False, min_len=2, max_len=15).

gensim.utils.simple_preprocess() fucntion

Gensim cung cấp chức năng này để chuyển đổi tài liệu thành danh sách các mã thông báo viết thường và cũng để bỏ qua các mã thông báo quá ngắn hoặc quá dài. Nó có các thông số sau:

doc (str)

Nó đề cập đến tài liệu đầu vào mà quá trình tiền xử lý nên được áp dụng.

deacc (bool, tùy chọn)

Tham số này được sử dụng để xóa các dấu trọng âm khỏi các mã thông báo. Nó sử dụngdeaccent() để làm điều này.

min_len (int, tùy chọn)

Với sự trợ giúp của tham số này, chúng tôi có thể đặt độ dài tối thiểu của mã thông báo. Các mã thông báo ngắn hơn độ dài đã xác định sẽ bị loại bỏ.

max_len (int, tùy chọn)

Với sự trợ giúp của tham số này, chúng tôi có thể đặt độ dài tối đa của mã thông báo. Các mã thông báo dài hơn độ dài đã xác định sẽ bị loại bỏ.

Đầu ra của hàm này sẽ là các mã thông báo được trích xuất từ ​​tài liệu đầu vào.

Ở đâ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

Trong chương trước, nơi chúng ta đã thảo luận về vector và mô hình, bạn đã có một ý tưởng về từ điển. Ở đây, chúng ta sẽ thảo luận vềDictionary đối tượng chi tiết hơn một chút.

Từ điển là gì?

Trước khi đi sâu vào khái niệm từ điển, chúng ta hãy hiểu một số khái niệm NLP đơn giản -

  • Token - Mã thông báo có nghĩa là một 'từ'.

  • Document - Một văn bản đề cập đến một câu hoặc đoạn văn.

  • Corpus - Nó đề cập đến một tập hợp các tài liệu như một túi từ (BoW).

Đối với tất cả các tài liệu, một kho tài liệu luôn chứa id mã thông báo của mỗi từ cùng với số lượng tần suất của nó trong tài liệu.

Hãy chuyển sang khái niệm từ điển trong Gensim. Để làm việc trên các tài liệu văn bản, Gensim cũng yêu cầu các từ, tức là mã thông báo phải được chuyển đổi thành id duy nhất của chúng. Để đạt được điều này, nó mang lại cho chúng tôi cơ sởDictionary object, ánh xạ mỗi từ với id số nguyên duy nhất của chúng. Nó thực hiện điều này bằng cách chuyển đổi văn bản đầu vào thành danh sách các từ và sau đó chuyển nó đếncorpora.Dictionary() vật.

Cần từ điển

Bây giờ câu hỏi đặt ra là thực sự nhu cầu của đối tượng từ điển là gì và nó có thể được sử dụng ở đâu? Trong Gensim, đối tượng từ điển được sử dụng để tạo một kho từ ngữ (BoW), được dùng làm đầu vào cho mô hình chủ đề và các mô hình khác.

Các dạng nhập văn bản

Có ba dạng văn bản đầu vào khác nhau, chúng tôi có thể cung cấp cho Gensim -

  • Là các câu được lưu trữ trong đối tượng danh sách gốc của Python (được gọi là str trong Python 3)

  • Là một tệp văn bản duy nhất (có thể là tệp nhỏ hoặc lớn)

  • Nhiều tệp văn bản

Tạo từ điển bằng Gensim

Như đã thảo luận, trong Gensim, từ điển chứa ánh xạ của tất cả các từ, còn gọi là mã thông báo đến id số nguyên duy nhất của chúng. Chúng ta có thể tạo từ điển từ danh sách các câu, từ một hoặc nhiều tệp văn bản (tệp văn bản chứa nhiều dòng văn bản). Vì vậy, trước tiên hãy bắt đầu bằng cách tạo từ điển bằng cách sử dụng danh sách các câu.

Từ một danh sách các câu

Trong ví dụ sau, chúng ta sẽ tạo từ điển từ một danh sách các câu. Khi chúng ta có danh sách các câu hoặc bạn có thể nói nhiều câu, chúng ta phải chuyển mọi câu thành danh sách các từ và cách hiểu là một trong những cách rất phổ biến để làm điều này.

Ví dụ triển khai

Đầu tiên, nhập các gói cần thiết và cần thiết như sau:

import gensim
from gensim import corpora
from pprint import pprint

Tiếp theo, tạo danh sách hiểu từ danh sách các câu / tài liệu để sử dụng nó tạo từ điển -

doc = [
   "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."
]

Tiếp theo, chúng ta cần chia các câu thành các từ. Nó được gọi là mã hóa.

text_tokens = [[text for text in doc.split()] for doc in doc]

Bây giờ, với sự trợ giúp của tập lệnh sau, chúng ta có thể tạo từ điển -

dict_LoS = corpora.Dictionary(text_tokens)

Bây giờ chúng ta hãy lấy thêm một số thông tin như số lượng mã thông báo trong từ điển -

print(dict_LoS)

Đầu ra

Dictionary(27 unique tokens: ['CNTK', 'Computational', 'Network', 'Toolkit', 'as']...)

Chúng ta cũng có thể thấy ánh xạ từ đến số nguyên duy nhất như sau:

print(dict_LoS.token2id)

Đầu ra

{
   'CNTK': 0, 'Computational': 1, 'Network': 2, 'Toolkit': 3, 'as': 4, 
   'formerly': 5, 'known': 6, 'a': 7, 'commercial-grade': 8, 'easy-to-use': 9,
   'free': 10, 'is': 11, 'open-source': 12, 'toolkit': 13, 'algorithms': 14,
   'brain.': 15, 'deep': 16, 'enable': 17, 'human': 18, 'learn': 19, 'learning': 20,
   'like': 21, 'that': 22, 'the': 23, 'to': 24, 'train': 25, 'us': 26
}

Hoàn thành ví dụ triển khai

import gensim
from gensim import corpora
from pprint import pprint
doc = [
   "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."
]
text_tokens = [[text for text in doc.split()] for doc in doc]
dict_LoS = corpora.Dictionary(text_tokens)
print(dict_LoS.token2id)

Từ một tệp văn bản

Trong ví dụ sau, chúng tôi sẽ tạo từ điển từ một tệp văn bản. Theo cách tương tự, chúng ta cũng có thể tạo từ điển từ nhiều hơn một tệp văn bản (tức là thư mục của tệp).

Đối với điều này, chúng tôi đã lưu tài liệu, được sử dụng trong ví dụ trước, trong tệp văn bản có tên doc.txt. Gensim sẽ đọc từng dòng tệp và xử lý từng dòng một bằng cách sử dụngsimple_preprocess. Theo cách này, nó không cần tải toàn bộ tệp hoàn chỉnh trong bộ nhớ cùng một lúc.

Ví dụ triển khai

Đầu tiên, nhập các gói cần thiết và cần thiết như sau:

import gensim
from gensim import corpora
from pprint import pprint
from gensim.utils import simple_preprocess
from smart_open import smart_open
import os

Dòng mã tiếp theo sẽ tạo từ điển gensim bằng cách sử dụng tệp văn bản duy nhất có tên doc.txt -

dict_STF = corpora.Dictionary(
   simple_preprocess(line, deacc =True) for line in open(‘doc.txt’, encoding=’utf-8’)
)

Bây giờ chúng ta hãy lấy thêm một số thông tin như số lượng mã thông báo trong từ điển -

print(dict_STF)

Đầu ra

Dictionary(27 unique tokens: ['CNTK', 'Computational', 'Network', 'Toolkit', 'as']...)

Chúng ta cũng có thể thấy ánh xạ từ đến số nguyên duy nhất như sau:

print(dict_STF.token2id)

Đầu ra

{
   'CNTK': 0, 'Computational': 1, 'Network': 2, 'Toolkit': 3, 'as': 4, 
   'formerly': 5, 'known': 6, 'a': 7, 'commercial-grade': 8, 'easy-to-use': 9, 
   'free': 10, 'is': 11, 'open-source': 12, 'toolkit': 13, 'algorithms': 14, 
   'brain.': 15, 'deep': 16, 'enable': 17, 'human': 18, 'learn': 19, 
   'learning': 20, 'like': 21, 'that': 22, 'the': 23, 'to': 24, 'train': 25, 'us': 26
}

Hoàn thành ví dụ triển khai

import gensim
from gensim import corpora
from pprint import pprint
from gensim.utils import simple_preprocess
from smart_open import smart_open
import os
dict_STF = corpora.Dictionary(
   simple_preprocess(line, deacc =True) for line in open(‘doc.txt’, encoding=’utf-8’)
)
dict_STF = corpora.Dictionary(text_tokens)
print(dict_STF.token2id)

Từ nhiều tệp văn bản

Bây giờ chúng ta hãy tạo từ điển từ nhiều tệp, tức là nhiều hơn một tệp văn bản được lưu trong cùng một thư mục. Đối với ví dụ này, chúng tôi đã tạo ba tệp văn bản khác nhau, cụ thể làfirst.txt, second.txtthird.txtchứa ba dòng từ tệp văn bản (doc.txt), chúng tôi đã sử dụng cho ví dụ trước. Tất cả ba tệp văn bản này được lưu trong một thư mục có tênABC.

Ví dụ triển khai

Để thực hiện điều này, chúng ta cần xác định một lớp với một phương thức có thể lặp lại qua tất cả ba tệp văn bản (First, Second và Third.txt) trong thư mục (ABC) và mang lại danh sách các mã thông báo từ đã xử lý.

Hãy xác định lớp có tên Read_files có một phương thức có tên __iteration__ () như sau -

class Read_files(object):
   def __init__(self, directoryname):
      elf.directoryname = directoryname
   def __iter__(self):
      for fname in os.listdir(self.directoryname):
         for line in open(os.path.join(self.directoryname, fname), encoding='latin'):
   yield simple_preprocess(line)

Tiếp theo, chúng ta cần cung cấp đường dẫn của thư mục như sau:

path = "ABC"

#provide the path as per your computer system where you saved the directory.

Các bước tiếp theo tương tự như chúng ta đã làm trong các ví dụ trước. Dòng mã tiếp theo sẽ tạo thư mục Gensim bằng cách sử dụng thư mục có ba tệp văn bản -

dict_MUL = corpora.Dictionary(Read_files(path))

Đầu ra

Dictionary(27 unique tokens: ['CNTK', 'Computational', 'Network', 'Toolkit', 'as']...)

Bây giờ chúng ta cũng có thể thấy ánh xạ từ sang số nguyên duy nhất như sau:

print(dict_MUL.token2id)

Đầu ra

{
   'CNTK': 0, 'Computational': 1, 'Network': 2, 'Toolkit': 3, 'as': 4, 
   'formerly': 5, 'known': 6, 'a': 7, 'commercial-grade': 8, 'easy-to-use': 9, 
   'free': 10, 'is': 11, 'open-source': 12, 'toolkit': 13, 'algorithms': 14, 
   'brain.': 15, 'deep': 16, 'enable': 17, 'human': 18, 'learn': 19, 
   'learning': 20, 'like': 21, 'that': 22, 'the': 23, 'to': 24, 'train': 25, 'us': 26
}

Lưu và tải từ điển Gensim

Gensim hỗ trợ bản địa của họ save() phương pháp lưu từ điển vào đĩa và load() phương pháp tải lại từ điển từ đĩa.

Ví dụ: chúng ta có thể lưu từ điển với sự trợ giúp của tập lệnh sau:

Gensim.corpora.dictionary.save(filename)

#provide the path where you want to save the dictionary.

Tương tự, chúng ta có thể tải từ điển đã lưu bằng cách sử dụng phương thức load (). Tập lệnh sau có thể làm điều này -

Gensim.corpora.dictionary.load(filename)

#provide the path where you have saved the dictionary.

Chúng tôi đã hiểu cách tạo từ điển từ danh sách tài liệu và từ tệp văn bản (từ một cũng như từ nhiều hơn một). Bây giờ, trong phần này, chúng ta sẽ tạo một kho từ ngữ (BoW). Để làm việc với Gensim, đây là một trong những đối tượng quan trọng nhất mà chúng ta cần làm quen. Về cơ bản, nó là kho ngữ liệu chứa id từ và tần suất của nó trong mỗi tài liệu.

Tạo BoW Corpus

Như đã thảo luận, trong Gensim, kho ngữ liệu chứa id từ và tần suất của nó trong mọi tài liệu. Chúng ta có thể tạo kho dữ liệu BoW từ một danh sách tài liệu đơn giản và từ các tệp văn bản. Những gì chúng ta cần làm là chuyển danh sách các từ được mã hóa cho đối tượng có tênDictionary.doc2bow(). Vì vậy, trước tiên, hãy bắt đầu bằng cách tạo kho dữ liệu BoW bằng cách sử dụng một danh sách các tài liệu đơn giản.

Từ một danh sách các câu đơn giản

Trong ví dụ sau, chúng tôi sẽ tạo kho ngữ liệu BoW từ một danh sách đơn giản chứa ba câu.

Đầu tiên, chúng ta cần nhập tất cả các gói cần thiết như sau:

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess

Bây giờ cung cấp danh sách chứa các câu. Chúng tôi có ba câu trong danh sách của mình -

doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]

Tiếp theo, thực hiện mã hóa các câu như sau:

doc_tokenized = [simple_preprocess(doc) for doc in doc_list]

Tạo một đối tượng của corpora.Dictionary() như sau -

dictionary = corpora.Dictionary()

Bây giờ chuyển những câu được mã hóa này sang dictionary.doc2bow() objectnhư sau -

BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]

Cuối cùng, chúng tôi có thể in Bag of word corpus -

print(BoW_corpus)

Đầu ra

[
   [(0, 1), (1, 1), (2, 1), (3, 1)], 
   [(2, 1), (3, 1), (4, 2)], [(0, 2), (3, 3), (5, 2), (6, 1), (7, 2), (8, 1)]
]

Kết quả đầu ra ở trên cho thấy từ có id = 0 xuất hiện một lần trong tài liệu đầu tiên (vì chúng ta có (0,1) trong đầu ra), v.v.

Đầu ra ở trên bằng cách nào đó mà con người không thể đọc được. Chúng tôi cũng có thể chuyển đổi các id này thành các từ nhưng để làm được điều này, chúng tôi cần từ điển của mình để thực hiện chuyển đổi như sau:

id_words = [[(dictionary[id], count) for id, count in line] for line in BoW_corpus]
print(id_words)

Đầu ra

[
   [('are', 1), ('hello', 1), ('how', 1), ('you', 1)], 
   [('how', 1), ('you', 1), ('do', 2)], 
   [('are', 2), ('you', 3), ('doing', 2), ('hey', 1), ('what', 2), ('yes', 1)]
]

Bây giờ đầu ra ở trên bằng cách nào đó con người có thể đọc được.

Hoàn thành ví dụ triển khai

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess
doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]
doc_tokenized = [simple_preprocess(doc) for doc in doc_list]
dictionary = corpora.Dictionary()
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
print(BoW_corpus)
id_words = [[(dictionary[id], count) for id, count in line] for line in BoW_corpus]
print(id_words)

Từ một tệp văn bản

Trong ví dụ sau, chúng ta sẽ tạo kho dữ liệu BoW từ một tệp văn bản. Đối với điều này, chúng tôi đã lưu tài liệu, được sử dụng trong ví dụ trước, trong tệp văn bản có têndoc.txt..

Gensim sẽ đọc từng dòng tệp và xử lý từng dòng một bằng cách sử dụng simple_preprocess. Theo cách này, nó không cần tải toàn bộ tệp hoàn chỉnh trong bộ nhớ cùng một lúc.

Ví dụ triển khai

Đầu tiên, nhập các gói cần thiết và cần thiết như sau:

import gensim
from gensim import corpora
from pprint import pprint
from gensim.utils import simple_preprocess
from smart_open import smart_open
import os

Tiếp theo, dòng mã sau sẽ đọc các tài liệu từ doc.txt và mã hóa nó -

doc_tokenized = [
   simple_preprocess(line, deacc =True) for line in open(‘doc.txt’, encoding=’utf-8’)
]
dictionary = corpora.Dictionary()

Bây giờ chúng ta cần chuyển những từ được mã hóa này vào dictionary.doc2bow() đối tượng (như đã làm trong ví dụ trước)

BoW_corpus = [
   dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized
]
print(BoW_corpus)

Đầu ra

[
   [(9, 1), (10, 1), (11, 1), (12, 1), (13, 1), (14, 1), (15, 1)], 
   [
      (15, 1), (16, 1), (17, 1), (18, 1), (19, 1), (20, 1), (21, 1), 
      (22, 1), (23, 1), (24, 1)
   ], 
   [
      (23, 2), (25, 1), (26, 1), (27, 1), (28, 1), (29, 1), 
      (30, 1), (31, 1), (32, 1), (33, 1), (34, 1), (35, 1), (36, 1)
   ], 
   [(3, 1), (18, 1), (37, 1), (38, 1), (39, 1), (40, 1), (41, 1), (42, 1), (43, 1)], 
   [
      (18, 1), (27, 1), (31, 2), (32, 1), (38, 1), (41, 1), (43, 1), 
      (44, 1), (45, 1), (46, 1), (47, 1), (48, 1), (49, 1), (50, 1), (51, 1), (52, 1)
   ]
]

Các doc.txt tệp có nội dung sau:

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 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í.

Hoàn thành ví dụ triển khai

import gensim
from gensim import corpora
from pprint import pprint
from gensim.utils import simple_preprocess
from smart_open import smart_open
import os
doc_tokenized = [
   simple_preprocess(line, deacc =True) for line in open(‘doc.txt’, encoding=’utf-8’)
]
dictionary = corpora.Dictionary()
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
print(BoW_corpus)

Lưu và tải Gensim Corpus

Chúng ta có thể lưu kho dữ liệu với sự trợ giúp của tập lệnh sau:

corpora.MmCorpus.serialize(‘/Users/Desktop/BoW_corpus.mm’, bow_corpus)

#provide the path and the name of the corpus. The name of corpus is BoW_corpus and we saved it in Matrix Market format.

Tương tự, chúng ta có thể tải kho dữ liệu đã lưu bằng cách sử dụng tập lệnh sau:

corpus_load = corpora.MmCorpus(‘/Users/Desktop/BoW_corpus.mm’)
for line in corpus_load:
print(line)

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 ngữ 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 làm tokenise và cùng với nó, chúng ta cũng sẽ loại bỏ 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 của chúng tôi, tức là 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

Ở đây, chúng ta sẽ tìm hiểu về cách tạo Ma trận Tần suất Tài liệu Nghịch đảo Thuật ngữ (TF-IDF) với sự trợ giúp của Gensim.

TF-IDF là gì?

Đó là mô hình Tần suất tài liệu nghịch đảo thuật ngữ, cũng là mô hình nhiều từ. Nó khác với kho ngữ liệu thông thường vì nó giảm trọng lượng của các mã thông báo tức là các từ xuất hiện thường xuyên trên các tài liệu. 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.

Nó được tính như thế nào?

Mô hình TF-IDF tính toán tfidf với sự trợ giúp của hai bước đơn giản sau:

Bước 1: Nhân thành phần cục bộ và toàn cầu

Trong bước đầu tiên này, mô hình sẽ nhân một thành phần cục bộ như TF (Tần suất kỳ hạn) với một thành phần toàn cục như IDF (Tần suất tài liệu nghịch đảo).

Bước 2: Chuẩn hóa kết quả

Sau khi thực hiện xong phép nhân, trong bước tiếp theo, mô hình TFIDF sẽ chuẩn hóa kết quả thành độ dài đơn vị.

Kết quả của hai bước trên là các từ thường xuyên xảy ra trên các tài liệu sẽ được giảm trọng số.

Làm thế nào để lấy TF-IDF Weights?

Ở đây, chúng ta sẽ triển khai một ví dụ để xem cách chúng ta có thể lấy trọng số TF-IDF. Về cơ bản, để có được trọng số TF-IDF, trước tiên chúng ta cần đào tạo kho dữ liệu và sau đó áp dụng kho dữ liệu đó trong mô hình tfidf.

Huấn luyện Corpus

Như đã nói ở trên để có được TF-IDF, trước tiên chúng ta cần đào tạo kho tài liệu của mình. Đầu tiên, chúng ta cần nhập tất cả các gói cần thiết như sau:

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess

Bây giờ cung cấp danh sách chứa các câu. Chúng tôi có ba câu trong danh sách của mình -

doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]

Tiếp theo, thực hiện mã hóa các câu như sau:

doc_tokenized = [simple_preprocess(doc) for doc in doc_list]

Tạo một đối tượng của corpora.Dictionary() như sau -

dictionary = corpora.Dictionary()

Bây giờ chuyển những câu được mã hóa này sang dictionary.doc2bow() đối tượng như sau -

BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]

Tiếp theo, chúng ta sẽ lấy id từ và tần số của chúng trong tài liệu của mình.

for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])

Đầu ra

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

Bằng cách này, chúng tôi đã đào tạo kho ngữ liệu của mình (Kho ngữ liệu Bag-of-Word).

Tiếp theo, chúng ta cần áp dụng kho dữ liệu được đào tạo này trong mô hình tfidf models.TfidfModel().

Đầu tiên nhập gói numpay -

import numpy as np

Hiện đang áp dụng kho dữ liệu được đào tạo của chúng tôi (BoW_corpus) trong dấu ngoặc vuông của models.TfidfModel()

tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')

Tiếp theo, chúng tôi sẽ lấy id từ và tần số của chúng trong kho ngữ liệu được mô hình hóa tfidf của chúng tôi -

for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

Đầu ra

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

Từ kết quả đầu ra ở trên, chúng tôi thấy sự khác biệt về tần số của các từ trong tài liệu của chúng tôi.

Hoàn thành ví dụ triển khai

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess
doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]
doc_tokenized = [simple_preprocess(doc) for doc in doc_list]
dictionary = corpora.Dictionary()
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])
import numpy as np
tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')
for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

Sự khác biệt về trọng lượng của các từ

Như đã thảo luận ở trên, các từ xuất hiện thường xuyên hơn trong tài liệu sẽ có trọng số nhỏ hơn. Chúng ta hãy hiểu sự khác biệt về trọng số của các từ từ hai kết quả đầu ra ở trên. Từ‘are’xảy ra trong hai tài liệu và đã được giảm trọng số. Tương tự, từ‘you’ xuất hiện trong tất cả các tài liệu và bị xóa hoàn toàn.

Chương này đề cập đến việc lập mô hình chủ đề liên quan đến Gensim.

Để chú thích dữ liệu của chúng tôi và hiểu cấu trúc câu, một trong những phương pháp tốt nhất là sử dụng các thuật toán ngôn ngữ tính toán. Không nghi ngờ gì nữa, với sự trợ giúp của các thuật toán ngôn ngữ tính toán này, chúng tôi có thể hiểu một số chi tiết tốt hơn về dữ liệu của mình nhưng,

  • Chúng ta có thể biết loại từ nào xuất hiện thường xuyên hơn những từ khác trong kho ngữ liệu của chúng ta không?

  • Chúng ta có thể nhóm dữ liệu của mình không?

  • Chúng ta có thể là chủ đề cơ bản trong dữ liệu của mình không?

Chúng tôi có thể đạt được tất cả những điều này với sự trợ giúp của mô hình chủ đề. Vì vậy, chúng ta hãy đi sâu vào khái niệm về mô hình chủ đề.

Mô hình chủ đề là gì?

Mô hình Chủ đề có thể được định nghĩa là mô hình xác suất chứa thông tin về các chủ đề trong văn bản của chúng tôi. Nhưng ở đây, có hai câu hỏi quan trọng nảy sinh như sau:

Đầu tiên, what exactly a topic is?

Chủ đề, như tên của nó, là những ý tưởng cơ bản hoặc các chủ đề được thể hiện trong văn bản của chúng tôi. Để cung cấp cho bạn một ví dụ, tập tài liệu chứanewspaper articles sẽ có các chủ đề liên quan đến finance, weather, politics, sports, various states news và như thế.

Thứ hai, what is the importance of topic models in text processing?

Như chúng ta biết rằng, để xác định sự giống nhau trong văn bản, chúng ta có thể thực hiện các kỹ thuật truy xuất và tìm kiếm thông tin bằng cách sử dụng các từ. Tuy nhiên, với sự trợ giúp của các mô hình chủ đề, giờ đây chúng ta có thể tìm kiếm và sắp xếp các tệp văn bản của mình bằng cách sử dụng các chủ đề chứ không phải từ.

Theo nghĩa này, chúng ta có thể nói rằng các chủ đề là sự phân bố theo xác suất của các từ. Đó là lý do tại sao, bằng cách sử dụng các mô hình chủ đề, chúng tôi có thể mô tả tài liệu của mình dưới dạng phân phối xác suất của các chủ đề.

Mục tiêu của Mô hình Chủ đề

Như đã thảo luận ở trên, trọng tâm của mô hình chủ đề là về các ý tưởng và chủ đề cơ bản. Các mục tiêu chính của nó như sau:

  • Các mô hình chủ đề có thể được sử dụng để tóm tắt văn bản.

  • Chúng có thể được sử dụng để sắp xếp các tài liệu. Ví dụ: chúng ta có thể sử dụng mô hình chủ đề để nhóm các bài báo lại với nhau thành một phần có tổ chức / liên kết với nhau, chẳng hạn như sắp xếp tất cả các bài báo liên quan đếncricket.

  • Chúng có thể cải thiện kết quả tìm kiếm. Làm sao? Đối với truy vấn tìm kiếm, chúng tôi có thể sử dụng các mô hình chủ đề để hiển thị tài liệu có kết hợp các từ khóa khác nhau, nhưng có cùng ý tưởng.

  • Khái niệm khuyến nghị rất hữu ích cho tiếp thị. Nó được sử dụng bởi nhiều trang web mua sắm trực tuyến, trang web tin tức và nhiều trang web khác. Các mô hình chủ đề giúp đưa ra các đề xuất về những gì nên mua, những gì sẽ đọc tiếp theo, v.v. Họ thực hiện bằng cách tìm các tài liệu có một chủ đề chung trong danh sách.

Các thuật toán lập mô hình chủ đề trong Gensim

Không nghi ngờ gì nữa, Gensim là bộ công cụ mô hình hóa chủ đề phổ biến nhất. Tính khả dụng miễn phí của nó và bằng Python khiến nó trở nên phổ biến hơn. Trong phần này, chúng ta sẽ thảo luận về một số thuật toán mô hình hóa chủ đề phổ biến nhất. Ở đây, chúng ta sẽ tập trung vào 'cái gì' hơn là 'như thế nào' vì Gensim đã tóm tắt chúng rất tốt cho chúng ta.

Phân bổ Dirichlet tiềm ẩn (LDA)

Phân bổ Dirichlet tiềm ẩn (LDA) là kỹ thuật phổ biến và thông dụng nhất hiện nay đang được sử dụng để lập mô hình chủ đề. Đây là công cụ mà các nhà nghiên cứu Facebook đã sử dụng trong bài báo nghiên cứu của họ được xuất bản vào năm 2013. Nó được đề xuất lần đầu tiên bởi David Blei, Andrew Ng và Michael Jordan vào năm 2003. Họ đề xuất LDA trong bài báo của họ có tên đơn giảnLatent Dirichlet allocation.

Đặc điểm của LDA

Hãy cùng biết thêm về kỹ thuật tuyệt vời này thông qua các đặc điểm của nó -

Probabilistic topic modeling technique

LDA là một kỹ thuật mô hình hóa chủ đề xác suất. Như chúng ta đã thảo luận ở trên, trong mô hình chủ đề, chúng tôi giả định rằng trong bất kỳ bộ sưu tập tài liệu nào có liên quan đến nhau (có thể là bài báo học thuật, bài báo, bài đăng trên Facebook, Tweet, e-mail, v.v.), có một số kết hợp chủ đề được bao gồm trong mỗi tài liệu .

Mục tiêu chính của mô hình chủ đề xác suất là khám phá cấu trúc chủ đề ẩn để thu thập các tài liệu có liên quan với nhau. Ba điều sau thường được bao gồm trong cấu trúc chủ đề:

  • Topics

  • Phân phối thống kê các chủ đề giữa các tài liệu

  • Các từ trên một tài liệu bao gồm chủ đề

Work in an unsupervised way

LDA hoạt động theo cách không được giám sát. Đó là bởi vì, LDA sử dụng xác suất có điều kiện để khám phá cấu trúc chủ đề ẩn. Nó giả định rằng các chủ đề được phân bổ không đều trong bộ sưu tập các tài liệu có liên quan với nhau.

Very easy to create it in Gensim

Trong Gensim, rất dễ dàng tạo mô hình LDA. chúng ta chỉ cần xác định kho ngữ liệu, ánh xạ từ điển và số lượng chủ đề chúng ta muốn sử dụng trong mô hình của mình.

Model=models.LdaModel(corpus, id2word=dictionary, num_topics=100)

May face computationally intractable problem

Tính toán xác suất của mọi cấu trúc chủ đề có thể có là một thách thức tính toán mà LDA phải đối mặt. Nó là một thách thức bởi vì nó cần phải tính toán xác suất của mọi từ được quan sát trong mọi cấu trúc chủ đề có thể. Nếu chúng ta có số lượng lớn các chủ đề và từ, LDA có thể gặp phải vấn đề khó tính toán.

Lập chỉ mục ngữ nghĩa tiềm ẩn (LSI)

Các thuật toán mô hình hóa chủ đề lần đầu tiên được triển khai trong Gensim với Latent Dirichlet Allocation (LDA)Latent Semantic Indexing (LSI). Nó còn được gọi làLatent Semantic Analysis (LSA).

Nó được cấp bằng sáng chế vào năm 1988 bởi Scott Deerwester, Susan Dumais, George Furnas, Richard Harshman, Thomas Landaur, Karen Lochbaum và Lynn Streeter. Trong phần này, chúng tôi sẽ thiết lập mô hình LSI của chúng tôi. Nó có thể được thực hiện theo cùng một cách thiết lập mô hình LDA. chúng tôi cần nhập mô hình LSI từgensim.models.

Vai trò của LSI

Trên thực tế, LSI là một kỹ thuật NLP, đặc biệt là trong ngữ nghĩa phân phối. Nó phân tích mối quan hệ giữa một tập hợp các tài liệu và các điều khoản mà các tài liệu này chứa đựng. Nếu chúng ta nói về hoạt động của nó, thì nó xây dựng một ma trận chứa số lượng từ trên mỗi tài liệu từ một đoạn văn bản lớn.

Sau khi được xây dựng, để giảm số lượng hàng, mô hình LSI sử dụng một kỹ thuật toán học được gọi là phân rã giá trị số ít (SVD). Cùng với việc giảm số lượng hàng, nó cũng bảo tồn cấu trúc tương tự giữa các cột. Trong ma trận, các hàng đại diện cho các từ duy nhất và các cột đại diện cho mỗi tài liệu. Nó hoạt động dựa trên giả thuyết phân bố, tức là nó giả định rằng các từ gần nghĩa sẽ xuất hiện trong cùng một loại văn bản.

Model=models.LsiModel(corpus, id2word=dictionary, num_topics=100)

Quy trình Dirichlet phân cấp (HDP)

Các mô hình chủ đề như LDA và LSI giúp tóm tắt và sắp xếp các kho lưu trữ văn bản lớn mà không thể phân tích bằng tay. Ngoài LDA và LSI, một mô hình chủ đề mạnh mẽ khác trong Gensim là HDP (Quy trình Dirichlet phân cấp). Về cơ bản, nó là một mô hình thành viên hỗn hợp để phân tích dữ liệu được nhóm không giám sát. Không giống như LDA (đối tác hữu hạn của nó), HDP suy ra số lượng chủ đề từ dữ liệu.

Model=models.HdpModel(corpus, id2word=dictionary

Chương này sẽ giúp bạn tìm hiểu cách tạo mô hình chủ đề Latent Dirichlet phân bổ (LDA) trong Gensim.

Tự động trích xuất thông tin về các chủ đề từ khối lượng lớn văn bản bằng một trong những ứng dụng chính của NLP (xử lý ngôn ngữ tự nhiên). Khối lượng lớn văn bản có thể là nguồn cấp dữ liệu từ đánh giá khách sạn, tweet, bài đăng trên Facebook, nguồn cấp dữ liệu từ bất kỳ kênh truyền thông xã hội nào khác, đánh giá phim, câu chuyện tin tức, phản hồi của người dùng, e-mail, v.v.

Trong kỷ nguyên kỹ thuật số này, để biết mọi người / khách hàng đang nói về điều gì, hiểu ý kiến ​​và vấn đề của họ, có thể rất có giá trị đối với các doanh nghiệp, chiến dịch chính trị và quản trị viên. Tuy nhiên, liệu có thể đọc thủ công một lượng lớn văn bản như vậy và sau đó trích xuất thông tin từ các chủ đề?

Không, không phải. Nó yêu cầu một thuật toán tự động có thể đọc qua khối lượng lớn tài liệu văn bản này và tự động trích xuất thông tin / chủ đề cần thiết được thảo luận từ nó.

Vai trò của LDA

Cách tiếp cận của LDA đối với mô hình chủ đề là phân loại văn bản trong tài liệu theo một chủ đề cụ thể. Được mô hình hóa như các bản phân phối Dirichlet, các bản dựng LDA -

  • Một chủ đề cho mỗi mô hình tài liệu và
  • Từ cho mỗi mô hình chủ đề

Sau khi cung cấp thuật toán mô hình chủ đề LDA, để có được thành phần phân phối từ khóa-chủ đề tốt, nó sẽ sắp xếp lại -

  • Các chủ đề phân phối trong tài liệu và
  • Phân phối từ khóa trong các chủ đề

Trong khi xử lý, một số giả định do LDA đưa ra là:

  • Mỗi tài liệu được mô hình hóa dưới dạng các bản phân phối nhiều danh nghĩa của các chủ đề.
  • Mọi chủ đề đều được mô hình hóa dưới dạng phân phối nhiều danh nghĩa của các từ.
  • Chúng ta nên chọn kho dữ liệu phù hợp vì LDA giả định rằng mỗi đoạn văn bản chứa các từ liên quan.
  • LDA cũng giả định rằng các tài liệu được tạo ra từ một hỗn hợp các chủ đề.

Thực hiện với Gensim

Ở đây, chúng ta sẽ sử dụng LDA (Phân bổ Dirichlet tiềm ẩn) để trích xuất các chủ đề được thảo luận tự nhiên từ tập dữ liệu.

Đang tải tập dữ liệu

Tập dữ liệu mà chúng tôi sẽ sử dụng là tập dữ liệu của ’20 Newsgroups’có hàng nghìn tin bài từ các phần khác nhau của một bản tin. Nó có sẵn dướiSklearncác tập dữ liệu. Chúng tôi có thể dễ dàng tải xuống với sự trợ giúp của tập lệnh Python sau:

from sklearn.datasets import fetch_20newsgroups
newsgroups_train = fetch_20newsgroups(subset='train')

Hãy xem một số tin tức mẫu với sự trợ giúp của tập lệnh sau:

newsgroups_train.data[:4]
["From: [email protected] (where's my thing)\nSubject: 
WHAT car is this!?\nNntp-Posting-Host: rac3.wam.umd.edu\nOrganization: 
University of Maryland, College Park\nLines: 
15\n\n I was wondering if anyone out there could enlighten me on this car 
I saw\nthe other day. It was a 2-door sports car, looked to be from the 
late 60s/\nearly 70s. It was called a Bricklin. The doors were really small. 
In addition,\nthe front bumper was separate from the rest of the body. 
This is \nall I know. If anyone can tellme a model name, 
engine specs, years\nof production, where this car is made, history, or 
whatever info you\nhave on this funky looking car, please e-mail.\n\nThanks,
\n- IL\n ---- brought to you by your neighborhood Lerxst ----\n\n\n\n\n",

"From: [email protected] (Guy Kuo)\nSubject: SI Clock Poll - Final 
Call\nSummary: Final call for SI clock reports\nKeywords: 
SI,acceleration,clock,upgrade\nArticle-I.D.: shelley.1qvfo9INNc3s\nOrganization: 
University of Washington\nLines: 11\nNNTP-Posting-Host: carson.u.washington.edu\n\nA 
fair number of brave souls who upgraded their SI clock oscillator have\nshared their 
experiences for this poll. Please send a brief message detailing\nyour experiences with 
the procedure. Top speed attained, CPU rated speed,\nadd on cards and adapters, heat 
sinks, hour of usage per day, floppy disk\nfunctionality with 800 and 1.4 m floppies 
are especially requested.\n\nI will be summarizing in the next two days, so please add 
to the network\nknowledge base if you have done the clock upgrade and haven't answered 
this\npoll. Thanks.\n\nGuy Kuo <;[email protected]>\n",

'From: [email protected] (Thomas E Willis)\nSubject: 
PB questions...\nOrganization: Purdue University Engineering 
Computer Network\nDistribution: usa\nLines: 36\n\nwell folks, 
my mac plus finally gave up the ghost this weekend after\nstarting 
life as a 512k way back in 1985. sooo, i\'m in the market for 
a\nnew machine a bit sooner than i intended to be...\n\ni\'m looking 
into picking up a powerbook 160 or maybe 180 and have a bunch\nof 
questions that (hopefully) somebody can answer:\n\n* does anybody 
know any dirt on when the next round of powerbook\nintroductions 
are expected? i\'d heard the 185c was supposed to make an\nappearence 
"this summer" but haven\'t heard anymore on it - and since i\ndon\'t 
have access to macleak, i was wondering if anybody out there had\nmore 
info...\n\n* has anybody heard rumors about price drops to the powerbook 
line like the\nones the duo\'s just went through recently?\n\n* what\'s 
the impression of the display on the 180? i could probably swing\na 180 
if i got the 80Mb disk rather than the 120, but i don\'t really have\na 
feel for how much "better" the display is (yea, it looks great in the\nstore, 
but is that all "wow" or is it really that good?). could i solicit\nsome 
opinions of people who use the 160 and 180 day-to-day on if its
worth\ntaking the disk size and money hit to get the active display? 
(i realize\nthis is a real subjective question, but i\'ve only played around 
with the\nmachines in a computer store breifly and figured the opinions 
of somebody\nwho actually uses the machine daily might prove helpful).\n\n* 
how well does hellcats perform? ;)\n\nthanks a bunch in advance for any info - 
if you could email, i\'ll post a\nsummary (news reading time is at a premium 
with finals just around the\ncorner... :
( )\n--\nTom Willis \\ [email protected] \\ Purdue Electrical 
Engineering\n---------------------------------------------------------------------------\
n"Convictions are more dangerous enemies of truth than lies." - F. W.\nNietzsche\n',

'From: jgreen@amber (Joe Green)\nSubject: Re: Weitek P9000 ?\nOrganization: 
Harris Computer Systems Division\nLines: 14\nDistribution: world\nNNTP-Posting-Host: 
amber.ssd.csd.harris.com\nX-Newsreader: TIN [version 1.1 PL9]\n\nRobert 
J.C. Kyanko ([email protected]) wrote:\n >[email protected] writes in article 
<[email protected] >:\n> > Anyone know about the 
Weitek P9000 graphics chip?\n > As far as the low-level stuff goes, it looks 
pretty nice. It\'s got this\n> quadrilateral fill command that requires just 
the four points.\n\nDo you have Weitek\'s address/phone number? I\'d like to get 
some information\nabout this chip.\n\n--\nJoe Green\t\t\t\tHarris 
Corporation\[email protected]\t\t\tComputer Systems Division\n"The only 
thing that really scares me is a person with no sense of humor.
"\n\t\t\t\t\t\t-- Jonathan Winters\n']

Điều kiện tiên quyết

Chúng tôi cần từ dừng từ NLTK và mô hình tiếng Anh từ Scapy. Cả hai đều có thể được tải xuống như sau:

import nltk;
nltk.download('stopwords')
nlp = spacy.load('en_core_web_md', disable=['parser', 'ner'])

Nhập các gói cần thiết

Để xây dựng mô hình LDA, chúng ta cần nhập gói cần thiết sau:

import re
import numpy as np
import pandas as pd
from pprint import pprint
import gensim
import gensim.corpora as corpora
from gensim.utils import simple_preprocess
from gensim.models import CoherenceModel
import spacy
import pyLDAvis
import pyLDAvis.gensim
import matplotlib.pyplot as plt

Chuẩn bị từ dừng

Bây giờ, chúng ta cần nhập các Từ dừng và sử dụng chúng -

from nltk.corpus import stopwords
stop_words = stopwords.words('english')
stop_words.extend(['from', 'subject', 're', 'edu', 'use'])

Xóa văn bản

Bây giờ, với sự giúp đỡ của Gensim's simple_preprocess()chúng ta cần phân tách từng câu thành một danh sách các từ. Chúng ta cũng nên loại bỏ các dấu câu và các ký tự không cần thiết. Để làm điều này, chúng tôi sẽ tạo một hàm có tênsent_to_words() -

def sent_to_words(sentences):
   for sentence in sentences:
      yield(gensim.utils.simple_preprocess(str(sentence), deacc=True))
data_words = list(sent_to_words(data))

Xây dựng mô hình Bigram & Trigram

Như chúng ta đã biết, bigram là hai từ thường xuyên xuất hiện cùng nhau trong tài liệu và bát quái là ba từ thường xuyên xuất hiện cùng nhau trong tài liệu. Với sự giúp đỡ của Gensim'sPhrases mô hình, chúng tôi có thể làm điều này -

bigram = gensim.models.Phrases(data_words, min_count=5, threshold=100)
trigram = gensim.models.Phrases(bigram[data_words], threshold=100)
bigram_mod = gensim.models.phrases.Phraser(bigram)
trigram_mod = gensim.models.phrases.Phraser(trigram)

Lọc ra các từ dừng

Tiếp theo, chúng ta cần lọc ra các Từ dừng. Cùng với đó, chúng tôi cũng sẽ tạo ra các chức năng để tạo ra bigrams, bát quái và cho lemmatisation -

def remove_stopwords(texts):
   return [[word for word in simple_preprocess(str(doc))
if word not in stop_words] for doc in texts]
def make_bigrams(texts):
   return [bigram_mod[doc] for doc in texts]
def make_trigrams(texts):
   return [trigram_mod[bigram_mod[doc]] for doc in texts]
def lemmatization(texts, allowed_postags=['NOUN', 'ADJ', 'VERB', 'ADV']):
   texts_out = []
   for sent in texts:
     doc = nlp(" ".join(sent))
     texts_out.append([token.lemma_ for token in doc if token.pos_ in allowed_postags])
   return texts_out

Xây dựng Từ điển & Tập đoàn cho Mô hình Chủ đề

Bây giờ chúng ta cần xây dựng từ điển & kho ngữ liệu. Chúng tôi cũng đã làm điều đó trong các ví dụ trước -

id2word = corpora.Dictionary(data_lemmatized)
texts = data_lemmatized
corpus = [id2word.doc2bow(text) for text in texts]

Xây dựng mô hình chủ đề LDA

Chúng tôi đã triển khai mọi thứ cần thiết để đào tạo mô hình LDA. Bây giờ, đã đến lúc xây dựng mô hình chủ đề LDA. Đối với ví dụ triển khai của chúng tôi, nó có thể được thực hiện với sự trợ giúp của dòng mã sau:

lda_model = gensim.models.ldamodel.LdaModel(
   corpus=corpus, id2word=id2word, num_topics=20, random_state=100, 
   update_every=1, chunksize=100, passes=10, alpha='auto', per_word_topics=True
)

Ví dụ triển khai

Hãy xem ví dụ triển khai hoàn chỉnh để xây dựng mô hình chủ đề LDA -

import re
import numpy as np
import pandas as pd
from pprint import pprint
import gensim
import gensim.corpora as corpora
from gensim.utils import simple_preprocess
from gensim.models import CoherenceModel
import spacy
import pyLDAvis
import pyLDAvis.gensim
import matplotlib.pyplot as plt
from nltk.corpus import stopwords
stop_words = stopwords.words('english')
stop_words.extend(['from', 'subject', 're', 'edu', 'use'])
from sklearn.datasets import fetch_20newsgroups
newsgroups_train = fetch_20newsgroups(subset='train')
data = newsgroups_train.data
data = [re.sub('\S*@\S*\s?', '', sent) for sent in data]
data = [re.sub('\s+', ' ', sent) for sent in data]
data = [re.sub("\'", "", sent) for sent in data]
print(data_words[:4]) #it will print the data after prepared for stopwords
bigram = gensim.models.Phrases(data_words, min_count=5, threshold=100)
trigram = gensim.models.Phrases(bigram[data_words], threshold=100)
bigram_mod = gensim.models.phrases.Phraser(bigram)
trigram_mod = gensim.models.phrases.Phraser(trigram)
def remove_stopwords(texts):
   return [[word for word in simple_preprocess(str(doc)) 
   if word not in stop_words] for doc in texts]
def make_bigrams(texts):
   return [bigram_mod[doc] for doc in texts]
def make_trigrams(texts):
   [trigram_mod[bigram_mod[doc]] for doc in texts]
def lemmatization(texts, allowed_postags=['NOUN', 'ADJ', 'VERB', 'ADV']):
   texts_out = []
   for sent in texts:
      doc = nlp(" ".join(sent))
      texts_out.append([token.lemma_ for token in doc if token.pos_ in allowed_postags])
   return texts_out
data_words_nostops = remove_stopwords(data_words)
data_words_bigrams = make_bigrams(data_words_nostops)
nlp = spacy.load('en_core_web_md', disable=['parser', 'ner'])
data_lemmatized = lemmatization(data_words_bigrams, allowed_postags=[
   'NOUN', 'ADJ', 'VERB', 'ADV'
])
print(data_lemmatized[:4]) #it will print the lemmatized data.
id2word = corpora.Dictionary(data_lemmatized)
texts = data_lemmatized
corpus = [id2word.doc2bow(text) for text in texts]
print(corpus[:4]) #it will print the corpus we created above.
[[(id2word[id], freq) for id, freq in cp] for cp in corpus[:4]] 
#it will print the words with their frequencies.
lda_model = gensim.models.ldamodel.LdaModel(
   corpus=corpus, id2word=id2word, num_topics=20, random_state=100, 
   update_every=1, chunksize=100, passes=10, alpha='auto', per_word_topics=True
)

Bây giờ chúng ta có thể sử dụng mô hình LDA đã tạo ở trên để lấy các chủ đề, để tính toán Độ phức tạp của mô hình.

Trong chương này, chúng ta sẽ hiểu cách sử dụng mô hình chủ đề Latent Dirichlet Allocation (LDA).

Xem chủ đề trong mô hình LDA

Mô hình LDA (lda_model) mà chúng tôi đã tạo ở trên có thể được sử dụng để xem các chủ đề từ các tài liệu. Nó có thể được thực hiện với sự trợ giúp của tập lệnh sau:

pprint(lda_model.print_topics())
doc_lda = lda_model[corpus]

Đầu ra

[
   (0, 
   '0.036*"go" + 0.027*"get" + 0.021*"time" + 0.017*"back" + 0.015*"good" + '
   '0.014*"much" + 0.014*"be" + 0.013*"car" + 0.013*"well" + 0.013*"year"'),
   (1,
   '0.078*"screen" + 0.067*"video" + 0.052*"character" + 0.046*"normal" + '
   '0.045*"mouse" + 0.034*"manager" + 0.034*"disease" + 0.031*"processor" + '
   '0.028*"excuse" + 0.028*"choice"'),
   (2,
   '0.776*"ax" + 0.079*"_" + 0.011*"boy" + 0.008*"ticket" + 0.006*"red" + '
   '0.004*"conservative" + 0.004*"cult" + 0.004*"amazing" + 0.003*"runner" + '
   '0.003*"roughly"'),
   (3,
   '0.086*"season" + 0.078*"fan" + 0.072*"reality" + 0.065*"trade" + '
   '0.045*"concept" + 0.040*"pen" + 0.028*"blow" + 0.025*"improve" + '
   '0.025*"cap" + 0.021*"penguin"'),
   (4,
   '0.027*"group" + 0.023*"issue" + 0.016*"case" + 0.016*"cause" + '
   '0.014*"state" + 0.012*"whole" + 0.012*"support" + 0.011*"government" + '
   '0.010*"year" + 0.010*"rate"'),
   (5,
   '0.133*"evidence" + 0.047*"believe" + 0.044*"religion" + 0.042*"belief" + '
   '0.041*"sense" + 0.041*"discussion" + 0.034*"atheist" + 0.030*"conclusion" +
   '
   '0.029*"explain" + 0.029*"claim"'),
   (6,
   '0.083*"space" + 0.059*"science" + 0.031*"launch" + 0.030*"earth" + '
   '0.026*"route" + 0.024*"orbit" + 0.024*"scientific" + 0.021*"mission" + '
   '0.018*"plane" + 0.017*"satellite"'),
   (7,
   '0.065*"file" + 0.064*"program" + 0.048*"card" + 0.041*"window" + '
   '0.038*"driver" + 0.037*"software" + 0.034*"run" + 0.029*"machine" + '
   '0.029*"entry" + 0.028*"version"'),
   (8,
   '0.078*"publish" + 0.059*"mount" + 0.050*"turkish" + 0.043*"armenian" + '
   '0.027*"western" + 0.026*"russian" + 0.025*"locate" + 0.024*"proceed" + '
   '0.024*"electrical" + 0.022*"terrorism"'),
   (9,
   '0.023*"people" + 0.023*"child" + 0.021*"kill" + 0.020*"man" + 0.019*"death" '
   '+ 0.015*"die" + 0.015*"live" + 0.014*"attack" + 0.013*"age" + '
   '0.011*"church"'),
   (10,
   '0.092*"cpu" + 0.085*"black" + 0.071*"controller" + 0.039*"white" + '
   '0.028*"water" + 0.027*"cold" + 0.025*"solid" + 0.024*"cool" + 0.024*"heat" '
   '+ 0.023*"nuclear"'),
   (11,
   '0.071*"monitor" + 0.044*"box" + 0.042*"option" + 0.041*"generate" + '
   '0.038*"vote" + 0.032*"battery" + 0.029*"wave" + 0.026*"tradition" + '
   '0.026*"fairly" + 0.025*"task"'),
   (12,
   '0.048*"send" + 0.045*"mail" + 0.036*"list" + 0.033*"include" + '
   '0.032*"price" + 0.031*"address" + 0.027*"email" + 0.026*"receive" + '
   '0.024*"book" + 0.024*"sell"'),
   (13,
   '0.515*"drive" + 0.052*"laboratory" + 0.042*"blind" + 0.020*"investment" + '
   '0.011*"creature" + 0.010*"loop" + 0.005*"dialog" + 0.000*"slave" + '
   '0.000*"jumper" + 0.000*"sector"'),
   (14,
   '0.153*"patient" + 0.066*"treatment" + 0.062*"printer" + 0.059*"doctor" + '

   '0.036*"medical" + 0.031*"energy" + 0.029*"study" + 0.029*"probe" + '
   '0.024*"mph" + 0.020*"physician"'),
   (15,
   '0.068*"law" + 0.055*"gun" + 0.039*"government" + 0.036*"right" + '
   '0.029*"state" + 0.026*"drug" + 0.022*"crime" + 0.019*"person" + '
   '0.019*"citizen" + 0.019*"weapon"'),
   (16,
   '0.107*"team" + 0.102*"game" + 0.078*"play" + 0.055*"win" + 0.052*"player" + '
   '0.051*"year" + 0.030*"score" + 0.025*"goal" + 0.023*"wing" + 0.023*"run"'),
   (17,
   '0.031*"say" + 0.026*"think" + 0.022*"people" + 0.020*"make" + 0.017*"see" + '
   '0.016*"know" + 0.013*"come" + 0.013*"even" + 0.013*"thing" + 0.013*"give"'),
   (18,
   '0.039*"system" + 0.034*"use" + 0.023*"key" + 0.016*"bit" + 0.016*"also" + '
   '0.015*"information" + 0.014*"source" + 0.013*"chip" + 0.013*"available" + '
   '0.010*"provide"'),
   (19,
   '0.085*"line" + 0.073*"write" + 0.053*"article" + 0.046*"organization" + '
   '0.034*"host" + 0.023*"be" + 0.023*"know" + 0.017*"thank" + 0.016*"want" + '
   '0.014*"help"')
]

Tính toán mô hình phức tạp

Mô hình LDA (lda_model) mà chúng ta đã tạo ở trên có thể được sử dụng để tính toán độ phức tạp của mô hình, tức là mô hình đó tốt như thế nào. Điểm càng thấp thì mô hình càng tốt. Nó có thể được thực hiện với sự trợ giúp của tập lệnh sau:

print('\nPerplexity: ', lda_model.log_perplexity(corpus))

Đầu ra

Perplexity: -12.338664984332151

Điểm tính mạch lạc

Mô hình LDA (lda_model)chúng tôi đã tạo ở trên có thể được sử dụng để tính toán điểm mạch lạc của mô hình, tức là điểm trung bình / trung vị của điểm số tương tự từ theo cặp của các từ trong chủ đề. Nó có thể được thực hiện với sự trợ giúp của tập lệnh sau:

coherence_model_lda = CoherenceModel(
   model=lda_model, texts=data_lemmatized, dictionary=id2word, coherence='c_v'
)
coherence_lda = coherence_model_lda.get_coherence()
print('\nCoherence Score: ', coherence_lda)

Đầu ra

Coherence Score: 0.510264381411751

Hình dung các Chủ đề-Từ khoá

Mô hình LDA (lda_model)chúng tôi đã tạo ở trên có thể được sử dụng để kiểm tra các chủ đề được sản xuất và các từ khóa liên quan. Nó có thể được hình dung bằng cách sử dụngpyLDAvisgói như sau -

pyLDAvis.enable_notebook()
vis = pyLDAvis.gensim.prepare(lda_model, corpus, id2word)
vis

Đầu ra

Từ kết quả trên, bong bóng ở phía bên trái đại diện cho một chủ đề và bong bóng lớn hơn, chủ đề đó càng thịnh hành. Mô hình chủ đề sẽ tốt nếu mô hình chủ đề có các bong bóng lớn, không chồng chéo nằm rải rác khắp biểu đồ.

Chương này sẽ giải thích Mô hình phân bổ tiềm ẩn Dirichlet (LDA) là gì và cách tạo mô hình tương tự trong Gensim.

Trong phần trước chúng ta đã triển khai mô hình LDA và lấy chủ đề từ các tài liệu của tập dữ liệu 20Newsgroup. Đó là phiên bản sẵn có của thuật toán LDA của Gensim. Ngoài ra còn có phiên bản Mallet của Gensim, cung cấp chất lượng chủ đề tốt hơn. Ở đây, chúng tôi sẽ áp dụng LDA của Mallet trên ví dụ trước mà chúng tôi đã triển khai.

Mô hình LDA Mallet là gì?

Mallet, một bộ công cụ mã nguồn mở, được viết bởi Andrew McCullum. Về cơ bản, nó là một gói dựa trên Java được sử dụng cho NLP, phân loại tài liệu, phân cụm, mô hình hóa chủ đề và nhiều ứng dụng học máy khác cho văn bản. Nó cung cấp cho chúng tôi bộ công cụ Mallet Topic Modeling chứa các triển khai hiệu quả, dựa trên lấy mẫu của LDA cũng như LDA phân cấp.

Mallet2.0 là bản phát hành hiện tại từ MALLET, bộ công cụ lập mô hình chủ đề java. Trước khi bắt đầu sử dụng nó với Gensim cho LDA, chúng ta phải tải xuống gói mallet-2.0.8.zip trên hệ thống của mình và giải nén nó. Sau khi cài đặt và giải nén, hãy đặt biến môi trường% MALLET_HOME% thành điểm đến thư mục MALLET theo cách thủ công hoặc bằng mã mà chúng tôi sẽ cung cấp, trong khi triển khai LDA với Mallet tiếp theo.

Gensim Wrapper

Python cung cấp trình bao bọc Gensim cho Phân bổ Dirichlet tiềm ẩn (LDA). Cú pháp của trình bao bọc đó làgensim.models.wrappers.LdaMallet. Mô-đun này, lấy mẫu gibbs thu gọn từ MALLET, cho phép ước tính mô hình LDA từ kho dữ liệu đào tạo và suy luận về phân phối chủ đề trên các tài liệu mới, chưa nhìn thấy.

Ví dụ triển khai

Chúng tôi sẽ sử dụng LDA Mallet trên mô hình LDA đã xây dựng trước đó và sẽ kiểm tra sự khác biệt về hiệu suất bằng cách tính điểm Coherence.

Cung cấp Đường dẫn đến Tệp Mallet

Trước khi áp dụng mô hình Mallet LDA trên kho dữ liệu được xây dựng trong ví dụ trước, chúng ta phải cập nhật các biến môi trường và cung cấp đường dẫn cho tệp Mallet. Nó có thể được thực hiện với sự trợ giúp của mã sau:

import os
from gensim.models.wrappers import LdaMallet
os.environ.update({'MALLET_HOME':r'C:/mallet-2.0.8/'}) 
#You should update this path as per the path of Mallet directory on your system.
mallet_path = r'C:/mallet-2.0.8/bin/mallet' 
#You should update this path as per the path of Mallet directory on your system.

Sau khi chúng tôi cung cấp đường dẫn đến tệp Mallet, bây giờ chúng tôi có thể sử dụng nó trên kho tài liệu. Nó có thể được thực hiện với sự giúp đỡ củaldamallet.show_topics() chức năng như sau -

ldamallet = gensim.models.wrappers.LdaMallet(
   mallet_path, corpus=corpus, num_topics=20, id2word=id2word
)
pprint(ldamallet.show_topics(formatted=False))

Đầu ra

[
   (4,
   [('gun', 0.024546225966016102),
   ('law', 0.02181426826996709),
   ('state', 0.017633545129043606),
   ('people', 0.017612848479831116),
   ('case', 0.011341763768445888),
   ('crime', 0.010596684396796159),
   ('weapon', 0.00985160502514643),
   ('person', 0.008671896020034356),
   ('firearm', 0.00838214293105946),
   ('police', 0.008257963035784506)]),
   (9,
   [('make', 0.02147966482730431),
   ('people', 0.021377478029838543),
   ('work', 0.018557122419783363),
   ('money', 0.016676885346413244),
   ('year', 0.015982015123646026),
   ('job', 0.012221540976905783),
   ('pay', 0.010239117106069897),
   ('time', 0.008910688739014919),
   ('school', 0.0079092581238504),
   ('support', 0.007357449417535254)]),
   (14,
   [('power', 0.018428398507941996),
   ('line', 0.013784244460364121),
   ('high', 0.01183271164249895),
   ('work', 0.011560979224821522),
   ('ground', 0.010770484918850819),
   ('current', 0.010745781971789235),
   ('wire', 0.008399002000938712),
   ('low', 0.008053160742076529),
   ('water', 0.006966231071366814),
   ('run', 0.006892122230182061)]),
   (0,
   [('people', 0.025218349201353372),
   ('kill', 0.01500904870564167),
   ('child', 0.013612400660948935),
   ('armenian', 0.010307655991816822),
   ('woman', 0.010287984892595798),
   ('start', 0.01003226060272248),
   ('day', 0.00967818081674404),
   ('happen', 0.009383114328428673),
   ('leave', 0.009383114328428673),
   ('fire', 0.009009363443229208)]),
   (1,
   [('file', 0.030686386604212003),
   ('program', 0.02227713642901929),
   ('window', 0.01945561169918489),
   ('set', 0.015914874783314277),
   ('line', 0.013831003577619592),
   ('display', 0.013794120901412606),
   ('application', 0.012576992586582082),
   ('entry', 0.009275993066056873),
   ('change', 0.00872275292295209),
   ('color', 0.008612104894331132)]),
   (12,
   [('line', 0.07153810971508515),
   ('buy', 0.02975597944523662),
   ('organization', 0.026877236406682988),
   ('host', 0.025451316957679788),
   ('price', 0.025182275552207485),
   ('sell', 0.02461728860071565),
   ('mail', 0.02192687454599263),
   ('good', 0.018967419085797303),
   ('sale', 0.017998870026097017),
   ('send', 0.013694207538540181)]),
   (11,
   [('thing', 0.04901329901329901),
   ('good', 0.0376018876018876),
   ('make', 0.03393393393393394),
   ('time', 0.03326898326898327),
   ('bad', 0.02664092664092664),
   ('happen', 0.017696267696267698),
   ('hear', 0.015615615615615615),
   ('problem', 0.015465465465465466),
   ('back', 0.015143715143715144),
   ('lot', 0.01495066495066495)]),
   (18,
   [('space', 0.020626317374284855),
   ('launch', 0.00965716006366413),
   ('system', 0.008560244332602057),
   ('project', 0.008173097603991913),
   ('time', 0.008108573149223556),
   ('cost', 0.007764442723792318),
   ('year', 0.0076784101174345075),
   ('earth', 0.007484836753129436),
   ('base', 0.0067535595990880545),
   ('large', 0.006689035144319697)]),
   (5,
   [('government', 0.01918437232469453),
   ('people', 0.01461203206475212),
   ('state', 0.011207097828624796),
   ('country', 0.010214802708381975),
   ('israeli', 0.010039691804809714),
   ('war', 0.009436532025838587),
   ('force', 0.00858043427504086),
   ('attack', 0.008424780138532182),
   ('land', 0.0076659662230523775),
   ('world', 0.0075103120865437)]),
   (2,
   [('car', 0.041091194044470564),
   ('bike', 0.015598981291017729),
   ('ride', 0.011019688510138114),
   ('drive', 0.010627877363110981),
   ('engine', 0.009403467528651191),
   ('speed', 0.008081104907434616),
   ('turn', 0.007738270153785875),
   ('back', 0.007738270153785875),
   ('front', 0.007468899990204721),
   ('big', 0.007370947203447938)])
]

Đánh giá phần thể hiện

Bây giờ chúng ta cũng có thể đánh giá hiệu suất của nó bằng cách tính điểm mạch lạc như sau:

ldamallet = gensim.models.wrappers.LdaMallet(
   mallet_path, corpus=corpus, num_topics=20, id2word=id2word
)
pprint(ldamallet.show_topics(formatted=False))

Đầu ra

Coherence Score: 0.5842762900901401

Chương này thảo luận về các tài liệu và mô hình LDA trong Gensim.

Tìm số lượng chủ đề tối ưu cho LDA

Chúng ta có thể tìm số lượng chủ đề tối ưu cho LDA bằng cách tạo ra nhiều mô hình LDA với các giá trị khác nhau của các chủ đề. Trong số các LDA đó, chúng ta có thể chọn một LDA có giá trị gắn kết cao nhất.

Chức năng sau có tên coherence_values_computation()sẽ đào tạo nhiều mô hình LDA. Nó cũng sẽ cung cấp các mô hình cũng như điểm liên kết tương ứng của chúng -

def coherence_values_computation(dictionary, corpus, texts, limit, start=2, step=3):
   coherence_values = []
   model_list = []
   for num_topics in range(start, limit, step):
      model = gensim.models.wrappers.LdaMallet(
         mallet_path, corpus=corpus, num_topics=num_topics, id2word=id2word
      )
      model_list.append(model)
   coherencemodel = CoherenceModel(
      model=model, texts=texts, dictionary=dictionary, coherence='c_v'
   )
   coherence_values.append(coherencemodel.get_coherence())
return model_list, coherence_values

Bây giờ với sự trợ giúp của mã sau, chúng tôi có thể có được số lượng chủ đề tối ưu mà chúng tôi có thể hiển thị với sự trợ giúp của biểu đồ -

model_list, coherence_values = coherence_values_computation (
   dictionary=id2word, corpus=corpus, texts=data_lemmatized, 
   start=1, limit=50, step=8
)
limit=50; start=1; step=8;
x = range(start, limit, step)
plt.plot(x, coherence_values)
plt.xlabel("Num Topics")
plt.ylabel("Coherence score")
plt.legend(("coherence_values"), loc='best')
plt.show()

Đầu ra

Tiếp theo, chúng ta cũng có thể in các giá trị mạch lạc cho các chủ đề khác nhau như sau:

for m, cv in zip(x, coherence_values):
   print("Num Topics =", m, " is having Coherence Value of", round(cv, 4))

Đầu ra

Num Topics = 1 is having Coherence Value of 0.4866
Num Topics = 9 is having Coherence Value of 0.5083
Num Topics = 17 is having Coherence Value of 0.5584
Num Topics = 25 is having Coherence Value of 0.5793
Num Topics = 33 is having Coherence Value of 0.587
Num Topics = 41 is having Coherence Value of 0.5842
Num Topics = 49 is having Coherence Value of 0.5735

Bây giờ, câu hỏi đặt ra là chúng ta nên chọn mô hình nào bây giờ? Một trong những cách thực hành tốt là chọn mô hình mang lại giá trị mạch lạc cao nhất trước khi tâng bốc. Vì vậy, đó là lý do tại sao, chúng tôi sẽ chọn mô hình với 25 chủ đề nằm ở vị trí thứ 4 trong danh sách trên.

optimal_model = model_list[3]
model_topics = optimal_model.show_topics(formatted=False)
pprint(optimal_model.print_topics(num_words=10))

[
   (0,
   '0.018*"power" + 0.011*"high" + 0.010*"ground" + 0.009*"current" + '
   '0.008*"low" + 0.008*"wire" + 0.007*"water" + 0.007*"work" + 0.007*"design" '
   '+ 0.007*"light"'),
   (1,
   '0.036*"game" + 0.029*"team" + 0.029*"year" + 0.028*"play" + 0.020*"player" '
   '+ 0.019*"win" + 0.018*"good" + 0.013*"season" + 0.012*"run" + 0.011*"hit"'),
   (2,
   '0.020*"image" + 0.019*"information" + 0.017*"include" + 0.017*"mail" + '
   '0.016*"send" + 0.015*"list" + 0.013*"post" + 0.012*"address" + '
   '0.012*"internet" + 0.012*"system"'),
   (3,
   '0.986*"ax" + 0.002*"_" + 0.001*"tm" + 0.000*"part" + 0.000*"biz" + '
   '0.000*"mb" + 0.000*"mbs" + 0.000*"pne" + 0.000*"end" + 0.000*"di"'),
   (4,
   '0.020*"make" + 0.014*"work" + 0.013*"money" + 0.013*"year" + 0.012*"people" '
   '+ 0.011*"job" + 0.010*"group" + 0.009*"government" + 0.008*"support" + '
   '0.008*"question"'),
   (5,
   '0.011*"study" + 0.011*"drug" + 0.009*"science" + 0.008*"food" + '
   '0.008*"problem" + 0.008*"result" + 0.008*"effect" + 0.007*"doctor" + '
   '0.007*"research" + 0.007*"patient"'),
   (6,
   '0.024*"gun" + 0.024*"law" + 0.019*"state" + 0.015*"case" + 0.013*"people" + '
   '0.010*"crime" + 0.010*"weapon" + 0.010*"person" + 0.008*"firearm" + '
   '0.008*"police"'),
   (7,
   '0.012*"word" + 0.011*"question" + 0.011*"exist" + 0.011*"true" + '
   '0.010*"religion" + 0.010*"claim" + 0.008*"argument" + 0.008*"truth" + '
   '0.008*"life" + 0.008*"faith"'),
   (8,
   '0.077*"time" + 0.029*"day" + 0.029*"call" + 0.025*"back" + 0.021*"work" + '
   '0.019*"long" + 0.015*"end" + 0.015*"give" + 0.014*"year" + 0.014*"week"'),
   (9,
   '0.048*"thing" + 0.041*"make" + 0.038*"good" + 0.037*"people" + '
   '0.028*"write" + 0.019*"bad" + 0.019*"point" + 0.018*"read" + 0.018*"post" + '
   '0.016*"idea"'),
   (10,
   '0.022*"book" + 0.020*"_" + 0.013*"man" + 0.012*"people" + 0.011*"write" + '
   '0.011*"find" + 0.010*"history" + 0.010*"armenian" + 0.009*"turkish" + '
   '0.009*"number"'),
   (11,
   '0.064*"line" + 0.030*"buy" + 0.028*"organization" + 0.025*"price" + '
   '0.025*"sell" + 0.023*"good" + 0.021*"host" + 0.018*"sale" + 0.017*"mail" + '
   '0.016*"cost"'),
   (12,
   '0.041*"car" + 0.015*"bike" + 0.011*"ride" + 0.010*"engine" + 0.009*"drive" '
   '+ 0.008*"side" + 0.008*"article" + 0.007*"turn" + 0.007*"front" + '
   '0.007*"speed"'),
   (13,
   '0.018*"people" + 0.011*"attack" + 0.011*"state" + 0.011*"israeli" + '
   '0.010*"war" + 0.010*"country" + 0.010*"government" + 0.009*"live" + '
   '0.009*"give" + 0.009*"land"'),
   (14,
   '0.037*"file" + 0.026*"line" + 0.021*"read" + 0.019*"follow" + '
   '0.018*"number" + 0.015*"program" + 0.014*"write" + 0.012*"entry" + '
   '0.012*"give" + 0.011*"check"'),
   (15,
   '0.196*"write" + 0.172*"line" + 0.165*"article" + 0.117*"organization" + '
   '0.086*"host" + 0.030*"reply" + 0.010*"university" + 0.008*"hear" + '
   '0.007*"post" + 0.007*"news"'),
   (16,
   '0.021*"people" + 0.014*"happen" + 0.014*"child" + 0.012*"kill" + '
   '0.011*"start" + 0.011*"live" + 0.010*"fire" + 0.010*"leave" + 0.009*"hear" '
   '+ 0.009*"home"'),
   (17,
   '0.038*"key" + 0.018*"system" + 0.015*"space" + 0.015*"technology" + '
   '0.014*"encryption" + 0.010*"chip" + 0.010*"bit" + 0.009*"launch" + '
   '0.009*"public" + 0.009*"government"'),
   (18,
   '0.035*"drive" + 0.031*"system" + 0.027*"problem" + 0.027*"card" + '
   '0.020*"driver" + 0.017*"bit" + 0.017*"work" + 0.016*"disk" + '
   '0.014*"monitor" + 0.014*"machine"'),
   (19,
   '0.031*"window" + 0.020*"run" + 0.018*"color" + 0.018*"program" + '
   '0.017*"application" + 0.016*"display" + 0.015*"set" + 0.015*"version" + '
   '0.012*"screen" + 0.012*"problem"')
]

Tìm chủ đề chính trong câu

Tìm chủ đề chủ đạo trong câu là một trong những ứng dụng thực tế hữu ích nhất của mô hình chủ đề. Nó xác định chủ đề của một tài liệu nhất định. Ở đây, chúng ta sẽ tìm thấy số chủ đề có tỷ lệ phần trăm đóng góp cao nhất trong tài liệu cụ thể đó. Để tổng hợp thông tin trong một bảng, chúng tôi sẽ tạo một hàm có têndominant_topics() -

def dominant_topics(ldamodel=lda_model, corpus=corpus, texts=data):
   sent_topics_df = pd.DataFrame()

Tiếp theo, chúng ta sẽ lấy các chủ đề chính trong mọi tài liệu -

for i, row in enumerate(ldamodel[corpus]):
   row = sorted(row, key=lambda x: (x[1]), reverse=True)

Tiếp theo, chúng ta sẽ nhận được chủ đề Thống trị, Phần trăm đóng góp và Từ khóa cho mọi tài liệu -

for j, (topic_num, prop_topic) in enumerate(row):
   if j == 0: # => dominant topic
      wp = ldamodel.show_topic(topic_num)
      topic_keywords = ", ".join([word for word, prop in wp])
sent_topics_df = sent_topics_df.append(
   pd.Series([int(topic_num), round(prop_topic,4), topic_keywords]), ignore_index=True
)
   else:
      break
sent_topics_df.columns = ['Dominant_Topic', 'Perc_Contribution', 'Topic_Keywords']

Với sự trợ giúp của mã sau, chúng tôi sẽ thêm văn bản gốc vào cuối đầu ra -

contents = pd.Series(texts)
   sent_topics_df = pd.concat([sent_topics_df, contents], axis=1)
   return(sent_topics_df)
df_topic_sents_keywords = dominant_topics(
   ldamodel=optimal_model, corpus=corpus, texts=data
)

Bây giờ, hãy thực hiện định dạng chủ đề trong các câu như sau:

df_dominant_topic = df_topic_sents_keywords.reset_index()
df_dominant_topic.columns = [
   'Document_No', 'Dominant_Topic', 'Topic_Perc_Contrib', 'Keywords', 'Text'
]

Cuối cùng, chúng tôi có thể hiển thị các chủ đề chính như sau:

df_dominant_topic.head(15)

Tìm tài liệu tiêu biểu nhất

Để hiểu thêm về chủ đề, chúng ta cũng có thể tìm các tài liệu, một chủ đề nhất định đã đóng góp nhiều nhất. Chúng ta có thể suy ra chủ đề đó bằng cách đọc (các) tài liệu cụ thể đó.

sent_topics_sorteddf_mallet = pd.DataFrame()
sent_topics_outdf_grpd = df_topic_sents_keywords.groupby('Dominant_Topic')
for i, grp in sent_topics_outdf_grpd:
   sent_topics_sorteddf_mallet = pd.concat([sent_topics_sorteddf_mallet,
grp.sort_values(['Perc_Contribution'], ascending=[0]).head(1)], axis=0)
sent_topics_sorteddf_mallet.reset_index(drop=True, inplace=True)
sent_topics_sorteddf_mallet.columns = [
   'Topic_Number', "Contribution_Perc", "Keywords", "Text"
]
sent_topics_sorteddf_mallet.head()

Đầu ra

Khối lượng & Phân phối Chủ đề

Đôi khi chúng ta cũng muốn đánh giá mức độ rộng rãi của chủ đề được thảo luận trong các tài liệu. Để làm được điều này, chúng ta cần hiểu khối lượng và sự phân bố các chủ đề trong các tài liệu.

Đầu tiên hãy tính số lượng tài liệu cho mỗi Chủ đề như sau:

topic_counts = df_topic_sents_keywords['Dominant_Topic'].value_counts()

Tiếp theo, tính phần trăm Tài liệu cho mỗi Chủ đề như sau -;

topic_contribution = round(topic_counts/topic_counts.sum(), 4)

Bây giờ tìm chủ đề Số và Từ khóa như sau:

topic_num_keywords = df_topic_sents_keywords[['Dominant_Topic', 'Topic_Keywords']]

Bây giờ, nối với Cột khôn ngoan như sau:

df_dominant_topics = pd.concat(
   [topic_num_keywords, topic_counts, topic_contribution], axis=1
)

Tiếp theo, chúng tôi sẽ thay đổi tên Cột như sau:

df_dominant_topics.columns = [
   'Dominant-Topic', 'Topic-Keywords', 'Num_Documents', 'Perc_Documents'
]
df_dominant_topics

Đầu ra

Chương này đề cập đến việc tạo lập chỉ mục ngữ nghĩa tiềm ẩn (LSI) và mô hình chủ đề Quy trình Dirichlet phân cấp (HDP) liên quan đến Gensim.

Các thuật toán mô hình hóa chủ đề lần đầu tiên được triển khai trong Gensim với Phân bổ Dirichlet tiềm ẩn (LDA) là Latent Semantic Indexing (LSI). Nó còn được gọi làLatent Semantic Analysis (LSA). Nó được cấp bằng sáng chế vào năm 1988 bởi Scott Deerwester, Susan Dumais, George Furnas, Richard Harshman, Thomas Landaur, Karen Lochbaum và Lynn Streeter.

Trong phần này, chúng tôi sẽ thiết lập mô hình LSI của chúng tôi. Nó có thể được thực hiện theo cùng một cách thiết lập mô hình LDA. Chúng tôi cần nhập mô hình LSI từgensim.models.

Vai trò của LSI

Trên thực tế, LSI là một kỹ thuật NLP, đặc biệt là trong ngữ nghĩa phân phối. Nó phân tích mối quan hệ giữa một tập hợp các tài liệu và các điều khoản mà các tài liệu này chứa đựng. Nếu chúng ta nói về hoạt động của nó, thì nó xây dựng một ma trận chứa số lượng từ trên mỗi tài liệu từ một đoạn văn bản lớn.

Sau khi được xây dựng, để giảm số lượng hàng, mô hình LSI sử dụng một kỹ thuật toán học được gọi là phân rã giá trị số ít (SVD). Cùng với việc giảm số lượng hàng, nó cũng bảo tồn cấu trúc tương tự giữa các cột.

Trong ma trận, các hàng đại diện cho các từ duy nhất và các cột đại diện cho mỗi tài liệu. Nó hoạt động dựa trên giả thuyết phân bố, tức là nó giả định rằng các từ gần nghĩa sẽ xuất hiện trong cùng một loại văn bản.

Thực hiện với Gensim

Ở đây, chúng tôi sẽ sử dụng LSI (Lập chỉ mục ngữ nghĩa tiềm ẩn) để trích xuất các chủ đề được thảo luận tự nhiên từ tập dữ liệu.

Đang tải tập dữ liệu

Tập dữ liệu mà chúng tôi sẽ sử dụng là tập dữ liệu của ’20 Newsgroups’có hàng nghìn tin bài từ các phần khác nhau của một bản tin. Nó có sẵn dướiSklearncác tập dữ liệu. Chúng tôi có thể dễ dàng tải xuống với sự trợ giúp của tập lệnh Python sau:

from sklearn.datasets import fetch_20newsgroups
newsgroups_train = fetch_20newsgroups(subset='train')

Hãy xem một số tin tức mẫu với sự trợ giúp của tập lệnh sau:

newsgroups_train.data[:4]
["From: [email protected] (where's my thing)\nSubject: 
WHAT car is this!?\nNntp-Posting-Host: rac3.wam.umd.edu\nOrganization: 
University of Maryland, College Park\nLines: 15\n\n 
I was wondering if anyone out there could enlighten me on this car 
I saw\nthe other day. It was a 2-door sports car,
looked to be from the late 60s/\nearly 70s. It was called a Bricklin. 
The doors were really small. In addition,\nthe front bumper was separate from 
the rest of the body. This is \nall I know. If anyone can tellme a model name, 
engine specs, years\nof production, where this car is made, history, or 
whatever info you\nhave on this funky looking car, 
please e-mail.\n\nThanks,\n- IL\n ---- brought to you by your neighborhood 
Lerxst ----\n\n\n\n\n",

"From: [email protected] (Guy Kuo)\nSubject: 
SI Clock Poll - Final Call\nSummary: Final call for SI clock reports\nKeywords: 
SI,acceleration,clock,upgrade\nArticle-I.D.: shelley.1qvfo9INNc3s\nOrganization: 
University of Washington\nLines: 11\nNNTP-Posting-Host: carson.u.washington.edu\n\nA 
fair number of brave souls who upgraded their SI clock oscillator have\nshared their 
experiences for this poll. Please send a brief message detailing\nyour experiences with 
the procedure. Top speed attained, CPU rated speed,\nadd on cards and adapters, heat 
sinks, hour of usage per day, floppy disk\nfunctionality with 800 and 1.4 m floppies 
are especially requested.\n\nI will be summarizing in the next two days, so please add 
to the network\nknowledge base if you have done the clock upgrade and haven't answered 
this\npoll. Thanks.\n\nGuy Kuo <[email protected]>\n",

'From: [email protected] (Thomas E Willis)\nSubject: 
PB questions...\nOrganization: Purdue University Engineering Computer 
Network\nDistribution: usa\nLines: 36\n\nwell folks, my mac plus finally gave up the 
ghost this weekend after\nstarting life as a 512k way back in 1985. sooo, i\'m in the 
market for a\nnew machine a bit sooner than i intended to be...\n\ni\'m looking into 
picking up a powerbook 160 or maybe 180 and have a bunch\nof questions that (hopefully) 
somebody can answer:\n\n* does anybody know any dirt on when the next round of 
powerbook\nintroductions are expected? i\'d heard the 185c was supposed to make 
an\nappearence "this summer" but haven\'t heard anymore on it - and since i\ndon\'t 
have access to macleak, i was wondering if anybody out there had\nmore info...\n\n* has 
anybody heard rumors about price drops to the powerbook line like the\nones the duo\'s 
just went through recently?\n\n* what\'s the impression of the display on the 180? i 
could probably swing\na 180 if i got the 80Mb disk rather than the 120, but i don\'t 
really have\na feel for how much "better" the display is (yea, it looks great in 
the\nstore, but is that all "wow" or is it really that good?). could i solicit\nsome 
opinions of people who use the 160 and 180 day-to-day on if its worth\ntaking the disk 
size and money hit to get the active display? (i realize\nthis is a real subjective 
question, but i\'ve only played around with the\nmachines in a computer store breifly 
and figured the opinions of somebody\nwho actually uses the machine daily might prove 
helpful).\n\n* how well does hellcats perform? ;)\n\nthanks a bunch in advance for any 
info - if you could email, i\'ll post a\nsummary (news reading time is at a premium 
with finals just around the\ncorner... :( )\n--\nTom Willis \\ [email protected] 
\\ Purdue Electrical 
Engineering\n---------------------------------------------------------------------------\
n"Convictions are more dangerous enemies of truth than lies." - F. W.\nNietzsche\n',

'From: jgreen@amber (Joe Green)\nSubject: Re: Weitek P9000 ?\nOrganization: Harris 
Computer Systems Division\nLines: 14\nDistribution: world\nNNTP-Posting-Host: 
amber.ssd.csd.harris.com\nX-Newsreader: TIN [version 1.1 PL9]\n\nRobert J.C. Kyanko 
([email protected]) wrote:\n > [email protected] writes in article <
[email protected]>:\n> > Anyone know about the Weitek P9000 
graphics chip?\n > As far as the low-level stuff goes, it looks pretty nice. It\'s 
got this\n > quadrilateral fill command that requires just the four
points.\n\nDo you have Weitek\'s address/phone number? I\'d like to get some 
information\nabout this chip.\n\n--\nJoe Green\t\t\t\tHarris 
Corporation\[email protected]\t\t\tComputer Systems Division\n"The only thing that 
really scares me is a person with no sense of humor."\n\t\t\t\t\t\t-- Jonathan 
Winters\n']

Điều kiện tiên quyết

Chúng tôi cần từ dừng từ NLTK và mô hình tiếng Anh từ Scapy. Cả hai đều có thể được tải xuống như sau:

import nltk;
nltk.download('stopwords')
nlp = spacy.load('en_core_web_md', disable=['parser', 'ner'])

Nhập các gói cần thiết

Để xây dựng mô hình LSI, chúng ta cần nhập gói cần thiết sau:

import re
import numpy as np
import pandas as pd
from pprint import pprint
import gensim
import gensim.corpora as corpora
from gensim.utils import simple_preprocess
from gensim.models import CoherenceModel
import spacy
import matplotlib.pyplot as plt

Chuẩn bị từ dừng

Bây giờ chúng ta cần nhập các Từ dừng và sử dụng chúng -

from nltk.corpus import stopwords
stop_words = stopwords.words('english')
stop_words.extend(['from', 'subject', 're', 'edu', 'use'])

Dọn dẹp văn bản

Bây giờ, với sự giúp đỡ của Gensim's simple_preprocess()chúng ta cần phân tách từng câu thành một danh sách các từ. Chúng ta cũng nên loại bỏ các dấu câu và các ký tự không cần thiết. Để làm điều này, chúng tôi sẽ tạo một hàm có tênsent_to_words() -

def sent_to_words(sentences):
   for sentence in sentences:
      yield(gensim.utils.simple_preprocess(str(sentence), deacc=True))
data_words = list(sent_to_words(data))

Xây dựng mô hình Bigram & Trigram

Như chúng ta biết rằng bigrams là hai từ thường xuyên xuất hiện cùng nhau trong tài liệu và bát quái là ba từ thường xuyên xuất hiện cùng nhau trong tài liệu. Với sự trợ giúp của mô hình Cụm từ của Gensim, chúng tôi có thể làm điều này -

bigram = gensim.models.Phrases(data_words, min_count=5, threshold=100)
trigram = gensim.models.Phrases(bigram[data_words], threshold=100)
bigram_mod = gensim.models.phrases.Phraser(bigram)
trigram_mod = gensim.models.phrases.Phraser(trigram)

Lọc ra các từ dừng

Tiếp theo, chúng ta cần lọc ra các Từ dừng. Cùng với đó, chúng tôi cũng sẽ tạo ra các chức năng để tạo ra bigrams, bát quái và cho lemmatisation -

def remove_stopwords(texts):
   return [[word for word in simple_preprocess(str(doc)) 
   if word not in stop_words] for doc in texts]
def make_bigrams(texts):
   return [bigram_mod[doc] for doc in texts]
def make_trigrams(texts):
   return [trigram_mod[bigram_mod[doc]] for doc in texts]
def lemmatization(texts, allowed_postags=['NOUN', 'ADJ', 'VERB', 'ADV']):
   texts_out = []
   for sent in texts:
      doc = nlp(" ".join(sent))
      texts_out.append([token.lemma_ for token in doc if token.pos_ in allowed_postags])
   return texts_out

Xây dựng Từ điển & Tập đoàn cho Mô hình Chủ đề

Bây giờ chúng ta cần xây dựng từ điển & kho ngữ liệu. Chúng tôi cũng đã làm điều đó trong các ví dụ trước -

id2word = corpora.Dictionary(data_lemmatized)
texts = data_lemmatized
corpus = [id2word.doc2bow(text) for text in texts]

Xây dựng mô hình chủ đề LSI

Chúng tôi đã triển khai mọi thứ cần thiết để đào tạo mô hình LSI. Bây giờ, đã đến lúc xây dựng mô hình chủ đề LSI. Đối với ví dụ triển khai của chúng tôi, nó có thể được thực hiện với sự trợ giúp của dòng mã sau:

lsi_model = gensim.models.lsimodel.LsiModel(
   corpus=corpus, id2word=id2word, num_topics=20,chunksize=100
)

Ví dụ triển khai

Hãy xem ví dụ triển khai hoàn chỉnh để xây dựng mô hình chủ đề LDA -

import re
import numpy as np
import pandas as pd
from pprint import pprint
import gensim
import gensim.corpora as corpora
from gensim.utils import simple_preprocess
from gensim.models import CoherenceModel
import spacy
import matplotlib.pyplot as plt
from nltk.corpus import stopwords
stop_words = stopwords.words('english')
stop_words.extend(['from', 'subject', 're', 'edu', 'use'])
from sklearn.datasets import fetch_20newsgroups
newsgroups_train = fetch_20newsgroups(subset='train')
data = newsgroups_train.data
data = [re.sub('\S*@\S*\s?', '', sent) for sent in data]
data = [re.sub('\s+', ' ', sent) for sent in data]
data = [re.sub("\'", "", sent) for sent in data]
print(data_words[:4]) #it will print the data after prepared for stopwords
bigram = gensim.models.Phrases(data_words, min_count=5, threshold=100)
trigram = gensim.models.Phrases(bigram[data_words], threshold=100)
bigram_mod = gensim.models.phrases.Phraser(bigram)
trigram_mod = gensim.models.phrases.Phraser(trigram)
def remove_stopwords(texts):
   return [[word for word in simple_preprocess(str(doc)) 
   if word not in stop_words] for doc in texts]
def make_bigrams(texts):
   return [bigram_mod[doc] for doc in texts]
def make_trigrams(texts):
   return [trigram_mod[bigram_mod[doc]] for doc in texts]
def lemmatization(texts, allowed_postags=['NOUN', 'ADJ', 'VERB', 'ADV']):
   texts_out = []
   for sent in texts:
      doc = nlp(" ".join(sent))
      texts_out.append([token.lemma_ for token in doc if token.pos_ in allowed_postags])
return texts_out
data_words_nostops = remove_stopwords(data_words)
data_words_bigrams = make_bigrams(data_words_nostops)
nlp = spacy.load('en_core_web_md', disable=['parser', 'ner'])
data_lemmatized = lemmatization(
   data_words_bigrams, allowed_postags=['NOUN', 'ADJ', 'VERB', 'ADV']
)
print(data_lemmatized[:4]) #it will print the lemmatized data.
id2word = corpora.Dictionary(data_lemmatized)
texts = data_lemmatized
corpus = [id2word.doc2bow(text) for text in texts]
print(corpus[:4]) #it will print the corpus we created above.
[[(id2word[id], freq) for id, freq in cp] for cp in corpus[:4]] 
#it will print the words with their frequencies.
lsi_model = gensim.models.lsimodel.LsiModel(
   corpus=corpus, id2word=id2word, num_topics=20,chunksize=100
)

Bây giờ chúng ta có thể sử dụng mô hình LSI đã tạo ở trên để lấy các chủ đề.

Xem chủ đề trong mô hình LSI

Mô hình LSI (lsi_model)chúng tôi đã tạo ở trên có thể được sử dụng để xem các chủ đề từ các tài liệu. Nó có thể được thực hiện với sự trợ giúp của tập lệnh sau:

pprint(lsi_model.print_topics())
doc_lsi = lsi_model[corpus]

Đầu ra

[
   (0,
   '1.000*"ax" + 0.001*"_" + 0.000*"tm" + 0.000*"part" +    0.000*"pne" + '
   '0.000*"biz" + 0.000*"mbs" + 0.000*"end" + 0.000*"fax" + 0.000*"mb"'),
   (1,
   '0.239*"say" + 0.222*"file" + 0.189*"go" + 0.171*"know" + 0.169*"people" + '
   '0.147*"make" + 0.140*"use" + 0.135*"also" + 0.133*"see" + 0.123*"think"')
]

Quy trình Dirichlet phân cấp (HPD)

Các mô hình chủ đề như LDA và LSI giúp tóm tắt và sắp xếp các kho lưu trữ văn bản lớn mà không thể phân tích bằng tay. Ngoài LDA và LSI, một mô hình chủ đề mạnh mẽ khác trong Gensim là HDP (Quy trình Dirichlet phân cấp). Về cơ bản, nó là một mô hình thành viên hỗn hợp để phân tích dữ liệu được nhóm không giám sát. Không giống như LDA (đối tác hữu hạn của nó), HDP suy ra số lượng chủ đề từ dữ liệu.

Thực hiện với Gensim

Để triển khai HDP trong Gensim, chúng ta cần đào tạo kho ngữ liệu và từ điển (như đã làm trong các ví dụ trên khi triển khai mô hình chủ đề LDA và LSI) mô hình chủ đề HDP mà chúng ta có thể nhập từ gensim.models.HdpModel. Ở đây chúng tôi cũng sẽ triển khai mô hình chủ đề HDP trên dữ liệu 20Newsgroup và các bước thực hiện cũng tương tự.

Đối với kho ngữ liệu và từ điển của chúng tôi (được tạo trong các ví dụ trên cho mô hình LSI và LDA), chúng tôi có thể nhập HdpModel như sau:

Hdp_model = gensim.models.hdpmodel.HdpModel(corpus=corpus, id2word=id2word)

Xem chủ đề trong mô hình LSI

Mô hình HDP (Hdp_model)có thể được sử dụng để xem các chủ đề từ các tài liệu. Nó có thể được thực hiện với sự trợ giúp của tập lệnh sau:

pprint(Hdp_model.print_topics())

Đầu ra

[
   (0,
   '0.009*line + 0.009*write + 0.006*say + 0.006*article + 0.006*know + '
   '0.006*people + 0.005*make + 0.005*go + 0.005*think + 0.005*be'),
   (1,
   '0.016*line + 0.011*write + 0.008*article + 0.008*organization + 0.006*know '
   '+ 0.006*host + 0.006*be + 0.005*get + 0.005*use + 0.005*say'),
   (2,
   '0.810*ax + 0.001*_ + 0.000*tm + 0.000*part + 0.000*mb + 0.000*pne + '
   '0.000*biz + 0.000*end + 0.000*wwiz + 0.000*fax'),
   (3,
   '0.015*line + 0.008*write + 0.007*organization + 0.006*host + 0.006*know + '
   '0.006*article + 0.005*use + 0.005*thank + 0.004*get + 0.004*problem'),
   (4,
   '0.004*line + 0.003*write + 0.002*believe + 0.002*think + 0.002*article + '
   '0.002*belief + 0.002*say + 0.002*see + 0.002*look + 0.002*organization'),
   (5,
   '0.005*line + 0.003*write + 0.003*organization + 0.002*article + 0.002*time '
   '+ 0.002*host + 0.002*get + 0.002*look + 0.002*say + 0.001*number'),
   (6,
   '0.003*line + 0.002*say + 0.002*write + 0.002*go + 0.002*gun + 0.002*get + '
   '0.002*organization + 0.002*bill + 0.002*article + 0.002*state'),
   (7,
   '0.003*line + 0.002*write + 0.002*article + 0.002*organization + 0.001*none '
   '+ 0.001*know + 0.001*say + 0.001*people + 0.001*host + 0.001*new'),
   (8,
   '0.004*line + 0.002*write + 0.002*get + 0.002*team + 0.002*organization + '
   '0.002*go + 0.002*think + 0.002*know + 0.002*article + 0.001*well'),
   (9,
   '0.004*line + 0.002*organization + 0.002*write + 0.001*be + 0.001*host + '
   '0.001*article + 0.001*thank + 0.001*use + 0.001*work + 0.001*run'),
   (10,
   '0.002*line + 0.001*game + 0.001*write + 0.001*get + 0.001*know + '
   '0.001*thing + 0.001*think + 0.001*article + 0.001*help + 0.001*turn'),
   (11,
   '0.002*line + 0.001*write + 0.001*game + 0.001*organization + 0.001*say + '
   '0.001*host + 0.001*give + 0.001*run + 0.001*article + 0.001*get'),
   (12,
   '0.002*line + 0.001*write + 0.001*know + 0.001*time + 0.001*article + '
   '0.001*get + 0.001*think + 0.001*organization + 0.001*scope + 0.001*make'),
   (13,
   '0.002*line + 0.002*write + 0.001*article + 0.001*organization + 0.001*make '
   '+ 0.001*know + 0.001*see + 0.001*get + 0.001*host + 0.001*really'),
   (14,
   '0.002*write + 0.002*line + 0.002*know + 0.001*think + 0.001*say + '
   '0.001*article + 0.001*argument + 0.001*even + 0.001*card + 0.001*be'),
   (15,
   '0.001*article + 0.001*line + 0.001*make + 0.001*write + 0.001*know + '
   '0.001*say + 0.001*exist + 0.001*get + 0.001*purpose + 0.001*organization'),
   (16,
   '0.002*line + 0.001*write + 0.001*article + 0.001*insurance + 0.001*go + '
   '0.001*be + 0.001*host + 0.001*say + 0.001*organization + 0.001*part'),
   (17,
   '0.001*line + 0.001*get + 0.001*hit + 0.001*go + 0.001*write + 0.001*say + '
   '0.001*know + 0.001*drug + 0.001*see + 0.001*need'),
   (18,
   '0.002*option + 0.001*line + 0.001*flight + 0.001*power + 0.001*software + '
   '0.001*write + 0.001*add + 0.001*people + 0.001*organization + 0.001*module'),
   (19,
   '0.001*shuttle + 0.001*line + 0.001*roll + 0.001*attitude + 0.001*maneuver + '
   '0.001*mission + 0.001*also + 0.001*orbit + 0.001*produce + 0.001*frequency')
]

Chương này sẽ giúp chúng ta hiểu việc phát triển tính năng nhúng từ trong Gensim.

Nhúng từ, cách tiếp cận để biểu diễn từ & tài liệu, là một biểu diễn vectơ dày đặc cho văn bản trong đó các từ có cùng ý nghĩa có cách biểu diễn tương tự. Sau đây là một số đặc điểm của nhúng từ -

  • Nó là một lớp kỹ thuật biểu diễn các từ riêng lẻ dưới dạng vectơ có giá trị thực trong một không gian vectơ được xác định trước.

  • Kỹ thuật này thường được gộp chung vào lĩnh vực DL (học sâu) vì mỗi từ được ánh xạ tới một vectơ và các giá trị vectơ được học theo cách mà NN (Neural Networks) thực hiện.

  • Cách tiếp cận chính của kỹ thuật nhúng từ là một biểu diễn phân tán dày đặc cho mỗi từ.

Các phương pháp / thuật toán nhúng Word khác nhau

Như đã thảo luận ở trên, các phương pháp / thuật toán nhúng từ học cách biểu diễn vectơ có giá trị thực từ một kho văn bản. Quá trình học tập này có thể sử dụng với mô hình NN trong nhiệm vụ như phân loại tài liệu hoặc là một quá trình không được giám sát như thống kê tài liệu. Ở đây chúng ta sẽ thảo luận về hai phương pháp / thuật toán có thể được sử dụng để học cách nhúng từ từ văn bản -

Word2Vec của Google

Word2Vec, được phát triển bởi Tomas Mikolov, et. al. tại Google vào năm 2013, là một phương pháp thống kê để học cách nhúng từ từ kho ngữ liệu văn bản một cách hiệu quả. Nó thực sự được phát triển như một phản ứng để làm cho quá trình đào tạo nhúng từ dựa trên NN hiệu quả hơn. Nó đã trở thành tiêu chuẩn thực tế cho việc nhúng từ.

Nhúng từ bằng Word2Vec liên quan đến việc phân tích các vectơ đã học cũng như khám phá toán học vectơ về cách biểu diễn các từ. Sau đây là hai phương pháp học tập khác nhau có thể được sử dụng như một phần của phương pháp Word2Vec:

  • Mô hình CBoW (Túi từ liên tục)
  • Mô hình Skip-Gram liên tục

GloVe của Standford

GloVe (Vectơ toàn cầu cho Biểu diễn Word), là một phần mở rộng của phương thức Word2Vec. Nó được phát triển bởi Pennington et al. tại Stanford. Thuật toán GloVe là sự kết hợp của cả hai -

  • Thống kê toàn cầu của các kỹ thuật phân tích nhân tử ma trận như LSA (Phân tích ngữ nghĩa tiềm ẩn)
  • Học tập dựa trên ngữ cảnh cục bộ trong Word2Vec.

Nếu chúng ta nói về hoạt động của nó thì thay vì sử dụng cửa sổ để xác định ngữ cảnh cục bộ, GloVe xây dựng một ma trận đồng xuất hiện từ rõ ràng bằng cách sử dụng thống kê trên toàn bộ ngữ liệu văn bản.

Phát triển Nhúng Word2Vec

Ở đây, chúng tôi sẽ phát triển tính năng nhúng Word2Vec bằng cách sử dụng Gensim. Để làm việc với mô hình Word2Vec, Gensim cung cấp cho chúng tôiWord2Vec lớp có thể được nhập từ models.word2vec. Để triển khai, word2vec yêu cầu rất nhiều văn bản, ví dụ như toàn bộ kho tài liệu đánh giá của Amazon. Nhưng ở đây, chúng tôi sẽ áp dụng nguyên tắc này trên văn bản có bộ nhớ nhỏ.

Ví dụ triển khai

Đầu tiên, chúng ta cần nhập lớp Word2Vec từ gensim.models như sau:

from gensim.models import Word2Vec

Tiếp theo, chúng ta cần xác định dữ liệu đào tạo. Thay vì sử dụng tệp văn bản lớn, chúng tôi sử dụng một số câu để thực hiện điều này.

sentences = [
   ['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
   ['this', 'is', 'the', 'tutorials' 'point', 'website'],
   ['you', 'can', 'read', 'technical','tutorials', 'for','free'],
   ['we', 'are', 'implementing','word2vec'],
   ['learn', 'full', 'gensim', 'tutorial']
]

Khi dữ liệu đào tạo được cung cấp, chúng tôi cần đào tạo mô hình. nó có thể được thực hiện như sau:

model = Word2Vec(sentences, min_count=1)

Chúng ta có thể tóm tắt mô hình như sau -;

print(model)

Chúng ta có thể tóm tắt các từ vựng như sau:

words = list(model.wv.vocab)
print(words)

Tiếp theo, hãy truy cập vector cho một từ. Chúng tôi đang làm điều đó cho từ 'hướng dẫn'.

print(model['tutorial'])

Tiếp theo, chúng ta cần lưu mô hình -

model.save('model.bin')

Tiếp theo, chúng ta cần tải mô hình -

new_model = Word2Vec.load('model.bin')

Cuối cùng, in mô hình đã lưu như sau:

print(new_model)

Hoàn thành ví dụ triển khai

from gensim.models import Word2Vec
sentences = [
   ['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
   ['this', 'is', 'the', 'tutorials' 'point', 'website'],
   ['you', 'can', 'read', 'technical','tutorials', 'for','free'],
   ['we', 'are', 'implementing','word2vec'],
   ['learn', 'full', 'gensim', 'tutorial']
]
model = Word2Vec(sentences, min_count=1)
print(model)
words = list(model.wv.vocab)
print(words)
print(model['tutorial'])
model.save('model.bin')
new_model = Word2Vec.load('model.bin')
print(new_model)

Đầu ra

Word2Vec(vocab=20, size=100, alpha=0.025)
[
   'this', 'is', 'gensim', 'tutorial', 'for', 'free', 'the', 'tutorialspoint', 
   'website', 'you', 'can', 'read', 'technical', 'tutorials', 'we', 'are', 
   'implementing', 'word2vec', 'learn', 'full'
]
[
   -2.5256255e-03 -4.5352755e-03 3.9024993e-03 -4.9509313e-03
   -1.4255195e-03 -4.0217536e-03 4.9407515e-03 -3.5925603e-03
   -1.1933431e-03 -4.6682903e-03 1.5440651e-03 -1.4101702e-03
   3.5070938e-03 1.0914479e-03 2.3334436e-03 2.4452661e-03
   -2.5336299e-04 -3.9676363e-03 -8.5054158e-04 1.6443320e-03
   -4.9968651e-03 1.0974540e-03 -1.1123562e-03 1.5393364e-03
   9.8941079e-04 -1.2656028e-03 -4.4471184e-03 1.8309267e-03
   4.9302122e-03 -1.0032534e-03 4.6892050e-03 2.9563988e-03
   1.8730218e-03 1.5343715e-03 -1.2685956e-03 8.3664013e-04
   4.1721235e-03 1.9445885e-03 2.4097660e-03 3.7517555e-03
   4.9687522e-03 -1.3598346e-03 7.1032363e-04 -3.6595813e-03
   6.0000515e-04 3.0872561e-03 -3.2115565e-03 3.2270295e-03
   -2.6354722e-03 -3.4988276e-04 1.8574356e-04 -3.5757164e-03
   7.5391348e-04 -3.5205986e-03 -1.9795434e-03 -2.8321696e-03
   4.7155009e-03 -4.3349937e-04 -1.5320212e-03 2.7013756e-03
   -3.7055744e-03 -4.1658725e-03 4.8034848e-03 4.8594419e-03
   3.7129463e-03 4.2385766e-03 2.4612297e-03 5.4920948e-04
   -3.8912550e-03 -4.8226118e-03 -2.2763973e-04 4.5571579e-03
   -3.4609400e-03 2.7903817e-03 -3.2709218e-03 -1.1036445e-03
   2.1492650e-03 -3.0384419e-04 1.7709908e-03 1.8429896e-03
   -3.4038599e-03 -2.4872608e-03 2.7693063e-03 -1.6352943e-03
   1.9182395e-03 3.7772327e-03 2.2769428e-03 -4.4629495e-03
   3.3151123e-03 4.6509290e-03 -4.8521687e-03 6.7615538e-04
   3.1034781e-03 2.6369948e-05 4.1454583e-03 -3.6932561e-03
   -1.8769916e-03 -2.1958587e-04 6.3395966e-04 -2.4969708e-03
]
Word2Vec(vocab=20, size=100, alpha=0.025)

Hình dung Nhúng Word

Chúng ta cũng có thể khám phá cách nhúng từ bằng hình ảnh. Nó có thể được thực hiện bằng cách sử dụng phương pháp chiếu cổ điển (như PCA) để giảm các vectơ từ chiều cao thành các ô 2-D. Sau khi giảm, chúng ta có thể vẽ chúng trên đồ thị.

Vẽ các vectơ Word bằng PCA

Đầu tiên, chúng ta cần truy xuất tất cả các vectơ từ một mô hình được đào tạo như sau:

Z = model[model.wv.vocab]

Tiếp theo, chúng ta cần tạo một mô hình 2-D PCA của các vectơ từ bằng cách sử dụng lớp PCA như sau:

pca = PCA(n_components=2)
result = pca.fit_transform(Z)

Bây giờ, chúng ta có thể vẽ biểu đồ kết quả bằng cách sử dụng matplotlib như sau:

Pyplot.scatter(result[:,0],result[:,1])

Chúng ta cũng có thể chú thích các điểm trên biểu đồ bằng chính các từ. Vẽ đồ thị kết quả bằng cách sử dụng matplotlib như sau:

words = list(model.wv.vocab)
for i, word in enumerate(words):
   pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))

Hoàn thành ví dụ triển khai

from gensim.models import Word2Vec
from sklearn.decomposition import PCA
from matplotlib import pyplot
sentences = [
   ['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
	['this', 'is', 'the', 'tutorials' 'point', 'website'],
	['you', 'can', 'read', 'technical','tutorials', 'for','free'],
	['we', 'are', 'implementing','word2vec'],
	['learn', 'full', 'gensim', 'tutorial']
]
model = Word2Vec(sentences, min_count=1)
X = model[model.wv.vocab]
pca = PCA(n_components=2)
result = pca.fit_transform(X)
pyplot.scatter(result[:, 0], result[:, 1])
words = list(model.wv.vocab)
for i, word in enumerate(words):
   pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))
pyplot.show()

Đầu ra

Mô hình Doc2Vec, ngược lại với mô hình Word2Vec, được sử dụng để tạo biểu diễn vecto của một nhóm các từ được gọi chung là một đơn vị. Nó không chỉ đưa ra giá trị trung bình đơn giản của các từ trong câu.

Tạo vectơ tài liệu bằng Doc2Vec

Ở đây để tạo vectơ tài liệu bằng Doc2Vec, chúng tôi sẽ sử dụng tập dữ liệu text8 có thể tải xuống từ gensim.downloader.

Tải xuống tập dữ liệu

Chúng ta có thể tải xuống tập dữ liệu text8 bằng cách sử dụng các lệnh sau:

import gensim
import gensim.downloader as api
dataset = api.load("text8")
data = [d for d in dataset]

Sẽ mất một chút thời gian để tải xuống tập dữ liệu text8.

Đào tạo Doc2Vec

Để đào tạo mô hình, chúng tôi cần tài liệu được gắn thẻ có thể được tạo bằng cách sử dụng models.doc2vec.TaggedDcument() như sau -

def tagged_document(list_of_list_of_words):
   for i, list_of_words in enumerate(list_of_list_of_words):
      yield gensim.models.doc2vec.TaggedDocument(list_of_words, [i])
data_for_training = list(tagged_document(data))

Chúng tôi có thể in tập dữ liệu được đào tạo như sau:

print(data_for_training [:1])

Đầu ra

[TaggedDocument(words=['anarchism', 'originated', 'as', 'a', 'term', 'of',
'abuse', 'first', 'used', 'against', 'early', 'working', 'class', 'radicals',
'including', 'the', 'diggers', 'of', 'the', 'english', 'revolution', 
'and', 'the', 'sans', 'culottes', 'of', 'the', 'french', 'revolution',
'whilst', 'the', 'term', 'is', 'still', 'used', 'in', 'a', 'pejorative',
'way', 'to', 'describe', 'any', 'act', 'that', 'used', 'violent', 
'means', 'to', 'destroy',
'the', 'organization', 'of', 'society', 'it', 'has', 'also', 'been'
, 'taken', 'up', 'as', 'a', 'positive', 'label', 'by', 'self', 'defined',
'anarchists', 'the', 'word', 'anarchism', 'is', 'derived', 'from', 'the',
'greek', 'without', 'archons', 'ruler', 'chief', 'king', 'anarchism', 
'as', 'a', 'political', 'philosophy', 'is', 'the', 'belief', 'that', 
'rulers', 'are', 'unnecessary', 'and', 'should', 'be', 'abolished',
'although', 'there', 'are', 'differing', 'interpretations', 'of', 
'what', 'this', 'means', 'anarchism', 'also', 'refers', 'to', 
'related', 'social', 'movements', 'that', 'advocate', 'the', 
'elimination', 'of', 'authoritarian', 'institutions', 'particularly',
'the', 'state', 'the', 'word', 'anarchy', 'as', 'most', 'anarchists', 
'use', 'it', 'does', 'not', 'imply', 'chaos', 'nihilism', 'or', 'anomie',
'but', 'rather', 'a', 'harmonious', 'anti', 'authoritarian', 'society', 
'in', 'place', 'of', 'what', 'are', 'regarded', 'as', 'authoritarian',
'political', 'structures', 'and', 'coercive', 'economic', 'institutions', 
'anarchists', 'advocate', 'social', 'relations', 'based', 'upon', 'voluntary',
'association', 'of', 'autonomous', 'individuals', 'mutual', 'aid', 'and', 
'self', 'governance', 'while', 'anarchism', 'is', 'most', 'easily', 'defined',
'by', 'what', 'it', 'is', 'against', 'anarchists', 'also', 'offer', 
'positive', 'visions', 'of', 'what', 'they', 'believe', 'to', 'be', 'a',
'truly', 'free', 'society', 'however', 'ideas', 'about', 'how', 'an', 'anarchist',
'society', 'might', 'work', 'vary', 'considerably', 'especially', 'with',
'respect', 'to', 'economics', 'there', 'is', 'also', 'disagreement', 'about', 
'how', 'a', 'free', 'society', 'might', 'be', 'brought', 'about', 'origins', 
'and', 'predecessors', 'kropotkin', 'and', 'others', 'argue', 'that', 'before',
'recorded', 'history', 'human', 'society', 'was', 'organized', 'on', 'anarchist', 
'principles', 'most', 'anthropologists', 'follow', 'kropotkin', 'and', 'engels', 
'in', 'believing', 'that', 'hunter', 'gatherer', 'bands', 'were', 'egalitarian',
'and', 'lacked', 'division', 'of', 'labour', 'accumulated', 'wealth', 'or', 'decreed',
'law', 'and', 'had', 'equal', 'access', 'to', 'resources', 'william', 'godwin', 
'anarchists', 'including', 'the', 'the', 'anarchy', 'organisation', 'and', 'rothbard',
'find', 'anarchist', 'attitudes', 'in', 'taoism', 'from', 'ancient', 'china', 
'kropotkin', 'found', 'similar', 'ideas', 'in', 'stoic', 'zeno', 'of', 'citium', 
'according', 'to', 'kropotkin', 'zeno', 'repudiated', 'the', 'omnipotence', 'of',
'the', 'state', 'its', 'intervention', 'and', 'regimentation', 'and', 'proclaimed',
'the', 'sovereignty', 'of', 'the', 'moral', 'law', 'of', 'the', 'individual', 'the',
'anabaptists', 'of', 'one', 'six', 'th', 'century', 'europe', 'are', 'sometimes',
'considered', 'to', 'be', 'religious', 'forerunners', 'of', 'modern', 'anarchism',
'bertrand', 'russell', 'in', 'his', 'history', 'of', 'western', 'philosophy', 
'writes', 'that', 'the', 'anabaptists', 'repudiated', 'all', 'law', 'since', 
'they', 'held', 'that', 'the', 'good', 'man', 'will', 'be', 'guided', 'at', 
'every', 'moment', 'by', 'the', 'holy', 'spirit', 'from', 'this', 'premise',
'they', 'arrive', 'at', 'communism', 'the', 'diggers', 'or', 'true', 'levellers', 
'were', 'an', 'early', 'communistic', 'movement',
(truncated…)

Khởi tạo mô hình

Sau khi được đào tạo, bây giờ chúng ta cần khởi tạo mô hình. nó có thể được thực hiện như sau:

model = gensim.models.doc2vec.Doc2Vec(vector_size=40, min_count=2, epochs=30)

Bây giờ, xây dựng từ vựng như sau:

model.build_vocab(data_for_training)

Bây giờ, hãy đào tạo mô hình Doc2Vec như sau:

model.train(data_for_training, total_examples=model.corpus_count, epochs=model.epochs)

Phân tích đầu ra

Cuối cùng, chúng ta có thể phân tích kết quả đầu ra bằng cách sử dụng model.infer_vector () như sau:

print(model.infer_vector(['violent', 'means', 'to', 'destroy', 'the','organization']))

Hoàn thành ví dụ triển khai

import gensim
import gensim.downloader as api
dataset = api.load("text8")
data = [d for d in dataset]
def tagged_document(list_of_list_of_words):
   for i, list_of_words in enumerate(list_of_list_of_words):
      yield gensim.models.doc2vec.TaggedDocument(list_of_words, [i])
data_for_training = list(tagged_document(data))
print(data_for_training[:1])
model = gensim.models.doc2vec.Doc2Vec(vector_size=40, min_count=2, epochs=30)
model.build_vocab(data_training)
model.train(data_training, total_examples=model.corpus_count, epochs=model.epochs)
print(model.infer_vector(['violent', 'means', 'to', 'destroy', 'the','organization']))

Đầu ra

[
   -0.2556166 0.4829361 0.17081228 0.10879577 0.12525807 0.10077011
   -0.21383236 0.19294572 0.11864349 -0.03227958 -0.02207291 -0.7108424
   0.07165232 0.24221905 -0.2924459 -0.03543589 0.21840079 -0.1274817
   0.05455418 -0.28968817 -0.29146606 0.32885507 0.14689675 -0.06913587
   -0.35173815 0.09340707 -0.3803535 -0.04030455 -0.10004586 0.22192696
   0.2384828 -0.29779273 0.19236489 -0.25727913 0.09140676 0.01265439
   0.08077634 -0.06902497 -0.07175519 -0.22583418 -0.21653089 0.00347822
   -0.34096122 -0.06176808 0.22885063 -0.37295452 -0.08222228 -0.03148199
   -0.06487323 0.11387568
]