shivamjadhav commited on
Commit
7b41c88
·
1 Parent(s): 389f9b6

created Bug Priority model and hugging face deployment read project

Browse files
.gitattributes copy ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
Dockerfile ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Read the doc: https://huggingface.co/docs/hub/spaces-sdks-docker
2
+ # you will also find guides on how best to write your Dockerfile
3
+
4
+ FROM python:3.9
5
+
6
+ RUN useradd -m -u 1000 user
7
+ USER user
8
+ ENV PATH="/home/user/.local/bin:$PATH"
9
+
10
+ WORKDIR /app
11
+
12
+ COPY --chown=user ./requirements.txt requirements.txt
13
+ RUN pip install --no-cache-dir --upgrade -r requirements.txt
14
+
15
+ COPY --chown=user . /app
16
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
README copy.md ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Bug Priority Multiclass
3
+ emoji: 📚
4
+ colorFrom: green
5
+ colorTo: purple
6
+ sdk: docker
7
+ pinned: false
8
+ short_description: This model fine-tunes `roberta-base` using a labeled dataset
9
+
10
+ tags:
11
+ - text-classification
12
+ - accessibility
13
+ - bug-triage
14
+ - transformers
15
+ - roberta
16
+ - pytorch-lightning
17
+ license: apache-2.0
18
+ datasets:
19
+ - custom
20
+ language:
21
+ - en
22
+
23
+ # RoBERTa Base Model for Accessibility Bug Priority Classification
24
+
25
+ This model fine-tunes `roberta-base` using a labeled dataset of accessibility-related bug descriptions to automatically classify their **priority level**. It helps automate the triage of bugs affecting users of screen readers and other assistive technologies.
26
+
27
+
28
+ ## 🧠 Problem Statement
29
+
30
+ Modern applications often suffer from accessibility issues that impact users with disabilities, such as content not being read properly by screen readers like **VoiceOver**, **NVDA**, or **JAWS**. These bugs are often reported via issue trackers or user forums in the form of short text summaries.
31
+
32
+ Due to the unstructured and domain-specific nature of these reports, manual triage is:
33
+ - Time-consuming
34
+ - Inconsistent
35
+ - Often delayed in resolution
36
+
37
+ There is a critical need to **prioritize accessibility bugs quickly and accurately** to ensure inclusive user experiences.
38
+
39
+
40
+ ## 🎯 Research Objective
41
+
42
+ This research project builds a machine learning model that can **automatically assign a priority level** to an accessibility bug report. The goal is to:
43
+
44
+ - Streamline accessibility QA workflows
45
+ - Accelerate high-impact fixes
46
+ - Empower developers and testers with ML-assisted tooling
47
+
48
+ ## 📊 Dataset Statistics
49
+
50
+ The dataset used for training consists of real-world accessibility bug reports, each labeled with one of four priority levels. The distribution of labels is imbalanced, and label-aware preprocessing steps were taken to improve model performance.
51
+
52
+ | Label | Priority Level | Count |
53
+ |-------|----------------|-------|
54
+ | 1 | Medium | 2035 |
55
+ | 2 | High | 1465 |
56
+ | 0 | Low | 804 |
57
+ | 3 | Critical | 756 |
58
+
59
+ **Total Samples**: 5,060
60
+
61
+ ### 🧹 Preprocessing
62
+
63
+ - Text normalization and cleanup
64
+ - Length filtering based on token count
65
+ - Label frequency normalization for class-weighted loss
66
+
67
+ To address class imbalance, class weights were computed as inverse label frequency and used in the cross-entropy loss during training.
68
+
69
+ ## 🧪 Dataset Description
70
+
71
+ The dataset consists of short bug report texts labeled with one of four priority levels:
72
+
73
+ | Label | Meaning |
74
+ |-------|-------------|
75
+ | 0 | Low |
76
+ | 1 | Medium |
77
+ | 2 | High |
78
+ | 3 | Critical |
79
+
80
+ ### ✏️ Sample Entries:
81
+
82
+ ```csv
83
+ Text,Label
84
+ "mac voiceover screen reader",3
85
+ "Firefox crashes when interacting with some MathML content using Voiceover on Mac",0
86
+ "VoiceOver skips over text in paragraphs which contain <strong> or <em> tags",2
87
+ ```
88
+
89
+
90
+ ## 📊 Model Comparison
91
+
92
+ We fine-tuned and evaluated three transformer models under identical training conditions using PyTorch Lightning (multi-GPU, mixed precision, and weighted loss). The validation accuracy and F1 scores are as follows:
93
+
94
+ | Model | Base Architecture | Validation Accuracy | Weighted F1 Score |
95
+ |-----------------|----------------------------|---------------------|-------------------|
96
+ | DeBERTa-v3 Base | microsoft/deberta-v3-base | **69%** | **0.69** |
97
+ | ALBERT Base | albert-base-v2 | 68% | 0.68 |
98
+ | RoBERTa Base | roberta-base | 66% | 0.67 |
99
+
100
+ ### 📝 Observations
101
+
102
+ - **DeBERTa** delivered the best performance, likely due to its *disentangled attention* and *enhanced positional encoding*.
103
+ - **ALBERT** performed surprisingly well despite having fewer parameters, showcasing its efficiency.
104
+ - **RoBERTa** provided stable and reliable results but slightly underperformed compared to the others.
105
+
106
+
107
+ # RoBERTa Base Model for Accessibility Priority Classification
108
+
109
+ This model fine-tunes `roberta-base` using a 4-class custom dataset to classify accessibility issues by priority. It was trained using PyTorch Lightning and optimized with mixed precision on multiple GPUs.
110
+
111
+ ## Details
112
+
113
+ - **Model**: roberta-base
114
+ - **Framework**: PyTorch Lightning
115
+ - **Labels**: 0 (Low), 1 (Medium), 2 (High), 3 (Critical)
116
+ - **Validation F1**: 0.71 (weighted)
117
+
118
+ ## Usage
119
+
120
+ ```python
121
+ from transformers import RobertaTokenizer, RobertaForSequenceClassification
122
+ import torch
123
+
124
+ model = RobertaForSequenceClassification.from_pretrained("your-username/roberta-priority-multiclass")
125
+ tokenizer = RobertaTokenizer.from_pretrained("your-username/roberta-priority-multiclass")
126
+
127
+ inputs = tokenizer("VoiceOver skips over text with <strong> tags", return_tensors="pt")
128
+ outputs = model(**inputs)
129
+ prediction = torch.argmax(outputs.logits, dim=1).item()
130
+
131
+ print("Predicted Priority:", prediction)
132
+ ```
133
+ ---
README.md CHANGED
@@ -1,11 +1,133 @@
1
  ---
2
  title: Bug Priority Multiclass
3
- emoji: 💻
4
- colorFrom: red
5
- colorTo: gray
6
  sdk: docker
7
  pinned: false
8
- short_description: This is a Multiclass Bug Priority Model
9
- ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
  title: Bug Priority Multiclass
3
+ emoji: 📚
4
+ colorFrom: green
5
+ colorTo: purple
6
  sdk: docker
7
  pinned: false
8
+ short_description: This model fine-tunes `roberta-base` using a labeled dataset
9
+
10
+ tags:
11
+ - text-classification
12
+ - accessibility
13
+ - bug-triage
14
+ - transformers
15
+ - roberta
16
+ - pytorch-lightning
17
+ license: apache-2.0
18
+ datasets:
19
+ - custom
20
+ language:
21
+ - en
22
+
23
+ # RoBERTa Base Model for Accessibility Bug Priority Classification
24
+
25
+ This model fine-tunes `roberta-base` using a labeled dataset of accessibility-related bug descriptions to automatically classify their **priority level**. It helps automate the triage of bugs affecting users of screen readers and other assistive technologies.
26
+
27
+
28
+ ## 🧠 Problem Statement
29
+
30
+ Modern applications often suffer from accessibility issues that impact users with disabilities, such as content not being read properly by screen readers like **VoiceOver**, **NVDA**, or **JAWS**. These bugs are often reported via issue trackers or user forums in the form of short text summaries.
31
+
32
+ Due to the unstructured and domain-specific nature of these reports, manual triage is:
33
+ - Time-consuming
34
+ - Inconsistent
35
+ - Often delayed in resolution
36
+
37
+ There is a critical need to **prioritize accessibility bugs quickly and accurately** to ensure inclusive user experiences.
38
+
39
+
40
+ ## 🎯 Research Objective
41
+
42
+ This research project builds a machine learning model that can **automatically assign a priority level** to an accessibility bug report. The goal is to:
43
+
44
+ - Streamline accessibility QA workflows
45
+ - Accelerate high-impact fixes
46
+ - Empower developers and testers with ML-assisted tooling
47
+
48
+ ## 📊 Dataset Statistics
49
+
50
+ The dataset used for training consists of real-world accessibility bug reports, each labeled with one of four priority levels. The distribution of labels is imbalanced, and label-aware preprocessing steps were taken to improve model performance.
51
+
52
+ | Label | Priority Level | Count |
53
+ |-------|----------------|-------|
54
+ | 1 | Medium | 2035 |
55
+ | 2 | High | 1465 |
56
+ | 0 | Low | 804 |
57
+ | 3 | Critical | 756 |
58
+
59
+ **Total Samples**: 5,060
60
+
61
+ ### 🧹 Preprocessing
62
+
63
+ - Text normalization and cleanup
64
+ - Length filtering based on token count
65
+ - Label frequency normalization for class-weighted loss
66
+
67
+ To address class imbalance, class weights were computed as inverse label frequency and used in the cross-entropy loss during training.
68
+
69
+ ## 🧪 Dataset Description
70
 
71
+ The dataset consists of short bug report texts labeled with one of four priority levels:
72
+
73
+ | Label | Meaning |
74
+ |-------|-------------|
75
+ | 0 | Low |
76
+ | 1 | Medium |
77
+ | 2 | High |
78
+ | 3 | Critical |
79
+
80
+ ### ✏️ Sample Entries:
81
+
82
+ ```csv
83
+ Text,Label
84
+ "mac voiceover screen reader",3
85
+ "Firefox crashes when interacting with some MathML content using Voiceover on Mac",0
86
+ "VoiceOver skips over text in paragraphs which contain <strong> or <em> tags",2
87
+ ```
88
+
89
+
90
+ ## 📊 Model Comparison
91
+
92
+ We fine-tuned and evaluated three transformer models under identical training conditions using PyTorch Lightning (multi-GPU, mixed precision, and weighted loss). The validation accuracy and F1 scores are as follows:
93
+
94
+ | Model | Base Architecture | Validation Accuracy | Weighted F1 Score |
95
+ |-----------------|----------------------------|---------------------|-------------------|
96
+ | DeBERTa-v3 Base | microsoft/deberta-v3-base | **69%** | **0.69** |
97
+ | ALBERT Base | albert-base-v2 | 68% | 0.68 |
98
+ | RoBERTa Base | roberta-base | 66% | 0.67 |
99
+
100
+ ### 📝 Observations
101
+
102
+ - **DeBERTa** delivered the best performance, likely due to its *disentangled attention* and *enhanced positional encoding*.
103
+ - **ALBERT** performed surprisingly well despite having fewer parameters, showcasing its efficiency.
104
+ - **RoBERTa** provided stable and reliable results but slightly underperformed compared to the others.
105
+
106
+
107
+ # RoBERTa Base Model for Accessibility Priority Classification
108
+
109
+ This model fine-tunes `roberta-base` using a 4-class custom dataset to classify accessibility issues by priority. It was trained using PyTorch Lightning and optimized with mixed precision on multiple GPUs.
110
+
111
+ ## Details
112
+
113
+ - **Model**: roberta-base
114
+ - **Framework**: PyTorch Lightning
115
+ - **Labels**: 0 (Low), 1 (Medium), 2 (High), 3 (Critical)
116
+ - **Validation F1**: 0.71 (weighted)
117
+
118
+ ## Usage
119
+
120
+ ```python
121
+ from transformers import RobertaTokenizer, RobertaForSequenceClassification
122
+ import torch
123
+
124
+ model = RobertaForSequenceClassification.from_pretrained("your-username/roberta-priority-multiclass")
125
+ tokenizer = RobertaTokenizer.from_pretrained("your-username/roberta-priority-multiclass")
126
+
127
+ inputs = tokenizer("VoiceOver skips over text with <strong> tags", return_tensors="pt")
128
+ outputs = model(**inputs)
129
+ prediction = torch.argmax(outputs.logits, dim=1).item()
130
+
131
+ print("Predicted Priority:", prediction)
132
+ ```
133
+ ---
Training/deberta.py ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import numpy as np
3
+ import torch
4
+ import torch.nn as nn
5
+ from torch.utils.data import DataLoader
6
+ from datasets import Dataset
7
+ from sklearn.model_selection import train_test_split
8
+ from sklearn.metrics import accuracy_score, f1_score, classification_report
9
+
10
+ import pytorch_lightning as pl
11
+ from pytorch_lightning.callbacks import ModelCheckpoint, EarlyStopping
12
+ from pytorch_lightning.strategies import DDPStrategy
13
+
14
+ from transformers import AutoTokenizer, AutoModel, DataCollatorWithPadding, get_cosine_schedule_with_warmup
15
+
16
+
17
+ class DebertaClassifier(pl.LightningModule):
18
+ def __init__(self, num_labels=4, lr=2e-5, class_weights=None):
19
+ super().__init__()
20
+ self.save_hyperparameters()
21
+ self.model = AutoModel.from_pretrained("microsoft/deberta-v3-large")
22
+ self.dropout = nn.Dropout(0.3)
23
+ self.classifier = nn.Sequential(
24
+ nn.LayerNorm(self.model.config.hidden_size),
25
+ nn.ReLU(),
26
+ nn.Dropout(0.2),
27
+ nn.Linear(self.model.config.hidden_size, num_labels)
28
+ )
29
+
30
+ if class_weights is not None:
31
+ weights = torch.tensor(class_weights, dtype=torch.float32)
32
+ self.loss_fn = nn.CrossEntropyLoss(weight=weights)
33
+ else:
34
+ self.loss_fn = nn.CrossEntropyLoss()
35
+
36
+ def forward(self, input_ids, attention_mask):
37
+ outputs = self.model(input_ids=input_ids, attention_mask=attention_mask)
38
+ cls_output = outputs.last_hidden_state[:, 0, :]
39
+ cls_output = self.dropout(cls_output)
40
+ return self.classifier(cls_output)
41
+
42
+ def training_step(self, batch, batch_idx):
43
+ input_ids, attention_mask, labels = batch["input_ids"], batch["attention_mask"], batch["labels"]
44
+ logits = self(input_ids, attention_mask)
45
+ loss = self.loss_fn(logits, labels)
46
+ preds = torch.argmax(logits, dim=1)
47
+ acc = accuracy_score(labels.cpu(), preds.cpu())
48
+ self.log("train_loss", loss, prog_bar=True)
49
+ self.log("train_acc", acc, prog_bar=True)
50
+ return loss
51
+
52
+ def validation_step(self, batch, batch_idx):
53
+ input_ids, attention_mask, labels = batch["input_ids"], batch["attention_mask"], batch["labels"]
54
+ logits = self(input_ids, attention_mask)
55
+ loss = self.loss_fn(logits, labels)
56
+ preds = torch.argmax(logits, dim=1)
57
+ acc = accuracy_score(labels.cpu(), preds.cpu())
58
+ f1 = f1_score(labels.cpu(), preds.cpu(), average='weighted')
59
+ self.log("val_loss", loss, prog_bar=True)
60
+ self.log("val_acc", acc, prog_bar=True)
61
+ self.log("val_f1", f1, prog_bar=True, sync_dist=True)
62
+
63
+ def configure_optimizers(self):
64
+ optimizer = torch.optim.AdamW(self.parameters(), lr=self.hparams.lr)
65
+ scheduler = get_cosine_schedule_with_warmup(
66
+ optimizer,
67
+ num_warmup_steps=100,
68
+ num_training_steps=self.trainer.estimated_stepping_batches
69
+ )
70
+ return {"optimizer": optimizer, "lr_scheduler": scheduler, "interval": "step"}
71
+
72
+
73
+ if __name__ == "__main__":
74
+ df = pd.read_csv("data_cleaned2.csv")
75
+ print(df.head())
76
+ class_counts = df["labels"].value_counts().sort_index().tolist()
77
+ class_weights = 1.0 / np.array(class_counts)
78
+ class_weights = class_weights / class_weights.sum()
79
+
80
+ train_df = df.sample(frac=0.8, random_state=42)
81
+ val_df = df.drop(train_df.index)
82
+
83
+ tokenizer = AutoTokenizer.from_pretrained("microsoft/deberta-v3-large")
84
+
85
+ def tokenize(batch):
86
+ return tokenizer(batch["text"], truncation=True)
87
+
88
+ train_dataset = Dataset.from_pandas(train_df).map(tokenize, batched=True)
89
+ val_dataset = Dataset.from_pandas(val_df).map(tokenize, batched=True)
90
+
91
+ train_dataset.set_format("torch", columns=["input_ids", "attention_mask", "labels"])
92
+ val_dataset.set_format("torch", columns=["input_ids", "attention_mask", "labels"])
93
+
94
+ data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
95
+ train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True, num_workers=8, collate_fn=data_collator)
96
+ val_loader = DataLoader(val_dataset, batch_size=16, num_workers=8, collate_fn=data_collator)
97
+
98
+ checkpoint_callback = ModelCheckpoint(
99
+ dirpath="checkpoints/",
100
+ filename="deberta3-{epoch:02d}-{val_f1:.2f}",
101
+ save_top_k=2,
102
+ monitor="val_f1",
103
+ mode="max",
104
+ save_weights_only=True,
105
+ every_n_epochs=1
106
+ )
107
+
108
+ early_stopping = EarlyStopping(
109
+ monitor="val_f1",
110
+ patience=3,
111
+ mode="max",
112
+ verbose=True,
113
+ )
114
+
115
+ trainer = pl.Trainer(
116
+ accelerator="gpu",
117
+ devices=2,
118
+ strategy=DDPStrategy(find_unused_parameters=False),
119
+ max_epochs=10,
120
+ precision=16,
121
+ log_every_n_steps=10,
122
+ callbacks=[checkpoint_callback, early_stopping],
123
+ )
124
+
125
+ model = DebertaClassifier(class_weights=class_weights)
126
+ trainer.fit(model, train_loader, val_loader)
Training/model.py ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import numpy as np
3
+ import torch
4
+ import torch.nn as nn
5
+ from torch.utils.data import DataLoader
6
+ from sklearn.model_selection import train_test_split
7
+ from sklearn.metrics import accuracy_score, f1_score
8
+ from datasets import Dataset
9
+
10
+ import pytorch_lightning as pl
11
+ from transformers import RobertaTokenizer, RobertaModel
12
+ from pytorch_lightning.callbacks import ModelCheckpoint, EarlyStopping
13
+ from pytorch_lightning.strategies import DDPStrategy
14
+
15
+
16
+ class RoBERTaClassifier(pl.LightningModule):
17
+ def __init__(self, num_labels=4, lr=2e-5, class_weights=None):
18
+ super().__init__()
19
+ self.save_hyperparameters()
20
+ self.model = RobertaModel.from_pretrained("roberta-base", add_pooling_layer=False)
21
+ self.dropout = nn.Dropout(0.3)
22
+ self.classifier = nn.Linear(self.model.config.hidden_size, num_labels)
23
+
24
+ if class_weights is not None:
25
+ weights = torch.tensor(class_weights, dtype=torch.float32)
26
+ self.loss_fn = nn.CrossEntropyLoss(weight=weights)
27
+ else:
28
+ self.loss_fn = nn.CrossEntropyLoss()
29
+
30
+ def forward(self, input_ids, attention_mask):
31
+ outputs = self.model(input_ids=input_ids, attention_mask=attention_mask)
32
+ cls_output = outputs.last_hidden_state[:, 0, :]
33
+ cls_output = self.dropout(cls_output)
34
+ return self.classifier(cls_output)
35
+
36
+ def training_step(self, batch, batch_idx):
37
+ input_ids, attention_mask, labels = batch["input_ids"], batch["attention_mask"], batch["label"]
38
+ logits = self(input_ids, attention_mask)
39
+ loss = self.loss_fn(logits, labels)
40
+ preds = torch.argmax(logits, dim=1)
41
+ acc = accuracy_score(labels.cpu(), preds.cpu())
42
+ self.log("train_loss", loss, prog_bar=True)
43
+ self.log("train_acc", acc, prog_bar=True)
44
+ return loss
45
+
46
+ def validation_step(self, batch, batch_idx):
47
+ input_ids, attention_mask, labels = batch["input_ids"], batch["attention_mask"], batch["label"]
48
+ logits = self(input_ids, attention_mask)
49
+ loss = self.loss_fn(logits, labels)
50
+ preds = torch.argmax(logits, dim=1)
51
+ acc = accuracy_score(labels.cpu(), preds.cpu())
52
+ f1 = f1_score(labels.cpu(), preds.cpu(), average='weighted')
53
+ self.log("val_loss", loss, prog_bar=True)
54
+ self.log("val_acc", acc, prog_bar=True)
55
+ self.log("val_f1", f1, prog_bar=True, sync_dist=True)
56
+
57
+ def configure_optimizers(self):
58
+ return torch.optim.AdamW(self.parameters(), lr=self.hparams.lr)
59
+
60
+
61
+ if __name__ == "__main__":
62
+ df = pd.read_csv("data_cleaned2.csv")
63
+
64
+ class_counts = df["label"].value_counts().sort_index().tolist()
65
+ class_weights = 1.0 / np.array(class_counts)
66
+ class_weights = class_weights / class_weights.sum()
67
+
68
+ train_df = df.sample(frac=0.8, random_state=42)
69
+ val_df = df.drop(train_df.index)
70
+
71
+ tokenizer = RobertaTokenizer.from_pretrained("roberta-base")
72
+
73
+ def tokenize(batch):
74
+ return tokenizer(batch["text"], truncation=True, padding="max_length", max_length=64)
75
+
76
+ train_dataset = Dataset.from_pandas(train_df).map(tokenize, batched=True)
77
+ val_dataset = Dataset.from_pandas(val_df).map(tokenize, batched=True)
78
+
79
+ train_dataset.set_format("torch", columns=["input_ids", "attention_mask", "label"])
80
+ val_dataset.set_format("torch", columns=["input_ids", "attention_mask", "label"])
81
+
82
+ train_loader = DataLoader(train_dataset, batch_size=16, num_workers=8, shuffle=True)
83
+ val_loader = DataLoader(val_dataset, batch_size=16, num_workers=8)
84
+
85
+ checkpoint_callback = ModelCheckpoint(
86
+ dirpath="checkpoints/",
87
+ filename="roberta-priority-{epoch:02d}-{val_f1:.2f}",
88
+ save_top_k=3,
89
+ monitor="val_f1",
90
+ mode="max",
91
+ save_weights_only=True,
92
+ every_n_epochs=1
93
+ )
94
+
95
+ early_stopping = EarlyStopping(
96
+ monitor="val_f1",
97
+ patience=2,
98
+ mode="max",
99
+ verbose=True,
100
+ )
101
+
102
+ trainer_kwargs = dict(
103
+ accelerator="gpu",
104
+ devices=2,
105
+ strategy=DDPStrategy(find_unused_parameters=True),
106
+ max_epochs=20,
107
+ precision=16,
108
+ log_every_n_steps=10,
109
+ callbacks=[checkpoint_callback, early_stopping],
110
+ )
111
+
112
+ trainer = pl.Trainer(**trainer_kwargs)
113
+ model = RoBERTaClassifier(class_weights=class_weights)
114
+
115
+ trainer.fit(model, train_loader, val_loader)
app.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI
2
+ from pydantic import BaseModel
3
+ from classifier.Bug_Priority import get_model
4
+ from fastapi.responses import PlainTextResponse
5
+
6
+ app = FastAPI()
7
+ model = get_model()
8
+
9
+ # Request body schema
10
+ class Issue(BaseModel):
11
+ text: str
12
+
13
+ PRIORITY_LABELS = ["Low", "Medium", "High", "Critical"]
14
+
15
+ @app.post("/predict")
16
+ async def predict(issue: Issue):
17
+ probs, predicted_label = model.predict(issue.text)
18
+ return {
19
+ "input_text": issue.text,
20
+ "predicted_label": predicted_label,
21
+ "label_index": PRIORITY_LABELS.index(predicted_label),
22
+ "confidence_scores": {
23
+ PRIORITY_LABELS[i]: f"{probs[i]:.4f}" for i in range(len(PRIORITY_LABELS))
24
+ }
25
+ }
26
+
27
+ @app.get("/", response_class=PlainTextResponse)
28
+ def root():
29
+ with open("README.md", "r") as f:
30
+ return f.read()
assets/roberta-priority-epoch=06-val_f1=0.72.ckpt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d7b19ddbb19ce104a6ac94f8a7ee103330dde7a1b94a113c17ff7692a6243a40
3
+ size 496315810
classifier/Bug_Priority.py ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from transformers import RobertaTokenizer, RobertaForSequenceClassification
2
+ import torch
3
+ import numpy as np
4
+
5
+ class Model:
6
+ def __init__(self, model_weights):
7
+ self.tokenizer = RobertaTokenizer.from_pretrained('roberta-base')
8
+ self.model = RobertaForSequenceClassification.from_pretrained('roberta-base', num_labels=4)
9
+ self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
10
+
11
+ # ✅ Load Lightning checkpoint
12
+ checkpoint = torch.load(model_weights, map_location=self.device)
13
+ state_dict = checkpoint.get("state_dict", checkpoint)
14
+
15
+ # ✅ Remove 'model.' prefix used by LightningModule
16
+ filtered_state_dict = {
17
+ k.replace("model.", ""): v
18
+ for k, v in state_dict.items()
19
+ if k.startswith("model.")
20
+ }
21
+
22
+ # ✅ Load weights into Hugging Face model
23
+ self.model.load_state_dict(filtered_state_dict, strict=False)
24
+
25
+ self.currepoch = checkpoint.get("epoch", "N/A")
26
+ self.loss = checkpoint.get("loss", "N/A")
27
+
28
+ print(f"✅ Loaded model state — Epoch: {self.currepoch}, Loss: {self.loss}")
29
+
30
+ self.model.to(self.device)
31
+ self.model.eval()
32
+
33
+ self.labels = ["Low", "Medium", "High", "Critical"]
34
+
35
+ def predict(self, text):
36
+ inputs = self.tokenizer(text, return_tensors='pt', padding=True, truncation=True, max_length=512)
37
+ inputs = {k: v.to(self.device) for k, v in inputs.items()}
38
+
39
+ with torch.no_grad():
40
+ outputs = self.model(**inputs)
41
+
42
+ logits = outputs.logits
43
+ probs = torch.nn.functional.softmax(logits, dim=-1)
44
+ predicted_label = self.labels[torch.argmax(probs).item()]
45
+ return probs[0].tolist(), predicted_label
46
+
47
+ # Singleton instance
48
+ model_instance = None
49
+ model_weights = "assets/roberta-priority-epoch=06-val_f1=0.72.ckpt" # Update path if needed
50
+
51
+ def get_model():
52
+ global model_instance
53
+ if model_instance is None:
54
+ model_instance = Model(model_weights)
55
+ return model_instance
data_cleaned2.csv ADDED
The diff for this file is too large to render. See raw diff
 
