mys commited on
Commit
e64fd6d
1 Parent(s): cdb05f9

Publish model

Browse files
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