+2

Dùng word2vec để train, tạo ra embedding, suggest các bài tin tức liên quan nhất tới cụm từ người dùng input.

Mô tả sơ bài toán.

Word2vec có vẻ là một model phổ biến hiện nay, giúp ta làm ra khối thứ hay ho, đặc biệt trong đó là bài toán tính similarity giữa các câu, từ đó suggest ra các bài viết sát với điều mọi người quan tâm nhất.

Import các thư viện liên quan thôi.

import gensim
from gensim.models import Word2Vec
import matplotlib.pyplot as plt
from gensim.models.word2vec import LineSentence
import multiprocessing
import pandas as pd
cores = multiprocessing.cpu_count()
print(cores)

Lấy tin tức từ database.

from regress_adapter import get_news_date

data = get_news_date('2022-01-01', '2023-09-31')
print(data.head())

Data sẽ có colum title, content.

Merge cả 2 lại, chuyển nó thành list.

t = data['title'] + data['content']
print(t.head(), type(t))
data_list = t.to_list()

Clean input dữ liệu, phân tích câu thành các từ đơn (dùng undersea cho việc tách từ).

import helper
import numpy as np
from importlib import reload

reload(helper)

def clear_text_vi(texts = []):
    clear_ld = lambda t: helper.NLP(t).get_words_feature()
    t = map(clear_ld, texts)
    return list(t)

print(data_list[:2])
data_token = clear_text_vi(data_list)
print(data_token[:5])

Build model:

from gensim.models import Word2Vec

model = Word2Vec(data_token, vector_size=100, epochs=100, workers=4)
model.save('./data/word2vec_new.model')

Dùng model để tính embedding của các câu.

question = 'Các ngành nghề kinh doanh bất động sản'

question_tokens = clear_text_vi([question])
print(question_tokens)

# Word embeddings
question_embeddings = [model.wv[word] for word in question_tokens[0] if word in model.wv]

# Post embeddings
post_check = data_token[:40]

post_embeddings = []
for post in post_check:
    post_embedding = [model.wv[word] for word in post if word in model.wv]
    post_embeddings.append(post_embedding)

Tính average của embedding để giảm chiều.

# Calculate sentence embeddings by averaging word embeddings
def calculate_sentence_embedding(embeddings):
    if len(embeddings) == 0:
        return np.zeros(model.vector_size)
    return np.mean(embeddings, axis=0)

question_embedding = calculate_sentence_embedding(question_embeddings)

mean_post_embedding = []
for post_embedding in post_embeddings:
    mean_post_embedding.append(calculate_sentence_embedding(post_embedding))

# Calculate similarity (cosine similarity)
from sklearn.metrics.pairwise import cosine_similarity
similarity_score = cosine_similarity([question_embedding], mean_post_embedding)

# Print the similarity score
print(f"Similarity Score: {similarity_score}")

Result:

  -0.03760083  0.09184954 -0.26139367  0.09156138 -0.05282419 -0.07381117
  -0.09515604 -0.2930485  -0.06603602  0.12692012 -0.02156531 -0.04931989
   0.47682947  0.03242811 -0.29510814  0.07030669  0.18673076  0.4208078
   0.42247126 -0.00814531  0.27266297  0.15943064 -0.08936192 -0.32939208
   0.22590993  0.5683259  -0.2530557  -0.20678571  0.18182027  0.03689668
  -0.00898143 -0.28743052  0.02861731 -0.28094292]]

Tính top 5 các bài viết liên quan nhất.

# Convert the list of lists into a numpy array
np_similarity_score = np.array(similarity_score)
print('np_question_embedding', np_similarity_score)
# Sort the array in ascending order
sorted_indices = np.argsort(np_similarity_score[0])[::-1]

# Print the sorted array
print("sorted_indices", sorted_indices)

# Get the top 5 indices
top_5_indices = sorted_indices[:5]

# Print the sorted indices and the top 5 indices
print("Sorted Indices:", sorted_indices)
print("Top 5 Indices:", top_5_indices)

Result:

np_question_embedding [[-0.12784502  0.29440886 -0.10272358 -0.26588625  0.4475231   0.45338875
  -0.03760083  0.09184954 -0.26139367  0.09156138 -0.05282419 -0.07381117
  -0.09515604 -0.2930485  -0.06603602  0.12692012 -0.02156531 -0.04931989
   0.47682947  0.03242811 -0.29510814  0.07030669  0.18673076  0.4208078
   0.42247126 -0.00814531  0.27266297  0.15943064 -0.08936192 -0.32939208
   0.22590993  0.5683259  -0.2530557  -0.20678571  0.18182027  0.03689668
  -0.00898143 -0.28743052  0.02861731 -0.28094292]]
sorted_indices [31 18  5  4 24 23  1 26 30 22 34 27 15  7  9 21 35 19 38 25 36 16  6 17
 10 14 11 28 12  2  0 33 32  8  3 39 37 13 20 29]
Sorted Indices: [31 18  5  4 24 23  1 26 30 22 34 27 15  7  9 21 35 19 38 25 36 16  6 17
 10 14 11 28 12  2  0 33 32  8  3 39 37 13 20 29]
Top 5 Indices: [31 18  5  4 24]

Từ đó ta có được kết quả:

for i, indice in enumerate(top_5_indices):
    # Remove duplicate spaces
    cleaned_sentence = ' '.join(data_list[indice][:200].split())
    print("Bài viết thứ " + str(i) + ":", cleaned_sentence)

Result:

Bài viết thứ 0: Đón đọc Tạp chí Kinh tế Việt Nam số 30-2023 Tạp chí Kinh tế Việt Nam số 30-2023 Để nâng cao chất lượng và phát triển thị trường trái phiếu doanh nghiệp riêng lẻ, cần ưu tiên phát triển các thị t
Bài viết thứ 1: Kinh tế Mỹ khó giảm phụ thuộc vào Trung Quốc? Theo tờ báo này, việc tách khỏi vai trò của Trung Quốc trong chuỗi cung ứng toàn cầu, thậm chí chỉ trong những lĩnh vực nhỏ, không phải là một đường thẳng
Bài viết thứ 2: Đón đọc Tạp chí Kinh tế Việt Nam số 31-2023 Tạp chí Kinh tế Việt Nam số 31-2023. Đã có một số tín hiệu tích cực từ sự khởi sắc của một số ngành và lĩnh vực trong nền kinh tế, nhưng doanh nghiệp
Bài viết thứ 3: Trung Quốc giảm đầu tư vào các nước phương Tây Mới chỉ vài năm trước, dòng vốn từ Trung Quốc còn đổ mạnh vào các nước giàu. Các nhà đầu tư “dày ví” của Trung Quốc đã chiếm nhiều dòng tít báo bằng nhữn
Bài viết thứ 4: Trung Quốc dè dặt phát tín hiệu kích cầu, chú trọng cứu bất động sản Các nhà lãnh đạo cấp cao nhất của Trung Quốc ngày 24/7 cam kết tăng cường hỗ trợ chính sách cho nền kinh tế trong bối cảnh sự phục

Hy vọng trên đây là bước đầu, để mọi người nắm hơn về cách xử lí embedding và word2vec, các cách tính similar từ model trên. Thân ái và quyết thắng !!!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí