Publish model
Browse files- README.md +71 -0
- added_tokens.json +1 -0
- config.json +26 -0
- special_tokens_map.json +1 -0
- tf_model.h5 +3 -0
- tokenizer.json +0 -0
- tokenizer_config.json +1 -0
- vocab.txt +0 -0
README.md
ADDED
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# {MODEL_NAME}
|
2 |
+
|
3 |
+
Google supported this work by providing Google Cloud credit. Thank you Google for supporting the open source! 🎉
|
4 |
+
|
5 |
+
## Model
|
6 |
+
This is a finetuned version of [mys/bert-base-turkish-cased-nli-mean](https://huggingface.co/) for FAQ retrieval, which is itself a finetuned version of [dbmdz/bert-base-turkish-cased](https://huggingface.co/dbmdz/bert-base-turkish-cased) for NLI. It maps questions & answers to 768 dimensional vectors to be used for FAQ-style chatbots and answer retrieval in question-answering pipelines. It was trained on the Turkish subset of [clips/mqa](https://huggingface.co/datasets/clips/mqa) dataset after some cleaning/ filtering and with a Multiple Negatives Symmetric Ranking loss. Before finetuning, I added two special tokens to the tokenizer (i.e., <Q> for questions and <A> for answers) and resized the model embeddings, so you need to prepend the relevant tokens to the sequences before feeding them into the model. Please have a look at [my accompanying repo](https://github.com/monatis/trfaq) to see how it was finetuned and how it can be used in inference. The following code snippet is an excerpt from the inference at the repo.
|
7 |
+
|
8 |
+
## Usage
|
9 |
+
```python
|
10 |
+
questions = [
|
11 |
+
"Merhaba",
|
12 |
+
"Nasılsın?",
|
13 |
+
"Bireysel araç kiralama yapıyor musunuz?",
|
14 |
+
"Kurumsal araç kiralama yapıyor musunuz?"
|
15 |
+
]
|
16 |
+
|
17 |
+
answers = [
|
18 |
+
"Merhaba, size nasıl yardımcı olabilirim?",
|
19 |
+
"İyiyim, teşekkür ederim. Size nasıl yardımcı olabilirim?",
|
20 |
+
"Hayır, sadece Kurumsal Araç Kiralama operasyonları gerçekleştiriyoruz. Size başka nasıl yardımcı olabilirim?",
|
21 |
+
"Evet, kurumsal araç kiralama hizmetleri sağlıyoruz. Size nasıl yardımcı olabilirim?"
|
22 |
+
]
|
23 |
+
|
24 |
+
|
25 |
+
questions = ["<Q>" + q for q in questions]
|
26 |
+
answers = ["<A>" + a for a in answers]
|
27 |
+
|
28 |
+
|
29 |
+
def answer_faq(model, tokenizer, questions, answers, return_similarities=False):
|
30 |
+
q_len = len(questions)
|
31 |
+
tokens = tokenizer(questions + answers, padding=True, return_tensors='tf')
|
32 |
+
embs = model(**tokens)[0]
|
33 |
+
|
34 |
+
attention_masks = tf.cast(tokens['attention_mask'], tf.float32)
|
35 |
+
sample_length = tf.reduce_sum(attention_masks, axis=-1, keepdims=True)
|
36 |
+
masked_embs = embs * tf.expand_dims(attention_masks, axis=-1)
|
37 |
+
masked_embs = tf.reduce_sum(masked_embs, axis=1) / tf.cast(sample_length, tf.float32)
|
38 |
+
a = tf.math.l2_normalize(masked_embs[:q_len, :], axis=1)
|
39 |
+
b = tf.math.l2_normalize(masked_embs[q_len:, :], axis=1)
|
40 |
+
|
41 |
+
similarities = tf.matmul(a, b, transpose_b=True)
|
42 |
+
|
43 |
+
scores = tf.nn.softmax(similarities)
|
44 |
+
results = list(zip(answers, scores.numpy().squeeze().tolist()))
|
45 |
+
sorted_results = sorted(results, key=lambda x: x[1], reverse=True)
|
46 |
+
sorted_results = [{"answer": answer.replace("<A>", ""), "score": f"{score:.4f}"} for answer, score in sorted_results]
|
47 |
+
return sorted_results
|
48 |
+
|
49 |
+
|
50 |
+
for question in questions:
|
51 |
+
results = answer_faq(model, tokenizer, [question], answers)
|
52 |
+
print(question.replace("<Q>", ""))
|
53 |
+
print(results)
|
54 |
+
print("---------------------")
|
55 |
+
```
|
56 |
+
|
57 |
+
And the output is:
|
58 |
+
```shell
|
59 |
+
Merhaba
|
60 |
+
[{'answer': 'Merhaba, size nasıl yardımcı olabilirim?', 'score': '0.2931'}, {'answer': 'İyiyim, teşekkür ederim. Size nasıl yardımcı olabilirim?', 'score': '0.2751'}, {'answer': 'Hayır, sadece Kurumsal Araç Kiralama operasyonları gerçekleştiriyoruz. Size başka nasıl yardımcı olabilirim?', 'score': '0.2200'}, {'answer': 'Evet, kurumsal araç kiralama hizmetleri sağlıyoruz. Size nasıl yardımcı olabilirim?', 'score': '0.2118'}]
|
61 |
+
---------------------
|
62 |
+
Nasılsın?
|
63 |
+
[{'answer': 'İyiyim, teşekkür ederim. Size nasıl yardımcı olabilirim?', 'score': '0.2808'}, {'answer': 'Merhaba, size nasıl yardımcı olabilirim?', 'score': '0.2623'}, {'answer': 'Hayır, sadece Kurumsal Araç Kiralama operasyonları gerçekleştiriyoruz. Size başka nasıl yardımcı olabilirim?', 'score': '0.2320'}, {'answer': 'Evet, kurumsal araç kiralama hizmetleri sağlıyoruz. Size nasıl yardımcı olabilirim?', 'score': '0.2249'}]
|
64 |
+
---------------------
|
65 |
+
Bireysel araç kiralama yapıyor musunuz?
|
66 |
+
[{'answer': 'Hayır, sadece Kurumsal Araç Kiralama operasyonları gerçekleştiriyoruz. Size başka nasıl yardımcı olabilirim?', 'score': '0.2861'}, {'answer': 'Evet, kurumsal araç kiralama hizmetleri sağlıyoruz. Size nasıl yardımcı olabilirim?', 'score': '0.2768'}, {'answer': 'İyiyim, teşekkür ederim. Size nasıl yardımcı olabilirim?', 'score': '0.2215'}, {'answer': 'Merhaba, size nasıl yardımcı olabilirim?', 'score': '0.2156'}]
|
67 |
+
---------------------
|
68 |
+
Kurumsal araç kiralama yapıyor musunuz?
|
69 |
+
[{'answer': 'Evet, kurumsal araç kiralama hizmetleri sağlıyoruz. Size nasıl yardımcı olabilirim?', 'score': '0.3060'}, {'answer': 'Hayır, sadece Kurumsal Araç Kiralama operasyonları gerçekleştiriyoruz. Size başka nasıl yardımcı olabilirim?', 'score': '0.2929'}, {'answer': 'İyiyim, teşekkür ederim. Size nasıl yardımcı olabilirim?', 'score': '0.2066'}, {'answer': 'Merhaba, size nasıl yardımcı olabilirim?', 'score': '0.1945'}]
|
70 |
+
---------------------
|
71 |
+
```
|
added_tokens.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"<A>": 32001, "<Q>": 32000}
|
config.json
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"_name_or_path": "./bert-base-turkish-cased-nli-mean-faq-mnr",
|
3 |
+
"architectures": [
|
4 |
+
"BertModel"
|
5 |
+
],
|
6 |
+
"attention_probs_dropout_prob": 0.1,
|
7 |
+
"classifier_dropout": null,
|
8 |
+
"gradient_checkpointing": false,
|
9 |
+
"hidden_act": "gelu",
|
10 |
+
"hidden_dropout_prob": 0.1,
|
11 |
+
"hidden_size": 768,
|
12 |
+
"initializer_range": 0.02,
|
13 |
+
"intermediate_size": 3072,
|
14 |
+
"layer_norm_eps": 1e-12,
|
15 |
+
"max_position_embeddings": 512,
|
16 |
+
"model_type": "bert",
|
17 |
+
"num_attention_heads": 12,
|
18 |
+
"num_hidden_layers": 12,
|
19 |
+
"pad_token_id": 0,
|
20 |
+
"position_embedding_type": "absolute",
|
21 |
+
"torch_dtype": "float32",
|
22 |
+
"transformers_version": "4.10.2",
|
23 |
+
"type_vocab_size": 2,
|
24 |
+
"use_cache": true,
|
25 |
+
"vocab_size": 32002
|
26 |
+
}
|
special_tokens_map.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"unk_token": "[UNK]", "sep_token": "[SEP]", "pad_token": "[PAD]", "cls_token": "[CLS]", "mask_token": "[MASK]", "additional_special_tokens": ["<Q>", "<A>"]}
|
tf_model.h5
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:7636af5ef5c86d85e92a250172002323430a437e06feee0a46935a937bfcb645
|
3 |
+
size 442742784
|
tokenizer.json
ADDED
The diff for this file is too large to render.
See raw diff
|
|
tokenizer_config.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"do_lower_case": false, "unk_token": "[UNK]", "sep_token": "[SEP]", "pad_token": "[PAD]", "cls_token": "[CLS]", "mask_token": "[MASK]", "tokenize_chinese_chars": true, "strip_accents": null, "max_len": 512, "special_tokens_map_file": null, "full_tokenizer_file": null, "name_or_path": "./bert-base-turkish-cased-nli-mean", "do_basic_tokenize": true, "never_split": null, "additional_special_tokens": ["<Q>", "<A>"], "tokenizer_class": "BertTokenizer"}
|
vocab.txt
ADDED
The diff for this file is too large to render.
See raw diff
|
|