datapreprocessing.ipynb ADDED
@@ -0,0 +1,513 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import pandas as pd"
10
+ ]
11
+ },
12
+ {
13
+ "cell_type": "code",
14
+ "execution_count": 2,
15
+ "metadata": {},
16
+ "outputs": [
17
+ {
18
+ "name": "stdout",
19
+ "output_type": "stream",
20
+ "text": [
21
+ "albert_multiclass.ipynb data.csv\n",
22
+ "albert_sentiment_checkpoint_100.pt datapreprocessing.ipynb\n",
23
+ "albert_sentiment_checkpoint_96.pt deberta.py\n",
24
+ "albert_sentiment_checkpoint_97.pt evaludate_roberta.py\n",
25
+ "albert_sentiment_checkpoint_98.pt \u001b[0m\u001b[01;34mlightning_logs\u001b[0m/\n",
26
+ "albert_sentiment_checkpoint_99.pt model.py\n",
27
+ "\u001b[01;34mbug_priority_multiclass\u001b[0m/ newdata.csv\n",
28
+ "bug_priority_multiclass.zip preProcessed.csv\n",
29
+ "\u001b[01;34mcheckpoints\u001b[0m/ Pri_Android_A11y.xlsx\n",
30
+ "data_cleaned2.csv \u001b[01;34m__pycache__\u001b[0m/\n",
31
+ "data_cleaned.csv\n"
32
+ ]
33
+ }
34
+ ],
35
+ "source": [
36
+ "ls"
37
+ ]
38
+ },
39
+ {
40
+ "cell_type": "code",
41
+ "execution_count": 4,
42
+ "metadata": {},
43
+ "outputs": [],
44
+ "source": [
45
+ "df=pd.read_csv('./data_cleaned2.csv')"
46
+ ]
47
+ },
48
+ {
49
+ "cell_type": "code",
50
+ "execution_count": 5,
51
+ "metadata": {},
52
+ "outputs": [
53
+ {
54
+ "data": {
55
+ "text/html": [
56
+ "<div>\n",
57
+ "<style scoped>\n",
58
+ " .dataframe tbody tr th:only-of-type {\n",
59
+ " vertical-align: middle;\n",
60
+ " }\n",
61
+ "\n",
62
+ " .dataframe tbody tr th {\n",
63
+ " vertical-align: top;\n",
64
+ " }\n",
65
+ "\n",
66
+ " .dataframe thead th {\n",
67
+ " text-align: right;\n",
68
+ " }\n",
69
+ "</style>\n",
70
+ "<table border=\"1\" class=\"dataframe\">\n",
71
+ " <thead>\n",
72
+ " <tr style=\"text-align: right;\">\n",
73
+ " <th></th>\n",
74
+ " <th>text</th>\n",
75
+ " <th>labels</th>\n",
76
+ " <th>textlen</th>\n",
77
+ " </tr>\n",
78
+ " </thead>\n",
79
+ " <tbody>\n",
80
+ " <tr>\n",
81
+ " <th>0</th>\n",
82
+ " <td>VoiceOver skips over text in paragraphs which ...</td>\n",
83
+ " <td>2</td>\n",
84
+ " <td>12</td>\n",
85
+ " </tr>\n",
86
+ " <tr>\n",
87
+ " <th>1</th>\n",
88
+ " <td>AXEnhancedUserInterface breaks window managers...</td>\n",
89
+ " <td>2</td>\n",
90
+ " <td>14</td>\n",
91
+ " </tr>\n",
92
+ " <tr>\n",
93
+ " <th>2</th>\n",
94
+ " <td>mac voiceover screen reader</td>\n",
95
+ " <td>3</td>\n",
96
+ " <td>4</td>\n",
97
+ " </tr>\n",
98
+ " <tr>\n",
99
+ " <th>3</th>\n",
100
+ " <td>when using firefox on mac with voiceover you c...</td>\n",
101
+ " <td>2</td>\n",
102
+ " <td>13</td>\n",
103
+ " </tr>\n",
104
+ " <tr>\n",
105
+ " <th>4</th>\n",
106
+ " <td>Children of HTML label element are read 3 time...</td>\n",
107
+ " <td>2</td>\n",
108
+ " <td>11</td>\n",
109
+ " </tr>\n",
110
+ " </tbody>\n",
111
+ "</table>\n",
112
+ "</div>"
113
+ ],
114
+ "text/plain": [
115
+ " text labels textlen\n",
116
+ "0 VoiceOver skips over text in paragraphs which ... 2 12\n",
117
+ "1 AXEnhancedUserInterface breaks window managers... 2 14\n",
118
+ "2 mac voiceover screen reader 3 4\n",
119
+ "3 when using firefox on mac with voiceover you c... 2 13\n",
120
+ "4 Children of HTML label element are read 3 time... 2 11"
121
+ ]
122
+ },
123
+ "execution_count": 5,
124
+ "metadata": {},
125
+ "output_type": "execute_result"
126
+ }
127
+ ],
128
+ "source": [
129
+ "df.head()"
130
+ ]
131
+ },
132
+ {
133
+ "cell_type": "code",
134
+ "execution_count": 19,
135
+ "metadata": {},
136
+ "outputs": [],
137
+ "source": [
138
+ "df.rename(columns={'Kevin_Pri':'label','Summary':'text'}, inplace=True)"
139
+ ]
140
+ },
141
+ {
142
+ "cell_type": "code",
143
+ "execution_count": 6,
144
+ "metadata": {},
145
+ "outputs": [
146
+ {
147
+ "data": {
148
+ "text/html": [
149
+ "<div>\n",
150
+ "<style scoped>\n",
151
+ " .dataframe tbody tr th:only-of-type {\n",
152
+ " vertical-align: middle;\n",
153
+ " }\n",
154
+ "\n",
155
+ " .dataframe tbody tr th {\n",
156
+ " vertical-align: top;\n",
157
+ " }\n",
158
+ "\n",
159
+ " .dataframe thead th {\n",
160
+ " text-align: right;\n",
161
+ " }\n",
162
+ "</style>\n",
163
+ "<table border=\"1\" class=\"dataframe\">\n",
164
+ " <thead>\n",
165
+ " <tr style=\"text-align: right;\">\n",
166
+ " <th></th>\n",
167
+ " <th>text</th>\n",
168
+ " <th>labels</th>\n",
169
+ " <th>textlen</th>\n",
170
+ " </tr>\n",
171
+ " </thead>\n",
172
+ " <tbody>\n",
173
+ " <tr>\n",
174
+ " <th>0</th>\n",
175
+ " <td>VoiceOver skips over text in paragraphs which ...</td>\n",
176
+ " <td>2</td>\n",
177
+ " <td>12</td>\n",
178
+ " </tr>\n",
179
+ " <tr>\n",
180
+ " <th>1</th>\n",
181
+ " <td>AXEnhancedUserInterface breaks window managers...</td>\n",
182
+ " <td>2</td>\n",
183
+ " <td>14</td>\n",
184
+ " </tr>\n",
185
+ " <tr>\n",
186
+ " <th>2</th>\n",
187
+ " <td>mac voiceover screen reader</td>\n",
188
+ " <td>3</td>\n",
189
+ " <td>4</td>\n",
190
+ " </tr>\n",
191
+ " <tr>\n",
192
+ " <th>3</th>\n",
193
+ " <td>when using firefox on mac with voiceover you c...</td>\n",
194
+ " <td>2</td>\n",
195
+ " <td>13</td>\n",
196
+ " </tr>\n",
197
+ " <tr>\n",
198
+ " <th>4</th>\n",
199
+ " <td>Children of HTML label element are read 3 time...</td>\n",
200
+ " <td>2</td>\n",
201
+ " <td>11</td>\n",
202
+ " </tr>\n",
203
+ " </tbody>\n",
204
+ "</table>\n",
205
+ "</div>"
206
+ ],
207
+ "text/plain": [
208
+ " text labels textlen\n",
209
+ "0 VoiceOver skips over text in paragraphs which ... 2 12\n",
210
+ "1 AXEnhancedUserInterface breaks window managers... 2 14\n",
211
+ "2 mac voiceover screen reader 3 4\n",
212
+ "3 when using firefox on mac with voiceover you c... 2 13\n",
213
+ "4 Children of HTML label element are read 3 time... 2 11"
214
+ ]
215
+ },
216
+ "execution_count": 6,
217
+ "metadata": {},
218
+ "output_type": "execute_result"
219
+ }
220
+ ],
221
+ "source": [
222
+ "df.head()"
223
+ ]
224
+ },
225
+ {
226
+ "cell_type": "code",
227
+ "execution_count": 7,
228
+ "metadata": {},
229
+ "outputs": [],
230
+ "source": [
231
+ "df['textlen']= df['text'].apply(lambda x: len(x.split()))\n"
232
+ ]
233
+ },
234
+ {
235
+ "cell_type": "code",
236
+ "execution_count": 8,
237
+ "metadata": {},
238
+ "outputs": [
239
+ {
240
+ "ename": "KeyError",
241
+ "evalue": "'label'",
242
+ "output_type": "error",
243
+ "traceback": [
244
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
245
+ "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
246
+ "File \u001b[0;32m~/miniconda3/envs/albert/lib/python3.12/site-packages/pandas/core/indexes/base.py:3805\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3804\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 3805\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcasted_key\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3806\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n",
247
+ "File \u001b[0;32mindex.pyx:167\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n",
248
+ "File \u001b[0;32mindex.pyx:196\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n",
249
+ "File \u001b[0;32mpandas/_libs/hashtable_class_helper.pxi:7081\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n",
250
+ "File \u001b[0;32mpandas/_libs/hashtable_class_helper.pxi:7089\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n",
251
+ "\u001b[0;31mKeyError\u001b[0m: 'label'",
252
+ "\nThe above exception was the direct cause of the following exception:\n",
253
+ "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
254
+ "Cell \u001b[0;32mIn[8], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlabel\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m=\u001b[39m \u001b[43mdf\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mlabel\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m\n",
255
+ "File \u001b[0;32m~/miniconda3/envs/albert/lib/python3.12/site-packages/pandas/core/frame.py:4102\u001b[0m, in \u001b[0;36mDataFrame.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 4100\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcolumns\u001b[38;5;241m.\u001b[39mnlevels \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m 4101\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_getitem_multilevel(key)\n\u001b[0;32m-> 4102\u001b[0m indexer \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcolumns\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 4103\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_integer(indexer):\n\u001b[1;32m 4104\u001b[0m indexer \u001b[38;5;241m=\u001b[39m [indexer]\n",
256
+ "File \u001b[0;32m~/miniconda3/envs/albert/lib/python3.12/site-packages/pandas/core/indexes/base.py:3812\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3807\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(casted_key, \u001b[38;5;28mslice\u001b[39m) \u001b[38;5;129;01mor\u001b[39;00m (\n\u001b[1;32m 3808\u001b[0m \u001b[38;5;28misinstance\u001b[39m(casted_key, abc\u001b[38;5;241m.\u001b[39mIterable)\n\u001b[1;32m 3809\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28many\u001b[39m(\u001b[38;5;28misinstance\u001b[39m(x, \u001b[38;5;28mslice\u001b[39m) \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m casted_key)\n\u001b[1;32m 3810\u001b[0m ):\n\u001b[1;32m 3811\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m InvalidIndexError(key)\n\u001b[0;32m-> 3812\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 3813\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[1;32m 3814\u001b[0m \u001b[38;5;66;03m# If we have a listlike key, _check_indexing_error will raise\u001b[39;00m\n\u001b[1;32m 3815\u001b[0m \u001b[38;5;66;03m# InvalidIndexError. Otherwise we fall through and re-raise\u001b[39;00m\n\u001b[1;32m 3816\u001b[0m \u001b[38;5;66;03m# the TypeError.\u001b[39;00m\n\u001b[1;32m 3817\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_check_indexing_error(key)\n",
257
+ "\u001b[0;31mKeyError\u001b[0m: 'label'"
258
+ ]
259
+ }
260
+ ],
261
+ "source": [
262
+ "df['label']= df['label']-1"
263
+ ]
264
+ },
265
+ {
266
+ "cell_type": "code",
267
+ "execution_count": 9,
268
+ "metadata": {},
269
+ "outputs": [
270
+ {
271
+ "data": {
272
+ "image/png": "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",
273
+ "text/plain": [
274
+ "<Figure size 640x480 with 1 Axes>"
275
+ ]
276
+ },
277
+ "metadata": {},
278
+ "output_type": "display_data"
279
+ }
280
+ ],
281
+ "source": [
282
+ "df['textlen'].hist(bins=50)\n",
283
+ "import matplotlib.pyplot as plt\n",
284
+ "plt.show()"
285
+ ]
286
+ },
287
+ {
288
+ "cell_type": "code",
289
+ "execution_count": 10,
290
+ "metadata": {},
291
+ "outputs": [
292
+ {
293
+ "data": {
294
+ "text/plain": [
295
+ "count 5060.00000\n",
296
+ "mean 9.63083\n",
297
+ "std 4.25744\n",
298
+ "min 1.00000\n",
299
+ "25% 7.00000\n",
300
+ "50% 9.00000\n",
301
+ "75% 12.00000\n",
302
+ "max 43.00000\n",
303
+ "Name: textlen, dtype: float64"
304
+ ]
305
+ },
306
+ "execution_count": 10,
307
+ "metadata": {},
308
+ "output_type": "execute_result"
309
+ }
310
+ ],
311
+ "source": [
312
+ "df['textlen'].describe()\n"
313
+ ]
314
+ },
315
+ {
316
+ "cell_type": "code",
317
+ "execution_count": 12,
318
+ "metadata": {},
319
+ "outputs": [
320
+ {
321
+ "data": {
322
+ "image/png": "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",
323
+ "text/plain": [
324
+ "<Figure size 640x480 with 1 Axes>"
325
+ ]
326
+ },
327
+ "metadata": {},
328
+ "output_type": "display_data"
329
+ },
330
+ {
331
+ "data": {
332
+ "text/plain": [
333
+ "labels\n",
334
+ "1 2035\n",
335
+ "2 1465\n",
336
+ "0 804\n",
337
+ "3 756\n",
338
+ "Name: count, dtype: int64"
339
+ ]
340
+ },
341
+ "execution_count": 12,
342
+ "metadata": {},
343
+ "output_type": "execute_result"
344
+ }
345
+ ],
346
+ "source": [
347
+ "df['labels'].value_counts().plot(kind='bar')\n",
348
+ "plt.show()\n",
349
+ "df['labels'].value_counts()"
350
+ ]
351
+ },
352
+ {
353
+ "cell_type": "code",
354
+ "execution_count": 26,
355
+ "metadata": {},
356
+ "outputs": [],
357
+ "source": [
358
+ "df = df[df['textlen'] >= 10]\n"
359
+ ]
360
+ },
361
+ {
362
+ "cell_type": "code",
363
+ "execution_count": 27,
364
+ "metadata": {},
365
+ "outputs": [
366
+ {
367
+ "data": {
368
+ "text/plain": [
369
+ "<Axes: >"
370
+ ]
371
+ },
372
+ "execution_count": 27,
373
+ "metadata": {},
374
+ "output_type": "execute_result"
375
+ },
376
+ {
377
+ "data": {
378
+ "image/png": "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",
379
+ "text/plain": [
380
+ "<Figure size 640x480 with 1 Axes>"
381
+ ]
382
+ },
383
+ "metadata": {},
384
+ "output_type": "display_data"
385
+ }
386
+ ],
387
+ "source": [
388
+ "df['textlen'].hist(bins=50)"
389
+ ]
390
+ },
391
+ {
392
+ "cell_type": "code",
393
+ "execution_count": 28,
394
+ "metadata": {},
395
+ "outputs": [],
396
+ "source": [
397
+ "df.to_csv('data_cleaned.csv', index=False)"
398
+ ]
399
+ },
400
+ {
401
+ "cell_type": "code",
402
+ "execution_count": 29,
403
+ "metadata": {},
404
+ "outputs": [
405
+ {
406
+ "data": {
407
+ "text/html": [
408
+ "<div>\n",
409
+ "<style scoped>\n",
410
+ " .dataframe tbody tr th:only-of-type {\n",
411
+ " vertical-align: middle;\n",
412
+ " }\n",
413
+ "\n",
414
+ " .dataframe tbody tr th {\n",
415
+ " vertical-align: top;\n",
416
+ " }\n",
417
+ "\n",
418
+ " .dataframe thead th {\n",
419
+ " text-align: right;\n",
420
+ " }\n",
421
+ "</style>\n",
422
+ "<table border=\"1\" class=\"dataframe\">\n",
423
+ " <thead>\n",
424
+ " <tr style=\"text-align: right;\">\n",
425
+ " <th></th>\n",
426
+ " <th>label</th>\n",
427
+ " <th>text</th>\n",
428
+ " <th>textlen</th>\n",
429
+ " </tr>\n",
430
+ " </thead>\n",
431
+ " <tbody>\n",
432
+ " <tr>\n",
433
+ " <th>1</th>\n",
434
+ " <td>2</td>\n",
435
+ " <td>focus should go to the web content after acti...</td>\n",
436
+ " <td>11</td>\n",
437
+ " </tr>\n",
438
+ " <tr>\n",
439
+ " <th>8</th>\n",
440
+ " <td>0</td>\n",
441
+ " <td>Aria-owns crash if the ID of an owned element ...</td>\n",
442
+ " <td>10</td>\n",
443
+ " </tr>\n",
444
+ " <tr>\n",
445
+ " <th>9</th>\n",
446
+ " <td>1</td>\n",
447
+ " <td>Regression in presubmit.py checking of accessi...</td>\n",
448
+ " <td>11</td>\n",
449
+ " </tr>\n",
450
+ " <tr>\n",
451
+ " <th>14</th>\n",
452
+ " <td>2</td>\n",
453
+ " <td>Label names when they embed a control are not ...</td>\n",
454
+ " <td>10</td>\n",
455
+ " </tr>\n",
456
+ " <tr>\n",
457
+ " <th>15</th>\n",
458
+ " <td>2</td>\n",
459
+ " <td>TalkBack doesn't read the text of the popup di...</td>\n",
460
+ " <td>12</td>\n",
461
+ " </tr>\n",
462
+ " </tbody>\n",
463
+ "</table>\n",
464
+ "</div>"
465
+ ],
466
+ "text/plain": [
467
+ " label text textlen\n",
468
+ "1 2 focus should go to the web content after acti... 11\n",
469
+ "8 0 Aria-owns crash if the ID of an owned element ... 10\n",
470
+ "9 1 Regression in presubmit.py checking of accessi... 11\n",
471
+ "14 2 Label names when they embed a control are not ... 10\n",
472
+ "15 2 TalkBack doesn't read the text of the popup di... 12"
473
+ ]
474
+ },
475
+ "execution_count": 29,
476
+ "metadata": {},
477
+ "output_type": "execute_result"
478
+ }
479
+ ],
480
+ "source": [
481
+ "df.head()"
482
+ ]
483
+ },
484
+ {
485
+ "cell_type": "code",
486
+ "execution_count": null,
487
+ "metadata": {},
488
+ "outputs": [],
489
+ "source": []
490
+ }
491
+ ],
492
+ "metadata": {
493
+ "kernelspec": {
494
+ "display_name": "albert",
495
+ "language": "python",
496
+ "name": "python3"
497
+ },
498
+ "language_info": {
499
+ "codemirror_mode": {
500
+ "name": "ipython",
501
+ "version": 3
502
+ },
503
+ "file_extension": ".py",
504
+ "mimetype": "text/x-python",
505
+ "name": "python",
506
+ "nbconvert_exporter": "python",
507
+ "pygments_lexer": "ipython3",
508
+ "version": "3.12.3"
509
+ }
510
+ },
511
+ "nbformat": 4,
512
+ "nbformat_minor": 2
513
+ }
requirements.txt ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ anyio==3.5.0
2
+ asgiref==3.5.0
3
+ certifi==2021.10.8
4
+ charset-normalizer==2.0.12
5
+ click==8.0.4
6
+ colorama==0.4.4
7
+ fastapi==0.75.0
8
+ filelock==3.6.0
9
+ gunicorn==20.1.0
10
+ h11==0.13.0
11
+ huggingface-hub==0.4.0
12
+ idna==3.3
13
+ joblib==1.1.0
14
+ numpy==1.22.3
15
+ packaging==21.3
16
+ pydantic==1.9.0
17
+ pyparsing==3.0.7
18
+ PyYAML==6.0
19
+ regex==2022.3.15
20
+ requests==2.27.1
21
+ sacremoses==0.0.49
22
+ sentencepiece==0.1.96
23
+ six==1.16.0
24
+ sniffio==1.2.0
25
+ starlette==0.17.1
26
+ tokenizers==0.11.6
27
+ --find-links https://download.pytorch.org/whl/torch_stable.html
28
+ torch==1.11.0+cpu
29
+ tqdm==4.63.0
30
+ transformers==4.17.0
31
+ typing_extensions==4.1.1
32
+ urllib3==1.26.8
33
+ uvicorn==0.17.6