AI với Python - Gói NLTK

Trong chương này, chúng ta sẽ học cách bắt đầu với Gói bộ công cụ ngôn ngữ tự nhiên.

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

Nếu chúng ta muốn xây dựng các ứng dụng với xử lý Ngôn ngữ Tự nhiên thì việc thay đổi ngữ cảnh sẽ gây khó khăn nhất. Yếu tố ngữ cảnh ảnh hưởng đến cách máy hiểu một câu cụ thể. Do đó, chúng ta cần phát triển các ứng dụng Ngôn ngữ tự nhiên bằng cách sử dụng các phương pháp tiếp cận máy học để máy móc cũng có thể hiểu cách con người có thể hiểu ngữ cảnh.

Để xây dựng các ứng dụng như vậy, chúng tôi sẽ sử dụng gói Python có tên NLTK (Natural Language Toolkit Package).

Nhập NLTK

Chúng ta cần cài đặt NLTK trước khi sử dụng nó. Nó có thể được cài đặt với sự trợ giúp của lệnh sau:

pip install nltk

Để tạo một gói chung cư cho NLTK, hãy sử dụng lệnh sau:

conda install -c anaconda nltk

Bây giờ sau khi cài đặt gói NLTK, chúng ta cần nhập nó qua dấu nhắc lệnh python. Chúng ta có thể nhập nó bằng cách viết lệnh sau trên dấu nhắc lệnh Python:

>>> import nltk

Tải xuống dữ liệu của NLTK

Bây giờ sau khi nhập NLTK, chúng ta cần tải xuống dữ liệu cần thiết. Nó có thể được thực hiện với sự trợ giúp của lệnh sau trên dấu nhắc lệnh Python:

>>> nltk.download()

Cài đặt các gói cần thiết khác

Để xây dựng các ứng dụng xử lý ngôn ngữ tự nhiên bằng NLTK, chúng ta cần cài đặt các gói cần thiết. Các gói như sau:

gensim

Nó là một thư viện mô hình ngữ nghĩa mạnh mẽ hữu ích cho nhiều ứng dụng. Chúng ta có thể cài đặt nó bằng cách thực hiện lệnh sau:

pip install gensim

mẫu

Nó được sử dụng để làm gensimgói hoạt động đúng cách. Chúng ta có thể cài đặt nó bằng cách thực hiện lệnh sau

pip install pattern

Khái niệm Tokenization, Stemming và Lemmatization

Trong phần này, chúng ta sẽ hiểu thế nào là mã hóa, tạo gốc và bổ sung.

Mã hóa

Nó có thể được định nghĩa là quá trình phá vỡ văn bản đã cho tức là chuỗi ký tự thành các đơn vị nhỏ hơn được gọi là mã thông báo. Các mã có thể là các từ, số hoặc dấu chấm câu. Nó còn được gọi là phân đoạn từ. Sau đây là một ví dụ đơn giản về mã hóa -

Input - Xoài, chuối, dứa và táo đều là hoa quả.

Output -

Quá trình phá vỡ văn bản đã cho có thể được thực hiện với sự trợ giúp của việc xác định các ranh giới từ. Sự kết thúc của một từ và sự bắt đầu của một từ mới được gọi là ranh giới từ. Hệ thống chữ viết và cấu trúc kiểu chữ của các từ ảnh hưởng đến ranh giới.

Trong mô-đun Python NLTK, chúng tôi có các gói khác nhau liên quan đến mã hóa mà chúng tôi có thể sử dụng để chia văn bản thành các mã thông báo theo yêu cầu của chúng tôi. Một số gói như sau:

gói sent_tokenize

Như tên gợi ý, gói này sẽ chia văn bản đầu vào thành các câu. Chúng tôi có thể nhập gói này với sự trợ giúp của mã Python sau:

from nltk.tokenize import sent_tokenize

gói word_tokenize

Gói này chia văn bản đầu vào thành các từ. Chúng tôi có thể nhập gói này với sự trợ giúp của mã Python sau:

from nltk.tokenize import word_tokenize

Gói WordPunctTokenizer

Gói này chia văn bản đầu vào thành các từ cũng như các dấu câu. Chúng tôi có thể nhập gói này với sự trợ giúp của mã Python sau:

from nltk.tokenize import WordPuncttokenizer

Gốc

