license: apache-2.0
language:
- en
tags:
- 短语表征
- 字符串匹配
- 模糊连接
- 实体检索
- transformers
- sentence-transformers
🦪⚪ 珍珠小模型(PEARL-small)
学习高质量通用短语表征
作者:陈立虎、高埃尔·瓦罗奎克斯、法比安·M·苏查内克
入选EACL Findings 2024
珍珠小模型是一款轻量级字符串嵌入模型。它是处理字符串语义相似度计算的理想工具,能为字符串匹配、实体检索、实体聚类、模糊连接等任务生成卓越的嵌入向量。
与传统句子嵌入模型不同,该模型融合了短语类型信息和词形特征,能更精准捕捉字符串的形态变化。本模型基于E5-small微调而成,使用我们构建的无上下文数据集训练,可为短语和字符串生成更优质的向量表示。
🤗 珍珠小模型 🤗 珍珠基础模型
📐 珍珠基准测试 🏆 珍珠排行榜
模型 |
参数量 |
平均分 |
PPDB |
PPDB过滤版 |
Turney |
BIRD |
YAGO |
UMLS |
CoNLL |
BC5CDR |
AutoFJ |
FastText |
- |
40.3 |
94.4 |
61.2 |
59.6 |
58.9 |
16.9 |
14.5 |
3.0 |
0.2 |
53.6 |
Sentence-BERT |
1.1亿 |
50.1 |
94.6 |
66.8 |
50.4 |
62.6 |
21.6 |
23.6 |
25.5 |
48.4 |
57.2 |
Phrase-BERT |
1.1亿 |
54.5 |
96.8 |
68.7 |
57.2 |
68.8 |
23.7 |
26.1 |
35.4 |
59.5 |
66.9 |
E5-small |
3400万 |
57.0 |
96.0 |
56.8 |
55.9 |
63.1 |
43.3 |
42.0 |
27.6 |
53.7 |
74.8 |
E5-base |
1.1亿 |
61.1 |
95.4 |
65.6 |
59.4 |
66.3 |
47.3 |
44.0 |
32.0 |
69.3 |
76.1 |
珍珠小模型 |
3400万 |
62.5 |
97.0 |
70.2 |
57.9 |
68.1 |
48.1 |
44.5 |
42.4 |
59.3 |
75.2 |
珍珠基础模型 |
1.1亿 |
64.8 |
97.3 |
72.2 |
59.7 |
72.6 |
50.7 |
45.8 |
39.3 |
69.4 |
77.1 |
FastText与珍珠模型的成本对比。内存估算基于参数数量(float16格式),推理速度单位为毫秒/512样本
。对比使用的FastText模型为crawl-300d-2M-subword.bin
。
模型 |
平均分 |
预估内存 |
GPU速度 |
CPU速度 |
FastText |
40.3 |
1200MB |
- |
57ms |
珍珠小模型 |
62.5 |
68MB |
42ms |
446ms |
珍珠基础模型 |
64.8 |
220MB |
89ms |
1394ms |
使用指南
句子转换器
珍珠模型已集成至Sentence Transformers库(感谢汤姆·阿尔森的贡献),使用方法如下:
from sentence_transformers import SentenceTransformer, util
query_texts = ["纽约时报"]
doc_texts = ["NYTimes", "纽约邮报", "纽约"]
input_texts = query_texts + doc_texts
model = SentenceTransformer("Lihuchen/pearl_small")
embeddings = model.encode(input_texts)
scores = util.cos_sim(embeddings[0], embeddings[1:]) * 100
print(scores.tolist())
Transformers库
也可直接使用transformers
调用珍珠模型。以下展示实体检索示例(代码复用E5实现):
import torch.nn.functional as F
from torch import Tensor
from transformers import AutoTokenizer, AutoModel
def average_pool(last_hidden_states: Tensor, attention_mask: Tensor) -> Tensor:
last_hidden = last_hidden_states.masked_fill(~attention_mask[..., None].bool(), 0.0)
return last_hidden.sum(dim=1) / attention_mask.sum(dim=1)[..., None]
def encode_text(model, input_texts):
batch_dict = tokenizer(input_texts, max_length=512, padding=True, truncation=True, return_tensors='pt')
outputs = model(**batch_dict)
embeddings = average_pool(outputs.last_hidden_state, batch_dict['attention_mask'])
return embeddings
query_texts = ["纽约时报"]
doc_texts = ["NYTimes", "纽约邮报", "纽约"]
input_texts = query_texts + doc_texts
tokenizer = AutoTokenizer.from_pretrained('Lihuchen/pearl_small')
model = AutoModel.from_pretrained('Lihuchen/pearl_small')
embeddings = encode_text(model, input_texts)
embeddings = F.normalize(embeddings, p=2, dim=1)
scores = (embeddings[:1] @ embeddings[1:].T) * 100
print(scores.tolist())
训练与评估
详见GitHub代码库
引用
若使用本工作,请引用:
@inproceedings{chen2024learning,
title={学习高质量通用短语表征},
author={陈立虎 and 高埃尔·瓦罗奎克斯 and 法比安·M·苏查内克},
booktitle={EACL 2024会议论文集},
pages={983--994},
year={2024}
}