Views
No views yet
light-splade-japanese-56M is a Japanese SPLADE (SParse Lexical AnD Expansion) model for sparse information retrieval. This model transforms Japanese text into interpretable sparse vector representations that can be used for semantic search and document retrieval tasks.light-splade package and transformers package.BertJapaneseTokenizer from Hugging Face Transformers| Metric | Value |
|---|---|
| MRR@10 | 0.4022 |
| NDCG@10 | 0.45 |
| Recall@10 | 0.6411 |
| Recall@100 | 0.874 |
| Recall@1000 | 0.9543 |
| Avg. non-zero terms | 107 |
light-splade package1import torch
2from light_splade import SpladeEncoder
3
4# Initialize the encoder
5encoder = SpladeEncoder(model_path="bizreach-inc/light-splade-japanese-56M")
6
7# Tokenize input text
8corpus = [
9 "日本の首都は東京です。",
10 "大阪万博は2025年に開催されます。"
11]
12token_outputs = encoder.tokenizer(corpus, padding=True, return_tensors="pt")
13
14# Generate sparse representation
15with torch.inference_mode():
16 sparse_vecs = encoder.get_sparse(
17 input_ids=token_outputs["input_ids"],
18 attention_mask=token_outputs["attention_mask"]
19 )
20
21print(sparse_vecs[0])
22print(sparse_vecs[1])transformers package only1import torch
2from transformers import AutoTokenizer, AutoModelForMaskedLM
3
4
5def dense_to_sparse(dense: torch.tensor, idx2token: dict[int, str]) -> list[dict[str, float]]:
6 rows, cols = dense.nonzero(as_tuple=True)
7 rows = rows.tolist()
8 cols = cols.tolist()
9 weights = dense[rows, cols].tolist()
10
11 sparse_vecs = [{} for _ in range(dense.size(0))]
12 for row, col, weight in zip(rows, cols, weights):
13 sparse_vecs[row][idx2token[col]] = round(weight, 2)
14
15 for i in range(len(sparse_vecs)):
16 sparse_vecs[i] = dict(sorted(sparse_vecs[i].items(), key=lambda x: x[1], reverse=True))
17 return sparse_vecs
18
19
20MODEL_PATH = "bizreach-inc/light-splade-japanese-56M"
21device = "cuda" if torch.cuda.is_available() else "cpu"
22transformer = AutoModelForMaskedLM.from_pretrained(MODEL_PATH).to(device)
23tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
24idx2token = {idx: token for token, idx in tokenizer.get_vocab().items()}
25
26corpus = [
27 "日本の首都は東京です。",
28 "大阪万博は2025年に開催されます。"
29]
30token_outputs = tokenizer(corpus, padding=True, return_tensors="pt")
31attention_mask = token_outputs["attention_mask"].to(device)
32token_outputs = {key: value.to(device) for key, value in token_outputs.items()}
33
34with torch.inference_mode():
35 outputs = transformer(**token_outputs)
36 dense, _ = torch.max(
37 torch.log(1 + torch.relu(outputs.logits)) * attention_mask.unsqueeze(-1),
38 dim=1,
39 )
40sparse_vecs = dense_to_sparse(dense, idx2token)
41
42print(sparse_vecs[0])
43print(sparse_vecs[1])1{'首都': 1.83, '日本': 1.71, '東京': 1.64, '富士': 1.07, '地名': 0.91, '都市': 0.8, '##都': 0.77, '領土': 0.73, 'ゼロ': 0.72, 'シティ': 0.71, '位置': 0.58, '大国': 0.58, '本社': 0.55, 'とうきょう': 0.54, '中心': 0.53, '外来': 0.45, '京都': 0.41...}
2{'202': 1.61, '大阪': 1.5, '##5': 1.33, '開催': 1.15, '万博': 1.11, '東京': 1.07, '関西': 1.06, '神戸': 0.99, '京都': 0.96, '年': 0.91, 'まつり': 0.91, '203': 0.9, '月': 0.89, '日程': 0.84, '207': 0.67, 'オリンピック': 0.57, '主催': 0.57...}1@misc{light-splade-japanese-56M,
2 title={Light SPLADE Japanese 56M},
3 author={Bizreach Inc.},
4 year={2025},
5 url={https://huggingface.co/bizreach-inc/light-splade-japanese-56M}
6}