Trong khi làm việc với các từ, chúng ta bắt gặp rất nhiều biến thể do lý do ngữ pháp. Khái niệm về các biến thể ở đây có nghĩa là chúng ta phải xử lý các dạng khác nhau của cùng một từ nhưdemocracy, democratic,democratization. Nó rất cần thiết để máy móc hiểu rằng những từ khác nhau này có cùng một dạng cơ sở. Bằng cách này, sẽ rất hữu ích khi trích xuất các dạng cơ bản của các từ trong khi chúng ta phân tích văn bản.

Chúng ta có thể đạt được điều này bằng cách xuất phát. Theo cách này, chúng ta có thể nói rằng tạo gốc là quá trình tự suy nghĩ để rút ra các dạng cơ sở của từ bằng cách cắt bỏ các phần cuối của từ.

Trong mô-đun Python NLTK, chúng tôi có các gói khác nhau liên quan đến việc tạo gốc. Các gói này có thể được sử dụng để lấy các dạng cơ bản của từ. Các gói này sử dụng các thuật toán. Một số gói như sau:

Gói PorterStemmer

Gói Python này sử dụng thuật toán Porter để trích xuất biểu mẫu cơ sở. Chúng tôi có thể nhập gói này với sự trợ giúp của mã Python sau:

from nltk.stem.porter import PorterStemmer

Ví dụ, nếu chúng ta sẽ đưa ra từ ‘writing’ là đầu vào cho trình gốc này, chúng tôi sẽ nhận được từ ‘write’ sau khi chiết cành.

Gói LancasterStemmer

Gói Python này sẽ sử dụng thuật toán Lancaster để trích xuất biểu mẫu cơ sở. Chúng tôi có thể nhập gói này với sự trợ giúp của mã Python sau:

from nltk.stem.lancaster import LancasterStemmer

Ví dụ, nếu chúng ta sẽ đưa ra từ ‘writing’ là đầu vào cho trình gốc này, chúng tôi sẽ nhận được từ ‘write’ sau khi chiết cành.

Gói SnowballStemmer

Gói Python này sẽ sử dụng thuật toán của quả cầu tuyết để trích xuất dạng cơ sở. Chúng tôi có thể nhập gói này với sự trợ giúp của mã Python sau:

from nltk.stem.snowball import SnowballStemmer

Ví dụ, nếu chúng ta sẽ đưa ra từ ‘writing’ là đầu vào cho trình gốc này, chúng tôi sẽ nhận được từ ‘write’ sau khi chiết cành.

Tất cả các thuật toán này có mức độ nghiêm ngặt khác nhau. Nếu chúng ta so sánh ba loại máy cắt gốc này thì máy cắt gốc Porter là ít nghiêm ngặt nhất và Lancaster là nghiêm ngặt nhất. Snowball stemmer sử dụng tốt về tốc độ cũng như độ chặt chẽ.

Bổ sung

Chúng tôi cũng có thể trích xuất dạng cơ sở của từ bằng cách bổ sung. Về cơ bản, nó thực hiện nhiệm vụ này với việc sử dụng phân tích từ vựng và hình thái của các từ, thông thường chỉ nhằm mục đích loại bỏ các kết thúc không theo chiều hướng. Dạng cơ sở này của bất kỳ từ nào được gọi là bổ đề.

Sự khác biệt chính giữa cách đặt gốc và bổ ngữ là việc sử dụng từ vựng và phân tích hình thái của các từ. Một điểm khác biệt nữa là việc bổ đề thường thu gọn các từ liên quan đến đạo hàm trong khi bổ đề thường chỉ thu gọn các dạng vô hướng khác nhau của một bổ đề. Ví dụ: nếu chúng ta cung cấp từ saw làm từ đầu vào thì việc đặt gốc có thể trả về từ 's' nhưng việc bổ sung sẽ cố gắng trả lại từ see hoặc saw tùy thuộc vào việc sử dụng mã thông báo là động từ hay danh từ.

Trong mô-đun Python NLTK, chúng tôi có gói sau liên quan đến quá trình lemmatization mà chúng tôi có thể sử dụng để lấy các dạng cơ bản của từ:

Gói WordNetLemmatizer

Gói Python này sẽ trích xuất dạng cơ sở của từ tùy thuộc vào việc nó được sử dụng như một danh từ hay một động từ. Chúng tôi có thể nhập gói này với sự trợ giúp của mã Python sau:

from nltk.stem import WordNetLemmatizer

Chunking: Chia dữ liệu thành các Chunks

