Sentence transformers

来自牛奶河Wiki
跳到导航 跳到搜索

sentence-transformer(SBERT) 框架提供了一种简便的方法来计算句子和段落的向量表示(也称为句子嵌入),是用于访问、使用和训练最先进的文本和图像嵌入模型的首选 Python 模块。它可用于模型计算嵌入或使用交叉编码器模型计算相似性,包括语义搜索、语义文本相似性和释义挖掘。

超过 5,000 个预先训练的 Sentence Transformer 模型可供 Hugging Face 立即使用,其中包括 Massive Text Embeddings Benchmark(MTEB) 排行榜中的许多最先进的模型。此外,使用 Sentence Transformer 可以轻松训练或微调您自己的模型,使您能够为特定用例创建自定义模型。

Sentence Transformers 由 UKPLab 创建,由 Hugging Face 维护。

Download: Sentence Transformers List

Embedding Mode

同种语义句向量对比

from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer('distiluse-base-multilingual-cased')
emb1 = model.encode('Natural language processing is a hard task for human')
emb2 = model.encode('自然语言处理对于人类来说是个困难的任务')
emb3 = model.encode('猫是一种小型哺乳动物,被视为宠物。')
cos_sim = util.pytorch_cos_sim(emb1, emb2)
print(cos_sim)
cos_sim = util.pytorch_cos_sim(emb1, emb3)
print(cos_sim)
# result
tensor([[0.8960]])
tensor([[0.1019]])

向量搜索

import pandas as pd
df = pd.read_csv("demo.txt", sep="#",header=None, names=["sentence"])

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('uer/sbert-base-chinese-nli')
sentences = df['sentence'].tolist()
sentence_embeddings = model.encode(sentences)

import faiss
dimension = sentence_embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(sentence_embeddings)

topK = 5
search = model.encode(["宠物猫"])
D, I = index.search(search, topK)
df['sentence'].iloc[I[0]]
# result
6     猫是一种小型哺乳动物,被视为宠物。
3       鸡是一种小型哺乳动物,下蛋用。
4     桌子是一种家俱,放东西、吃饭使用。
7    狗是一种常见的宠物,被用作伴侣动物。
5           椅子是一种家俱,人坐。
Name: sentence, dtype: object
>>> 
>>> D
array([[341.92676, 638.62585, 787.46716, 848.5363 , 861.7328 ]], dtype=float32)
>>> I
array([[6, 3, 4, 7, 5]])
# demo.txt
大米是一种食品,通常煮饭吃。
马是一种大型哺乳动物,可以在战场上。
驴是一种大中型哺乳动物,拉磨使用。
鸡是一种小型哺乳动物,下蛋用。
桌子是一种家俱,放东西、吃饭使用。
椅子是一种家俱,人坐。
猫是一种小型哺乳动物,被视为宠物。
狗是一种常见的宠物,被用作伴侣动物
# sentence_embeddings
array([[ 0.11093175,  1.1299301 ,  0.17589748, ...,  0.37643528,
        -0.12583402,  0.00688386],
       [ 0.8285252 ,  0.56754893,  0.8541247 , ..., -0.02121782,
         0.24608377, -0.8908539 ],
       [ 0.8924473 ,  0.39356   ,  1.0510321 , ..., -0.28610831,
         0.61363673, -0.98788214],
       ...,
       [ 0.5105152 ,  0.45100805,  0.05316412, ...,  0.8938415 ,
         0.93790394,  0.23845226],
       [-0.35107028, -0.48179546,  0.13401322, ...,  1.0194194 ,
         1.2652978 ,  0.60486746],
       [ 0.68396544,  1.0733061 ,  0.99040854, ..., -0.5946619 ,
         0.9970803 ,  0.17561308]], dtype=float32)

# sentence_embeddings.shape
(8, 768)

向量搜索(增加向量)

sentences_add = ["《红楼梦》,中国古代章回体长篇小说,中国古典四大名著之一。其通行本共 120 回,一般认为前 80 回是清代作家曹雪芹所著,后 40 回作者为无名氏,整理者为程伟元、高鹗。小说以贾、史、王、薛四大家族的兴衰为背景,以富贵公子贾宝玉为视角,以贾宝玉与林黛玉、薛宝钗的爱情婚姻悲剧为主线,描绘了一些闺阁佳人的人生百态,展现了真正的人性美和悲剧美,是一部从各个角度展现女性美以及中国古代社会百态的史诗性著作。", "《三国演义》(又名《三国志演义》《三国志通俗演义》)是元末明初小说家罗贯中根据陈寿《三国志》和裴松之注解以及民间三国故事传说经过艺术加工创作而成的长篇章回体历史演义小说,与《西游记》《水浒传》《红楼梦》并称为中国古典四大名著。"]

sentence_add_embeddings = model.encode(sentences_add)
index.add(sentence_add_embeddings)

df = pd.DataFrame([*sentences, *sentences_add], columns=["sentence"])

search = model.encode(["章回体小说"])
D, I = index.search(search, topK)
df['sentence'].iloc[I[0]]