File size: 1,988 Bytes
a8a7752
4b2ecc5
eef708d
a8a7752
 
 
 
 
4b2ecc5
a8a7752
 
 
4b2ecc5
a8a7752
 
 
 
1aab113
a8a7752
 
0e69a3b
a8a7752
 
 
 
 
1aab113
a8a7752
 
3231e07
a8a7752
 
3231e07
a8a7752
 
3231e07
a8a7752
 
 
 
 
 
3231e07
a8a7752
 
 
3231e07
a8a7752
 
 
 
 
0e69a3b
a8a7752
 
3231e07
a8a7752
 
d77e4f1
a8a7752
3231e07
 
 
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
import spacy
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from collections import Counter
import re

# Baixar as stopwords do NLTK (se ainda não tiver feito)
nltk.download('punkt')
nltk.download('stopwords')

# Carregar o modelo spaCy para reconhecimento de entidades nomeadas
nlp = spacy.load("en_core_web_sm")

app = FastAPI()

class PostText(BaseModel):
    post: str  # O post (texto) que será enviado para a API

def clean_text(text):
    """Remove caracteres especiais e faz a limpeza do texto."""
    text = re.sub(r'[^\w\s]', '', text)  # Remove pontuação
    text = text.lower()  # Converte para minúsculas
    return text

def extract_keywords(text):
    """Extrai palavras-chave usando spaCy e nltk."""
    
    # Limpeza inicial do texto
    cleaned_text = clean_text(text)
    
    # Tokenização do texto
    words = word_tokenize(cleaned_text)
    
    # Remover stopwords
    stop_words = set(stopwords.words("english"))
    filtered_words = [word for word in words if word not in stop_words]

    # Contar a frequência das palavras filtradas
    word_counts = Counter(filtered_words)
    
    # Processar entidades nomeadas com spaCy (ex.: pessoas, locais, eventos)
    doc = nlp(text)
    entities = [ent.text for ent in doc.ents]
    
    # Juntar as palavras mais frequentes e as entidades encontradas
    keywords = set(filtered_words + entities)
    
    # Ordenar e retornar as palavras-chave mais relevantes (top 10)
    return [keyword for keyword, _ in word_counts.most_common(10)] + entities[:10]

@app.get("/generate-keywords")
async def generate_keywords(post_text: PostText):
    try:
        # Gerar as palavras-chave a partir do texto do post
        keywords = extract_keywords(post_text.post)
        
        return {"keywords": keywords}
    
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))