Nó là một trong những quá trình quan trọng trong xử lý ngôn ngữ tự nhiên. Công việc chính của phân khúc là xác định các phần của lời nói và các cụm từ ngắn như cụm danh từ. Chúng tôi đã nghiên cứu quá trình mã hóa, việc tạo ra mã thông báo. Chunking về cơ bản là ghi nhãn của những token đó. Nói cách khác, phân khúc sẽ cho chúng ta thấy cấu trúc của câu.

Trong phần sau, chúng ta sẽ tìm hiểu về các loại Chunking.

Các loại chunking

Có hai loại chunking. Các loại như sau:

Chunking lên

Trong quá trình phân chia này, đối tượng, sự vật, v.v ... sẽ trở nên tổng quát hơn và ngôn ngữ trở nên trừu tượng hơn. Có nhiều cơ hội thỏa thuận hơn. Trong quá trình này, chúng tôi thu nhỏ. Ví dụ, nếu chúng ta đặt câu hỏi “ô tô dùng cho mục đích gì”? Chúng tôi có thể nhận được câu trả lời là "vận chuyển".

Chunking xuống

Trong quá trình phân loại này, đối tượng, sự vật, v.v ... sẽ trở nên cụ thể hơn và ngôn ngữ được thâm nhập nhiều hơn. Cấu trúc sâu hơn sẽ được xem xét khi phân tích. Trong quá trình này, chúng tôi phóng to. Ví dụ: nếu chúng tôi rút ngắn câu hỏi "Hãy kể cụ thể về một chiếc ô tô"? Chúng tôi sẽ nhận được những thông tin nhỏ hơn về chiếc xe.

Example

Trong ví dụ này, chúng ta sẽ thực hiện phân đoạn Danh từ-Cụm từ, một loại phân đoạn sẽ tìm các cụm danh từ trong câu, bằng cách sử dụng mô-đun NLTK trong Python -

Follow these steps in python for implementing noun phrase chunking −

Step 1- Ở bước này, chúng ta cần xác định ngữ pháp cho chunking. Nó sẽ bao gồm các quy tắc mà chúng ta cần tuân theo.

Step 2- Ở bước này, chúng ta cần tạo một trình phân tích cú pháp chunk. Nó sẽ phân tích ngữ pháp và đưa ra kết quả.

Step 3 - Trong bước cuối cùng này, đầu ra được tạo ra ở dạng cây.

Hãy để chúng tôi nhập gói NLTK cần thiết như sau:

import nltk

Bây giờ, chúng ta cần xác định câu. Ở đây, DT nghĩa là định thức, VBP nghĩa là động từ, JJ nghĩa là tính từ, IN nghĩa là giới từ và NN nghĩa là danh từ.

sentence=[("a","DT"),("clever","JJ"),("fox","NN"),("was","VBP"),
          ("jumping","VBP"),("over","IN"),("the","DT"),("wall","NN")]

Bây giờ, chúng ta cần đưa ra ngữ pháp. Ở đây, chúng tôi sẽ đưa ra ngữ pháp ở dạng biểu thức chính quy.

grammar = "NP:{<DT>?<JJ>*<NN>}"

Chúng ta cần xác định một trình phân tích cú pháp sẽ phân tích ngữ pháp.

parser_chunking = nltk.RegexpParser(grammar)

Trình phân tích cú pháp phân tích câu như sau:

parser_chunking.parse(sentence)

Tiếp theo, chúng ta cần lấy đầu ra. Đầu ra được tạo trong biến đơn giản được gọi làoutput_chunk.

Output_chunk = parser_chunking.parse(sentence)

Khi thực thi đoạn mã sau, chúng ta có thể vẽ đầu ra của mình ở dạng cây.

output.draw()

Mô hình Bag of Word (BoW)

Bag of Word (BoW), một mô hình trong xử lý ngôn ngữ tự nhiên, về cơ bản được sử dụng để trích xuất các tính năng từ văn bản để văn bản có thể được sử dụng trong mô hình hóa như trong các thuật toán học máy.

Bây giờ câu hỏi đặt ra là tại sao chúng ta cần trích xuất các tính năng từ văn bản. Đó là bởi vì các thuật toán học máy không thể hoạt động với dữ liệu thô và chúng cần dữ liệu số để có thể trích xuất thông tin có ý nghĩa từ đó. Việc chuyển đổi dữ liệu văn bản thành dữ liệu số được gọi là trích xuất đối tượng hoặc mã hóa đối tượng.

Làm thế nào nó hoạt động

