Alexeym12 commited on
Commit
c2093a4
1 Parent(s): 0e7fc7e

readme_update

Browse files
Files changed (1) hide show
  1. README.md +33 -22
README.md CHANGED
@@ -4,23 +4,23 @@ tags:
4
  - ESG
5
  - finance
6
  language:
7
- - en
8
 
9
  ---
10
  ![esgify](ESGify.png)
11
- # About ESGify
12
  <img src="ESGify_logo.jpeg" alt="image" width="20%" height="auto">
13
- **ESGify** is a model for multilabel news classification with respect to ESG risks. Our custom methodology includes 46 ESG classes and 1 non-relevant to ESG class, resulting in 47 classes in total:
14
 
15
  ![esgify_classes](ESGify_classes.jpg)
16
 
17
  # Usage
18
 
19
- ESGify is based on MPNet architecture but with a custom classification head. The ESGify class is defined is follows.
20
 
21
  ```python
22
  from collections import OrderedDict
23
- from transformers import MPNetPreTrainedModel, MPNetModel, AutoTokenizer
24
  import torch
25
 
26
  # Mean Pooling - Take attention mask into account for correct averaging
@@ -30,15 +30,15 @@ def mean_pooling(model_output, attention_mask):
30
  return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)
31
 
32
  # Definition of ESGify class because of custom,sentence-transformers like, mean pooling function and classifier head
33
- class ESGify(MPNetPreTrainedModel):
34
- """Model for Classification ESG risks from text."""
35
 
36
  def __init__(self,config): #tuning only the head
37
  """
38
  """
39
  super().__init__(config)
40
  # Instantiate Parts of model
41
- self.mpnet = MPNetModel(config,add_pooling_layer=False)
42
  self.id2label = config.id2label
43
  self.label2id = config.label2id
44
  self.classifier = torch.nn.Sequential(OrderedDict([('norm',torch.nn.BatchNorm1d(768)),
@@ -46,12 +46,12 @@ class ESGify(MPNetPreTrainedModel):
46
  ('act',torch.nn.ReLU()),
47
  ('batch_n',torch.nn.BatchNorm1d(512)),
48
  ('drop_class', torch.nn.Dropout(0.2)),
49
- ('class_l',torch.nn.Linear(512 ,47))]))
50
 
51
 
52
  def forward(self, input_ids, attention_mask):
53
- # Feed input to mpnet model
54
- outputs = self.mpnet(input_ids=input_ids,
55
  attention_mask=attention_mask)
56
 
57
  # mean pooling dataset and eed input to classifier to compute logits
@@ -65,8 +65,8 @@ class ESGify(MPNetPreTrainedModel):
65
  After defining model class, we initialize ESGify and tokenizer with the pre-trained weights
66
 
67
  ```python
68
- model = ESGify.from_pretrained('ai-lab/ESGify')
69
- tokenizer = AutoTokenizer.from_pretrained('ai-lab/ESGify')
70
  ```
71
 
72
  Getting results from the model:
@@ -93,20 +93,31 @@ for i in torch.topk(results, k=3).indices.tolist()[0]:
93
  print(f"{model.id2label[i]}: {np.round(results.flatten()[i].item(), 3)}")
94
  ```
95
 
96
- For example, for the news "She faced employment rejection because of her gender", we get the following top-3 labels:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
  ```
98
- Discrimination: 0.944
99
- Strategy Implementation: 0.82
100
- Indigenous People: 0.499
101
  ```
102
 
103
- Before training our model, we masked words related to Organisation, Date, Country, and Person to prevent false associations between these entities and risks. Hence, we recommend to process text with FLAIR NER model before inference.
104
- An example of such preprocessing is given in https://colab.research.google.com/drive/15YcTW9KPSWesZ6_L4BUayqW_omzars0l?usp=sharing.
105
-
106
 
107
  # Training procedure
108
 
