80 lines
3.4 KiB
Python
80 lines
3.4 KiB
Python
"""
|
||
ایجاد بردار جملات - امبدینگ
|
||
"""
|
||
from sentence_transformers import SentenceTransformer
|
||
from fastapi import FastAPI
|
||
import json
|
||
import datetime
|
||
import numpy as np
|
||
|
||
date = datetime.datetime.now()
|
||
today = f'{date.year}-{date.month}-{date.day}-{date.hour}'
|
||
|
||
model_name = 'sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2'#89-25
|
||
# model_name = 'sentence-transformers/paraphrase-multilingual-mpnet-base-v2'#87-30
|
||
# model_name = 'sharif-dal/dal-bert'#90-41
|
||
# model_name = 'lifeweb-ai/shiraz'#97-67
|
||
# model_name = 'BAAI/bge-m3'#90-35
|
||
# model_name = 'jinaai/jina-embeddings-v3'#??
|
||
# model_name = 'jinaai/jina-embeddings-v4'#??
|
||
# model_name = 'HooshvareLab/bert-base-parsbert-uncased'#90-54
|
||
model = SentenceTransformer(model_name)
|
||
|
||
def do_word_embedder(sections):
|
||
for index, id in enumerate(sections):
|
||
embeddings = single_section_embedder(sections[id]['content'])
|
||
sections[id]['embeddings'] = embeddings.tolist()
|
||
|
||
with open(f'./data/embeddings/sections_embeddings_{today}.json', 'w', encoding='utf-8') as output_file:
|
||
data = json.dumps(sections, ensure_ascii=False)
|
||
output_file.write(data)
|
||
|
||
return sections
|
||
|
||
|
||
|
||
|
||
|
||
# Create a FastAPI app instance
|
||
# یک نمونه از برنامه FastAPI ایجاد میکنیم
|
||
app = FastAPI()
|
||
|
||
# Your method, wrapped in an API endpoint
|
||
# متد شما که در یک نقطه پایانی API قرار گرفته
|
||
@app.post("/single_section_embedder/")
|
||
def single_section_embedder(sentence: str):
|
||
"""
|
||
این نقطه پایانی، متن ورودی را تبدیل به بردار متناظر آن می کند.
|
||
|
||
**Args:**
|
||
sentence (str): متن یک سکشن
|
||
|
||
**Returns:**
|
||
list: لیست بردار متناظر با متن ورودی
|
||
"""
|
||
# Use the loaded model to encode the sentence
|
||
# برای تبدیل متن به بردار از مدلی که در بالا لود شده استفاده میکنیم
|
||
embeddings = model.encode(sentence)
|
||
|
||
# The output of model.encode is a NumPy array, which needs to be converted
|
||
# to a list to be returned as a JSON response.
|
||
# خروجی model.encode یک آرایه NumPy هست که باید به لیست تبدیل بشه
|
||
# تا به عنوان یک پاسخ JSON برگردانده بشه.
|
||
return {"embeddings": embeddings.tolist()}
|
||
|
||
|
||
|
||
|
||
|
||
def cosine_similarity(vec1, vec2):
|
||
dot_product = np.dot(vec1, vec2) # ضرب داخلی دو بردار
|
||
norm_vec1 = np.linalg.norm(vec1) # نُرم بردار اول
|
||
norm_vec2 = np.linalg.norm(vec2) # نُرم بردار دوم
|
||
return dot_product / (norm_vec1 * norm_vec2)
|
||
|
||
if __name__ == '__main__':
|
||
embd1 = single_section_embedder("۲ – درصد مشارکت و سهم پرداختی کارفرما نسبت به مأخذ کسر حق بیمه به صندوقهای فعال در سطح همگانی بیمههای اجتماعی و درمانی یکسان خواهد بود.")
|
||
embd2 = single_section_embedder("۳ – درصد مشارکت و سهم پرداختی بیمهشده نسبت به مأخذ کسر حق بیمه به صندوقهای فعال در سطح همگانی بیمههای اجتماعی و درمانی یکسان خواهد بود.")
|
||
# embd2 = get_sentence_embeddings("تو کم گذاشتی وگرنه شکست نمی خوردی")
|
||
similarity = cosine_similarity(embd1, embd2)
|
||
print(f'similarity: {similarity}') |