File size: 6,407 Bytes
58b12cc
 
0e7fc7e
 
 
 
c2093a4
0e7fc7e
58b12cc
0e7fc7e
c2093a4
0e7fc7e
c2093a4
0e7fc7e
 
 
 
 
c2093a4
0e7fc7e
 
 
c2093a4
0e7fc7e
 
 
 
 
 
 
 
 
c2093a4
 
0e7fc7e
 
 
 
 
 
c2093a4
0e7fc7e
 
 
 
 
 
 
c2093a4
0e7fc7e
 
 
c2093a4
 
0e7fc7e
 
 
 
 
 
 
 
 
 
 
 
 
c2093a4
 
0e7fc7e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c2093a4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0e7fc7e
c2093a4
 
 
0e7fc7e
 
 
 
 
c2093a4
0e7fc7e
c2093a4
0e7fc7e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
---
license: apache-2.0
tags:
- ESG
- finance
language:
- ru

---
![esgify](ESGify.png)
# About ESGify_ru
<img src="ESGify_logo.jpeg" alt="image" width="20%" height="auto">
**ESGify_ru** is a model for multilabel russian language news classification with respect to ESG risks. Our custom methodology includes 46 ESG classes, 1 non-relevant to ESG class and Positive news class, resulting in 48 classes in total:

![esgify_classes](ESGify_classes.jpg)

# Usage 

ESGify is based on ruBert architecture but with a custom classification head. The ESGify_ru class is defined is follows.

```python
from collections import OrderedDict
from transformers import BertPreTrainedModel, BertModel, AutoTokenizer
import torch

# Mean Pooling - Take attention mask into account for correct averaging
def mean_pooling(model_output, attention_mask):
        token_embeddings = model_output #First element of model_output contains all token embeddings
        input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
        return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)

# Definition of ESGify class because of custom,sentence-transformers like, mean pooling function and classifier head
class ESGify_ru(BertPreTrainedModel):
    """Model for Classification ESG risks from russian language text."""

    def __init__(self,config): #tuning only the head
        """
        """
        super().__init__(config)
        # Instantiate Parts of model
        self.bert = BertModel(config,add_pooling_layer=False)
        self.id2label =  config.id2label
        self.label2id =  config.label2id
        self.classifier = torch.nn.Sequential(OrderedDict([('norm',torch.nn.BatchNorm1d(768)),
                                                ('linear',torch.nn.Linear(768,512)),
                                                ('act',torch.nn.ReLU()),
                                                ('batch_n',torch.nn.BatchNorm1d(512)),
                                                ('drop_class', torch.nn.Dropout(0.2)),
                                                ('class_l',torch.nn.Linear(512 ,48))]))


    def forward(self, input_ids, attention_mask):
         # Feed input to bert model
        outputs = self.bert(input_ids=input_ids,
                             attention_mask=attention_mask)
         
        # mean pooling dataset and eed input to classifier to compute logits
        logits = self.classifier( mean_pooling(outputs['last_hidden_state'],attention_mask))
         
        # apply sigmoid
        logits  = 1.0 / (1.0 + torch.exp(-logits))
        return logits
```

After defining model class, we initialize ESGify and tokenizer with the pre-trained weights

```python
model = ESGify_ru.from_pretrained('ai-lab/ESGify_ru')
tokenizer = AutoTokenizer.from_pretrained('ai-lab/ESGify_ru')
```

Getting results from the model:

```python
texts = ['text1','text2']
to_model = tokenizer.batch_encode_plus(
                  texts,
                  add_special_tokens=True,
                  max_length=512,
                  return_token_type_ids=False,
                  padding="max_length",
                  truncation=True,
                  return_attention_mask=True,
                  return_tensors='pt',
                )
results = model(**to_model)
```

To identify top-3 classes by relevance and their scores: 

```python
for i in torch.topk(results, k=3).indices.tolist()[0]:
    print(f"{model.id2label[i]}: {np.round(results.flatten()[i].item(), 3)}")
```

For example, for the news:
'''Профсоюз попросил "Аэрофлот" пересмотреть систему оплаты труда пилотов.
Профсоюз летного состава предупредил "Аэрофлот" о риске дефицита пилотов из-за низких зарплат.
Шереметьевский профсоюз летного состава (ШПЛС) написал письмо гендиректору "Аэрофлота" Михаилу Полубояринову,
призвав пересмотреть систему оплаты работы пилотов, обращение размещено на сайте профсоюза.
Как пояснил глава профсоюза Игорь Дельдюжов, новые правила оплаты труда, в которых сокращена доплата за час полетного времени,
вступили в силу в начале прошлого года на фоне снижения объема перевозок пассажиров из-за пандемии коронавируса. 
Тогда летный состав согласился на новые условия оплаты, учитывая сложную ситуацию, в которой оказались авиаперевозчики.
Однако теперь, как говорится в обращении, объемы авиаперевозок по России достигли допандемийного уровня,
возобновляется и международное авиасообщение, у летного состава растет нагрузка, однако зарплата при этом пропорционально не растет.
Из-за этого, по словам Дельдюжова, растет недовольство системой оплаты труда.
Пилоты "Аэрофлота" вновь начали менять место работы, уходя в те авиакомпании, где "лучше условия труда".
Глава профсоюза предупредил, что если не будут срочно приняты меры, авиакомпанию ждет нехватка квалифицированного летного состава.'''

we get the following top-3 labels:
```
Labor Relations Management
Employee Health and Safety
Retrenchment
```


# Training procedure

We use the pretrained [`ai-forever/ruBert-base`](https://huggingface.co/ai-forever/ruBert-base) model.
Next, we do the domain-adaptation procedure by Mask Language Modeling with using texts of ESG reports. 
Finally, we fine-tune our model on 2500 texts with manually annotation of ESG specialists.