Chuyển đến nội dung chính

Phân tích ngữ nghĩa tiềm ẩn bằng Python

Trong hướng dẫn này, bạn sẽ học cách khám phá các chủ đề ẩn trong tài liệu cho trước bằng Phân tích ngữ nghĩa tiềm ẩn trong Python.
Đã cập nhật 5 thg 10, 2026  · 11 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Khám phá chủ đề mang lại lợi ích cho nhiều mục đích như gom cụm tài liệu, tổ chức nội dung trực tuyến để truy xuất thông tin và gợi ý. Nhiều nhà cung cấp nội dung và hãng tin đang sử dụng mô hình chủ đề để giới thiệu bài viết cho độc giả. Tương tự, các công ty tuyển dụng sử dụng để trích xuất mô tả công việc và ánh xạ chúng với bộ kỹ năng của ứng viên. Nếu bạn nhìn vào công việc của nhà khoa học dữ liệu, cốt lõi là trích xuất “tri thức” từ lượng dữ liệu thu thập khổng lồ. Thông thường, dữ liệu thu thập là phi cấu trúc. Bạn cần các công cụ và kỹ thuật mạnh mẽ để phân tích và hiểu một lượng lớn dữ liệu phi cấu trúc.

Mô hình chủ đề là một kỹ thuật khai phá văn bản cung cấp các phương pháp xác định các từ khóa đồng xuất hiện để tóm tắt những tập hợp thông tin văn bản lớn. Nó giúp khám phá các chủ đề ẩn trong tài liệu, gán nhãn tài liệu bằng những chủ đề này và tổ chức một lượng lớn dữ liệu phi cấu trúc.

Mô hình chủ đề

Mô hình chủ đề tự động khám phá các chủ đề ẩn từ các tài liệu cho trước. Đây là một thuật toán phân tích văn bản không giám sát, dùng để tìm nhóm từ trong tài liệu. Những nhóm từ này đại diện cho một chủ đề. Có khả năng một tài liệu đơn lẻ có thể gắn với nhiều chủ đề. Ví dụ, một nhóm từ như 'patient', 'doctor', 'disease', 'cancer' và 'health' sẽ đại diện cho chủ đề 'chăm sóc sức khỏe'. Mô hình chủ đề là một “trò chơi” khác so với tìm kiếm văn bản dựa trên quy tắc sử dụng biểu thức chính quy.

diagram

So sánh phân loại văn bản và mô hình chủ đề

Phân loại văn bản là một bài toán học máy có giám sát, trong đó một tài liệu hay bài viết được phân loại vào một tập lớp xác định trước. Mô hình chủ đề là quá trình khám phá các nhóm từ đồng xuất hiện trong tài liệu văn bản. Những nhóm từ đồng xuất hiện có liên quan này tạo thành “chủ đề”. Đây là một dạng học không giám sát, vì vậy tập chủ đề có thể có là không biết trước. Mô hình chủ đề có thể dùng để giải quyết bài toán phân loại văn bản. Mô hình chủ đề sẽ xác định “các chủ đề xuất hiện trong một tài liệu” trong khi phân loại văn bản đưa văn bản vào một lớp duy nhất.

diagram

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

LSA (Latent Semantic Analysis), còn gọi là LSI (Latent Semantic Index), sử dụng mô hình túi từ (BoW), tạo ra ma trận thuật ngữ–tài liệu (số lần xuất hiện của thuật ngữ trong tài liệu). Hàng biểu diễn thuật ngữ còn cột biểu diễn tài liệu. LSA học các chủ đề tiềm ẩn bằng cách phân rã ma trận thuật ngữ–tài liệu bằng phép phân rã giá trị riêng (SVD). LSA thường được dùng như một kỹ thuật giảm chiều hoặc giảm nhiễu.

Latent Semantic Analysis

Phân rã giá trị riêng (SVD)

SVD là một phương pháp phân tích nhân tử ma trận, biểu diễn một ma trận dưới dạng tích của hai ma trận. Nó có nhiều ứng dụng hữu ích trong xử lý tín hiệu, tâm lý học, xã hội học, khoa học khí hậu và khí quyển, thống kê và thiên văn học.

factor
  • M là ma trận m×m
  • U là ma trận kỳ dị trái m×n
  • Σ là ma trận đường chéo n×n với các số thực không âm.
  • V là ma trận kỳ dị phải m×n
  • V* là ma trận n×m, là chuyển vị của V.

Ma trận đơn vị: Là ma trận vuông trong đó tất cả phần tử trên đường chéo chính bằng 1, và các phần tử khác bằng 0.

Ma trận đường chéo: Là ma trận mà các phần tử ngoài đường chéo chính đều bằng 0.

Ma trận suy biến: Một ma trận là suy biến nếu định thức của nó bằng 0 hoặc là ma trận vuông không có nghịch đảo.

Xác định số lượng chủ đề tối ưu

Cách tốt nhất để xác định k (số chủ đề) trong mô hình chủ đề là gì? Xác định số chủ đề tối ưu trong một kho văn bản cho trước là một nhiệm vụ thách thức. Ta có thể dùng các cách sau để xác định số chủ đề tối ưu:

  • Một cách là coi mỗi chủ đề như một cụm và đánh giá hiệu quả cụm bằng hệ số Silhouette.
  • Thước đo độ mạch lạc của chủ đề là một thước đo thực tế để xác định số chủ đề.

Độ mạch lạc chủ đề là thước đo được dùng rộng rãi để đánh giá mô hình chủ đề. Nó sử dụng các mô hình biến ẩn. Mỗi chủ đề sinh ra có một danh sách từ. Trong thước đo độ mạch lạc, bạn sẽ tính trung bình/trung vị điểm tương đồng cặp từ của các từ trong một chủ đề. Mô hình có điểm độ mạch lạc cao sẽ được coi là một mô hình chủ đề tốt.

Triển khai LSA bằng Gensim

Nhập các thư viện cần thiết

#import modules
import os.path
from gensim import corpora
from gensim.models import LsiModel
from nltk.tokenize import RegexpTokenizer
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
from gensim.models.coherencemodel import CoherenceModel
import matplotlib.pyplot as plt

Nạp dữ liệu

Trước tiên hãy tạo hàm nạp dữ liệu để đọc articles.csv. Bạn có thể tải dữ liệu tại đây.

def load_data(path,file_name):
    """
    Input  : path and file_name
    Purpose: loading text file
    Output : list of paragraphs/documents and
             title(initial 100 words considred as title of document)
    """
    documents_list = []
    titles=[]
    with open( os.path.join(path, file_name) ,"r") as fin:
        for line in fin.readlines():
            text = line.strip()
            documents_list.append(text)
    print("Total Number of Documents:",len(documents_list))
    titles.append( text[0:min(len(text),100)] )
    return documents_list,titles

Tiền xử lý dữ liệu

Sau hàm nạp dữ liệu, bạn cần tiền xử lý văn bản. Các bước sau được thực hiện để tiền xử lý văn bản:

  • Tách token cho các bài viết
  • Loại bỏ từ dừng
  • Thực hiện stemming cho văn bản bài viết
def preprocess_data(doc_set):
    """
    Input  : docuemnt list
    Purpose: preprocess text (tokenize, removing stopwords, and stemming)
    Output : preprocessed text
    """
    # initialize regex tokenizer
    tokenizer = RegexpTokenizer(r'\w+')
    # create English stop words list
    en_stop = set(stopwords.words('english'))
    # Create p_stemmer of class PorterStemmer
    p_stemmer = PorterStemmer()
    # list for tokenized documents in loop
    texts = []
    # loop through document list
    for i in doc_set:
        # clean and tokenize document string
        raw = i.lower()
        tokens = tokenizer.tokenize(raw)
        # remove stop words from tokens
        stopped_tokens = [i for i in tokens if not i in en_stop]
        # stem tokens
        stemmed_tokens = [p_stemmer.stem(i) for i in stopped_tokens]
        # add tokens to list
        texts.append(stemmed_tokens)
    return texts

Chuẩn bị corpus

Bước tiếp theo là chuẩn bị corpus. Ở đây, bạn cần tạo ma trận thuật ngữ–tài liệu và từ điển thuật ngữ.

def prepare_corpus(doc_clean):
    """
    Input  : clean document
    Purpose: create term dictionary of our courpus and Converting list of documents (corpus) into Document Term Matrix
    Output : term dictionary and Document Term Matrix
    """
    # Creating the term dictionary of our courpus, where every unique term is assigned an index. dictionary = corpora.Dictionary(doc_clean)
    dictionary = corpora.Dictionary(doc_clean)
    # Converting list of documents (corpus) into Document Term Matrix using dictionary prepared above.
    doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean]
    # generate LDA model
    return dictionary,doc_term_matrix

Tạo mô hình LSA bằng Gensim

Sau khi tạo corpus, bạn có thể tạo mô hình bằng LSA.

def create_gensim_lsa_model(doc_clean,number_of_topics,words):
    """
    Input  : clean document, number of topics and number of words associated with each topic
    Purpose: create LSA model using gensim
    Output : return LSA model
    """
    dictionary,doc_term_matrix=prepare_corpus(doc_clean)
    # generate LSA model
    lsamodel = LsiModel(doc_term_matrix, num_topics=number_of_topics, id2word = dictionary)  # train model
    print(lsamodel.print_topics(num_topics=number_of_topics, num_words=words))
    return lsamodel

