Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks
Paper
• 1908.10084 • Published
• 12
This is a Cross Encoder model finetuned from MatMulMan/araelectra-base-discriminator-tydi-tafseer-pairs using the sentence-transformers library. It computes scores for pairs of texts, which can be used for text reranking and semantic search.
First install the Sentence Transformers library:
pip install -U sentence-transformers
Then you can load this model and run inference.
from sentence_transformers import CrossEncoder
# Download from the 🤗 Hub
model = CrossEncoder("cross_encoder_model_id")
# Get scores for pairs of texts
pairs = [
['بعد ستة أيام شغل ورا بعض، المفروض آخد راحة قد إيه في الأسبوع؟', '24 ساعة متصلة (يعني يوم كامل).'],
['إيه هي الحقوق والميزات اللي القانون الجديد للشغل بيديها للستات الحوامل بالتحديد؟', 'ممكن بس بشرطين: ما يزيدش عن 48 ساعة في الأسبوع (من غير حساب الراحة). يتم احتساب الساعات الزايدة كعمل إضافي ويتحسب لها أجر أعلى.'],
['حد من الصحة بييجي يتأكد من سلامة المستشفى اللي بنشتغل فيها؟ (يستخدم كلمة "سلامة" للتعبير عن الجودة)', 'أيوه، في مفتشين من وزارة الصحة أو هيئة السلامة المهنية بيزوروا المستشفيات والمنشآت الصحية علشان يتأكدوا من التزامها بشروط السلامة والصحة المهنية.'],
['لو خدت إجازة في الفترة دي، ده هيقلل من رصيد إجازتي السنوية العادية، ولا ده وضع مختلف ومش هياثر عليها؟', 'أيوه، التأمين الصحي بيغطي الأمراض والإصابات اللي بتحصل أثناء الشغل أو بسبب ظروف الشغل. وفيه حاجة اسمها "إصابة عمل"، ودي بيكون ليها علاج وتعويض خاص.'],
['يعني العقد لازم يبقى عربي بس، حتى لو الشركة اللي طرف فيه مش مصرية؟ ولا ممكن يكون بلغتهم برضه؟', 'الحد الأدنى بيتحدد سنويًا بقرار من الهيئة العامة للتأمينات. في 2025، الحد الأدنى حوالي 1700 جنيه، والحد الأقصى وصل لـ11200 جنيه، وده بيزيد تدريجيًا كل سنة.'],
]
scores = model.predict(pairs)
print(scores.shape)
# (5,)
# Or rank different texts based on similarity to a single text
ranks = model.rank(
'بعد ستة أيام شغل ورا بعض، المفروض آخد راحة قد إيه في الأسبوع؟',
[
'24 ساعة متصلة (يعني يوم كامل).',
'ممكن بس بشرطين: ما يزيدش عن 48 ساعة في الأسبوع (من غير حساب الراحة). يتم احتساب الساعات الزايدة كعمل إضافي ويتحسب لها أجر أعلى.',
'أيوه، في مفتشين من وزارة الصحة أو هيئة السلامة المهنية بيزوروا المستشفيات والمنشآت الصحية علشان يتأكدوا من التزامها بشروط السلامة والصحة المهنية.',
'أيوه، التأمين الصحي بيغطي الأمراض والإصابات اللي بتحصل أثناء الشغل أو بسبب ظروف الشغل. وفيه حاجة اسمها "إصابة عمل"، ودي بيكون ليها علاج وتعويض خاص.',
'الحد الأدنى بيتحدد سنويًا بقرار من الهيئة العامة للتأمينات. في 2025، الحد الأدنى حوالي 1700 جنيه، والحد الأقصى وصل لـ11200 جنيه، وده بيزيد تدريجيًا كل سنة.',
]
)
# [{'corpus_id': ..., 'score': ...}, {'corpus_id': ..., 'score': ...}, ...]
sentence_0, sentence_1, and label| sentence_0 | sentence_1 | label | |
|---|---|---|---|
| type | string | string | float |
| details |
|
|
|
| sentence_0 | sentence_1 | label |
|---|---|---|
بعد ستة أيام شغل ورا بعض، المفروض آخد راحة قد إيه في الأسبوع؟ |
24 ساعة متصلة (يعني يوم كامل). |
1.0 |
إيه هي الحقوق والميزات اللي القانون الجديد للشغل بيديها للستات الحوامل بالتحديد؟ |
ممكن بس بشرطين: ما يزيدش عن 48 ساعة في الأسبوع (من غير حساب الراحة). يتم احتساب الساعات الزايدة كعمل إضافي ويتحسب لها أجر أعلى. |
0.0 |
حد من الصحة بييجي يتأكد من سلامة المستشفى اللي بنشتغل فيها؟ (يستخدم كلمة "سلامة" للتعبير عن الجودة) |
أيوه، في مفتشين من وزارة الصحة أو هيئة السلامة المهنية بيزوروا المستشفيات والمنشآت الصحية علشان يتأكدوا من التزامها بشروط السلامة والصحة المهنية. |
1.0 |
BinaryCrossEntropyLoss with these parameters:{
"activation_fn": "torch.nn.modules.linear.Identity",
"pos_weight": null
}
per_device_train_batch_size: 16per_device_eval_batch_size: 16num_train_epochs: 10disable_tqdm: Trueoverwrite_output_dir: Falsedo_predict: Falseeval_strategy: noprediction_loss_only: Trueper_device_train_batch_size: 16per_device_eval_batch_size: 16per_gpu_train_batch_size: Noneper_gpu_eval_batch_size: Nonegradient_accumulation_steps: 1eval_accumulation_steps: Nonetorch_empty_cache_steps: Nonelearning_rate: 5e-05weight_decay: 0.0adam_beta1: 0.9adam_beta2: 0.999adam_epsilon: 1e-08max_grad_norm: 1num_train_epochs: 10max_steps: -1lr_scheduler_type: linearlr_scheduler_kwargs: {}warmup_ratio: 0.0warmup_steps: 0log_level: passivelog_level_replica: warninglog_on_each_node: Truelogging_nan_inf_filter: Truesave_safetensors: Truesave_on_each_node: Falsesave_only_model: Falserestore_callback_states_from_checkpoint: Falseno_cuda: Falseuse_cpu: Falseuse_mps_device: Falseseed: 42data_seed: Nonejit_mode_eval: Falseuse_ipex: Falsebf16: Falsefp16: Falsefp16_opt_level: O1half_precision_backend: autobf16_full_eval: Falsefp16_full_eval: Falsetf32: Nonelocal_rank: 0ddp_backend: Nonetpu_num_cores: Nonetpu_metrics_debug: Falsedebug: []dataloader_drop_last: Falsedataloader_num_workers: 0dataloader_prefetch_factor: Nonepast_index: -1disable_tqdm: Trueremove_unused_columns: Truelabel_names: Noneload_best_model_at_end: Falseignore_data_skip: Falsefsdp: []fsdp_min_num_params: 0fsdp_config: {'min_num_params': 0, 'xla': False, 'xla_fsdp_v2': False, 'xla_fsdp_grad_ckpt': False}fsdp_transformer_layer_cls_to_wrap: Noneaccelerator_config: {'split_batches': False, 'dispatch_batches': None, 'even_batches': True, 'use_seedable_sampler': True, 'non_blocking': False, 'gradient_accumulation_kwargs': None}deepspeed: Nonelabel_smoothing_factor: 0.0optim: adamw_torchoptim_args: Noneadafactor: Falsegroup_by_length: Falselength_column_name: lengthddp_find_unused_parameters: Noneddp_bucket_cap_mb: Noneddp_broadcast_buffers: Falsedataloader_pin_memory: Truedataloader_persistent_workers: Falseskip_memory_metrics: Trueuse_legacy_prediction_loop: Falsepush_to_hub: Falseresume_from_checkpoint: Nonehub_model_id: Nonehub_strategy: every_savehub_private_repo: Nonehub_always_push: Falsehub_revision: Nonegradient_checkpointing: Falsegradient_checkpointing_kwargs: Noneinclude_inputs_for_metrics: Falseinclude_for_metrics: []eval_do_concat_batches: Truefp16_backend: autopush_to_hub_model_id: Nonepush_to_hub_organization: Nonemp_parameters: auto_find_batch_size: Falsefull_determinism: Falsetorchdynamo: Noneray_scope: lastddp_timeout: 1800torch_compile: Falsetorch_compile_backend: Nonetorch_compile_mode: Noneinclude_tokens_per_second: Falseinclude_num_input_tokens_seen: Falseneftune_noise_alpha: Noneoptim_target_modules: Nonebatch_eval_metrics: Falseeval_on_start: Falseuse_liger_kernel: Falseliger_kernel_config: Noneeval_use_gather_object: Falseaverage_tokens_across_devices: Falseprompts: Nonebatch_sampler: batch_samplermulti_dataset_batch_sampler: proportional| Epoch | Step | Training Loss |
|---|---|---|
| 0.2323 | 500 | 0.58 |
| 0.4647 | 1000 | 0.2103 |
| 0.6970 | 1500 | 0.1512 |
| 0.9294 | 2000 | 0.1332 |
| 1.1617 | 2500 | 0.1047 |
| 1.3941 | 3000 | 0.1018 |
| 1.6264 | 3500 | 0.088 |
| 1.8587 | 4000 | 0.0734 |
| 2.0911 | 4500 | 0.0621 |
| 2.3234 | 5000 | 0.0681 |
| 2.5558 | 5500 | 0.0584 |
| 2.7881 | 6000 | 0.0491 |
| 3.0204 | 6500 | 0.0519 |
| 3.2528 | 7000 | 0.0502 |
| 3.4851 | 7500 | 0.0365 |
| 3.7175 | 8000 | 0.0452 |
| 3.9498 | 8500 | 0.0455 |
| 4.1822 | 9000 | 0.0438 |
| 4.4145 | 9500 | 0.0358 |
| 4.6468 | 10000 | 0.0398 |
| 4.8792 | 10500 | 0.0346 |
| 5.1115 | 11000 | 0.038 |
| 5.3439 | 11500 | 0.0368 |
| 5.5762 | 12000 | 0.0273 |
| 5.8086 | 12500 | 0.0369 |
| 6.0409 | 13000 | 0.0314 |
| 6.2732 | 13500 | 0.0242 |
| 6.5056 | 14000 | 0.0276 |
| 6.7379 | 14500 | 0.0306 |
| 6.9703 | 15000 | 0.0338 |
| 7.2026 | 15500 | 0.0226 |
| 7.4349 | 16000 | 0.0274 |
| 7.6673 | 16500 | 0.0294 |
| 7.8996 | 17000 | 0.0298 |
| 8.1320 | 17500 | 0.0267 |
| 8.3643 | 18000 | 0.0307 |
| 8.5967 | 18500 | 0.0167 |
| 8.8290 | 19000 | 0.0289 |
| 9.0613 | 19500 | 0.0183 |
| 9.2937 | 20000 | 0.0247 |
| 9.5260 | 20500 | 0.0266 |
| 9.7584 | 21000 | 0.025 |
| 9.9907 | 21500 | 0.0215 |
@inproceedings{reimers-2019-sentence-bert,
title = "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks",
author = "Reimers, Nils and Gurevych, Iryna",
booktitle = "Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing",
month = "11",
year = "2019",
publisher = "Association for Computational Linguistics",
url = "https://arxiv.org/abs/1908.10084",
}