|
pip install transformers |
|
pip install gradio |
|
|
|
import transformers |
|
from transformers import AutoTokenizer, AutoModel |
|
from sklearn.metrics.pairwise import cosine_similarity |
|
from sklearn.decomposition import PCA |
|
import matplotlib.pyplot as plt |
|
import torch |
|
import torchvision |
|
import gradio as gr |
|
import io |
|
from PIL import Image |
|
|
|
|
|
|
|
def similarity_score(text1, text2): |
|
|
|
tokenizer = AutoTokenizer.from_pretrained("vinai/phobert-base") |
|
model = AutoModel.from_pretrained("vinai/phobert-base", output_hidden_states=True) |
|
|
|
|
|
tokens1 = tokenizer(text1, return_tensors='pt', padding=True) |
|
tokens2 = tokenizer(text2, return_tensors='pt', padding=True) |
|
|
|
with torch.no_grad(): |
|
hidden_states1 = model(tokens1['input_ids'], tokens1['attention_mask']) |
|
hidden_states2 = model(tokens2['input_ids'], tokens2['attention_mask']) |
|
|
|
|
|
similarity = cosine_similarity(hidden_states1[0][:, -1, :], hidden_states2[0][:, -1, :])[0][0] |
|
|
|
pca = PCA(n_components=2) |
|
pca.fit_transform(torch.cat((hidden_states1[0][:, -1, :], hidden_states2[0][:, -1, :]))) |
|
|
|
|
|
fig, ax = plt.subplots() |
|
ax.scatter(pca.components_[0][0], pca.components_[1][0], color='red') |
|
ax.text(pca.components_[0][0], pca.components_[1][0], text1, fontsize=12) |
|
ax.scatter(pca.components_[0][1], pca.components_[1][1], color='blue') |
|
ax.text(pca.components_[0][1], pca.components_[1][1], text2, fontsize=12) |
|
ax.set_title(f"Khoảng các Consin của 2 câu: {similarity:.4f}") |
|
|
|
|
|
buffer = io.BytesIO() |
|
fig.canvas.print_png(buffer) |
|
img_bytes = buffer.getvalue() |
|
return Image.open(io.BytesIO(img_bytes)) |
|
|
|
input_text1 = gr.inputs.Textbox(label="Câu 1") |
|
input_text2 = gr.inputs.Textbox(label="Câu 2") |
|
output_score = gr.outputs.Textbox(label="Điểm tương đồng") |
|
|
|
app = gr.Interface( |
|
fn=similarity_score, |
|
inputs=[input_text1, input_text2], |
|
outputs=gr.outputs.Image(type='numpy'), |
|
title="So sánh độ giống nhau giữa 2 câu", |
|
description="Nhập vào 2 câu, kết quả trả ra độ tương đồng của 2 câu đó", |
|
allow_flagging=False, |
|
layout="vertical", |
|
theme="default",) |
|
app.launch(share=True) |
|
|