Xác định số chủ đề

Cần thực hiện thêm một bước để tối ưu kết quả bằng cách xác định số chủ đề tối ưu. Ở đây, bạn sẽ tạo điểm độ mạch lạc để xác định số chủ đề tối ưu.

def compute_coherence_values(dictionary, doc_term_matrix, doc_clean, stop, start=2, step=3):
    """
    Input   : dictionary : Gensim dictionary
              corpus : Gensim corpus
              texts : List of input texts
              stop : Max num of topics
    purpose : Compute c_v coherence for various number of topics
    Output  : model_list : List of LSA topic models
              coherence_values : Coherence values corresponding to the LDA model with respective number of topics
    """
    coherence_values = []
    model_list = []
    for num_topics in range(start, stop, step):
        # generate LSA model
        model = LsiModel(doc_term_matrix, num_topics=number_of_topics, id2word = dictionary)  # train model
        model_list.append(model)
        coherencemodel = CoherenceModel(model=model, texts=doc_clean, dictionary=dictionary, coherence='c_v')
        coherence_values.append(coherencemodel.get_coherence())
    return model_list, coherence_values

Hãy vẽ biểu đồ điểm độ mạch lạc.

def plot_graph(doc_clean,start, stop, step):
    dictionary,doc_term_matrix=prepare_corpus(doc_clean)
    model_list, coherence_values = compute_coherence_values(dictionary, doc_term_matrix,doc_clean,
                                                            stop, start, step)
    # Show graph
    x = range(start, stop, step)
    plt.plot(x, coherence_values)
    plt.xlabel("Number of Topics")
    plt.ylabel("Coherence score")
    plt.legend(("coherence_values"), loc='best')
    plt.show()

start,stop,step=2,12,1
plot_graph(clean_text,start,stop,step)
line graph

Bạn có thể dễ dàng đọc biểu đồ này. Trục X là số chủ đề và trục Y là điểm độ mạch lạc. Trong các số chủ đề, 7 có điểm độ mạch lạc cao nhất, vì vậy số chủ đề tối ưu là 7.

Chạy tất cả các hàm trên

# LSA Model
number_of_topics=7
words=10
document_list,titles=load_data("","articles.txt")
clean_text=preprocess_data(document_list)
model=create_gensim_lsa_model(clean_text,number_of_topics,words)
Total Number of Documents: 4551
[(0, '0.361*"trump" + 0.272*"say" + 0.233*"said" + 0.166*"would" + 0.160*"clinton" + 0.140*"peopl" + 0.136*"one" + 0.126*"campaign" + 0.123*"year" + 0.110*"time"'), (1, '-0.389*"citi" + -0.370*"v" + -0.356*"h" + -0.355*"2016" + -0.354*"2017" + -0.164*"unit" + -0.159*"west" + -0.157*"manchest" + -0.116*"apr" + -0.112*"dec"'), (2, '0.612*"trump" + 0.264*"clinton" + -0.261*"eu" + -0.148*"say" + -0.137*"would" + 0.135*"donald" + -0.134*"leav" + -0.134*"uk" + 0.119*"republican" + -0.110*"cameron"'), (3, '-0.400*"min" + 0.261*"eu" + -0.183*"goal" + -0.152*"ball" + -0.132*"play" + 0.128*"said" + 0.128*"say" + -0.126*"leagu" + 0.122*"leav" + -0.122*"game"'), (4, '0.404*"bank" + -0.305*"eu" + -0.290*"min" + 0.189*"year" + -0.164*"leav" + -0.153*"cameron" + 0.143*"market" + 0.140*"rate" + -0.139*"vote" + -0.133*"say"'), (5, '0.310*"bank" + -0.307*"say" + -0.221*"peopl" + 0.203*"trump" + 0.166*"1" + 0.164*"min" + 0.163*"0" + 0.152*"eu" + 0.152*"market" + -0.138*"like"'), (6, '0.570*"say" + 0.237*"min" + -0.170*"vote" + 0.158*"govern" + -0.154*"poll" + 0.122*"tax" + 0.115*"statement" + 0.115*"bank" + 0.112*"budget" + -0.108*"one"')]
  • Chủ đề-1: "trump", "say", "said", "would", "clinton", "peopl", "one", "campaign","year","time"' (Bầu cử Tổng thống Mỹ)
  • Chủ đề-2: "citi", "v", "h", "2016", "2017","unit", "west", "manchest","apr" ,"dec"' (Giải Ngoại hạng Anh)
  • Chủ đề-3: "trump","clinton", "eu","say","would","donald","leav","uk" ,"republican" ,"cameron" (Bầu cử Tổng thống Mỹ, Brexit)
  • Chủ đề-4:min","eu","goal","ball","play","said","say","leagu","leav","game" (Giải Ngoại hạng Anh)
  • Chủ đề-5: "bank","eu","min","year","leav","cameron","market","rate","vote","say" (Brexit và điều kiện thị trường)
  • Chủ đề-6: "bank","say","peopl","trump","1" ,"min" ,"eu","market" ,"like" (Tình hình chính trị và điều kiện thị trường)
  • Chủ đề-7: "say","min","vote","govern","poll","tax","statement","bank","budget","one" (Bầu cử Tổng thống Mỹ và hoạch định tài chính)

Ở đây, 7 chủ đề được phát hiện bằng Phân tích ngữ nghĩa tiềm ẩn. Một số chủ đề bị chồng lấp. Để nắm bắt đa nghĩa với độ chính xác cao hơn, chúng ta cần thử LDA (latent Dirichlet allocation). Tôi sẽ để phần này làm bài tập cho bạn, hãy thử bằng Gensim và chia sẻ ý kiến.

Ưu và nhược điểm của LSA

Thuật toán LSA là phương pháp đơn giản nhất, dễ hiểu và triển khai. Nó cũng cho kết quả tốt hơn so với mô hình không gian vectơ. Nó nhanh hơn so với các thuật toán khác vì chỉ liên quan đến phân rã ma trận thuật ngữ–tài liệu.

Số chiều chủ đề tiềm ẩn phụ thuộc vào hạng của ma trận nên chúng ta không thể vượt quá giới hạn đó. Ma trận đã phân rã của LSA rất đặc dày, nên khó lập chỉ mục từng chiều. LSA không thể nắm bắt được đa nghĩa của từ. Nó không dễ triển khai như LDA (latent Dirichlet allocation). Độ chính xác cũng thấp hơn LDA.

Trường hợp sử dụng của mô hình chủ đề

Các ứng dụng đơn giản của kỹ thuật này gồm gom cụm tài liệu trong phân tích văn bản, hệ thống gợi ý và truy xuất thông tin. Các trường hợp sử dụng chi tiết hơn của mô hình chủ đề gồm:

  • Tóm tắt hồ sơ: Có thể giúp nhà tuyển dụng đánh giá nhanh hồ sơ xin việc. Họ có thể giảm công sức khi lọc một đống hồ sơ.
  • Tối ưu hóa công cụ tìm kiếm: bài viết trực tuyến, blog và tài liệu có thể được gắn thẻ dễ dàng bằng cách xác định các chủ đề và từ khóa liên quan, từ đó cải thiện kết quả tìm kiếm.
  • Tối ưu hệ thống gợi ý: hệ thống gợi ý hoạt động như bộ lọc thông tin và tư vấn theo hồ sơ và lịch sử người dùng. Nó có thể giúp chúng ta khám phá nội dung liên quan chưa từng xem dựa trên các lượt truy cập trước đây.
  • Cải thiện hỗ trợ khách hàng: Khám phá chủ đề liên quan và từ khóa trong khiếu nại và phản hồi của khách hàng, ví dụ như thông số sản phẩm/dịch vụ, phòng ban và chi nhánh. Thông tin như vậy giúp công ty chuyển thẳng khiếu nại đến đúng bộ phận.
  • Trong ngành chăm sóc sức khỏe, mô hình chủ đề có thể giúp trích xuất thông tin hữu ích và giá trị từ các báo cáo y tế phi cấu trúc. Thông tin này có thể được dùng cho điều trị bệnh nhân và mục đích nghiên cứu khoa học y học.

Kết luận

Trong hướng dẫn này, bạn đã tìm hiểu rất nhiều về Mô hình chủ đề. Bạn đã biết Mô hình chủ đề là gì, Phân tích ngữ nghĩa tiềm ẩn là gì, cách xây dựng các mô hình tương ứng, cách các chủ đề được tạo bằng LSA. Bạn cũng đã điểm qua một số khái niệm cơ bản như Phân rã giá trị riêng và điểm độ mạch lạc chủ đề.

Hy vọng giờ đây bạn có thể sử dụng mô hình chủ đề để phân tích bộ dữ liệu của riêng mình. Cảm ơn bạn đã đọc hướng dẫn!

Nếu bạn muốn học thêm về Python, hãy tham gia khóa Case Studies in Statistical Thinking của DataCamp.

Chủ đề
Python
Khoa học Dữ liệu

Khóa học Python

Khóa học

Nhập môn Python

4 giờ
7.1M
Nắm vững phân tích dữ liệu với Python chỉ trong 4 giờ. Khóa học online này giúp bạn làm quen với giao diện Python và các thư viện phổ biến.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm