habulaj commited on
Commit
a8a7752
·
verified ·
1 Parent(s): eef708d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -56
app.py CHANGED
@@ -1,74 +1,63 @@
1
- import os
2
- os.environ["NUMBA_CACHE_DIR"] = "/tmp/numba_cache"
3
- os.environ["U2NET_HOME"] = "/tmp/u2net"
4
-
5
  from fastapi import FastAPI, HTTPException
6
  from pydantic import BaseModel
7
- from io import BytesIO
8
- from PIL import Image, ImageFilter
9
- import rembg
10
- import onnxruntime as ort
11
- from concurrent.futures import ThreadPoolExecutor
12
- import asyncio
13
- import gc
14
- import base64
15
 
16
- app = FastAPI()
 
 
17
 
18
- # Configurações do onnxruntime para CPU
19
- options = ort.SessionOptions()
20
- options.intra_op_num_threads = 2 # Limita o número de threads para evitar sobrecarga
21
- options.execution_mode = ort.ExecutionMode.ORT_SEQUENTIAL # Execução sequencial para melhor desempenho em CPU
22
 
23
- # Pool de threads para executar tarefas bloqueantes
24
- executor = ThreadPoolExecutor(max_workers=4)
25
 
26
- def resize_image(image, max_size=512):
27
- """Redimensiona a imagem para uma largura máxima de 512px, mantendo a proporção."""
28
- width, height = image.size
29
- if width > max_size or height > max_size:
30
- ratio = min(max_size / width, max_size / height)
31
- new_size = (int(width * ratio), int(height * ratio))
32
- image = image.resize(new_size, Image.Resampling.LANCZOS)
33
- return image
34
 
35
- def process_image(image_data):
36
- # Decodifica a imagem base64
37
- image = Image.open(BytesIO(base64.b64decode(image_data)))
38
 
39
- # Pré-processamento: apenas redimensiona para 512px
40
- image = resize_image(image, max_size=512)
41
 
42
- # Remove o fundo da imagem usando rembg
43
- output = rembg.remove(image, session_options=options)
44
 
45
- # Pós-processamento: suaviza as bordas
46
- output = output.filter(ImageFilter.SMOOTH_MORE)
 
 
 
 
47
 
48
- # Converte a imagem de volta para bytes
49
- img_byte_arr = BytesIO()
50
- output.save(img_byte_arr, format='PNG')
51
- img_byte_arr.seek(0)
52
 
53
- # Codifica a imagem processada em base64
54
- return base64.b64encode(img_byte_arr.getvalue()).decode('utf-8')
55
-
56
- class ImageBase64(BaseModel):
57
- image: str # A imagem em base64
58
 
59
- @app.post("/remove-background")
60
- async def remove_background(image_data: ImageBase64):
61
  try:
62
- # Executa o processamento da imagem em um thread separado
63
- loop = asyncio.get_event_loop()
64
- processed_image_base64 = await loop.run_in_executor(executor, process_image, image_data.image)
65
 
66
- # Retorna a imagem processada em base64
67
- return {"processed_image": processed_image_base64}
68
 
69
  except Exception as e:
70
  raise HTTPException(status_code=400, detail=str(e))
71
-
72
- finally:
73
- # Força a coleta de lixo após cada requisição
74
- gc.collect()
 
1
+ import spacy
 
 
 
2
  from fastapi import FastAPI, HTTPException
3
  from pydantic import BaseModel
4
+ import nltk
5
+ from nltk.tokenize import word_tokenize
6
+ from nltk.corpus import stopwords
7
+ from collections import Counter
8
+ import re
 
 
 
9
 
10
+ # Baixar as stopwords do NLTK (se ainda não tiver feito)
11
+ nltk.download('punkt')
12
+ nltk.download('stopwords')
13
 
14
+ # Carregar o modelo spaCy para reconhecimento de entidades nomeadas
15
+ nlp = spacy.load("en_core_web_sm")
16
+
17
+ app = FastAPI()
18
 
19
+ class PostText(BaseModel):
20
+ post: str # O post (texto) que será enviado para a API
21
 
22
+ def clean_text(text):
23
+ """Remove caracteres especiais e faz a limpeza do texto."""
24
+ text = re.sub(r'[^\w\s]', '', text) # Remove pontuação
25
+ text = text.lower() # Converte para minúsculas
26
+ return text
 
 
 
27
 
28
+ def extract_keywords(text):
29
+ """Extrai palavras-chave usando spaCy e nltk."""
 
30
 
31
+ # Limpeza inicial do texto
32
+ cleaned_text = clean_text(text)
33
 
34
+ # Tokenização do texto
35
+ words = word_tokenize(cleaned_text)
36
 
37
+ # Remover stopwords
38
+ stop_words = set(stopwords.words("english"))
39
+ filtered_words = [word for word in words if word not in stop_words]
40
+
41
+ # Contar a frequência das palavras filtradas
42
+ word_counts = Counter(filtered_words)
43
 
44
+ # Processar entidades nomeadas com spaCy (ex.: pessoas, locais, eventos)
45
+ doc = nlp(text)
46
+ entities = [ent.text for ent in doc.ents]
 
47
 
48
+ # Juntar as palavras mais frequentes e as entidades encontradas
49
+ keywords = set(filtered_words + entities)
50
+
51
+ # Ordenar e retornar as palavras-chave mais relevantes (top 10)
52
+ return [keyword for keyword, _ in word_counts.most_common(10)] + entities[:10]
53
 
54
+ @app.get("/generate-keywords")
55
+ async def generate_keywords(post_text: PostText):
56
  try:
57
+ # Gerar as palavras-chave a partir do texto do post
58
+ keywords = extract_keywords(post_text.post)
 
59
 
60
+ return {"keywords": keywords}
 
61
 
62
  except Exception as e:
63
  raise HTTPException(status_code=400, detail=str(e))