Diplomatik transkriplerin yapısal çıkarımı, çok katmanlı anotasyonu ve kantitatif çerçeveleme analizi için geliştirilmiş açık kaynaklı NLP motoru.
[!WARNING] Bu döküman v1.1.0'e özeldir. Sistem geliştikçe API'ler, formüller ve mimariler önemli ölçüde değişebilir. Güncel bilgi için her zaman etiketli sürümün dökümantasyonuna başvurun.
Note
Bu bölüm, BB-PAXDATA'yı sıfırdan kuracak ve çalıştıracak geliştiriciler/araştırmacılar için adım adım bir kılavuzdur. Analizleri başlatmak için önce ortamın hazırlanması gerekir.
| Gereksinim | Versiyon | Zorunlu? |
|---|---|---|
| Python |
|
✅ |
| Poetry |
|
✅ |
| Docker + Docker Compose | Herhangi | İzleme için (Opsiyonel) |
| Ollama | Herhangi | Yerel LLM için (Opsiyonel) |
# 1. Repoyu klonla
git clone https://github.com/BBgitaccount/BB-PAXDATA.git
cd BB-PAXDATA
# 2. Environment dosyasını oluştur
cp .env.example .env
# .env dosyasını düzenle — AI API anahtarlarını ekle.env Dosyası Yapılandırması (Örnek):
# AI Backend Anahtarları (en az biri gerekli)
OLLAMA_BASE_URL=http://localhost:11434 # Yerel LLM için (ücretsiz)
ANTHROPIC_API_KEY=your_claude_key # Claude için
GEMINI_API_KEY=your_gemini_key # Google Gemini için
GROQ_API_KEY=your_groq_key # Hızlı çıkarım için
DEEPSEEK_API_KEY=your_deepseek_key # DeepSeek (V3/R1) için
# Veritabanı ve Önbellek
DATABASE_URL=sqlite:///./data/paxdata.db
CACHE_BACKEND=diskcache
CACHE_DIR=./data/cache# 3. Bağımlılıkları kur ve sanal ortama geç
poetry install
# NOT: Poetry 2.0+ kullanıyorsanız varsayılan olarak `poetry shell` komutu yüklü gelmez.
# Eklentiyi kurmak için: poetry self add poetry-plugin-shell
# Sonrasında 'poetry shell' ile sanal ortama geçebilir veya tüm komutları 'poetry run' önekiyle çalıştırabilirsiniz.
poetry shell
# 4. Veritabanı tablolarını oluştur
poetry run alembic upgrade headCLI üzerinden analiz pipeline'ını kolayca tetikleyebilirsiniz:
# Ham transkriptlerin olduğu dizini veritabanına al
poetry run bbpaxdata build data/
# Yapay zekasız / mantıksal (logic) ve NLP testlerini çalıştır
poetry run bbpaxdata test run --type logic
# Tam analiz pipeline'ını çalıştır (Bilateral Sentiment, Söylem Ağı, Konu Matrisi)
poetry run bbpaxdata analyze full --panel-id "panel_01" --threshold 0.5 --centrality
# Veritabanı bütünlüğünü doğrula
poetry run bbpaxdata validate db --strictBB-PAXDATA, diplomatik söylemleri (konferans tutanakları, zirve konuşmaları, BM oturumları vb.) çok boyutlu biçimde analiz eden bir NLP boru hattıdır. Sistem; duygu analizi, risk puanlama, çit (hedge) dili tespiti, çerçeveleme analizi ve anomali tespitini tek bir bütünleşik motorun altında toplar.
Aşağıdaki şema, sistemin 5 temel katmanındaki veri akışını ve sorumlulukları göstermektedir:
flowchart TB
A([📄 Ham Transkript Girişi]) --> INGEST["📥 INGESTION LAYER\nMetin Normalleştirme & Konuşmacı Ayrıştırma\n(Idempotency: SHA-256)"]
INGEST --> CORE["🧠 DOMAIN CORE\nNLP & Yapay Zeka Anotasyonu\n(Duygu, Risk, Hedge, Çerçeveleme)"]
CORE --> INFRA["🏗️ INFRASTRUCTURE\nAI Backend'leri (Ollama/Claude)\n6-Seviyeli JSON Kurtarma (Recovery Engine)"]
INFRA --> OBS["📊 OBSERVABILITY & HITL\nKalite Güvencesi, İnsan İncelemesi (HITL)\nPrometheus Metrikleri"]
OBS --> INTERFACE["🖥️ INTERFACES\nTyper CLI & FastAPI REST\nRaporlama (JSON/HTML)"]
style A fill:#475569,stroke:#94a3b8,color:#f8fafc
style INGEST fill:#1e1b4b,stroke:#a78bfa,color:#e2e8f0
style CORE fill:#052e16,stroke:#34d399,color:#e2e8f0
style INFRA fill:#2d1515,stroke:#f87171,color:#e2e8f0
style OBS fill:#0f2746,stroke:#60a5fa,color:#e2e8f0
style INTERFACE fill:#422006,stroke:#f97316,color:#e2e8f0
| Katman | Sorumluluk | Çıktı |
|---|---|---|
| Ingestion | Transkript normalleştirme, konuşmacı ayrıştırma, idempotency | Segment[], Speaker[] |
| Domain Core | NLP anotasyonu (duygu, risk, hedge, çerçeve, anomali) | Analysis (cümle başına) |
| Infrastructure | Persistans, AI backend soyutlaması, önbellekleme, kurtarma | Alembic-versioned DB, önbellek |
| Observability | Metrikler, izleme, prompt versiyonlama | Prometheus + Grafana |
| Quality Assurance | Altın veri seti değerlendirmesi, belirsizlik puanlama, drift tespiti | QualityReport, UncertaintyScore |
| Interface | CLI (typer) + gelecek REST API (FastAPI) |
Okunabilir raporlar & yapısal export |
graph TB
subgraph INTERFACES["🖥️ INTERFACES"]
CLI["CLI (Typer + Rich)"]
API["Future: FastAPI REST"]
end
subgraph APPLICATION["⚙️ APPLICATION"]
CMD_BUILD["BuildDatabaseCommand"]
CMD_ANALYZE["RunAnalysisCommand"]
CMD_FAIL["RunFailCheckCommand"]
QUERIES["Query Objects"]
PIPELINE["AnalysisPipeline"]
CONSENSUS["ConsensusService"]
end
subgraph DOMAIN["🧠 DOMAIN CORE"]
SENTIMENT["SentimentService\n(DIPLO + VADER)"]
RISK["RiskService\n(SBI + DKI)"]
HEDGING["HedgingService\n(Hyland 1995)"]
FRAMING["FramingService\n(Entman 1993)"]
ANOMALY["CrossAnomalyService\n(10 Kural)"]
TOPIC["TopicService\n(TF-IDF + BERTopic)"]
TEMPORAL["TemporalAnalyzer\n(CUSUM + JSD)"]
NER["NERService\n(spaCy GPE/ORG)"]
end
subgraph INFRA["🏗️ INFRASTRUCTURE"]
DB["SQLAlchemy 2.0 async\n+ Alembic"]
AI["AI Clients\n(Ollama/Claude/Gemini/Groq)"]
CACHE["Cache\n(DiskCache + Redis)"]
RECOVERY["6-Level JSON\nRecovery Engine"]
OBS["Observability\n(Prometheus)"]
QUALITY["Quality\n(DeepEval + Golden DS)"]
end
subgraph CONFIG["⚙️ CONFIG"]
SETTINGS["Pydantic Settings\n(.env)"]
LOGGING["Structlog"]
end
INTERFACES --> APPLICATION
APPLICATION --> DOMAIN
APPLICATION --> INFRA
DOMAIN --> INFRA
INFRA --> CONFIG
style INTERFACES fill:#1e1b4b,stroke:#a78bfa,color:#e2e8f0
style APPLICATION fill:#0f2746,stroke:#60a5fa,color:#e2e8f0
style DOMAIN fill:#052e16,stroke:#34d399,color:#e2e8f0
style INFRA fill:#2d1515,stroke:#f87171,color:#e2e8f0
style CONFIG fill:#1c1917,stroke:#a3a3a3,color:#e2e8f0
sequenceDiagram
participant CLI as CLI
participant CMD as BuildCommand
participant INGEST as IngestService
participant DB as Database
participant PIPELINE as AnalysisPipeline
participant AI as AI Client
participant RECOVERY as RecoveryEngine
participant CACHE as Cache
CLI->>CMD: bbpaxdata build --transcript transcript.json
CMD->>INGEST: parse_transcript()
INGEST->>INGEST: SHA-256 idempotency check
INGEST->>DB: upsert Speakers, Segments, Sentences
CMD->>PIPELINE: run_analysis(segments)
loop Her Cümle için
PIPELINE->>CACHE: check(sha256(text))
alt Cache hit
CACHE-->>PIPELINE: cached_analysis
else Cache miss
PIPELINE->>AI: generate(prompt)
AI-->>PIPELINE: raw_json_text
PIPELINE->>RECOVERY: recover(raw_json_text)
RECOVERY-->>PIPELINE: structured_dict
PIPELINE->>CACHE: store(sha256(text), result)
end
PIPELINE->>DB: upsert Analysis
end
CMD-->>CLI: ✅ Analysis complete
erDiagram
TRANSCRIPT {
string id PK
string title
string source
datetime created_at
string language
}
SPEAKER {
string id PK
string name
string role
string country
float power_level
string bloc_type
}
SEGMENT {
string id PK
string transcript_id FK
string speaker_id FK
int order_index
string text
float duration
}
SENTENCE {
string id PK
string segment_id FK
string speaker_id FK
int global_sent_order
string text
float sentiment_score
float risk_score
float hedging_score
string diplomatic_tone
string dominant_frame
string dominant_topic
}
ANALYSIS {
string id PK
string sentence_id FK
float ai_sentiment_score
float ai_risk_score
float sbi_score
float dki_score
float anomaly_score
string risk_level
json ai_raw_output
bool has_ai_output
}
QUALITY_REPORT {
string id PK
string analysis_id FK
float uncertainty_score
float accuracy_vs_golden
string review_status
}
TRANSCRIPT ||--o{ SPEAKER : "has"
TRANSCRIPT ||--o{ SEGMENT : "contains"
SPEAKER ||--o{ SEGMENT : "speaks"
SEGMENT ||--o{ SENTENCE : "contains"
SPEAKER ||--o{ SENTENCE : "spoken_by"
SENTENCE ||--|| ANALYSIS : "analyzed_as"
ANALYSIS ||--o| QUALITY_REPORT : "evaluated_by"
flowchart LR
RAW["📄 Ham Metin"] --> ENCODE["🔧 Encoding\nNormalization\n(ftfy + unicodedata)"]
ENCODE --> TOKENIZE["✂️ Tokenization\n(Kelime + Cümle)"]
TOKENIZE --> LEMMA["📚 Lemmatization\n(spaCy tr/en)"]
LEMMA --> POS["🏷️ POS Tagging\n(Dependency Parser)"]
POS --> NER["🌍 NER\n(GPE, ORG, PERSON)"]
NER --> STOP["🚫 Stopword\nFiltering\n(negasyon korunur)"]
STOP --> FEAT["📊 Feature\nExtraction\n(TF-IDF, N-gram,\nEmbeddings)"]
style RAW fill:#1e1b4b,stroke:#a78bfa,color:#e2e8f0
style FEAT fill:#052e16,stroke:#34d399,color:#e2e8f0
| Adım | Yöntem | Amaç |
|---|---|---|
| Tokenization | Kelime + cümle düzeyi | Tüm downstream görevler için temel |
| Encoding Normalization | ftfy + unicodedata |
Türkçe/Arapça/Kiril mojibake düzeltme |
| Lemmatization | spaCy (tr_core_news_trf, en_core_web_trf) |
Morfolojik varyantları standartlaştırma |
| POS Tagging | spaCy dependency parser | Sözdizimsel özellik çıkarımı |
| NER | spaCy + özel GPE modeli | Jeopolitik varlık tespiti |
| Stopword Filtering | Alan-farkında (negasyon not, never korunur) | Retorik açıdan yüklü token'ları koruma |
| Özellik | Teknik | Granülarlik |
|---|---|---|
| TF-IDF | Scikit-learn / özel | Segment düzeyinde anahtar kelime sıralaması |
| N-gram | Bigram / trigram frekansı | Collocation & retorik örüntü tespiti |
| Embeddings | Bağlamsal (transformer tabanlı) | Semantik benzerlik & kümeleme |
Important
Bu bölümde sistemde kullanılan indekslerin bilimsel formülleri açıklanmaktadır. Github'ın LaTeX Markdown render sürecinde formüllerin bozulmaması için \text{...} bloklarındaki alt çizgiler özenle kodlanmıştır.
Sistem, diplomatik söylemler için özelleştirilmiş DIPLO leksikonu ile VADER'ı birleştirir.
Saf DIPLO skoru şu şekilde hesaplanır:
Burada
Sol-pencere negasyon tespiti (Jia & Liang, 2017):
Burada
flowchart TD
TEXT["📝 Cümle Girişi"] --> TOKENIZE["Token'lara Ayır\n(contraction korumalı)"]
TOKENIZE --> DIPLO_MATCH["DIPLO Leksikonu ile\nEşleştir (phrase-first)"]
DIPLO_MATCH --> NEG_CHECK{"Sol-pencere\nNegasyon Var mı?\n[i-4 : i]"}
NEG_CHECK -- "Evet" --> ATTENUATE["Polarite Ters Çevir\n-v × 0.8"]
NEG_CHECK -- "Hayır" --> KEEP["v olarak koru"]
ATTENUATE & KEEP --> SUM["Toplam Düzeltme\nΣ × 0.05"]
SUM --> VADER["VADER compound\nekle"]
VADER --> CLAMP["[-1, 1] aralığına\nsıkıştır"]
CLAMP --> CLASSIFY["Kategori Sınıflandır\nCONFRONTATIONAL / CONCERNED\nNEUTRAL / CONSTRUCTIVE / COOPERATIVE"]
style TEXT fill:#1e1b4b,stroke:#a78bfa,color:#e2e8f0
style CLASSIFY fill:#052e16,stroke:#34d399,color:#e2e8f0
Duygu Eşikleri:
| Skor Aralığı | Kategori |
|---|---|
CONFRONTATIONAL |
|
CONCERNED |
|
NEUTRAL_CAUTIOUS |
|
CONSTRUCTIVE |
|
COOPERATIVE |
Sistem iki adet bileşik indeks hesaplar: SBI (Söylemsel Baskı İndeksi) ve DKI (Diplomatik Konum İndeksi).
Burada:
-
$P_{\text{level}} \in [0, 10]$ : Konuşmacının güç düzeyi -
$W_{\text{demand}} \in [0, 1]$ : Talebin ağırlığı (suggest=0.5, should=0.7, must/demand=0.9) -
$R_{\text{score}} \in [0, 10]$ : Baz risk skoru
Burada:
-
$d_{\text{norm}}$ : Normalize diplomatik skor$\in [0, 1]$ -
$r_{\text{norm}}$ : Normalize risk skoru$\in [0, 1]$ -
$d_{\text{req}}$ : Normalize talep yoğunluğu$\in [0, 1]$ -
$m_{\text{norm}}$ : Normalize manipülasyon skoru$\in [0, 1]$
Sonuç:
Risk Sinyal Ağırlıkları:
| Kategori | Örnekler | Puan |
|---|---|---|
| CRITICAL | red line, ultimatum, unacceptable, military option | 3 |
| HIGH | escalate, retaliate, decisive actions, deep strikes | 2 |
| BASE | Diğer tüm sinyal kelimeleri | 1 |
Hyland (1995, 2005) taksonomisine dayanan epistemic ve stil hedge kategorileri:
graph LR
HEDGE["🛡️ Hedge Tespiti"] --> EH["Epistemic High\n(might, could, possibly)\nAğırlık: 0.8"]
HEDGE --> EM["Epistemic Medium\n(typically, generally)\nAğırlık: 0.5"]
HEDGE --> AH["Anti-Hedge\n(definitely, certainly)\nAğırlık: -0.3"]
HEDGE --> APX["Approximator\n(roughly, about)\nAğırlık: 0.4"]
HEDGE --> SH["Shield\n(I'm not sure, to my knowledge)\nAğırlık: 0.6"]
HEDGE --> ATTR["Attribution\n(reportedly, allegedly)\nAğırlık: 0.3"]
EH & EM & AH & APX & SH & ATTR --> SCORE["📊 Hedge Skoru\n[0, 1]"]
SCORE --> INTERP["Yorum\n0.6+ = Yüksek Belirsizlik\n0.1-0.6 = Orta\n< 0.1 = Doğrudan Dil"]
style HEDGE fill:#1e1b4b,stroke:#a78bfa,color:#e2e8f0
style INTERP fill:#052e16,stroke:#34d399,color:#e2e8f0
Entman (1993) dört-fonksiyonlu çerçeveleme modelini uygular:
mindmap
root((Çerçeveleme\nAnalizi))
Problem Tanımı
Konu-varlık ko-oluşumu
NER GPE entegrasyonu
Nedensel Yorum
dependency path nsubj→ROOT→obl:agent
Pasif yapı agent tespiti
Ahlaki Değerlendirme
Appraisal sistemi
Değerlendirici sıfat-varlık eşleşmesi
Tedavi Önerisi
Modal fiil + politika fiili kümesi
should, must + GPE bağlamı
Çerçeve Türleri (v1.1.0):
| Frame Türü | Tanımı |
|---|---|
CONFLICT_FRAME |
Savaş/çatışma odaklı çerçeve |
HUMANITARIAN_FRAME |
İnsani kriz odaklı çerçeve |
SOVEREIGNTY_FRAME |
Egemenlik ve toprak bütünlüğü |
SECURITY_FRAME |
Güvenlik tehdidi çerçeve |
LEGAL_FRAME |
Uluslararası hukuk ve yaptırım |
DETERRENCE_FRAME |
Caydırıcılık stratejisi |
PEACE_FRAME |
Diyalog ve uzlaşı |
THREAT_FRAME |
Tehdit ve tehlike |
MULTILATERAL_FRAME |
Çok taraflı diplomatik eylem |
NEGOTIATION_FRAME |
Reform / müzakere süreci |
Plugin mimarisi — her kural AnomalyRule protokolünü uygular.
flowchart TD
ANALYSIS["📊 Analysis Nesnesi"] --> RULES["Kural Motoru\n(Plugin Mimarisi)"]
RULES --> R1["SentimentRiskDivergenceRule\nTsytsarau (2017) formülü"]
RULES --> R2["HighRiskThresholdRule\nRisk ≥ 0.8"]
RULES --> R3["NegativeSentimentRule\nDuygu ≤ -0.7"]
RULES --> R4["PowerAsymmetryRule\nAsimetri > 0.5 + δ < -0.3"]
RULES --> R5["CheapTalkAnomalyRule\nTrager (2010) proxy"]
R1 & R2 & R3 & R4 & R5 --> AGGREGATE["Toplam Anomali Skoru\nmin(Σ katkılar, 1.0)"]
AGGREGATE --> RISK_LEVEL["Risk Seviyesi\nLOW / MEDIUM / HIGH / CRITICAL"]
style ANALYSIS fill:#1e1b4b,stroke:#a78bfa,color:#e2e8f0
style RISK_LEVEL fill:#7f1d1d,stroke:#f87171,color:#e2e8f0
Burada:
-
$M_1 = \frac{1}{n}\sum p_i$ (ortalama polarite) -
$M_2 = \frac{1}{n}\sum p_i^2$ (ikinci moment) -
$\vartheta = 0.1$ (regularizasyon) -
$W = n$ (ağırlıklandırma)
Negasyon düzeltmesinden sonra SENTIMENT_RISK_DIVERGENCE anomalisi tetiklenir.
Anomali Türleri (v1.1.0):
| Anomali | Tetikleyici Koşul | Kategori |
|---|---|---|
RISK_HEDGING_CONFLICT |
Risk ≥ 7 AND Hedge ≥ 0.6 | Deception Pattern |
NEGATIVE_CONFRONTATIONAL_AMPLIFICATION |
Duygu ≤ -0.5 AND Ton = confrontational | Agresif Söylem |
VELVET_GLOVE_CONFRONTATION |
Duygu ≥ 0.3 AND Ton = confrontational | Örtülü Baskı |
HIGH_RISK_CONCILIATORY_MASK |
Risk ≥ 7 AND Ton = cooperative | Deception Pattern |
DIRECT_MANIPULATION_LOW_HEDGE |
Manip ≥ 0.7 AND Hedge ≤ 0.2 | Manipulation |
DOMINANT_ACTOR_PRESSURE |
Güç ≥ 8 AND SBI ≥ 7 AND Risk ≥ 6 | Power Dynamics |
VAGUE_DEMAND_PLAUSIBLE_DENIABILITY |
Hedge ≥ 0.6 AND Risk ≥ 4 | Strategic Ambiguity |
CONFLICT_FRAME_POSITIVE_WRAP |
Frame=conflict AND Duygu ≥ 0.3 | Framing Strategy |
INCONSISTENCY_PLUS_MANIPULATION |
Manip ≥ 0.5 AND |AI−Formül| ≥ 0.5 | Deception Pattern |
NEGATIVE_APPRAISAL_PERSUASIVE_TONE |
Appraisal=neg AND Duygu ≤ -0.5 AND Kibarlık ≥ 0.6 | Persuasion Strategy |
| Yöntem | Kullanım Amacı |
|---|---|
| TF-IDF + Anahtar Kelime | Segment düzeyinde baz konu sıralaması |
| BERTopic | Tematik drift tespiti için semantik kümeleme |
Konu Kategorileri (v1.1.0):
Gazze_Filistin_İsrail · Ukrayna_Rusya · BM_Reformu · Ekonomi_Ticaret_Enerji · Güvenlik_Çatışma
flowchart LR
subgraph DRIFT_TYPES["Drift Türleri"]
SENTIMENT_DRIFT["SENTIMENT\nCUSUM Algoritması"]
TOPIC_DRIFT["TOPIC\nJensen-Shannon Div."]
LEXICAL_DRIFT["LEXICAL\nMATTR Metriği"]
TONE_DRIFT["TONE\nMarkov Geçiş Matrisi"]
RISK_DRIFT["RISK\nSlop Değişim Tespiti"]
end
DATA["Zaman Serisi\nVerileri"] --> SENTIMENT_DRIFT
DATA --> TOPIC_DRIFT
DATA --> LEXICAL_DRIFT
DATA --> TONE_DRIFT
DATA --> RISK_DRIFT
SENTIMENT_DRIFT & TOPIC_DRIFT & LEXICAL_DRIFT & TONE_DRIFT & RISK_DRIFT --> EVENTS["DriftEvent[]\n(severity: LOW/MEDIUM/HIGH/CRITICAL)"]
style DATA fill:#1e1b4b,stroke:#a78bfa,color:#e2e8f0
style EVENTS fill:#052e16,stroke:#34d399,color:#e2e8f0
| Metrik | Formül / Yöntem | Açıklama |
|---|---|---|
| MTLD | Type-Token Ratio stabilizasyon noktası | Sözcük çeşitlilik zenginliği |
| GARCH(1,1) | Duygu oynaklık rejimi | |
| Entity Half-Life | Varlık saliency bozunumu | |
| Lexical Entropy | Shannon entropi (sözcük dağılımı) | |
| Red Line Flexibility | Concession Count / Red Line Count | Kırmızı çizgi geri adım indeksi |
Sistemdeki verilerin ham halden global endekslere nasıl dönüştüğünü gösteren metrik hiyerarşisi:
flowchart LR
subgraph INPUT["1. Girdi Katmanı"]
T["Metin Segmenti"]
S["Konuşmacı Gücü (Power Level)"]
end
subgraph BASE["2. Temel Çıkarımlar"]
VADER["VADER & DIPLO Sentiment"]
HEDGE["Hedge Skoru (Hyland)"]
NER["GPE/ORG Varlık Tespiti"]
FRAME["Çerçeve (Entman)"]
end
subgraph COMPOUND["3. Bileşik İndeksler (Cümle)"]
SBI["SBI\nSöylemsel Baskı"]
DKI["DKI\nDiplomatik Konum"]
ANOMALY["Anomali Skoru\n(10 Kural)"]
end
subgraph AGGREGATE["4. Global Metrikler (Makro)"]
GCI["Global Çatışma İndeksi\n(GCI)"]
DRIFT["Zamansal Drift Skoru\n(CUSUM/JSD)"]
CRED["Aktör Güvenilirlik Puanı"]
end
T --> VADER & HEDGE & NER & FRAME
S --> SBI
VADER & NER --> SBI
VADER & SBI & HEDGE & FRAME --> DKI
VADER & SBI & HEDGE --> ANOMALY
DKI & ANOMALY --> GCI
VADER & FRAME --> DRIFT
ANOMALY --> CRED
style INPUT fill:#1e1b4b,stroke:#a78bfa,color:#e2e8f0
style BASE fill:#0f2746,stroke:#60a5fa,color:#e2e8f0
style COMPOUND fill:#052e16,stroke:#34d399,color:#e2e8f0
style AGGREGATE fill:#422006,stroke:#f97316,color:#e2e8f0
Note
Temel çıkarımlardan hesaplanan bileşik indeksler (SBI, DKI, Anomali Skoru), nihai analiz raporlarında konuşmacının veya oturumun genel profilini (Global Metrikler) belirlemede ağırlıklı olarak kullanılır.
Modelin sürekli öğrenmesi ve kalibre edilmesi için sisteme entegre bir Human-in-the-Loop (HITL) döngüsü ve kalite güvence altyapısı bulunur.
| Bileşen | Amaç |
|---|---|
GoldenDataset |
100 el-etiketli cümle (ground truth) |
QualityEvaluator |
DeepEval / özel puanlayıcı (altın kümeye karşı) |
UncertaintyScorer |
AI çıktısı başına entropi tabanlı güven puanlaması |
HumanReview |
Uzmanların AI analizlerini değerlendirdiği salt-okunur (immutable) referans modeli |
CalibrationService |
Uzman ve AI uyumunu (Cohen's Kappa, Macro-F1, SBI MAE) haftalık analiz eden servis |
FewShotInjector |
Uzman onaylı altın standart verileri LLM istemlerine (prompt) otomatik enjekte eden modül |
Burada
Aşağıdaki şema, yapay zeka analizinin alan uzmanları tarafından nasıl denetlendiğini, bu denetimlerin sistemi nasıl kalibre ettiğini ve AI'ın few-shot learning ile kendi kendini nasıl eğittiğini göstermektedir:
sequenceDiagram
participant AI as AI Model
participant SYSTEM as Anomaly & Uncertainty
participant EXPERT as Alan Uzmanı
participant CALIB as Calibration Service
participant PROMPT as Few-Shot Injector
AI->>SYSTEM: 1. İlk Analiz Çıktısı (Sentiment, Risk, Çerçeve)
SYSTEM->>SYSTEM: 2. Entropi (U) Hesapla
alt U > Threshold (Yüksek Belirsizlik)
SYSTEM->>EXPERT: 3. Review Kuyruğuna Gönder
EXPERT-->>SYSTEM: 4. Uzman Düzeltmesi (Immutable HumanReview)
else U <= Threshold
SYSTEM->>SYSTEM: Otomatik Onay
end
loop Haftalık
SYSTEM->>CALIB: 5. Analiz Verilerini Besle
CALIB->>CALIB: 6. Uyum Ölçümü (Kappa, F1, SBI MAE)
alt Düşük Uyum (MAE > 10 veya F1 < 0.70)
CALIB-->>PROMPT: 7. Alert: Prompt veya Ağırlık Güncelle
else Yüksek Uyum
CALIB->>PROMPT: 8. Golden Dataset'e Ekle
end
end
PROMPT->>AI: 9. Yeni Analizlerde Few-Shot Olarak Enjekte Et
class AIClient(ABC):
async def generate(self, prompt: str, **kwargs) -> str: ...
async def embed(self, text: str) -> list[float]: ...
# Desteklenen backend'ler (v1.1.0)
class OllamaClient(AIClient): ... # Yerel LLM (Llama3, Mistral vb.)
class AnthropicClient(AIClient): ... # Claude (Haiku / Sonnet / Opus)
class GeminiClient(AIClient): ... # Google Gemini (Flash / Pro)
class GroqClient(AIClient): ... # Groq (hızlı çıkarım)
class DeepSeekClient(AIClient): ... # DeepSeek (V3 / R1)flowchart TD
REQUEST["AI İsteği"] --> PRIMARY["Birincil Backend\n(Yapılandırılmış)"]
PRIMARY -->|Başarı| RESULT["✅ Sonuç"]
PRIMARY -->|Hata / Timeout| SECONDARY["İkincil Backend\n(Fallback)"]
SECONDARY -->|Başarı| RESULT
SECONDARY -->|Hata| TERTIARY["Üçüncül Backend\n(Son çare)"]
TERTIARY -->|Başarı| RESULT
TERTIARY -->|Hata| RECOVERY["6-Seviyeli JSON\nKurtarma"]
RECOVERY -->|L1 Direct| R1["✅ Direct JSON parse"]
RECOVERY -->|L2 Stripped| R2["✅ Markdown bloğu sıyrılır"]
RECOVERY -->|L3 FirstBlock| R3["✅ İlk JSON bloğu bulunur"]
RECOVERY -->|L4 Partial| R4["✅ Kısmi KV çifti kurtarma"]
RECOVERY -->|L5 KeyValue| R5["✅ Geniş regex eşleştirme"]
RECOVERY -->|L6 SchemaDefault| R6["✅ Varsayılan şema uygulanır"]
style REQUEST fill:#1e1b4b,stroke:#a78bfa,color:#e2e8f0
style RESULT fill:#052e16,stroke:#34d399,color:#e2e8f0
style RECOVERY fill:#422006,stroke:#f97316,color:#e2e8f0
| Backend | Sürücü | TTL Stratejisi |
|---|---|---|
| Disk | diskcache |
24 saat (varsayılan) |
| Redis | redis-py |
LRU + açık geçersiz kılma |
Önbellek anahtarı: SHA-256(prompt_text + model_version) — prompt değişirse otomatik geçersiz.
| Bileşen | Teknoloji |
|---|---|
| ORM | SQLAlchemy 2.0 (async) |
| Migrasyonlar | Alembic |
| Varsayılan | SQLite (geliştirme ortamı için) |
graph LR
subgraph APP["BB-PAXDATA"]
METRICS["Prometheus\nMetrics Endpoint\n:8000/metrics"]
end
subgraph MONITORING["İzleme Yığını"]
PROM["Prometheus\n:9090"]
GRAFANA["Grafana\n:3000"]
end
subgraph OPTIONAL["Opsiyonel"]
LANGSMITH["LangSmith\n(Prompt izleme)"]
end
APP --> PROM
PROM --> GRAFANA
APP --> LANGSMITH
style APP fill:#1e1b4b,stroke:#a78bfa,color:#e2e8f0
style MONITORING fill:#052e16,stroke:#34d399,color:#e2e8f0
style OPTIONAL fill:#1c1917,stroke:#a3a3a3,color:#e2e8f0
| Metrik | Tip | Etiketler |
|---|---|---|
ai_backend_latency_seconds |
Histogram | backend, operation |
cache_hit_rate |
Gauge | backend (disk/redis) |
batch_fallback_count |
Counter | from_backend, to_backend |
json_recovery_total |
Counter | level, result |
BB-PAXDATA CLI arayüzü, sistemin tüm işlevlerini yönetmenizi sağlar.
poetry run bbpaxdata [KOMUT] [SEÇENEKLER]-
Legacy Göçü (
migrate): Eski monolitik SQLite veritabanından yeni modüler formata verileri taşır:poetry run bbpaxdata migrate run --legacy-db <eski_db_yolu> [--dry-run] [--batch-size <boyut>]
Dosya: migrate.py
-
Veritabanı Doğrulama (
validate): Veritabanının bütünlüğünü, yabancı anahtarları ve şema doğruluğunu kontrol eder:poetry run bbpaxdata validate db [--strict] [--json] [--output <dosya_yolu>]
Dosya: validate.py
-
Veri Yükleme, İzleme ve Yapılandırma (
build): Transkript dosyalarını okuyarak veritabanına yükler:poetry run bbpaxdata build <veri_dizini_yolu> [--force-rebuild] [--panel <panel_adı>] [--dry-run] [--logic-only] [--ai-limit <sayi>]
-
Seçenekler:
--force-rebuild/-f: Daha önce işlenmiş dosyaları zorla yeniden analiz eder.--panel <panel_adı>/-p <panel_adı>: Yalnızca dosya adında belirtilen metin geçen paneli işler.--dry-run/-d: Veritabanına yazmadan ve dosyaları diske kaydetmeden simülasyon yapar.--logic-only/-L: AI-Free (Logic-only) modunu çalıştırır. LLM/AI çağrısı yapmadan, tamamen deterministik kural tabanlı NLP algoritmasıyla duygu ve risk skorlarını hesaplar (sıfır maliyet ve yüksek hız).--ai-limit <sayi>/-n <sayi>: Cümle Bazlı AI Limiti uygular. İlk N cümle gerçek AI (LLM) ile analiz edilir, sınır aşıldığında sonraki tüm cümlelerin analizleri (ve frame, anomali vb. alt modülleri) otomatik olarakLogicOnlyanalistine düşer.
-
Klasör İzleme (
watch): Belirtilen klasörü sürekli izler. Yeni veya güncellenen dosyalar eklendiğinde otomatik olarak dosyayı standardize eder ve veritabanına aktarır:poetry run bbpaxdata build watch <veri_dizini_yolu> [--interval <saniye>] [--logic-only] [--ai-limit <sayi>]
--interval <saniye>/-i <saniye>: Klasör tarama sıklığı (varsayılan: 5s).
-
Durum Kontrolü (
status): Dosya durumunu ve işlenme geçmişini kontrol eder:poetry run bbpaxdata build status <dosya_yolu>
-
Temizlik (
clean): Panelleri veya eski dosyaları temizlemek için:poetry run bbpaxdata build clean [--panel <panel_id>] [--older-than <gun_sayisi>] [--force]
Dosya: build.py
-
Diplomatik söylem analizlerini çalıştırmak için kullanılan komutlar:
- Bilateral Sentiment Analizi:
poetry run bbpaxdata analyze country-refs --panel-id <panel_id> [--verbose]
- Söylem Ağı Kurulumu:
poetry run bbpaxdata analyze network --panel-id <panel_id> [--threshold <deger>] [--centrality]
- Tam Analiz Pipeline'ı:
Tüm pipeline adımlarını (Bilateral Sentiment, Söylem Ağı, Konu Matrisi) sırayla çalıştırır:
Dosya: analyze.py
poetry run bbpaxdata analyze full --panel-id <panel_id> [--threshold <deger>] [--centrality]
-
Test Süitini Çalıştırma (
run): Belirli kapsamdaki testleri pytest kullanarak çalıştırır:poetry run bbpaxdata test run --type [logic|ai|e2e|all] [--limit <sayi>] [--verbose]
--type logic: AI (LLM) katmanı olmadan, sadece yerel NLP ve kural tabanlı mantıksal testleri çalıştırır. (Önerilen yerel analiz testi)--type ai: Sadece AI/LLM servislerini test eder.--type e2e: Uçtan uca tüm sistemi test eder.--type all: Tüm test süitini çalıştırır.
-
Tek Cümle Analizi (
eval-sentence): Tek bir cümleyi tüm pipeline üzerinden geçirip sonucunu terminalde görselleştirir:poetry run bbpaxdata test eval-sentence "<analiz_edilecek_cumle>" [--verbose] [--logic-only]
--logic-only/-Lbayrağı ile AI çağrısı yapmadan yerel motor üzerinden çalıştırılabilir.
-
Dataset Kalite Ölçümü (
eval-dataset): Golden Dataset üzerinden DeepEval kalite değerlendirme pipeline'ını tetikler:poetry run bbpaxdata test eval-dataset [--limit <sayi>]
Dosya: test.py
- Uzman İncelemesi Ekleme (
submit): AI çıktısıyla uzman kararını karşılaştırıp kaydetmek için:poetry run bbpaxdata review submit --analysis-id <id> --reviewer-id <uzman_id> [--human-frame <frame>] [--human-risk <risk>] [--human-sbi <sbi>] [--human-sentiment <sentiment>] [--reason <neden>] [--duration <saniye>]
- Haftalık Kalibrasyon Raporu (
calibrate): Prompt sürümleri için Cohen's Kappa, Macro-F1 ve MAE istatistiklerini hesaplar:poetry run bbpaxdata review calibrate --prompt-version <surum> [--days-back <gun>]
- Anlaşmazlıkları Listeleme (
show-disagreements): Uzman ve AI arasındaki kararsızlık/anlaşmazlık durumlarını listeler:Dosya: review_commands.pypoetry run bbpaxdata review show-disagreements --prompt-version <surum> [--limit <sayi>]
Bu bölüm, BB-PAXDATA CLI'ını en verimli şekilde kullanabilmeniz için senaryolara dayalı adım adım komut kılavuzudur.
LLM API anahtarınız yoksa veya bütçe harcamadan binlerce satırlık büyük transkript dosyalarını hızlıca yerel makinenizde analiz etmek istiyorsanız bu adımları izleyin.
- Test Edin: Yerel kuralların ve veri tabanının sorunsuz çalıştığını doğrulamak için sadece logic testlerini çalıştırın:
poetry run bbpaxdata test run --type logic - AI-Free Veri Yükleme (
build):data/dizinindeki transkriptleri LLM çağrısı yapmadan, tamamen deterministik sözlükler ve kural motoruyla işleyip veritabanına kaydedin:poetry run bbpaxdata build data/ --logic-only --force-rebuild
- Tek Cümle Denemesi: Belirli bir diplomatik ifadenin kural tabanlı motora göre duygu ve risk çıktısını anında görün:
poetry run bbpaxdata test eval-sentence "Savaş ve askeri saldırı durumunda geri adım atmayacağız." --logic-only
- Analiz Raporu: İşlenen veriler üzerinden ülke referans duygu skorlarını hesaplayın:
poetry run bbpaxdata analyze country-refs --panel-id "03_erdogan"
Tüm transkripti yapay zekaya gönderip yüksek faturalarla karşılaşmak yerine, her transkript dosyasının sadece ilk N cümlesini (örneğin ilk 50 cümle) yapay zekayla derinlemesine analiz edip, kalanını otomatik olarak logic-only modla tamamlayabilirsiniz.
- Bütçe Sınırlı Build: Her transkriptin ilk 50 cümlesini yapay zekaya gönderin, 51. cümleden itibaren tüm AI alt servislerini (sentiment, frame, anomali vb.) logic-only moduna düşürün:
Not: İşlem tamamlandığında terminalde
poetry run bbpaxdata build data/ --ai-limit 50 --force-rebuild
📊 AI Kullanım Raporubaşlığı altında kaç cümle için AI çağrısı yapıldığı ve limitin aşıp aşmadığı detaylıca gösterilir.
Ham transkript dosyalarını bir klasöre kaydettiğiniz anda sistemin bunu yakalamasını, otomatik olarak temizleyip standardize etmesini (konuşmacı adlarına ülke kodları ekleme, metadata başlıkları yerleştirme) ve veritabanına aktarmasını istiyorsanız:
- Watcher'ı Başlatın (Logic-Only modda):
poetry run bbpaxdata build watch "data/Antalya Diplomatic Forum 2026" --logic-only --interval 5 - Dosya Ekleyin: Bu klasöre ham, düzensiz bir transkript dosyası (
03_Erdogan.txt) atın:Recep Tayyip Erdoğan: Bu yeni bir küresel diplomasi testidir. Sergei Lavrov: Katılıyorum. - Watcher Tarafından Yapılanlar:
- Watcher 5 saniye içinde dosyayı algılar.
standardize_file_content()çalışarak konuşmacılarıRecep Tayyip Erdoğan (TR)veSergei Lavrov (RU)olarak günceller.- Dosyanın en tepesine
TITLE: Recep Tayyip Erdoğan Address,DATE: April 2026,THEME: ...gibi metadata bloklarını idempotent şekilde yazar. - Dosyayı diske kaydedip ardından veritabanına (
bb-paxdata.db) kaydeder.
- Dosya Durumu Sorgulama: Belirli bir dosyanın veritabanına işlenip işlenmediğini, son işlenme tarihini ve kullanılan parser sürümünü sorgulayın:
poetry run bbpaxdata build status data/03_Erdoğan.txt
- Kısmi Veri Temizleme: İşlemlerinizde bir hata yaptıysanız ve belirli bir panel verilerini veritabanından tamamen silip yeniden başlatmak istiyorsanız:
poetry run bbpaxdata build clean --panel "03_erdogan" --force
| Modül | Yöntem | Akademik Temel |
|---|---|---|
| Sentiment | Negasyon-farkında DIPLO + VADER | Jia & Liang (2017); Socher et al. (2013) |
| Risk | SBI / DKI bileşik indeks | Baldwin (1985); Kıyılar (2020) |
| Hedging | Hyland (1995) taksonomisi + yoğunluk oranı | Hyland (1995, 2005) |
| Framing | Entman (1993) dört-fonksiyonlu model + salience | Entman (1993) |
| Anomaly | 10 kurallı çapraz-anomali tensörü | Tsytsarau et al. (2017); Trager (2010) |
| Topic | TF-IDF + BERTopic dinamik modelleme | Grootendorst (2022) |
| Dependency | spaCy SVO çıkarımı + diplomatik alan budama | Manning et al. (2014) |
| Explainability | SHAP + LIME hibrit | Lundberg & Lee (2017); Ribeiro et al. (2016) |
| Temporal | CUSUM + JSD lexical drift + embedding centroid kayması | Page (1954); Lin (1991) |
| Quality | Tahmine dayalı entropi + ensemble anlaşmazlığı | Gal & Ghahramani (2016) |
flowchart TB
subgraph L1["L1: Kural Tabanlı (Deterministik)"]
DIPLO["DIPLO Leksikonu\n(Phrase-first)"]
RISK_SIG["Risk Sinyalleri\n(Ağırlıklı)"]
HEDGE_LEX["Hedge Leksikonu\n(Regex tabanlı)"]
end
subgraph L2["L2: İstatistiksel (Stokastik)"]
CUSUM["CUSUM\n(Drift tespiti)"]
JSD["Jensen-Shannon\n(Dağılım farkı)"]
GARCH["GARCH(1,1)\n(Oynaklık)"]
end
subgraph L3["L3: Makine Öğrenimi (Olasılıksal)"]
BERTOPIC["BERTopic\n(Semantik küme)"]
VADER_ML["VADER\n(Duygu lexicon ML)"]
EMBEDDING["Sentence Transformers\n(Semantik benzerlik)"]
end
subgraph L4["L4: Büyük Dil Modelleri (Üretken)"]
AI_ANALYST["AI Analyst\n(Claude/Gemini/Groq/Ollama)"]
PROMPT_REG["Prompt Registry\n(Versiyonlanmış)"]
end
L1 --> CONSENSUS["Uzlaşı Motoru\n(Consensus Service)"]
L2 --> CONSENSUS
L3 --> CONSENSUS
L4 --> CONSENSUS
CONSENSUS --> FINAL["Son Analiz Skoru\n(Ağırlıklı birleşim)"]
style L1 fill:#1e1b4b,stroke:#a78bfa,color:#e2e8f0
style L2 fill:#0f2746,stroke:#60a5fa,color:#e2e8f0
style L3 fill:#052e16,stroke:#34d399,color:#e2e8f0
style L4 fill:#2d1515,stroke:#f87171,color:#e2e8f0
style FINAL fill:#422006,stroke:#f97316,color:#e2e8f0
Aşağıdaki kaynaklar v1.1.0'de doğrudan uygulanan veya referans alınan çalışmalardır.
- Socher, R., Perelygin, A., Wu, J. et al. (2013). Recursive Deep Models for Semantic Compositionality Over a Sentiment Treebank. EMNLP 2013.
- Jia, L., & Liang, J. (2017). Negation and Speculation Scope Detection. Chinese National Conference on Computational Linguistics.
- Hutto, C.J., & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. ICWSM.
- Baldwin, D.A. (1985). Economic Statecraft. Princeton University Press.
- Fearon, J.D. (1995). Rationalist Explanations for War. International Organization, 49(3), 379–414.
- Trager, R.F. (2010). Diplomatic Calculus in Uncharted Territory. American Political Science Review, 104(2), 347–371.
- Hyland, K. (1995). The Author in the Text: Hedging Scientific Writing. Hong Kong Papers in Linguistics and Language Teaching, 18, 33–42.
- Hyland, K. (2005). Metadiscourse: Exploring Interaction in Writing. Continuum.
- Entman, R.M. (1993). Framing: Toward Clarification of a Fractured Paradigm. Journal of Communication, 43(4), 51–58.
- Tsytsarau, M., Palpanas, T., & Denecke, K. (2017). Identifying Sentiment-based Contradictions. Data Science and Engineering, 2, 81–97.
- Page, E.S. (1954). Continuous Inspection Schemes. Biometrika, 41(1/2), 100–115.
- Lin, J. (1991). Divergence Measures Based on the Shannon Entropy. IEEE Transactions on Information Theory, 37(1), 145–151.
- Covington, M.A., & McFall, J.D. (2010). Cutting the Gordian Knot: The Moving-Average Type–Token Ratio (MATTR). Journal of Quantitative Linguistics, 17(2), 94–100.
- Bollerslev, T. (1986). Generalized Autoregressive Conditional Heteroskedasticity. Journal of Econometrics, 31(3), 307–327.
- Volansky, V., Ordan, N., & Wintner, S. (2015). On the Features of Translationese. Literary and Linguistic Computing, 30(1), 98–118.
- Grootendorst, M. (2022). BERTopic: Neural topic modeling with a class-based TF-IDF procedure. arXiv:2203.05794.
- Lundberg, S.M., & Lee, S.I. (2017). A Unified Approach to Interpreting Model Predictions. NeurIPS 2017.
- Ribeiro, M.T., Singh, S., & Guestrin, C. (2016). "Why Should I Trust You?": Explaining the Predictions of Any Classifier. KDD 2016.