Đây là cách tiếp cận rất đơn giản để trích xuất các tính năng từ văn bản. Giả sử chúng ta có một tài liệu văn bản và chúng ta muốn chuyển nó thành dữ liệu số hoặc nói muốn trích xuất các tính năng của nó thì trước hết mô hình này trích xuất một từ vựng từ tất cả các từ trong tài liệu. Sau đó, bằng cách sử dụng ma trận thuật ngữ tài liệu, nó sẽ xây dựng một mô hình. Theo cách này, BoW chỉ đại diện cho tài liệu như một túi từ. Mọi thông tin về thứ tự hoặc cấu trúc của các từ trong tài liệu sẽ bị loại bỏ.

Khái niệm về ma trận thuật ngữ tài liệu

Thuật toán BoW xây dựng mô hình bằng cách sử dụng ma trận thuật ngữ tài liệu. Như tên cho thấy, ma trận thuật ngữ tài liệu là ma trận của các số lượng từ khác nhau xuất hiện trong tài liệu. Với sự trợ giúp của ma trận này, tài liệu văn bản có thể được biểu diễn dưới dạng sự kết hợp có trọng số của các từ khác nhau. Bằng cách đặt ngưỡng và chọn các từ có nghĩa hơn, chúng tôi có thể xây dựng biểu đồ của tất cả các từ trong tài liệu có thể được sử dụng làm vectơ đặc trưng. Sau đây là một ví dụ để hiểu khái niệm về ma trận thuật ngữ tài liệu:

Example

Giả sử chúng ta có hai câu sau:

  • Sentence 1 - Chúng tôi đang sử dụng mô hình Bag of Words.

  • Sentence 2 - Mô hình Bag of Words được sử dụng để trích xuất các tính năng.

Bây giờ, bằng cách xem xét hai câu này, chúng ta có 13 từ khác biệt sau:

  • we
  • are
  • using
  • the
  • bag
  • of
  • words
  • model
  • is
  • used
  • for
  • extracting
  • features

Bây giờ, chúng ta cần xây dựng biểu đồ cho mỗi câu bằng cách sử dụng số từ trong mỗi câu -

  • Sentence 1 - [1,1,1,1,1,1,1,1,0,0,0,0,0]

  • Sentence 2 - [0,0,0,1,1,1,1,1,1,1,1,1,1]

Bằng cách này, chúng tôi có các vectơ đặc trưng đã được trích xuất. Mỗi vectơ đặc trưng là 13 chiều vì chúng ta có 13 từ riêng biệt.

Khái niệm về thống kê

Khái niệm về số liệu thống kê được gọi là Tần suất tài liệu nghịch đảo-Thuật ngữ (tf-idf). Mỗi từ đều quan trọng trong tài liệu. Các số liệu thống kê giúp chúng tôi hiểu tầm quan trọng của mỗi từ.

Tần suất kỳ hạn (tf)

Nó là thước đo tần suất mỗi từ xuất hiện trong tài liệu. Nó có thể nhận được bằng cách chia số lượng của mỗi từ cho tổng số từ trong một tài liệu nhất định.

Tần suất tài liệu nghịch đảo (idf)

Nó là thước đo mức độ duy nhất của một từ đối với tài liệu này trong bộ tài liệu nhất định. Để tính toán idf và xây dựng một vectơ đặc trưng riêng biệt, chúng ta cần giảm trọng số của các từ thường xuất hiện như và và tăng trọng số của các từ hiếm.

Xây dựng Mô hình Túi từ trong NLTK

Trong phần này, chúng ta sẽ xác định một tập hợp các chuỗi bằng cách sử dụng CountVectorizer để tạo vectơ từ các câu này.

Hãy để chúng tôi nhập gói cần thiết -

from sklearn.feature_extraction.text import CountVectorizer

Bây giờ hãy xác định tập hợp các câu.

