analisisNews / app /schemas.py
ahmadsayadi's picture
feat: add keywords extraction, NER, project digest endpoints
f39a9fa
Raw
History Blame Contribute Delete
2.97 kB
"""Pydantic schemas untuk request/response."""
from typing import List, Dict, Optional
from pydantic import BaseModel
class TextItem(BaseModel):
id: int
text: str
# === Shared request ===
class TextItemsRequest(BaseModel):
items: List[TextItem]
# === Sentiment ===
class SentimentRequest(BaseModel):
items: List[TextItem]
class SentimentResult(BaseModel):
id: int
sentiment: str
score: float
confidence: float
class SentimentResponse(BaseModel):
results: List[SentimentResult]
model_mode: str
# === Summarize ===
class SummarizeRequest(BaseModel):
text: str
sentences: int = 3
class SummarizeResponse(BaseModel):
summary: str
sentences: List[str]
# === Topics ===
class TopicRequest(BaseModel):
items: List[TextItem]
num_topics: int = 8
class TopicCluster(BaseModel):
topic_id: int
label: str
keywords: List[str]
article_ids: List[int]
size: int
class TopicResponse(BaseModel):
topics: List[TopicCluster]
model_mode: str
# === Similarity ===
class SimilarityRequest(BaseModel):
items: List[TextItem]
threshold: float = 0.3
class SimilarityPair(BaseModel):
id_a: int
id_b: int
score: float
class SimilarityResponse(BaseModel):
pairs: List[SimilarityPair]
# === Emotion ===
class EmotionResult(BaseModel):
id: int
emotions: Dict[str, float]
dominant_emotion: str
dominant_score: float
class EmotionResponse(BaseModel):
results: List[EmotionResult]
# === Framing ===
class FramingResult(BaseModel):
id: int
frames: Dict[str, float]
dominant_frame: str
score: float
class FramingResponse(BaseModel):
results: List[FramingResult]
# === Fake Score ===
class FakeScoreResult(BaseModel):
id: int
score: int
level: str
reasons: List[str]
class FakeScoreResponse(BaseModel):
results: List[FakeScoreResult]
# === Opinion vs Fact ===
class OpinionFactResult(BaseModel):
id: int
classification: str
opinion_pct: int
fact_pct: int
confidence: float
class OpinionFactResponse(BaseModel):
results: List[OpinionFactResult]
# === Keywords ===
class KeywordItem(BaseModel):
keyword: str
score: float
count: int
class KeywordsResult(BaseModel):
id: int
keywords: List[KeywordItem]
class KeywordsResponse(BaseModel):
results: List[KeywordsResult]
# === NER ===
class EntitiesMap(BaseModel):
persons: List[str]
organizations: List[str]
locations: List[str]
class NerResult(BaseModel):
id: int
entities: EntitiesMap
class NerResponse(BaseModel):
results: List[NerResult]
# === Digest ===
class DigestRequest(BaseModel):
items: List[TextItem]
project_name: str = ""
class DigestTopicItem(BaseModel):
topic: str
count: int
class DigestResponse(BaseModel):
summary: str
top_topics: List[DigestTopicItem]
key_titles: List[str]
article_count: int