File size: 2,535 Bytes
6cb3a35
 
799358b
1e3b9fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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):
# Load PhoBERT tokenizer and model
    tokenizer = AutoTokenizer.from_pretrained("vinai/phobert-base")
    model = AutoModel.from_pretrained("vinai/phobert-base", output_hidden_states=True)

    # Encode the two texts using PhoBERT tokenizer
    tokens1 = tokenizer(text1, return_tensors='pt', padding=True)
    tokens2 = tokenizer(text2, return_tensors='pt', padding=True)
    # Pass the encoded tokens to PhoBERT to get the hidden states
    with torch.no_grad():
        hidden_states1 = model(tokens1['input_ids'], tokens1['attention_mask'])
        hidden_states2 = model(tokens2['input_ids'], tokens2['attention_mask'])

    # Calculate cosine similarity between the last hidden states of the two texts
    similarity = cosine_similarity(hidden_states1[0][:, -1, :], hidden_states2[0][:, -1, :])[0][0]
    #return similarity
    pca = PCA(n_components=2)
    pca.fit_transform(torch.cat((hidden_states1[0][:, -1, :], hidden_states2[0][:, -1, :])))

    # tạo biểu đồ
    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}")

    # chuyển đổi hình ảnh matplotlib sang định dạng bytes và hiển thị trên Gradio
    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)