Initial commit
Browse files- 0_Transformer/config.json +27 -0
- 0_Transformer/pytorch_model.bin +3 -0
- 0_Transformer/sentence_bert_config.json +4 -0
- 0_Transformer/special_tokens_map.json +1 -0
- 0_Transformer/tokenizer.json +0 -0
- 0_Transformer/tokenizer_config.json +1 -0
- 0_Transformer/vocab.txt +0 -0
- 1_Pooling/config.json +7 -0
- README.md +163 -0
- config.json +3 -0
- modules.json +14 -0
0_Transformer/config.json
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"_name_or_path": "german-nlp-group/electra-base-german-uncased",
|
3 |
+
"architectures": [
|
4 |
+
"ElectraModel"
|
5 |
+
],
|
6 |
+
"attention_probs_dropout_prob": 0.1,
|
7 |
+
"embedding_size": 768,
|
8 |
+
"hidden_act": "gelu",
|
9 |
+
"hidden_dropout_prob": 0.1,
|
10 |
+
"hidden_size": 768,
|
11 |
+
"initializer_range": 0.02,
|
12 |
+
"intermediate_size": 3072,
|
13 |
+
"layer_norm_eps": 1e-12,
|
14 |
+
"max_position_embeddings": 512,
|
15 |
+
"model_type": "electra",
|
16 |
+
"num_attention_heads": 12,
|
17 |
+
"num_hidden_layers": 12,
|
18 |
+
"pad_token_id": 0,
|
19 |
+
"position_embedding_type": "absolute",
|
20 |
+
"summary_activation": "gelu",
|
21 |
+
"summary_last_dropout": 0.1,
|
22 |
+
"summary_type": "first",
|
23 |
+
"summary_use_proj": true,
|
24 |
+
"transformers_version": "4.6.1",
|
25 |
+
"type_vocab_size": 2,
|
26 |
+
"vocab_size": 32767
|
27 |
+
}
|
0_Transformer/pytorch_model.bin
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:e85402a181a4f658ccdcdec705661fe19bd867cb8da8dd4244205799f740ca81
|
3 |
+
size 442549029
|
0_Transformer/sentence_bert_config.json
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"max_seq_length": 300,
|
3 |
+
"do_lower_case": false
|
4 |
+
}
|
0_Transformer/special_tokens_map.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"unk_token": "[UNK]", "sep_token": "[SEP]", "pad_token": "[PAD]", "cls_token": "[CLS]", "mask_token": "[MASK]"}
|
0_Transformer/tokenizer.json
ADDED
The diff for this file is too large to render.
See raw diff
|
|
0_Transformer/tokenizer_config.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"do_lower_case": true, "unk_token": "[UNK]", "sep_token": "[SEP]", "pad_token": "[PAD]", "cls_token": "[CLS]", "mask_token": "[MASK]", "tokenize_chinese_chars": true, "strip_accents": false, "special_tokens_map_file": null, "full_tokenizer_file": null, "max_len": 512, "name_or_path": "german-nlp-group/electra-base-german-uncased", "do_basic_tokenize": true, "never_split": null}
|
0_Transformer/vocab.txt
ADDED
The diff for this file is too large to render.
See raw diff
|
|
1_Pooling/config.json
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"word_embedding_dimension": 768,
|
3 |
+
"pooling_mode_cls_token": false,
|
4 |
+
"pooling_mode_mean_tokens": true,
|
5 |
+
"pooling_mode_max_tokens": false,
|
6 |
+
"pooling_mode_mean_sqrt_len_tokens": false
|
7 |
+
}
|
README.md
ADDED
@@ -0,0 +1,163 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# SVALabs - German Uncased Electra Bi-Encoder
|
2 |
+
|
3 |
+
In this repository, we present our german, uncased bi-encoder for Passage Retrieval.
|
4 |
+
|
5 |
+
This model was trained on the basis of the german electra uncased model from the [german-nlp-group](https://huggingface.co/german-nlp-group/electra-base-german-uncased) and finetuned as a bi-encoder for Passage Retrieval using the [sentence-transformers](https://github.com/UKPLab/sentence-transformers) package.
|
6 |
+
For this purpose, we translated the [MSMARCO-Passage-Ranking](https://github.com/microsoft/MSMARCO-Passage-Ranking) dataset using the [fairseq-wmt19-en-de](https://github.com/pytorch/fairseq/tree/master/examples/wmt19) translation model.
|
7 |
+
|
8 |
+
### Model Details
|
9 |
+
|
10 |
+
| | Description or Link |
|
11 |
+
|---|---|
|
12 |
+
|**Base model** | [```german-nlp-group/electra-base-german-uncased```](https://huggingface.co/german-nlp-group/electra-base-german-uncased) |
|
13 |
+
|**Finetuning task**| Passage Retrieval / Semantic Search |
|
14 |
+
|**Source dataset**| [```MSMARCO-Passage-Ranking```](https://github.com/microsoft/MSMARCO-Passage-Ranking) |
|
15 |
+
|**Translation model**| [```fairseq-wmt19-en-de```](https://github.com/pytorch/fairseq/tree/master/examples/wmt19) |
|
16 |
+
|
17 |
+
### Performance
|
18 |
+
|
19 |
+
We evaluated our model on the [GermanDPR testset](https://deepset.ai/germanquad) and followed the benchmark framework of [BEIR](https://github.com/UKPLab/beir).
|
20 |
+
In order to compare our results, we conducted an evaluation on the same test data with BM25 and presented the results in the table below.
|
21 |
+
|
22 |
+
|
23 |
+
| Model | NDCG@1 | NDCG@5 | NDCG@10 | Recall@1 | Recall@5 | Recall@10 |
|
24 |
+
|:-------:|:--------:|:--------:|:---------:|:--------:|:----------:|:-----------:|
|
25 |
+
| BM25 | 0.1463 | 0.3451 | 0.4097 | 0.1463 | 0.5424 | 0.7415 |
|
26 |
+
| Ours | 0.4624 | 0.6218 | 0.6425 | 0.4624 | 0.7581 | 0.8205 |
|
27 |
+
|
28 |
+
|
29 |
+
|
30 |
+
### How to Use
|
31 |
+
|
32 |
+
With ```sentence-transformers``` package (see [UKPLab/sentence-transformers](https://github.com/UKPLab/sentence-transformers) on GitHub for more details):
|
33 |
+
```python
|
34 |
+
from sentence_transformers import SentenceTransformer
|
35 |
+
|
36 |
+
bi_model = SentenceTransformer("svalabs/bi-electra-ms-marco-german-uncased-1")
|
37 |
+
```
|
38 |
+
|
39 |
+
### Semantic Search Example
|
40 |
+
```python
|
41 |
+
import numpy as np
|
42 |
+
from sklearn.metrics.pairwise import cosine_similarity
|
43 |
+
|
44 |
+
K = 3 # number of top ranks to retrieve
|
45 |
+
|
46 |
+
# specify documents and queries
|
47 |
+
docs = [
|
48 |
+
"Auf Netflix gibt es endlich die neue Staffel meiner Lieblingsserie.",
|
49 |
+
"Der Gepard jagt seine Beute.",
|
50 |
+
"Wir haben in der Agentur ein neues System für Zeiterfassung.",
|
51 |
+
"Mein Arzt sagt, dass mir dabei eher ein Orthopäde helfen könnte.",
|
52 |
+
"Einen Impftermin kann mir der Arzt momentan noch nicht anbieten.",
|
53 |
+
"Auf Kreta hat meine Tochter mit Muscheln eine schöne Sandburg gebaut.",
|
54 |
+
"Das historische Zentrum (centro storico) liegt auf mehr als 100 Inseln in der Lagune von Venedig.",
|
55 |
+
"Um in Zukunft sein Vermögen zu schützen, sollte man andere Investmentstrategien in Betracht ziehen.",
|
56 |
+
"Die Ära der Dinosaurier wurde vermutlich durch den Einschlag eines gigantischen Meteoriten auf der Erde beendet.",
|
57 |
+
"Bei ALDI sind die Bananen gerade im Angebot.",
|
58 |
+
"Die Entstehung der Erde ist 4,5 milliarden jahre her.",
|
59 |
+
"Finanzwerte treiben DAX um mehr als sechs Prozent nach oben Frankfurt/Main gegeben.",
|
60 |
+
"DAX dreht ins Minus. Konjunkturdaten und Gewinnmitnahmen belasten Frankfurt/Main.",
|
61 |
+
]
|
62 |
+
|
63 |
+
queries = [
|
64 |
+
"dax steigt",
|
65 |
+
"dax sinkt",
|
66 |
+
"probleme mit knieschmerzen",
|
67 |
+
"software für urlaubsstunden",
|
68 |
+
"raubtier auf der jagd",
|
69 |
+
"alter der erde",
|
70 |
+
"wie alt ist unser planet?",
|
71 |
+
"wie kapital sichern",
|
72 |
+
"supermarkt lebensmittel reduziert",
|
73 |
+
"wodurch ist der tyrannosaurus aussgestorben",
|
74 |
+
"serien streamen"
|
75 |
+
]
|
76 |
+
|
77 |
+
# encode documents and queries
|
78 |
+
features_docs = bi_model.encode(docs)
|
79 |
+
features_queries = bi_model.encode(queries)
|
80 |
+
|
81 |
+
# compute pairwise cosine similarity scores
|
82 |
+
sim = cosine_similarity(features_queries, features_docs)
|
83 |
+
|
84 |
+
# print results
|
85 |
+
for i, query in enumerate(queries):
|
86 |
+
ranks = np.argsort(-sim[i])
|
87 |
+
print("Query:", query)
|
88 |
+
for j, r in enumerate(ranks[:K]):
|
89 |
+
print(f"[{j}: {sim[i, r]: .3f}]", docs[r])
|
90 |
+
print("-"*96)
|
91 |
+
```
|
92 |
+
|
93 |
+
**Console Output**:
|
94 |
+
```
|
95 |
+
Query: dax steigt
|
96 |
+
[0: 0.811] Finanzwerte treiben DAX um mehr als sechs Prozent nach oben Frankfurt/Main gegeben.
|
97 |
+
[1: 0.719] DAX dreht ins Minus. Konjunkturdaten und Gewinnmitnahmen belasten Frankfurt/Main.
|
98 |
+
[2: 0.218] Auf Netflix gibt es endlich die neue Staffel meiner Lieblingsserie.
|
99 |
+
------------------------------------------------------------------------------------------------
|
100 |
+
Query: dax sinkt
|
101 |
+
[0: 0.815] DAX dreht ins Minus. Konjunkturdaten und Gewinnmitnahmen belasten Frankfurt/Main.
|
102 |
+
[1: 0.719] Finanzwerte treiben DAX um mehr als sechs Prozent nach oben Frankfurt/Main gegeben.
|
103 |
+
[2: 0.243] Auf Netflix gibt es endlich die neue Staffel meiner Lieblingsserie.
|
104 |
+
------------------------------------------------------------------------------------------------
|
105 |
+
Query: probleme mit knieschmerzen
|
106 |
+
[0: 0.237] Mein Arzt sagt, dass mir dabei eher ein Orthopäde helfen könnte.
|
107 |
+
[1: 0.209] Das historische Zentrum (centro storico) liegt auf mehr als 100 Inseln in der Lagune von Venedig.
|
108 |
+
[2: 0.182] DAX dreht ins Minus. Konjunkturdaten und Gewinnmitnahmen belasten Frankfurt/Main.
|
109 |
+
------------------------------------------------------------------------------------------------
|
110 |
+
Query: software für urlaubsstunden
|
111 |
+
[0: 0.478] Wir haben in der Agentur ein neues System für Zeiterfassung.
|
112 |
+
[1: 0.208] Auf Netflix gibt es endlich die neue Staffel meiner Lieblingsserie.
|
113 |
+
[2: 0.190] Bei ALDI sind die Bananen gerade im Angebot.
|
114 |
+
------------------------------------------------------------------------------------------------
|
115 |
+
Query: raubtier auf der jagd
|
116 |
+
[0: 0.599] Der Gepard jagt seine Beute.
|
117 |
+
[1: 0.264] Auf Netflix gibt es endlich die neue Staffel meiner Lieblingsserie.
|
118 |
+
[2: 0.159] Auf Kreta hat meine Tochter mit Muscheln eine schöne Sandburg gebaut.
|
119 |
+
------------------------------------------------------------------------------------------------
|
120 |
+
Query: alter der erde
|
121 |
+
[0: 0.705] Die Entstehung der Erde ist 4,5 milliarden jahre her.
|
122 |
+
[1: 0.413] Die Ära der Dinosaurier wurde vermutlich durch den Einschlag eines gigantischen Meteoriten auf der Erde beendet.
|
123 |
+
[2: 0.262] Finanzwerte treiben DAX um mehr als sechs Prozent nach oben Frankfurt/Main gegeben.
|
124 |
+
------------------------------------------------------------------------------------------------
|
125 |
+
Query: wie alt ist unser planet?
|
126 |
+
[0: 0.441] Die Entstehung der Erde ist 4,5 milliarden jahre her.
|
127 |
+
[1: 0.335] Auf Netflix gibt es endlich die neue Staffel meiner Lieblingsserie.
|
128 |
+
[2: 0.302] Die Ära der Dinosaurier wurde vermutlich durch den Einschlag eines gigantischen Meteoriten auf der Erde beendet.
|
129 |
+
------------------------------------------------------------------------------------------------
|
130 |
+
Query: wie kapital sichern
|
131 |
+
[0: 0.547] Um in Zukunft sein Vermögen zu schützen, sollte man andere Investmentstrategien in Betracht ziehen.
|
132 |
+
[1: 0.331] Finanzwerte treiben DAX um mehr als sechs Prozent nach oben Frankfurt/Main gegeben.
|
133 |
+
[2: 0.143] Auf Netflix gibt es endlich die neue Staffel meiner Lieblingsserie.
|
134 |
+
------------------------------------------------------------------------------------------------
|
135 |
+
Query: supermarkt lebensmittel reduziert
|
136 |
+
[0: 0.455] Bei ALDI sind die Bananen gerade im Angebot.
|
137 |
+
[1: 0.362] DAX dreht ins Minus. Konjunkturdaten und Gewinnmitnahmen belasten Frankfurt/Main.
|
138 |
+
[2: 0.345] Finanzwerte treiben DAX um mehr als sechs Prozent nach oben Frankfurt/Main gegeben.
|
139 |
+
------------------------------------------------------------------------------------------------
|
140 |
+
Query: wodurch ist der tyrannosaurus aussgestorben
|
141 |
+
[0: 0.457] Die Ära der Dinosaurier wurde vermutlich durch den Einschlag eines gigantischen Meteoriten auf der Erde beendet.
|
142 |
+
[1: 0.216] Der Gepard jagt seine Beute.
|
143 |
+
[2: 0.195] Die Entstehung der Erde ist 4,5 milliarden jahre her.
|
144 |
+
------------------------------------------------------------------------------------------------
|
145 |
+
Query: serien streamen
|
146 |
+
[0: 0.570] Auf Netflix gibt es endlich die neue Staffel meiner Lieblingsserie.
|
147 |
+
[1: 0.361] Wir haben in der Agentur ein neues System für Zeiterfassung.
|
148 |
+
[2: 0.282] Bei ALDI sind die Bananen gerade im Angebot.
|
149 |
+
------------------------------------------------------------------------------------------------
|
150 |
+
```
|
151 |
+
|
152 |
+
### Contact
|
153 |
+
- Baran Avinc, [email protected]
|
154 |
+
- Jonas Grebe, [email protected]
|
155 |
+
- Lisa Stolz, [email protected]
|
156 |
+
- Bonian Riebe, [email protected]
|
157 |
+
|
158 |
+
### References
|
159 |
+
- N. Reimers and I. Gurevych (2019), ['Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks'](https://arxiv.org/abs/1908.10084).
|
160 |
+
- Payal Bajaj et al. (2018), ['MS MARCO: A Human Generated MAchine Reading COmprehension Dataset'](https://arxiv.org/abs/1611.09268).
|
161 |
+
- N. Thakur et al. (2021), ['BEIR: A Heterogenous Benchmark for Zero-shot Evaluation of Information Retrieval Models'](https://arxiv.org/abs/2104.08663).
|
162 |
+
- T. Möller, J. Risch and M. Pietsch (2021), ['GermanQuAD and GermanDPR: Improving Non-English Question Answering and Passage Retrieval'](https://arxiv.org/abs/2104.12741).
|
163 |
+
- Hofstätter et al. (2021), ['Improving Efficient Neural Ranking Models with Cross-Architecture Knowledge Distillation'](https://arxiv.org/abs/2010.02666)
|
config.json
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"__version__": "1.2.0"
|
3 |
+
}
|
modules.json
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[
|
2 |
+
{
|
3 |
+
"idx": 0,
|
4 |
+
"name": "0",
|
5 |
+
"path": "0_Transformer",
|
6 |
+
"type": "sentence_transformers.models.Transformer"
|
7 |
+
},
|
8 |
+
{
|
9 |
+
"idx": 1,
|
10 |
+
"name": "1",
|
11 |
+
"path": "1_Pooling",
|
12 |
+
"type": "sentence_transformers.models.Pooling"
|
13 |
+
}
|
14 |
+
]
|