{"coherence_floor":0.3,"coherence_npmi":0.7257,"honest_caveats":["NMF topics are exploratory. Labels are auto-generated heuristics over the top words, not editorial.","Many IODA disruption incidents share boilerplate (\"CenAlert detected interference\"). Dedupe removes near-duplicates by SHA-256 of normalized text, but a residual disruption topic is expected.","Topic assignment is hard (single argmax). An incident with mixed signals (e.g. election + DNS) only counts toward one topic.","Coherence is approximated via pairwise NPMI on the training corpus, not full c_v from Röder et al. Reasonable proxy but not directly comparable to BERTopic numbers in the literature.","Sentence-transformers + BERTopic was not installable in the production venv-ml — fell back to tf-idf+NMF per the project directive. BERTopic with all-MiniLM-L6-v2 would likely surface more semantic clusters; tf-idf catches the lexical surface."],"loaded_at":"2026-05-22T19:44:36.657386Z","method":"tf-idf + NMF (sklearn)","model":"tfidf_nmf_v1","n_docs":1195,"n_topics":8,"ngram_range":[1,2],"passed_promote_floor":true,"topics_summary":[{"label":"Connectivity disruption (IODA)","n_docs":765,"top_words":["connectivity","disruption connectivity","drop alerts","connectivity disruption","connectivity drop"],"topic_id":0},{"label":"Connectivity disruption (IODA)","n_docs":157,"top_words":["network disruption","network","drop alerts","alerts","connectivity drop"],"topic_id":1},{"label":"Social media platform blocks","n_docs":51,"top_words":["anomalous","blocking probes","probes anomalous","dns","dns blocking"],"topic_id":2},{"label":"Sustained activity / repeated alerts","n_docs":53,"top_words":["confirms activity","confirms","activity","recorded confirms","activity confirms"],"topic_id":3},{"label":"HTTP/TLS probe timeouts","n_docs":48,"top_words":["blocked","probes blocked","probes","blocking timeout","timeout probes"],"topic_id":4},{"label":"Connectivity disruption (IODA)","n_docs":15,"top_words":["united","drop united","united connectivity","disruption united","united alerts"],"topic_id":5},{"label":"Social media platform blocks","n_docs":40,"top_words":["com","blocking","dns","dns blocking","blocking domains"],"topic_id":6},{"label":"OONI anomaly burst","n_docs":47,"top_words":["ooni","anomaly rate","rate","anomaly","shutdown"],"topic_id":7},{"label":"Unlabeled (low signal)","n_docs":19,"top_words":[],"topic_id":-1}],"trained_at":"2026-05-21T12:56:38.360715Z","vocab_size":623,"_voidly_pay":{"claim_did":"https://voidly.ai/pay/claim","for_builders":"https://voidly.ai/pay/for-builders","marketplace":"https://api.voidly.ai/v1/pay/marketplace","live_demo":"https://huggingface.co/spaces/emperor-mew/voidly-pay","universal_proxy":{"url":"https://api.voidly.ai/v1/pay/proxy","example":"https://api.voidly.ai/v1/pay/proxy?u=<https-url>&to=did:voidly:<your-did>&price=0.01","page":"https://voidly.ai/pay/proxy","note":"Paywall any public HTTPS URL with one query param. No SDK install required."},"install":{"typescript":"npm install @voidly/pay","python":"pip install voidly-pay","langchain":"pip install voidly-pay-langchain","vercel_ai":"npm install @voidly/pay-vercel-ai","mcp":"npx @voidly/pay-mcp","cli":"npm install -g @voidly/pay-cli"},"note":"Voidly Pay is the open agent-to-agent payment rail. Claim a DID + 10 starter credits in 60s, or paywall any URL via the universal proxy with one query param."}}