pipeline_tag: 句子相似度
tags:
- 句子转换器
- 句子相似度
- 转换器
- TAACO
language: ko
TAACO_相似度模型
本模型基于Sentence-transformers框架,通过KLUE的STS(句子文本相似度)数据集训练而成。
作为开发者正在构建的韩语句子连贯性测量工具K-TAACO(暂定名)的指标之一,为测量句子间语义连贯性而开发了本模型。
此外还计划获取包括"所有人的语料库"中的句子相似度数据在内的多种数据来进行追加训练。
训练数据
KLUE-sts-v1.1_train.json
NLI-sts-train.tsv
使用方法(Sentence-Transformers)
使用本模型需要先安装Sentence-transformers库:
pip install -U sentence-transformers
参考以下代码使用模型:
from sentence_transformers import SentenceTransformer, models
sentences = ["这是一个示例句子", "每个句子都会被转换"]
embedding_model = models.Transformer(
model_name_or_path="KDHyun08/TAACO_STS",
max_seq_length=256,
do_lower_case=True
)
pooling_model = models.Pooling(
embedding_model.get_word_embedding_dimension(),
pooling_mode_mean_tokens=True,
pooling_mode_cls_token=False,
pooling_mode_max_tokens=False,
)
model = SentenceTransformer(modules=[embedding_model, pooling_model])
embeddings = model.encode(sentences)
print(embeddings)
实际句子相似度比较
安装Sentence-transformers后,可按以下方式比较句子相似度。
query变量作为基准句子(源句),待比较句子以列表形式组织在docs中。
from sentence_transformers import SentenceTransformer, models
embedding_model = models.Transformer(
model_name_or_path="KDHyun08/TAACO_STS",
max_seq_length=256,
do_lower_case=True
)
pooling_model = models.Pooling(
embedding_model.get_word_embedding_dimension(),
pooling_mode_mean_tokens=True,
pooling_mode_cls_token=False,
pooling_mode_max_tokens=False,
)
model = SentenceTransformer(modules=[embedding_model, pooling_model])
docs = ['昨天是妻子的生日', '为了庆祝生日,从早上8点30分就开始准备早餐。主菜有牛排、炒章鱼、海带汤、杂菜、小香肠等', '因为常做牛排所以打算自己准备', '前后各煎1分钟翻三次面,静置得当就能做出多汁的牛排', '妻子也很喜欢这种牛排。但没想到发生了意外', '平时都是买未调味的原切肉来做牛排,这次买了预调味的牛肩肉', '却没注意到包装盒里的防腐剂,连防腐剂一起放上了平底锅', '就这样毫无察觉地...大火煎了一分钟后翻面时才发现防腐剂也被煎了', '本想为妻子生日好好表现,却发生了这种荒唐事', '可能是高温融化了防腐剂,像水一样流了下来', '犹豫过要不要去掉沾到防腐剂的部分重新煎,但看到包装上写着绝对不可食用,只好忍痛丢弃', '实在太遗憾了', '本想早起准备妻子爱吃的牛排,看着她开心享用的样子...却遇到这种意外...不过还是振作精神立刻换了其他菜色', '小香肠炒蔬菜..', '虽然不确定妻子是否喜欢,但看到冰箱里的法兰克福香肠就决定做这个。最后菜品很成功', '妻子40岁生日准备得很圆满', '也很感谢妻子吃得开心', '决定每年妻子生日都要准备早餐。希望今天也是快乐的一天', '因为是生日嘛~']
document_embeddings = model.encode(docs)
query = '为了庆祝生日,从早上8点30分就开始准备早餐'
query_embedding = model.encode(query)
top_k = min(10, len(docs))
cos_scores = util.pytorch_cos_sim(query_embedding, document_embeddings)[0]
top_results = torch.topk(cos_scores, k=top_k)
print(f"输入句子: {query}")
print(f"\n<与输入句子最相似的{top_k}个句子>\n")
for i, (score, idx) in enumerate(zip(top_results[0], top_results[1])):
print(f"{i+1}: {docs[idx]} {'(相似度: {:.4f})'.format(score)}\n")
评估结果
执行上述代码会得到如下结果,数值越接近1表示相似度越高。
输入句子: 为了庆祝生日,从早上8点30分就开始准备早餐
<与输入句子最相似的10个句子>
1: 为了庆祝生日,从早上8点30分就开始准备早餐。主菜有牛排、炒章鱼、海带汤、杂菜、小香肠等 (相似度: 0.6687)
2: 决定每年妻子生日都要准备早餐。希望今天也是快乐的一天 (相似度: 0.6468)
3: 妻子40岁生日准备得很圆满 (相似度: 0.4647)
4: 本想为妻子生日好好表现,却发生了这种荒唐事 (相似度: 0.4469)
5: 因为是生日嘛~ (相似度: 0.4218)
6: 昨天是妻子的生日 (相似度: 0.4192)
7: 本想早起准备妻子爱吃的牛排,看着她开心享用的样子...却遇到这种意外...不过还是振作精神立刻换了其他菜色 (相似度: 0.4156)
8: 也很感谢妻子吃得开心 (相似度: 0.3093)
9: 虽然不确定妻子是否喜欢,但看到冰箱里的法兰克福香肠就决定做这个。最后菜品很成功 (相似度: 0.2259)
10: 妻子也很喜欢这种牛排。但没想到发生了意外 (相似度: 0.1967)
数据加载器:
包含142个批次的torch.utils.data.dataloader.DataLoader
,参数为:
{'batch_size': 32, 'sampler': 'torch.utils.data.sampler.RandomSampler', 'batch_sampler': 'torch.utils.data.sampler.BatchSampler'}
损失函数:
使用sentence_transformers.losses.CosineSimilarityLoss.CosineSimilarityLoss
训练参数配置:
{
"epochs": 4,
"evaluation_steps": 1000,
"evaluator": "sentence_transformers.evaluation.EmbeddingSimilarityEvaluator.EmbeddingSimilarityEvaluator",
"max_grad_norm": 1,
"optimizer_class": "<class 'transformers.optimization.AdamW'>",
"optimizer_params": {
"lr": 2e-05
},
"scheduler": "WarmupLinear",
"steps_per_epoch": null,
"warmup_steps": 10000,
"weight_decay": 0.01
}
完整模型架构
SentenceTransformer(
(0): Transformer({'max_seq_length': 512, 'do_lower_case': False}) with Transformer model: BertModel
(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})
)
引用与作者