truth-detector-api / source_reputation.py
waliullah123's picture
Upload source_reputation.py
0d94a87 verified
Raw
History Blame Contribute Delete
3.08 kB
import json
import os
import re
class ReputationEngine:
def __init__(self, db_path=None):
if not db_path:
db_path = os.path.join(os.path.dirname(__file__), 'data', 'source_reputation.json')
self.db_path = db_path
self.reputation_data = {}
self.load_db()
def load_db(self):
if os.path.exists(self.db_path):
with open(self.db_path, 'r') as f:
self.reputation_data = json.load(f)
else:
print(f"Warning: Reputation database not found at {self.db_path}")
def get_source_stats(self, identifier):
"""
identifier can be a speaker name (e.g. 'john-mccain')
or a domain (e.g. 'reuters.com').
"""
# Clean identifier
slug = identifier.lower().strip().replace(' ', '-')
# Try direct match
if slug in self.reputation_data:
return self.reputation_data[slug]
# Try regex search for domains in URLs/metadata
for key in self.reputation_data:
if key in slug or slug in key:
return self.reputation_data[key]
return None
def analyze_source(self, text, speaker=None, context=None):
"""
Returns a dictionary with trust_score, bias, and label.
"""
target = speaker or "unknown"
stats = self.get_source_stats(target)
# Fallback: check context for domain-like strings
if not stats and context:
domains = re.findall(r'([a-z0-9]+(?:-[a-z0-9]+)*\.[a-z]{2,})', context.lower())
for d in domains:
stats = self.get_source_stats(d)
if stats: break
if stats:
score = stats.get('trust_score', 0)
party = stats.get('metadata', {}).get('party', 'unknown').lower()
# Simple bias mapping
bias = "Center"
if 'republican' in party: bias = "Right-Leaning"
elif 'democrat' in party: bias = "Left-Leaning"
elif 'libertarian' in party: bias = "Libertarian"
# Labeling
label = "Unknown"
if score >= 90: label = "EXCEPTIONAL"
elif score >= 75: label = "HIGHLY RELIABLE"
elif score >= 50: label = "MIXED RECORD"
elif score >= 30: label = "QUESTIONABLE"
else: label = "LOW CREIBILITY"
return {
"source_name": stats.get('name', target),
"trust_score": score,
"bias": bias,
"veracity_label": label,
"total_history": stats.get('total_claims', 0),
"counts": stats.get('counts', {})
}
return {
"source_name": target,
"trust_score": 0,
"bias": "Undetermined",
"veracity_label": "NO DATA",
"total_history": 0,
"counts": {}
}