--- license: mit language: - en library_name: transformers pipeline_tag: token-classification tags: - Social Bias metrics: - name: F1 type: F1 value: 0.7864 - name: Recall type: Recall value: 0.7617 base_model: "bert-base-uncased" co2_eq_emissions: emissions: 8 training_type: "fine-tuning" geographical_location: "Phoenix, AZ" hardware_used: "T4" --- # Social Bias NER This NER model is fine-tuned from BERT, for *multi-label* token classification of: - (GEN)eralizations - (UNFAIR)ness - (STEREO)types You can [try it out in spaces](https://huggingface.co/spaces/ethical-spectacle/gusnet-v1-demo) :). ## How to Get Started with the Model Transformers pipeline doesn't have a class for multi-label token classification, but you can use this code to load the model, and run it, and format the output. ``` import json import torch from transformers import BertTokenizerFast, BertForTokenClassification import gradio as gr # init important things tokenizer = BertTokenizerFast.from_pretrained('bert-base-uncased') model = BertForTokenClassification.from_pretrained('ethical-spectacle/social-bias-ner') model.eval() model.to('cuda' if torch.cuda.is_available() else 'cpu') # ids to labels we want to display id2label = { 0: 'O', 1: 'B-STEREO', 2: 'I-STEREO', 3: 'B-GEN', 4: 'I-GEN', 5: 'B-UNFAIR', 6: 'I-UNFAIR' } # predict function you'll want to use if using in your own code def predict_ner_tags(sentence): inputs = tokenizer(sentence, return_tensors="pt", padding=True, truncation=True, max_length=128) input_ids = inputs['input_ids'].to(model.device) attention_mask = inputs['attention_mask'].to(model.device) with torch.no_grad(): outputs = model(input_ids=input_ids, attention_mask=attention_mask) logits = outputs.logits probabilities = torch.sigmoid(logits) predicted_labels = (probabilities > 0.5).int() # remember to try your own threshold result = [] tokens = tokenizer.convert_ids_to_tokens(input_ids[0]) for i, token in enumerate(tokens): if token not in tokenizer.all_special_tokens: label_indices = (predicted_labels[0][i] == 1).nonzero(as_tuple=False).squeeze(-1) labels = [id2label[idx.item()] for idx in label_indices] if label_indices.numel() > 0 else ['O'] result.append({"token": token, "labels": labels}) return json.dumps(result, indent=4) ``` ## GUS-Net Project Details: #### Resources: - Please visit this [collection](https://huggingface.co/collections/ethical-spectacle/gus-net-66edfe93801ea45d7a26a10f) for the datasets and model presented in the [GUS-Net paper](https://huggingface.co/papers/2410.08388). - GUS-Net was implemented as part of [The Fair-ly Project](https://ethical-spectacle-research.gitbook.io/fair-ly), in a [Chrome Extension](https://chromewebstore.google.com/detail/fair-ly/geoaacpcopfegimhbdemjkocekpncfcc), and [PyPI package](https://ethical-spectacle-research.gitbook.io/fair-ly/toolkit/python-package). #### Please cite: ``` @article{powers2024gusnet, title={{GUS-Net: Social Bias Classification in Text with Generalizations, Unfairness, and Stereotypes}}, author={Maximus Powers and Umang Mavani and Harshitha Reddy Jonala and Ansh Tiwari and Hua Wei}, journal={arXiv preprint arXiv:2410.08388}, year={2024}, url={https://arxiv.org/abs/2410.08388} } ``` Give our research group, [Ethical Spectacle](https://huggingface.co/ethical-spectacle), a follow ;).