高性能な日本語
SPLADE (Sparse Lexical and Expansion Model) モデルです。
テキストからスパースベクトルへの変換デモで、どのようなスパースベクトルに変換できるか、WebUI から気軽にお試しいただけます。
1from yasem import SpladeEmbedder
2
3model_name = "hotchpotch/japanese-splade-base-v1"
4embedder = SpladeEmbedder(model_name)
5
6sentences = [
7 "車の燃費を向上させる方法は?",
8 "急発進や急ブレーキを避け、一定速度で走行することで燃費が向上します。",
9 "車を長持ちさせるには、消耗品を適切なタイミングで交換することが重要です。",
10]
11
12embeddings = embedder.encode(sentences)
13similarity = embedder.similarity(embeddings, embeddings)
14
15print(similarity)
16# [[21.49299249 10.48868281 6.25582337]
17# [10.48868281 12.90587398 3.19429791]
18# [ 6.25582337 3.19429791 12.89678271]]
1token_values = embedder.get_token_values(embeddings[0])
2
3print(token_values)
4
5#{
6# '車': 2.1796875,
7# '燃費': 2.146484375,
8# '向上': 1.7353515625,
9# '方法': 1.55859375,
10# '燃料': 1.3291015625,
11# '効果': 1.1376953125,
12# '良い': 0.873046875,
13# '改善': 0.8466796875,
14# 'アップ': 0.833984375,
15# 'いう': 0.70849609375,
16# '理由': 0.64453125,
17# ...
1
2from transformers import AutoModelForMaskedLM, AutoTokenizer
3import torch
4
5model = AutoModelForMaskedLM.from_pretrained(model_name)
6tokenizer = AutoTokenizer.from_pretrained(model_name)
7
8def splade_max_pooling(logits, attention_mask):
9 relu_log = torch.log(1 + torch.relu(logits))
10 weighted_log = relu_log * attention_mask.unsqueeze(-1)
11 max_val, _ = torch.max(weighted_log, dim=1)
12 return max_val
13
14tokens = tokenizer(
15 sentences, return_tensors="pt", padding=True, truncation=True, max_length=512
16)
17tokens = {k: v.to(model.device) for k, v in tokens.items()}
18
19with torch.no_grad():
20 outputs = model(**tokens)
21embeddings = splade_max_pooling(outputs.logits, tokens["attention_mask"])
22
23similarity = torch.matmul(embeddings.unsqueeze(0), embeddings.T).squeeze(0)
24print(similarity)
25
26# tensor([[21.4943, 10.4816, 6.2540],
27# [10.4816, 12.9024, 3.1939],
28# [ 6.2540, 3.1939, 12.8919]])
JMTEB の評価結果です。japanese-splade-base-v1 は
JMTEB をスパースベクトルで評価できるように変更したコードでの評価となっています。
なお、japanese-splade-base-v1 は jaqket, mrtydi のドメインを学習(testのデータ以外)しています。
hpprc/emb から、auto-wiki-qa, mmarco, jsquad jaquad, auto-wiki-qa-nemotron, quiz-works quiz-no-mori, miracl, jqara mr-tydi, baobab-wiki-retrieval, mkqa データセットを利用しています。
また英語データセットとして、MS Marcoを利用しています。