File size: 3,855 Bytes
9eabecd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4b463b1
 
 
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
"""
Data Scientist.: PhD.Eddy Giusepe Chirinos Isidro

main.py
=======
Objetivo: Este script calcula os EMBEDDINGS de qualquer TEXTO usando
          a API da OpenAI e o modelo 'text-embedding-ada-002'. Logo 
          esses Embeddings são armazenado no Banco de Dados 'redis'. 

Versão: 1.0.0
Data: 27/06/2023
Autor: Dr.Eddy Giusepe

Método de execução:
                   $ python main.py
"""
import os
import openai
import numpy as np
import time
from redis_client import RedisClient # Chamo à Classe que crie

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
openai.api_key  = os.getenv('OPENAI_API_KEY')

Eddy_RedisHost = os.environ["REDIS_HOST"]
Eddy_RedisPort = os.environ["REDIS_PORT"]


def get_embedding(text):
    """Recupera Embeddings do cache redis, se não existir, crie-a e armazene-a no cache e retorne-a"""
    redis_client = RedisClient(host=Eddy_RedisHost, port=Eddy_RedisPort)
    key = text
    if not redis_client.exists(key): # Chamo ao método da minha Classe 'RedisClient'
        time.sleep(1)
        print("Criando Embeddings para: " + text)
        response = openai.Embedding.create(input=text,
                                           model = "text-embedding-ada-002"
                                          )
        embeddings = response['data'][0]['embedding']
        redis_client.set(key, embeddings) # Aqui salvamos esses 'embeddings'
    else:
        embeddings = redis_client.get(key) # Como existe, simplesmente 'get' desse Embedding
    return embeddings


def cosine_similarity(a, b):
    """Calcula a similaridade de cosseno entre dois Embeddings."""
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))


def similarity(text1, text2):
    """Calcula a similaridade entre dois textos."""
    embedding1 = get_embedding(text1)
    embedding2 = get_embedding(text2)
    return cosine_similarity(embedding1, embedding2)


def similarity_list(text, text_list):
    """Calcula a similaridade entre um texto e uma lista de textos."""
    embedding1 = get_embedding(text)
    similarities = []
    for text2 in text_list:
        embedding2 = get_embedding(text2)
        similarities.append(cosine_similarity(embedding1, embedding2))
    return similarities


def most_similar(text, text_list):
    """Calcula a similaridade entre um texto e uma lista de 
       textos e retorna o texto mais similar."""
    similarities = similarity_list(text, text_list)
    return text_list[similarities.index(max(similarities))]


def most_similar_with_similarity(text, text_list):
    """Calcula a similaridade entre um texto e uma lista de textos 
       e retornar o texto mais similar e sua similaridade."""
    similarities = similarity_list(text, text_list)
    return text_list[similarities.index(max(similarities))], max(similarities)


def most_similar_with_similarity_threshold(text, text_list, threshold):
    """Calcula a similaridade entre um texto e uma lista de textos e 
       retornar o texto mais similar e sua similaridade se a similaridade 
       estiver abaixo de um limite, retornar Nenhum"""
    similarities = similarity_list(text, text_list)
    max_similarity = max(similarities)
    if max_similarity < threshold:
        return None, max_similarity
    return text_list[similarities.index(max_similarity)], max_similarity



if __name__ == '__main__':
    # BÚSQUEDAS INTELIGENTES CON OPENAI
    text_list = ['Los felinos dicen', 'Los caninos dicen',\
                 'Los bovinos dicen', 'Tengo un terreno en ayacucho', 'Tengo una casa en Piura']

    text = 'meaw'

    print(f'El texto 🧐{text}🧐 es mais similar com: 🤗{most_similar(text, text_list)}🤗')
    print("")
    text_Eddy = """Eu sou Cientista de Dados e sou casado com a Karina ❤️"""
    print("Gerando Embeddings de: ", get_embedding(text_Eddy))