Commit
·
7b41c88
1
Parent(s):
389f9b6
created Bug Priority model and hugging face deployment read project
Browse files- .gitattributes copy +35 -0
- Dockerfile +16 -0
- README copy.md +133 -0
- README.md +128 -6
- Training/deberta.py +126 -0
- Training/model.py +115 -0
- app.py +30 -0
- assets/roberta-priority-epoch=06-val_f1=0.72.ckpt +3 -0
- classifier/Bug_Priority.py +55 -0
- data_cleaned2.csv +0 -0
- datapreprocessing.ipynb +513 -0
- requirements.txt +33 -0
.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:
|
5 |
-
colorTo:
|
6 |
sdk: docker
|
7 |
pinned: false
|
8 |
-
short_description: This
|
9 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|