109
- We use the pretrained [`microsoft/mpnet-base`](https://huggingface.co/microsoft/mpnet-base) model.
110
  Next, we do the domain-adaptation procedure by Mask Language Modeling with using texts of ESG reports.
111
- Finally, we fine-tune our model on 2000 texts with manually annotation of ESG specialists.
112
 
 
4
  - ESG
5
  - finance
6
  language:
7
+ - ru
8
 
9
  ---
10
  ![esgify](ESGify.png)
11
+ # About ESGify_ru
12
  <img src="ESGify_logo.jpeg" alt="image" width="20%" height="auto">
13
+ **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:
14
 
15
  ![esgify_classes](ESGify_classes.jpg)
16
 
17
  # Usage
18
 
19
+ ESGify is based on ruBert architecture but with a custom classification head. The ESGify_ru class is defined is follows.
20
 
21
  ```python
22
  from collections import OrderedDict
23
+ from transformers import BertPreTrainedModel, BertModel, AutoTokenizer
24
  import torch
25
 
26
  # Mean Pooling - Take attention mask into account for correct averaging
 
30
  return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)
31
 
32
  # Definition of ESGify class because of custom,sentence-transformers like, mean pooling function and classifier head
33
+ class ESGify_ru(BertPreTrainedModel):
34
+ """Model for Classification ESG risks from russian language text."""
35
 
36
  def __init__(self,config): #tuning only the head
37
  """
38
  """
39
  super().__init__(config)
40
  # Instantiate Parts of model
41
+ self.bert = BertModel(config,add_pooling_layer=False)
42
  self.id2label = config.id2label
43
  self.label2id = config.label2id
44
  self.classifier = torch.nn.Sequential(OrderedDict([('norm',torch.nn.BatchNorm1d(768)),
 
46
  ('act',torch.nn.ReLU()),
47
  ('batch_n',torch.nn.BatchNorm1d(512)),
48
  ('drop_class', torch.nn.Dropout(0.2)),
49
+ ('class_l',torch.nn.Linear(512 ,48))]))
50
 
51
 
52
  def forward(self, input_ids, attention_mask):
53
+ # Feed input to bert model
54
+ outputs = self.bert(input_ids=input_ids,
55
  attention_mask=attention_mask)
56
 
57
  # mean pooling dataset and eed input to classifier to compute logits
 
65
  After defining model class, we initialize ESGify and tokenizer with the pre-trained weights
66
 
67
  ```python
68
+ model = ESGify_ru.from_pretrained('ai-lab/ESGify_ru')
69
+ tokenizer = AutoTokenizer.from_pretrained('ai-lab/ESGify_ru')
70
  ```
71
 
72
  Getting results from the model:
 
93
  print(f"{model.id2label[i]}: {np.round(results.flatten()[i].item(), 3)}")
94
  ```
95
 
96
+ For example, for the news:
97
+ '''Профсоюз попросил "Аэрофлот" пересмотреть систему оплаты труда пилотов.
98
+ Профсоюз летного состава предупредил "Аэрофлот" о риске дефицита пилотов из-за низких зарплат.
99
+ Шереметьевский профсоюз летного состава (ШПЛС) написал письмо гендиректору "Аэрофлота" Михаилу Полубояринову,
100
+ призвав пересмотреть систему оплаты работы пилотов, обращение размещено на сайте профсоюза.
101
+ Как пояснил глава профсоюза Игорь Дельдюжов, новые правила оплаты труда, в которых сокращена доплата за час полетного времени,
102
+ вступили в силу в начале прошлого года на фоне снижения объема перевозок пассажиров из-за пандемии коронавируса.
103
+ Тогда летный состав согласился на новые условия оплаты, учитывая сложную ситуацию, в которой оказались авиаперевозчики.
104
+ Однако теперь, как говорится в обращении, объемы авиаперевозок по России достигли допандемийного уровня,
105
+ возобновляется и международное авиасообщение, у летного состава растет нагрузка, однако зарплата при этом пропорционально не растет.
106
+ Из-за этого, по словам Дельдюжова, растет недовольство системой оплаты труда.
107
+ Пилоты "Аэрофлота" вновь начали менять место работы, уходя в те авиакомпании, где "лучше условия труда".
108
+ Глава профсоюза предупредил, что если не будут срочно приняты меры, авиакомпанию ждет нехватка квалифицированного летного состава.'''
109
+
110
+ we get the following top-3 labels:
111
  ```
112
+ Labor Relations Management
113
+ Employee Health and Safety
114
+ Retrenchment
115
  ```
116
 
 
 
 
117
 
118
  # Training procedure
119
 
120
+ We use the pretrained [`ai-forever/ruBert-base`](https://huggingface.co/ai-forever/ruBert-base) model.
121
  Next, we do the domain-adaptation procedure by Mask Language Modeling with using texts of ESG reports.
122
+ Finally, we fine-tune our model on 2500 texts with manually annotation of ESG specialists.
123