Text Classification
Transformers
Safetensors
bert
multilingual
multi-label-classification
community-notes
topic-classification
text-embeddings-inference
Instructions to use ychuai/community-notes-topic-classifier with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use ychuai/community-notes-topic-classifier with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-classification", model="ychuai/community-notes-topic-classifier")# pip install -U transformers accelerate # Load model directly from transformers import AutoTokenizer, AutoModelForSequenceClassification tokenizer = AutoTokenizer.from_pretrained("ychuai/community-notes-topic-classifier") model = AutoModelForSequenceClassification.from_pretrained("ychuai/community-notes-topic-classifier", device_map="auto") - Notebooks
- Google Colab
- Kaggle
File size: 6,224 Bytes
2358b2d cec807d 2358b2d cec807d 1e06e01 cec807d 1e06e01 cec807d 1e06e01 cec807d 1e06e01 cec807d 1e06e01 cec807d 1e06e01 cec807d 5005ec9 cec807d | 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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | ---
license: cc-by-4.0
library_name: transformers
pipeline_tag: text-classification
base_model: Twitter/twhin-bert-base
tags:
- multilingual
- multi-label-classification
- community-notes
- topic-classification
metrics:
- f1
---
# Multilingual Community Notes topic classifier
TwHIN-BERT fine-tuned to assign zero or more of ten topics to a post and its associated Community Note summaries. The unit of classification is the combined post record, not an individual note.
## Labels
Politics and Elections; War and Geopolitics; Health and Medicine; Economy and Finance; Technology and AI; Crime and Public Safety; Sports and Games; Celebrity and Entertainment; Religion and Spirituality; Gender and Identity.
## Inputs and inference
Input format:
```text
Original post:
The original post text
Community Note 1:
First summary
Community Note 2:
Second summary
```
Use summaries alone when the original post is unavailable, or post text alone when summaries are unavailable. Duplicate nonempty summary texts are included once. Input order should match the prepared record.
Long inputs are split into overlapping windows of 512 tokens with a 64-token stride. For each topic, take the maximum logit over all windows, then apply sigmoid. Scores ≥0.5 are selected independently. All settings are in `topic_config.json`.
### Quick start with Transformers
Install the dependencies in your terminal (or use `%pip install` in a notebook):
```bash
pip install torch "transformers>=4.41,<5" accelerate
```
```python
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
repo = "ychuai/community-notes-topic-classifier"
tokenizer = AutoTokenizer.from_pretrained(repo)
model = AutoModelForSequenceClassification.from_pretrained(
repo, device_map="auto"
)
model.eval()
text = (
"Original post:\nA new vaccine study was published.\n\n"
"Community Note 1:\nThe study was conducted in adults."
)
inputs = tokenizer(
text, return_tensors="pt", truncation=True, max_length=512
).to(model.device)
with torch.inference_mode():
scores = model(**inputs).logits.sigmoid()[0]
for index, score in enumerate(scores.tolist()):
if score >= 0.5:
print(f"{model.config.id2label[index]}: {score:.3f}")
```
Example output for this input (small numerical differences can occur across devices):
```text
Health and Medicine: 0.977
```
Use sigmoid rather than softmax: each topic is scored independently, and multiple topics or none may be selected.
**This quick-start example truncates text beyond 512 tokens.** For longer posts or multiple summaries, use the included helper below to preserve the model's overlapping-window max-logit pooling.
### Long inputs: use all windows
Download the inference files and run the included helper:
```python
from pathlib import Path
import runpy
from huggingface_hub import snapshot_download
model_dir = snapshot_download(
repo_id="ychuai/community-notes-topic-classifier",
allow_patterns=[
"config.json", "model.safetensors", "tokenizer.json",
"tokenizer_config.json", "special_tokens_map.json",
"topic_config.json", "predict_topics.py",
],
)
TopicPredictor = runpy.run_path(
str(Path(model_dir) / "predict_topics.py")
)["TopicPredictor"]
classifier = TopicPredictor(model_dir, device="cpu")
results = classifier.predict(
post_text="A new vaccine study was published.",
summaries=["The study was conducted in adults."],
)
for result in results:
if result["selected"]:
print(f"{result['topic']}: {result['score']:.3f}")
```
The helper returns all ten scores and their `selected` flags. Omit `post_text` to classify summaries alone. It can also be run from a downloaded model folder:
```bash
python predict_topics.py --post "A new vaccine study was published." --note "The study was conducted in adults."
```
These examples download the model from Hugging Face and run inference on your computer or notebook. No hosted inference endpoint or OpenAI API key is needed. The first model download is approximately 1.13 GB; later runs reuse the cache.
## Training and evaluation
Base model: [Twitter/twhin-bert-base](https://huggingface.co/Twitter/twhin-bert-base).
Training inputs combine original post text with all associated nonempty note summaries. The pipeline adopts `gpt-5.4-mini` to label 20,000 combined post records with multi-label topic annotations, deduplicates identical combined inputs, and uses an 85%/15% training/validation split. Window logits are max-pooled before a post-level binary cross-entropy loss. The saved evaluation was recorded at epoch 5.
| Held-out metric | Value |
|---|---:|
| Micro F1 | 0.831219 |
| Macro F1 | 0.809377 |
| Samples F1 | 0.761806 |
| Evaluation loss | 0.187633 |
## Intended use and limitations
Research topic annotation of multilingual posts and summaries. Topic predictions do not determine whether a statement is true or a note is Helpful. Multiple categories or no category can be selected. Language-specific performance has not been established by the saved evaluation. Domain shifts, synthetic-label bias, classification errors, and window max-pooling can affect predictions.
Combined summaries can include information added after the original post. These predictions are snapshot labels, not historical annotations. The model package contains weights, configuration, tokenizer, inference code, and aggregate metrics; the source corpus and annotation records are not bundled.
## License
This fine-tuned model is released under the Creative Commons Attribution 4.0 International (CC BY 4.0) license.
## Related papers
Please cite the following related papers when using this model in research:
```bibtex
@article{chuai2026community,
title={Community corrections have divergent downstream effects across corrected accounts},
author={Chuai, Yuwei and Renault, Thomas and Pr{\"o}llochs, Nicolas and Lenzini, Gabriele and Mosleh, Mohsen},
journal={arXiv preprint arXiv:2608.27526},
year={2026}
}
@article{renault2026grok,
title={@ Grok is this true? LLM-powered fact-checking on social media},
author={Renault, Thomas and Mosleh, Mohsen and Rand, David},
year={2026},
publisher={OSF}
}
```
|