Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks
Paper • 1908.10084 • Published • 13
How to use TextModel/Embedding-crime-indo with sentence-transformers:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("TextModel/Embedding-crime-indo")
sentences = [
"query: Kalau si koruptor ternyata udah nggak punya harta lagi buat bayar uang pengganti, apa konsekuensinya?",
"passage: Hukumnya adalah tindak pidana yang diancam dengan pidana penjara paling lama 4 tahun atau pidana denda paling banyak kategori IV karena menggunakan ancaman kekerasan. (Pasal 302 KUHP)",
"passage: Kalau harta bendanya tidak mencukupi, terpidana bisa dipidana penjara yang lamanya tidak melebihi ancaman maksimum pidana pokoknya dan sudah ditentukan langsung di dalam putusan pengadilan.",
"passage: Penyitaan dan pelelangan harta bila uang pengganti tidak dibayar."
]
embeddings = model.encode(sentences)
similarities = model.similarity(embeddings, embeddings)
print(similarities.shape)
# [4, 4]This is a sentence-transformers model finetuned from google/embeddinggemma-300m. It maps sentences & paragraphs to a 768-dimensional dense vector space and can be used for semantic textual similarity, semantic search, paraphrase mining, text classification, clustering, and more.
SentenceTransformer(
(0): Transformer({'max_seq_length': 2048, 'do_lower_case': False, 'architecture': 'Gemma3TextModel'})
(1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False, 'include_prompt': True})
(2): Dense({'in_features': 768, 'out_features': 3072, 'bias': False, 'activation_function': 'torch.nn.modules.linear.Identity'})
(3): Dense({'in_features': 3072, 'out_features': 768, 'bias': False, 'activation_function': 'torch.nn.modules.linear.Identity'})
(4): Normalize()
)
First install the Sentence Transformers library:
pip install -U sentence-transformers
Then you can load this model and run inference.
from sentence_transformers import SentenceTransformer
# Download from the 🤗 Hub
model = SentenceTransformer("TextModel/Gemma-Crime-Indo")
# Run inference
queries = [
"query: Apa syarat bagi dokter untuk bisa menyerahkan narkotika kepada pasien?",
]
documents = [
'passage: Pasal 43: Penyerahan Narkotika oleh dokter hanya dapat dilaksanakan untuk menjalankan praktik dokter dengan memberikan Narkotika melalui suntikan, menolong orang sakit dalam keadaan darurat dengan memberikan Narkotika melalui suntikan, atau menjalankan tugas di daerah terpencil yang tidak ada apotek.',
'passage: Pasal 53: Untuk kepentingan pengobatan dan berdasarkan indikasi medis, dokter dapat memberikan Narkotika Golongan II atau Golongan III dalam jumlah terbatas dan sediaan tertentu kepada pasien.',
'passage: Pasal 448: (1) Dipidana dengan pidana penjara paling lama 1 (satu) tahun atau pidana denda paling banyak kategori II, Setiap Orang yang: a. secara melawan hukum memaksa orang lain supaya melakukan, tidak melakukan, atau membiarkan sesuatu, dengan Kekerasan atau Ancaman Kekerasan, baik terhadap orang itu sendiri maupun orang lain; atau b. memaksa orang lain supaya melakukan, tidak melakukan, atau membiarkan sesuatu dengan ancaman pencemaran atau pencemaran tertulis. (2) Tindak Pidana sebagaimana dimaksud pada ayat (1) huruf b hanya dapat dituntut atas pengaduan dari Korban Tindak Pidana. Pasal ini berlaku karena Bram Sulistyo memaksa Andi Firmansyah untuk melakukan sesuatu (mencabut laporan ketenagakerjaan) dengan ancaman pencemaran nama baik (ancaman membocorkan aib pribadi), yang memenuhi unsur tindak pidana dalam Pasal 448 ayat (1) huruf b KUHP 2023. Karena menggunakan ancaman pencemaran, tindak pidana ini merupakan delik aduan sebagaimana Pasal 448 ayat (2)',
]
query_embeddings = model.encode_query(queries)
document_embeddings = model.encode_document(documents)
print(query_embeddings.shape, document_embeddings.shape)
# [1, 768] [3, 768]
# Get the similarity scores for the embeddings
similarities = model.similarity(query_embeddings, document_embeddings)
print(similarities)
# tensor([[0.7065, 0.5494, 0.1299]])
val and testTripletEvaluator| Metric | val | test |
|---|---|---|
| cosine_accuracy | 0.9466 | 0.9357 |
anchor, positive, and negative| anchor | positive | negative | |
|---|---|---|---|
| type | string | string | string |
| details |
|
|
|
| anchor | positive | negative |
|---|---|---|
query: Kalo mau lapor ke polisi soal pencemaran nama baik, apa emang harus nunggu korban datang lapor sendiri atau polisi bisa langsung tangkap pelakunya? |
passage: Pasal 24 KUHP: Dalam hal tertentu, pelaku Tindak Pidana hanya dapat dituntut atas dasar pengaduan. Tindak Pidana aduan harus ditentukan secara tegas dalam Undang-Undang. |
passage: Pasal 28 KUHP: Pengaduan dilakukan dengan cara menyampaikan pemberitahuan dan permohonan untuk dituntut. Pengaduan sebagaimana dimaksud diajukan secara lisan atau tertulis kepada Pejabat yang berwenang. |
query: Anak saya yang masih 14 tahun kena aniaya sama tetangga, saya sebagai bapaknya yang lapor polisi. Tapi ternyata Anak saya yang masih 14 tahun kena aniaya, saya sebagai bapaknya yang mau lapor polisi. Apakah saya berhak melapor mewakili anak saya?? |
passage: Pasal 25 KUHP: Dalam hal Korban Tindak Pidana aduan belum berumur 16 tahun, yang berhak mengadu merupakan Orang Tua atau walinya. Dalam hal Orang Tua atau wali tidak ada atau Orang Tua/wali itu sendiri yang harus diadukan, pengaduan dilakukan oleh keluarga sedarah dalam garis lurus. |
passage: Pasal 26 KUHP: Dalam hal Korban Tindak Pidana aduan berada di bawah pengampuan, yang berhak mengadu merupakan pengampunya, kecuali bagi Korban yang berada dalam pengampuan karena boros. Jika pengampu tidak ada atau pengampu itu sendiri yang harus diadukan, pengaduan dilakukan oleh suami/istri atau keluarga sedarah. |
query: Saya kemarin udah lapor polisi soal kejadian yang menimpa saya, tapi sekarang saya udah maafin pelakunya dan mau cabut laporan. Apa yang bakal terjadi sama perkara ini? |
passage: Pasal 30 KUHP: Pengaduan dapat ditarik kembali oleh pengadu dalam waktu 3 Bulan terhitung sejak tanggal pengaduan diajukan. Pengaduan yang ditarik kembali tidak dapat diajukan lagi. |
passage: Pasal 29 KUHP: Pengaduan harus diajukan dalam tenggang waktu 6 Bulan terhitung sejak tanggal orang yang berhak mengadu mengetahui adanya Tindak Pidana jika bertempat tinggal di wilayah NKRI. Jika yang berhak mengadu lebih dari 1 orang, tenggang waktu dihitung sejak tanggal masing-masing pengadu mengetahui adanya Tindak Pidana. |
MultipleNegativesRankingLoss with these parameters:{
"scale": 20.0,
"similarity_fct": "cos_sim",
"gather_across_devices": false
}
anchor, positive, and negative| anchor | positive | negative | |
|---|---|---|---|
| type | string | string | string |
| details |
|
|
|
| anchor | positive | negative |
|---|---|---|
query: Bisa nggak orang yang tinggal di luar negeri ikut kena jerat hukum karena dia bantu-bantu kasus korupsi yang terjadi di Indonesia? |
passage: Bisa, orang di luar wilayah Indonesia yang memberikan bantuan, sarana, atau keterangan agar terjadi korupsi akan dipidana sama seperti pelaku utamanya. |
passage: Pasal 15: percobaan, pembantuan, atau pemufakatan jahat dipidana sama dengan delik asal |
query: Yoga Andrianto, seorang influencer di Bandung dengan ratusan ribu pengikut, pada tahun 2024 secara konsisten mengunggah konten video di platform media sosial yang berisi penghinaan terhadap DPR RI sebagai lembaga negara. Konten tersebut dibuat dengan maksud agar isi penghinaan diketahui oleh khalayak umum secara luas. Akibat viralnya konten tersebut, terjadi aksi demonstrasi yang berujung pada kerusuhan di beberapa kota. Pasal apa yang tepat dikenakan kepada Yoga Andrianto? |
passage: Pasal 241: (1) Setiap Orang yang menyiarkan, mempertunjukkan, atau menempelkan tulisan atau gambar sehingga terlihat oleh umum, memperdengarkan rekaman sehingga terdengar oleh umum, atau menyebarluaskan dengan sarana teknologi informasi yang berisi penghinaan terhadap pemerintah atau lembaga negara, dengan maksud agar isi penghinaan diketahui umum, dipidana dengan pidana penjara paling lama 3 (tiga) tahun atau pidana denda paling banyak kategori IV. (2) Dalam hal Tindak Pidana sebagaimana dimaksud pada ayat (1) berakibat terjadinya kerusuhan dalam masyarakat, dipidana dengan pidana penjara paling lama 4 (empat) tahun atau pidana denda paling banyak kategori V.. Pasal ini berlaku karena Yoga Andrianto menyebarluaskan melalui sarana teknologi informasi konten berisi penghinaan terhadap DPR RI sebagai lembaga negara dengan maksud agar isi penghinaan diketahui umum, memenuhi unsur Pasal 241 ayat (1). Karena perbuatannya berakibat terjadinya kerusuhan dalam masyarakat, ancaman pida... |
passage: Pasal 300: Setiap Orang Di Muka Umum yang: a. melakukan perbuatan yang bersifat permusuhan; b. menyatakan kebencian atau permusuhan; atau c. menghasut untuk melakukan Kekerasan, atau diskriminasi, terhadap agama, kepercayaan orang lain, golongan, atau kelompok atas dasar agama atau kepercayaan di Indonesia, dipidana dengan pidana penjara paling lama 3 (tiga) tahun atau pidana denda paling banyak kategori IV.. Pasal ini mengatur pernyataan kebencian atau hasutan terhadap kelompok atas dasar agama, bukan penghinaan terhadap pemerintah atau lembaga negara.. |
query: Apa perbedaan hukuman bagi pembantu aborsi jika perbuatannya mengakibatkan kematian, antara yang izin sama yang tidak izin? |
passage: Jika mengakibatkan kematian, aborsi dengan persetujuan diancam penjara paling lama 8 tahun, sedangkan aborsi tanpa persetujuan diancam penjara paling lama 15 tahun. (Pasal 464 ayat (2) dan (3) KUHP) |
passage: Jika mengakibatkan kematian, pembunuhan biasa yang dilakukan oleh seseorang dengan sengaja merampas nyawa orang lain diancam penjara paling lama 15 tahun. (Pasal 458 ayat (1) KUHP) |
MultipleNegativesRankingLoss with these parameters:{
"scale": 20.0,
"similarity_fct": "cos_sim",
"gather_across_devices": false
}
eval_strategy: epochper_device_train_batch_size: 4per_device_eval_batch_size: 4gradient_accumulation_steps: 4learning_rate: 1e-05weight_decay: 0.01num_train_epochs: 4warmup_ratio: 0.3warmup_steps: 0.3fp16: Trueload_best_model_at_end: Truedataloader_pin_memory: Falsegradient_checkpointing: Truebatch_sampler: no_duplicatesdo_predict: Falseeval_strategy: epochprediction_loss_only: Trueper_device_train_batch_size: 4per_device_eval_batch_size: 4gradient_accumulation_steps: 4eval_accumulation_steps: Nonetorch_empty_cache_steps: Nonelearning_rate: 1e-05weight_decay: 0.01adam_beta1: 0.9adam_beta2: 0.999adam_epsilon: 1e-08max_grad_norm: 1.0num_train_epochs: 4max_steps: -1lr_scheduler_type: linearlr_scheduler_kwargs: Nonewarmup_ratio: 0.3warmup_steps: 0.3log_level: passivelog_level_replica: warninglog_on_each_node: Truelogging_nan_inf_filter: Trueenable_jit_checkpoint: Falsesave_on_each_node: Falsesave_only_model: Falserestore_callback_states_from_checkpoint: Falseuse_cpu: Falseseed: 42data_seed: Nonebf16: Falsefp16: Truebf16_full_eval: Falsefp16_full_eval: Falsetf32: Nonelocal_rank: -1ddp_backend: Nonedebug: []dataloader_drop_last: Falsedataloader_num_workers: 0dataloader_prefetch_factor: Nonedisable_tqdm: Falseremove_unused_columns: Truelabel_names: Noneload_best_model_at_end: Trueignore_data_skip: Falsefsdp: []fsdp_config: {'min_num_params': 0, 'xla': False, 'xla_fsdp_v2': False, 'xla_fsdp_grad_ckpt': False}accelerator_config: {'split_batches': False, 'dispatch_batches': None, 'even_batches': True, 'use_seedable_sampler': True, 'non_blocking': False, 'gradient_accumulation_kwargs': None}parallelism_config: Nonedeepspeed: Nonelabel_smoothing_factor: 0.0optim: adamw_torch_fusedoptim_args: Nonegroup_by_length: Falselength_column_name: lengthproject: huggingfacetrackio_space_id: trackioddp_find_unused_parameters: Noneddp_bucket_cap_mb: Noneddp_broadcast_buffers: Falsedataloader_pin_memory: Falsedataloader_persistent_workers: Falseskip_memory_metrics: Truepush_to_hub: Falseresume_from_checkpoint: Nonehub_model_id: Nonehub_strategy: every_savehub_private_repo: Nonehub_always_push: Falsehub_revision: Nonegradient_checkpointing: Truegradient_checkpointing_kwargs: Noneinclude_for_metrics: []eval_do_concat_batches: Trueauto_find_batch_size: Falsefull_determinism: Falseddp_timeout: 1800torch_compile: Falsetorch_compile_backend: Nonetorch_compile_mode: Noneinclude_num_input_tokens_seen: noneftune_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: Trueuse_cache: Falseprompts: Nonebatch_sampler: no_duplicatesmulti_dataset_batch_sampler: proportionalrouter_mapping: {}learning_rate_mapping: {}| Epoch | Step | Training Loss | Validation Loss | val_cosine_accuracy | test_cosine_accuracy |
|---|---|---|---|---|---|
| -1 | -1 | - | - | 0.9192 | 0.9097 |
| 1.0 | 82 | 0.2979 | 0.2212 | 0.9438 | - |
| 2.0 | 164 | 0.1132 | 0.2597 | 0.9466 | - |
| 3.0 | 246 | 0.0371 | 0.2365 | 0.9411 | - |
| 4.0 | 328 | 0.0233 | 0.2106 | 0.9411 | - |
| -1 | -1 | - | - | 0.9466 | 0.9357 |
@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",
}
@misc{henderson2017efficient,
title={Efficient Natural Language Response Suggestion for Smart Reply},
author={Matthew Henderson and Rami Al-Rfou and Brian Strope and Yun-hsuan Sung and Laszlo Lukacs and Ruiqi Guo and Sanjiv Kumar and Balint Miklos and Ray Kurzweil},
year={2017},
eprint={1705.00652},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
Base model
google/embeddinggemma-300m
from sentence_transformers import SentenceTransformer model = SentenceTransformer("TextModel/Embedding-crime-indo") sentences = [ "query: Kalau si koruptor ternyata udah nggak punya harta lagi buat bayar uang pengganti, apa konsekuensinya?", "passage: Hukumnya adalah tindak pidana yang diancam dengan pidana penjara paling lama 4 tahun atau pidana denda paling banyak kategori IV karena menggunakan ancaman kekerasan. (Pasal 302 KUHP)", "passage: Kalau harta bendanya tidak mencukupi, terpidana bisa dipidana penjara yang lamanya tidak melebihi ancaman maksimum pidana pokoknya dan sudah ditentukan langsung di dalam putusan pengadilan.", "passage: Penyitaan dan pelelangan harta bila uang pengganti tidak dibayar." ] embeddings = model.encode(sentences) similarities = model.similarity(embeddings, embeddings) print(similarities.shape) # [4, 4]