1.安装
环境:python 3.6>=,pytorch 1.6.0>=,transformers v4.6.0>=。不支持 python 2.7
pytorch 安装参考 PyTorch安装报错_piukaty的博客-CSDN博客
transformers 安装:
pip install transformers
sentence-transformers安装:
pip install -U sentence-transformers
检查:import sentence_transformers。能正常导入,无报错。在官方文档可能会让你输入一段英语小测验一下,其实也没必要。
2.加载中文预训练模型
from sentence_transformers import SentenceTransformer
# 保存预训练模型的文件夹
save_path = "./bert_based_chinese"
# 加载模型
model = SentenceTransformer('distiluse-base-multilingual-cased-v1')
# 保存模型到指定文件夹
model.save(save_path)
sentence_transformers 还支持其他的预训练模型,详细见预训练模型 — 句子转换器文档 (sbert.net)。这里我们选择了支持多语言的模型(当然也支持中文)。加载指定模型用:
model = SentenceTransformer('model-name')
其中model-name指你要加载的模型名。当你把模型保存到本地后,就可以用SentenceTransformers(path)来加载模型。model-name替换为保存模型的路径。注意对模型新建一个空的文件夹保存。
3.一个小的尝试:怎么嵌入句向量
from sentence_transformers import SentenceTransformer as st
# 加载模型
model = st("./bert_based_chinese")
# 待编码的句子
sentences = [
"明月几时有",
"把酒问青天"
]
# 编码
embeddings = model.encode(sentences)
for sentence,embedding in zip(sentences, embeddings):
print("Sentence:", sentence)
print("Embedding:", embedding)
print("")
model.encode参数说明:
-
sentence – 要嵌入的句子
-
batch_size – 用于计算的批大小
-
show_progress_bar – 对句子进行编码时输出进度条
-
output_value – 默认sentence_embedding,用于获取句子嵌入。可以设置为token_embeddings以获取字片标记嵌入。设置为"无",以获取所有输出值
-
convert_to_numpy – 如果为 true,则输出为 numpy 向量的列表。否则,它是一个 pytorch 张量列表。
-
convert_to_tensor – 如果为 true,将返回一个tensor大张量。覆盖convert_to_numpy中的任何设置
-
normalize_embeddings – 如果设置为 true,则返回的向量的长度将为 1。在这种情况下,可以使用更快的点积(util.dot_score)而不是余弦相似性。
需要注意的点:
1.输入的多个句子放在列表里;
2.也可以输入短语或者长句子,超过最大句长会被截断,最大句长为512个单词片段,约为300-400单词(以英语单词来衡量)
# 获取最大句长,默认是128
print("Max Sequence Length:", model.max_seq_length)
# 修改最大句长为200,不然超过支持的512
model.max_seq_length = 200
print("Max Sequence Length:", model.max_seq_length)