要使用 Sentence Transformers 执行释义挖掘,首先将句子编码成密集的向量表示(embeddings),然后比较这些 embeddings 来识别语义相似或重复的句子。Sentence Transformers 模型,例如 paraphrase-MiniLM-L6-v2
模型,经过专门训练以捕获语义含义,因此非常适合此任务。此过程涉及三个主要步骤:生成 embeddings、计算相似度和基于阈值的过滤。通过将文本转换为数值向量,可以使用余弦相似度等度量高效地衡量相似度,余弦相似度量化了两个向量在高维空间中的“对齐”程度。
技术实现首先对语料库中的所有句子进行 embedding。例如,使用 Python 中的 sentence-transformers
库,可以加载预训练模型并将句子编码成 embeddings。下面是一个简化的代码片段:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
embeddings = model.encode(sentences, batch_size=128, show_progress_bar=True)
对于大型数据集(例如,数百万个句子),直接成对比较所有 embeddings 的计算成本很高。因此,使用近似最近邻 (ANN) 库,如 FAISS 或 Annoy,来加速相似性搜索。这些工具以某种方式对 embeddings 进行索引,从而可以快速检索最接近的匹配项。例如,FAISS 可以通过对向量进行聚类或使用量化,将搜索时间从几小时缩短到几秒。索引后,针对索引查询每个句子的 embedding 以找到其最近邻居,并通过相似度阈值(例如,0.85 余弦相似度)过滤结果,以标记潜在的释义。
实际考虑因素包括选择合适的模型、调整阈值和处理可扩展性。像 paraphrase-MiniLM-L6-v2
这样的模型在速度和准确性之间取得了平衡,但更大的模型(例如,all-mpnet-base-v2
)可能会以计算资源为代价提供更高的准确性。阈值取决于您的用例:较低的阈值(0.7)会捕获更多释义,但存在误报的风险,而较高的阈值(0.9)可确保精度,但可能会错过细微的相似性。例如,在客户支持语料库中,像“我无法登录我的帐户”和“我的登录不起作用”这样的句子得分可能为 0.92,表明是重复的。在数据的标记子集上测试阈值可确保获得最佳结果。最后,批量处理和分布式计算框架(例如,Dask)可以帮助管理超大型数据集的内存和处理时间。