Sentences = ['We are using the Bag of Word model', 'Bag of Word model is
           used for extracting the features.']

vectorizer_count = CountVectorizer()

features_text = vectorizer.fit_transform(Sentences).todense()

print(vectorizer.vocabulary_)

Chương trình trên tạo ra kết quả như hình dưới đây. Nó cho thấy rằng chúng ta có 13 từ khác biệt trong hai câu trên -

{'we': 11, 'are': 0, 'using': 10, 'the': 8, 'bag': 1, 'of': 7,
 'word': 12, 'model': 6, 'is': 5, 'used': 9, 'for': 4, 'extracting': 2, 'features': 3}

Đây là các vectơ đặc trưng (dạng văn bản thành số) có thể được sử dụng cho học máy.

Giải quyết những vấn đề

Trong phần này, chúng tôi sẽ giải quyết một vài vấn đề liên quan.

Dự đoán danh mục

Trong một bộ văn bản, không chỉ từ ngữ mà thể loại của từ ngữ cũng rất quan trọng; trong loại văn bản mà một từ cụ thể rơi vào. Ví dụ: chúng tôi muốn dự đoán liệu một câu đã cho có thuộc danh mục email, tin tức, thể thao, máy tính, v.v. Trong ví dụ sau, chúng tôi sẽ sử dụng tf-idf để tạo một vectơ đặc trưng để tìm danh mục tài liệu. Chúng tôi sẽ sử dụng dữ liệu từ 20 tập dữ liệu nhóm tin của sklearn.

Chúng tôi cần nhập các gói cần thiết -

from sklearn.datasets import fetch_20newsgroups
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer

Xác định bản đồ danh mục. Chúng tôi đang sử dụng năm danh mục khác nhau có tên là Tôn giáo, Ô tô, Thể thao, Điện tử và Không gian.

category_map = {'talk.religion.misc':'Religion','rec.autos''Autos',
   'rec.sport.hockey':'Hockey','sci.electronics':'Electronics', 'sci.space': 'Space'}

Tạo tập huấn luyện -

training_data = fetch_20newsgroups(subset = 'train',
   categories = category_map.keys(), shuffle = True, random_state = 5)

Xây dựng một vectơ đếm và trích xuất số lượng từ -

vectorizer_count = CountVectorizer()
train_tc = vectorizer_count.fit_transform(training_data.data)
print("\nDimensions of training data:", train_tc.shape)

Biến áp tf-idf được tạo như sau:

tfidf = TfidfTransformer()
train_tfidf = tfidf.fit_transform(train_tc)

Bây giờ, xác định dữ liệu thử nghiệm -

input_data = [
   'Discovery was a space shuttle',
   'Hindu, Christian, Sikh all are religions',
   'We must have to drive safely',
   'Puck is a disk made of rubber',
   'Television, Microwave, Refrigrated all uses electricity'
]

Dữ liệu trên sẽ giúp chúng tôi đào tạo bộ phân loại Naive Bayes đa thức -

classifier = MultinomialNB().fit(train_tfidf, training_data.target)

Biến đổi dữ liệu đầu vào bằng cách sử dụng vector đếm -

input_tc = vectorizer_count.transform(input_data)

Bây giờ, chúng ta sẽ chuyển đổi dữ liệu được vector hóa bằng cách sử dụng biến áp tfidf -

input_tfidf = tfidf.transform(input_tc)

Chúng tôi sẽ dự đoán các loại đầu ra -

predictions = classifier.predict(input_tfidf)

Đầu ra được tạo như sau:

for sent, category in zip(input_data, predictions):
   print('\nInput Data:', sent, '\n Category:', \
      category_map[training_data.target_names[category]])

Công cụ dự đoán danh mục tạo ra kết quả sau:

Dimensions of training data: (2755, 39297)

Input Data: Discovery was a space shuttle
Category: Space

Input Data: Hindu, Christian, Sikh all are religions
Category: Religion

Input Data: We must have to drive safely
Category: Autos

Input Data: Puck is a disk made of rubber
Category: Hockey

Input Data: Television, Microwave, Refrigrated all uses electricity
Category: Electronics

Tìm giới tính

Trong câu lệnh bài toán này, một bộ phân loại sẽ được đào tạo để tìm giới tính (nam hoặc nữ) bằng cách cung cấp tên. Chúng ta cần sử dụng heuristic để xây dựng một vector đặc trưng và đào tạo bộ phân loại. Chúng tôi sẽ sử dụng dữ liệu được gắn nhãn từ gói scikit-learning. Sau đây là mã Python để xây dựng công cụ tìm giới tính:

Hãy để chúng tôi nhập các gói cần thiết -

import random

from nltk import NaiveBayesClassifier
from nltk.classify import accuracy as nltk_accuracy
from nltk.corpus import names

Bây giờ chúng ta cần trích xuất N ký tự cuối cùng từ đầu vào. Các chữ cái này sẽ hoạt động như các tính năng -

def extract_features(word, N = 2):
   last_n_letters = word[-N:]
   return {'feature': last_n_letters.lower()}
	
if __name__=='__main__':

Tạo dữ liệu đào tạo bằng cách sử dụng các tên được gắn nhãn (nam cũng như nữ) có sẵn trong NLTK -

male_list = [(name, 'male') for name in names.words('male.txt')]
female_list = [(name, 'female') for name in names.words('female.txt')]
data = (male_list + female_list)

random.seed(5)
random.shuffle(data)

Bây giờ, dữ liệu thử nghiệm sẽ được tạo như sau:

namesInput = ['Rajesh', 'Gaurav', 'Swati', 'Shubha']

Xác định số lượng mẫu được sử dụng để huấn luyện và thử nghiệm với mã sau

train_sample = int(0.8 * len(data))

Bây giờ, chúng ta cần lặp qua các độ dài khác nhau để có thể so sánh độ chính xác -

for i in range(1, 6):
   print('\nNumber of end letters:', i)
   features = [(extract_features(n, i), gender) for (n, gender) in data]
   train_data, test_data = features[:train_sample],
features[train_sample:]
   classifier = NaiveBayesClassifier.train(train_data)

Độ chính xác của bộ phân loại có thể được tính như sau:

accuracy_classifier = round(100 * nltk_accuracy(classifier, test_data), 2)
   print('Accuracy = ' + str(accuracy_classifier) + '%')

Bây giờ, chúng ta có thể dự đoán đầu ra -

for name in namesInput:
   print(name, '==>', classifier.classify(extract_features(name, i)))

Chương trình trên sẽ tạo ra kết quả sau:

Number of end letters: 1
Accuracy = 74.7%
Rajesh -> female
Gaurav -> male
Swati -> female
Shubha -> female

Number of end letters: 2
Accuracy = 78.79%
Rajesh -> male
Gaurav -> male
Swati -> female
Shubha -> female

Number of end letters: 3
Accuracy = 77.22%
Rajesh -> male
Gaurav -> female
Swati -> female
Shubha -> female

Number of end letters: 4
Accuracy = 69.98%
Rajesh -> female
Gaurav -> female
Swati -> female
Shubha -> female

Number of end letters: 5
Accuracy = 64.63%
Rajesh -> female
Gaurav -> female
Swati -> female
Shubha -> female

Trong đầu ra ở trên, chúng ta có thể thấy rằng độ chính xác về số lượng chữ cái cuối tối đa là hai và nó đang giảm khi số lượng chữ cái cuối ngày càng tăng.

Mô hình chủ đề: Xác định các mẫu trong dữ liệu văn bản

Chúng tôi biết rằng thông thường các tài liệu được nhóm thành các chủ đề. Đôi khi chúng ta cần xác định các mẫu trong văn bản tương ứng với một chủ đề cụ thể. Kỹ thuật thực hiện điều này được gọi là mô hình hóa chủ đề. Nói cách khác, chúng ta có thể nói rằng mô hình hóa chủ đề là một kỹ thuật để khám phá các chủ đề trừu tượng hoặc cấu trúc ẩn trong một bộ tài liệu nhất định.

Chúng ta có thể sử dụng kỹ thuật mô hình hóa chủ đề trong các tình huống sau:

Phân loại văn bản

Với sự trợ giúp của mô hình chủ đề, việc phân loại có thể được cải thiện vì nó nhóm các từ tương tự lại với nhau thay vì sử dụng từng từ riêng biệt làm đặc điểm.

Hệ thống đề xuất

Với sự trợ giúp của mô hình chủ đề, chúng tôi có thể xây dựng hệ thống khuyến nghị bằng cách sử dụng các biện pháp tương tự.

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

Mô hình chủ đề có thể được thực hiện bằng cách sử dụng các thuật toán. Các thuật toán như sau:

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

Thuật toán này là phổ biến nhất cho mô hình chủ đề. Nó sử dụng các mô hình đồ họa xác suất để thực hiện mô hình hóa chủ đề. Chúng ta cần nhập gói gensim bằng Python để sử dụng thuật toán LDA.

Phân tích ngữ nghĩa tiềm ẩn (LDA) hoặc Lập chỉ mục ngữ nghĩa tiềm ẩn (LSI)

Thuật toán này dựa trên Đại số tuyến tính. Về cơ bản, nó sử dụng khái niệm SVD (Phân hủy Giá trị Số ít) trên ma trận thuật ngữ tài liệu.

Hệ số hóa ma trận không âm (NMF)

Nó cũng dựa trên Đại số tuyến tính.

Tất cả các thuật toán được đề cập ở trên cho mô hình chủ đề sẽ có number of topics như một tham số, Document-Word Matrix như một đầu vào và WTM (Word Topic Matrix) & TDM (Topic Document Matrix) dưới dạng đầu ra.