File size: 4,107 Bytes
554eb76
5c3b1e1
75cb137
5c3b1e1
 
 
 
 
 
 
 
 
 
 
d60f80a
 
 
 
5c3b1e1
 
 
d60f80a
5c3b1e1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
---
inference: false
pipeline_tag: sentence-similarity
language:
- bg
license: mit
datasets:
- oscar
- chitanka
- wikipedia
tags:
- torch
---

# ROBERTA BASE (cased) trained on private Bulgarian-English parallel data
This is a Multilingual Roberta model. It could be used for creating embeddings of Bulgarian sentences. 

Using the ideas from [Sentence-BERT](https://arxiv.org/abs/2004.09813), the training is based on the idea that a translated sentence should be mapped to the same location in the vector space as the original sentence. 

This model is cased: it does make a difference between bulgarian and Bulgarian.

It was trained on private Bulgarian-English parallel data.

Then, it was compressed via [progressive module replacing](https://arxiv.org/abs/2002.02925).

### How to use

Here is how to use this model in PyTorch:

```python
>>> import scipy
>>> import torch
>>> from transformers import AutoModel, AutoTokenizer
>>> 
>>> model = AutoModel.from_pretrained('rmihaylov/roberta-base-nli-stsb-theseus-bg')
>>> tokenizer = AutoTokenizer.from_pretrained('rmihaylov/roberta-base-nli-stsb-theseus-bg')
>>>
>>> def embed(text):
>>>     inputs = tokenizer.encode_plus(text, return_tensors='pt')
>>>     outputs = model(**inputs)
>>>     sequence_output = outputs[0]
>>>     input_mask_expanded = inputs['attention_mask'].unsqueeze(-1).expand(sequence_output.size()).float()
>>>     embeddings = torch.sum(sequence_output * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)
>>>     return embeddings.detach().numpy()[0]
>>> 
>>> 
>>> query_embedding = embed("Какви са съставките на бисквитките?")
>>> 
>>> questions = [
>>>     "Какво е бисквитка?",
>>>     "От какво са направени бисквитките?",
>>>     "Използват ли в Англия думата бисквитки?",
>>>     "Къде се правят бисквитките?",
>>>     "Какви видове бисквитки има?",
>>>     "Къде човек може да купи бисквитки?",
>>>     "Откъде дойде думата бисквитка?",
>>>     "Кое е чудовището на бисквитките?",
>>>     "Как да си направите бисквитки у дома?",
>>>     "Колко калории има типичната бисквитка?",
>>>     "Какви напитки вървят добре с бисквитките?",
>>>     "Бисквитките наричат ли се също сладки?"
>>>     ]
>>> 
>>> corpus, corpus_embeddings = [], []
>>> for question in questions:
>>>     embedding = embed(question)
>>>     corpus.append(question)
>>>     corpus_embeddings.append(embedding)
>>> 
>>> distances = scipy.spatial.distance.cdist([query_embedding], corpus_embeddings, "cosine")[0]
>>> 
>>> results = zip(range(len(distances)), distances)
>>> results = sorted(results, key=lambda x: x[1])
>>> 
>>> print([[corpus[idx].strip(), (1.0 - distance)] for idx, distance in results])

[['От какво са направени бисквитките?', 0.9855158537034977],
 ['Къде се правят бисквитките?', 0.9774093134195002],
 ['Какви видове бисквитки има?', 0.9766014240577192],
 ['Използват ли в Англия думата бисквитки?', 0.9446492058523037],
 ['Кое е чудовището на бисквитките?', 0.9269786184641834],
 ['Къде човек може да купи бисквитки?', 0.9268900421152592],
 ['Какво е бисквитка?', 0.9188155080718263],
 ['Бисквитките наричат ли се също сладки?', 0.9060368627614406],
 ['Откъде дойде думата бисквитка?', 0.9048309659657036],
 ['Какви напитки вървят добре с бисквитките?', 0.890836765118977],
 ['Как да си направите бисквитки у дома?', 0.8878968487540497],
 ['Колко калории има типичната бисквитка?', 0.8652821650136402]]
```