Spaces:
No application file
No application file
| """ | |
| 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)) |