语义相似性计算

文章讲解了如何使用SentenceTransformer库在NLP项目中进行基于SBERT的语义搜索和无监督训练,涉及模型创建、编码数据和相似度查询的过程。

1、匹配内容较少(内存可以放下时)

参考:NLP实践——基于SBERT的语义搜索,语义相似度计算,SimCSE、GenQ等无监督训练-优快云博客

sentencetransformer对应的git说明:GitHub - UKPLab/sentence-transformers: Multilingual Sentence & Image Embeddings with BERT

sentencetransformer的官方文档:Pretrained Models — Sentence-Transformers documentation 

 查询的代码:

from sentence_transformers import SentenceTransformer, util
# 【创建模型】
# 这里的编码器可以换成mpnet-base-v2等
# 模型自动下载,并在/root/.cache下创建缓存,若使用本地制定目录的模型,只需要修改为对应的模型目录即可。
# 如果是想加载本地的预训练模型,则类似于huggingface的from_pretrained方法,把输入参数换成本地模型的路径
encoder = SentenceTransformer('paraphrase-MiniLM-L12-v2')
# encoder = SentenceTransformer('path-to-your-pretrained-model/paraphrase-MiniLM-L12-v2/')

answer_list = []

def encoding_all_data():

    base_data_path =

    input_question_list = []

    with open(base_data_path,'r',encoding='utf-8') as fi:

        json_data = json.loads(fi.read())

        for each in json_data:

            input_data,output_data = each["input"],each["output"]

            input_question_list.append(input_data)

            answer_list.append( output_data)

    matrix =encoder.encode(input_question_list, convert_to_tensor=True)

    return matrix

matrix = encoding_all_data()

# 计算编码
def get_similar_query(query):

    sentence_vec = encoder.encode(query, convert_to_tensor=True)

    cos_scores = util.cos_sim(sentence_vec, matrix)

    max_score, max_index = torch.max(cos_scores, dim=1)

    index = max_index.cpu().numpy().tolist()[0]

    score = max_score.cpu().numpy().tolist()[0]

    return answer_list[index],score

if __name__ == '__main__':
    print("data ok")
    while True:
        print("begin compute sim")

        inputs = input()

        result = get_similar_query(inputs)

        print(result)

 

### 关于语义相似性计算的方法总结 #### 传统方法概述 传统的语义相似性计算方法主要依赖符号匹配或统计特征,这些技术虽然简单易实现,但在处理深层次的语义关联时存在局限性。例如,基于字符串编辑距离的技术可以衡量两个单词的形式差异,但对于理解它们的实际意义帮助有限[^1]。 #### 基于嵌入的学习方法 近年来,随着深度学习的发展,联合嵌入(joint embedding)成为一种有效的解决方案。通过将实体及其关系映射到连续向量空间中,这种方法能够更好地捕捉语义上的相似性和关联性。具体而言,在知识图谱领域,联合嵌入模型利用三元组结构训练得到低维表示,从而支持更复杂的推理任务。 另外值得注意的是词袋模型(Bag Of Words), 它假设如果某些特定词汇频繁共同出现,则很可能具有相近含义;不过该方式忽略了语法顺序等因素的影响,因此仅适用于部分场景下粗略估计文本间的关系程度 [^2]. #### 度量标准与评估指标 对于评价不同算法效果的好坏来说 , 平均交并比(Mean IoU 或 MIoU) 是一个广泛接受的标准之一 。 这一数值反映了预测结果同真实标签之间重叠区域的比例大小情况 , 特别是在计算机视觉中的分割问题里尤为常见 [^3]. 同样地还有像素精度(Pixel Accuracy),以及频率加权版IOU(Frequency Weighted IOU)[^4], 不过后者更多见诸个别研究者的工作报告当中. #### 新兴趋势与发展动态 未来可能值得探索的方向包括但不限于以下几个方面 : - 结合几何信息与语义线索来提升三维重建质量 ; - 利用预训练语言模型进一步增强自然语言处理应用内的表征能力; - 针对资源稀缺环境设计轻量化版本网络架构等等 [^4]. ```python def calculate_mIoU(true_labels, predicted_labels): intersection = np.sum(np.logical_and(predicted_labels == true_labels)) union = np.sum(np.logical_or(predicted_labels != true_labels)) iou_score = intersection / float(union) return iou_score ``` 以上代码片段展示了如何手动计算单类别下的IoU得分,实际项目中应考虑多分类情形并对每类分别求取后再做平均操作获得最终mIoU值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会发paper的学渣

您的鼓励和将是我前进的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值