首页 > 编程语言 >基于实体抽取-SMC-语义向量的大模型能力评估通用算法(附代码)

基于实体抽取-SMC-语义向量的大模型能力评估通用算法(附代码)

时间:2024-03-18 20:02:13浏览次数:23  
标签:word list 模型 语义 相似 ########## 文本 SMC 向量

大模型相关目录

大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容
从0起步,扬帆起航。

  1. 大模型应用向开发路径及一点个人思考
  2. 大模型应用开发实用开源项目汇总
  3. 大模型问答项目问答性能评估方法
  4. 大模型数据侧总结
  5. 大模型token等基本概念及参数和内存的关系
  6. 从零开始的LLaMA-Factory的指令增量微调
  7. 基于实体抽取-SMC-语义向量的大模型能力评估通用算法(附代码)

文章目录


一、简介

大模型能力评估本质是对如下问答数据集的评分。

 quetions = [
        '如果我在办理建设项目抗震设防要求审批时对服务不满意,想要提出投诉,应该如何操作?',
        '请问在申请《电视剧制作许可证(乙种)》的过程中,是由哪个政府部门具体负责办理的?',
        '电视剧制作许可证(乙种)的申请在哪里办理呢?'
    ]
    answers_standard = [
        '对于办理建设项目抗震设防要求审批的投诉事宜,可以直接通过烟台市行政审批服务局的投诉电话0535-6788801进行,他们会处理你的问题并给出回应。',
        '《电视剧制作许可证(乙种)》的核发是由烟台市文化和旅游局来承办的,具体操作由烟台市政务服务中心文旅局驻厅窗口负责处理。',
        '电视剧制作许可证(乙种)的受理地点在山东省烟台市莱山区滨海路街道银海路46号的烟台市政务服务中心,具体是在A359/360窗口。'
    ]
    answers_test = [
        '可通过拨打投诉电话0535-6788801进行投诉。',
        '《电视剧制作许可证(乙种)》的核发由烟台市自然资源和规划局来承办。',
        '在山东省烟台市莱山区滨海路街道银海路46号的烟台市政务服务中心,具体是在A359/360窗口。'
    ]

可见answers_standard是标准答案,answers_test是大模型的回答答案,只需评估二者对应数据项之间的关系即可度量出大模型的回答性能。二者之间数据相似度越高,评分则越高,大模型性能则越优越。

本文针对这一需求,设计了基于实体抽取-SMC-语义向量的大模型能力评估通用算法,可有效利用NLP技术实现有效评估。

1.1 实体抽取

实体抽取,也被称为命名实体识别(Named Entity
Recognition,NER),是自然语言处理(NLP)中的一项关键任务。其目标是从原始语料中自动识别并提取出具有特定意义的实体,如人名、地名、组织机构名、时间等。

本文引入实体抽取旨在抽取标准答案与大模型答案中的指定实体,观测二者所抽实体与实体内容是否一致,一致则增加评分。

1.2 SMC词频文本相似度

“SMC词频文本相似度”是一个结合了词频(SM,可能是指"词频"或"统计模型")和某种形式的文本相似度度量(C)的概念。在文本分析和自然语言处理中,词频通常用于衡量一个词在文本中的出现频率,而文本相似度则是用来度量两个或多个文本之间的相似程度。

本文引入SMC词频文本相似度用于作为评分固定项。

1.3 基于语义文本向量相似度

基于语义的文本向量相似度是一种度量两个或多个文本之间相似度的方法,它侧重于文本之间的语义关系而非仅仅基于表面的词汇匹配。这种方法通常结合了词频统计、文本表示学习(如词嵌入)和相似度计算算法。

在基于语义的文本向量相似度计算中,首先需要将文本转化为向量表示。这通常通过预训练的词嵌入模型(如Word2Vec、GloVe或BERT)来实现,这些模型能够将词汇或短语映射到高维向量空间中的点,使得语义上相似的词汇在向量空间中距离较近。

一旦文本被转化为向量表示,就可以使用各种相似度度量方法(如余弦相似度、欧氏距离等)来计算这些向量之间的相似度。余弦相似度是常用的度量方法之一,它通过计算两个向量之间的夹角余弦值来评估它们的相似度,值越接近1表示越相似,越接近-1表示越不相似。

本文引入基于语义文本向量相似度用于作为评分固定项。

1.4 算法总体介绍

在这里插入图片描述

二、环境准备

2.1 NER环境

采用paddle生态:

pip install paddlenlp==2.5.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple

2.2 smc环境

pip install jieba -i https://pypi.tuna.tsinghua.edu.cn/simple

2.3 情感分析环境

pip install snownlp -i https://pypi.tuna.tsinghua.edu.cn/simple

2.4 文本语义相似度环境

见:

https://blog.csdn.net/qq_43128256/article/details/136498423?spm=1001.2014.3001.5502

三、代码实例

def intersection(list1:list,list2:list) -> list:
    # 将列表转换为集合
    set1 = set(list1)
    set2 = set(list2)
    # 取两个集合的交集
    intersection = set1 & set2

    # 如果需要将结果转回列表
    intersection_list = list(intersection)
    return intersection_list

def keyword_score(text1:str,text2:str,ie_model) -> float:
    ner_dict_result1 = ie_model(text1)[0]
    ner_dict_result2 = ie_model(text2)[0]

    intersection_result = intersection(list(ner_dict_result1.keys()),list(ner_dict_result2.keys()))

    result = 0
    for field in intersection_result:
        if (ner_dict_result1[field][0]['probability'] > 0.6) and (ner_dict_result2[field][0]['probability'] > 0.6):
            if ner_dict_result1[field][0]['text'] == ner_dict_result2[field][0]['text']:
                result = 1
                break
        else:
            pass
    return result


# 加载停用词
def Stop(filepath):
    stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
    return stopwords

# 删除停用词(停用词表选用哈工大停用词表,存名为 hit_stopwords.txt)
def seg_sentence(sentence):
    A = jieba.cut(sentence.strip(), cut_all=False)
    stop = Stop('./hit_stopwords.txt')
    outstr = ''
    for word in A:
        if word not in stop:
            if word != '\t':
                outstr += word
                outstr += ' '
    return outstr

# 情感分析函数,输入为文本,输出情感得分
# 越接近1情感越积极
def sentimentAnalysis(text:str)->float:
    # 创建一个SnowNLP对象
    s = SnowNLP(text)
    # 分析情感
    sentiment = s.sentiments
    # 输出结果
    return sentiment

# 词频度量:用SMC相似度计算文本之间的相似度,输入文本1与文本2,输出文本1、文本2之间的相似度评分
# 越接近1相似度越高
def smc_similarity(sentence1: str, sentence2: str) -> float:
    sentence1 = seg_sentence(sentence1)
    sentence2 = seg_sentence(sentence2)
    # 1. 实现文本分词
    ########## Begin ##########
    seg1 = [word for word in jieba.cut(sentence1)]
    seg2 = [word for word in jieba.cut(sentence2)]
    ########## End ##########
    # 2. 建立词库
    ########## Begin ##########
    word_list = list(set([word for word in seg1 + seg2]))
    ########## End ##########
    # 3. 统计各个文本在词典里出现词的次数
    ########## Begin ##########
    word_counts_1 = np.array([len([word for word in seg1 if word == w]) for w in word_list])
    word_counts_2 = np.array([len([word for word in seg2 if word == w]) for w in word_list])
    ########## End ##########
    # 4. 余弦公式
    ########## Begin ##########
    f00 = np.sum((word_counts_1 == 0) & (word_counts_2 == 0))
    f01 = np.sum((word_counts_1 == 0) & (word_counts_2 != 0))
    f10 = np.sum((word_counts_1 != 0) & (word_counts_2 == 0))
    f11 = np.sum((word_counts_1 != 0) & (word_counts_2 != 0))
    smc = (f00 + f11) / (f01 + f10 + f00 + f11)
    ########## End ##########
    return float(smc)


# 语义度量:基于paraphrase-multilingual-MiniLM-L12-v2的文本向量化计算文本之间的相似度,输入文本1与文本2,输出文本1、文本2之间的相似度评分
# 越接近1相似度越高
def paraphrase_similarity(sentence1: str, sentence2: str) -> float:
    embedding1 =  model.encode(sentence1)
    embedding2 =  model.encode(sentence2)
    cosine_score = cos_sim(embedding1, embedding2)
    return float(cosine_score[0][0])


# 汇总评分
def calculate_score(text1:str,text2:str,ie_model) -> float:
    if ie_model(text1)[0] == {} or ie_model(text2)[0] == {}:
        result = 0
        if abs(sentimentAnalysis(text1) - sentimentAnalysis(text2)) <= 0.3:
            smc_score = 0.5 * smc_similarity(text1, text2)
            semanteme_score = 0.5 * paraphrase_similarity(text1, text2)
            result = smc_score + semanteme_score
        else:
            smc_score = 0.25 * smc_similarity(text1, text2)
            semanteme_score = 0.25 * paraphrase_similarity(text1, text2)
            result = smc_score + semanteme_score
    else:
        result = 0

        if abs(sentimentAnalysis(text1) - sentimentAnalysis(text2)) <= 0.3:
            smc_score = 0.4 * smc_similarity(text1, text2)
            semanteme_score = 0.4 * paraphrase_similarity(text1, text2)
            key_score = 0.2 * keyword_score(text1, text2,ie_model)
            result = smc_score + semanteme_score + key_score
        else:
            smc_score = 0.25 * smc_similarity(text1, text2)
            semanteme_score = 0.25 * paraphrase_similarity(text1, text2)
            key_score = 0.2 * keyword_score(text1, text2, ie_model)
            result = smc_score + semanteme_score + key_score

    return round(result,4)

标签:word,list,模型,语义,相似,##########,文本,SMC,向量
From: https://blog.csdn.net/qq_43128256/article/details/136818704

相关文章

  • HTML进阶版(表单标签、语义化标签、字符实体)
    雷迪斯andthe乡亲们 欢迎你们来到奇幻的编程世界  上一篇我们学习了(列表标签、表格标签)让我来回顾一下吧!列表标签无序列表最常用,有序列表偶尔用,自定义列表底部导航用表格标签①表格基本标签:table>tr>td②表格标题和表头单元格标签:table> caption......
  • Desmos 3D| 向量计算的工具化
    前言计算示例全屏......
  • 语义分割、实例分割、全景分割
    语义分割:实例分割:全景分割:UNetUnet包括两部分,可以看右图,第一部分,特征提取,VGG类似。第二部分上采样部分。由于网络结构像U型,所以叫Unet网络。特征提取部分,每经过一个池化层就一个尺度,包括原图尺度一共有5个尺度。上采样部分,每上采样一次,就和特......
  • Sklearn支持向量机
    支持向量机(SupportVectorMachine,SVM)是一种常用的分类算法,它可以用于解决二分类和多分类问题。在Python中,你可以使用Sklearn库来实现SVM。下面是一个简单的例子,展示了如何使用Sklearn进行SVM分类。#导入必要的库fromsklearn.model_selectionimporttrain_test_split......
  • 基于大模型和向量数据库的 RAG 示例
    1        RAG介绍RAG是一种先进的自然语言处理方法,它结合了信息检索和文本生成技术,用于提高问答系统、聊天机器人等应用的性能。2        RAG的工作流程文档加载(DocumentLoading)从各种来源加载大量文档数据。这些文档将作为知识库,用于后续的信息检索......
  • PaperPlagiarismChecker
    这个作业属于哪个课程https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024这个作业要求在哪里https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136这个作业的目标1.学习GitHub创建文件2.学习psp表格规划时间3.开发一个论文查......
  • BSLTR-初始化向量的优化
    要使得初始化的用户向量X在训练过程中得到优化,我们需要对前述示例进行一些修改,确保X是一个可训练的参数。在PyTorch中,这意味着我们需要将X定义为一个Parameter或者设置requires_grad=True。然而,由于X代表原始数据,通常我们不直接将其视为模型参数进行优化。相反,我们优化模型来学习......
  • 一文看明白Transformer微调过程中嵌入向量的变化
    TL;DR微调在图像分类中显著影响嵌入向量。微调前的嵌入向量提供通用性表征,而微调后的嵌入向量捕获任务特定的特征。这种区别可能导致在异常检测和其他任务中的不同结果。微调前和微调后的嵌入向量各有其独特优势,应结合使用以实现图像分类和分析任务中的全面分析。请查看本......
  • PHP立体安全攻击向量:保护应用程序的关键挑战
    PHP立体安全攻击向量:保护应用程序的关键挑战PHP作为一种广泛使用的服务器端脚本语言,拥有庞大的用户群体和丰富的生态系统。然而,随着互联网的发展,网络安全问题也变得愈发严重。本文将深入探讨PHP的立体安全攻击向量,分析其原理和可能的应对策略,帮助开发者了解并应对这些潜在威......
  • 使用 Keras 和 ArcGIS Pro 通过 Mask-RCNN/DeepLabV3+ 进行 EagleView 高分辨率图像语
            机器学习中的计算机视觉为GIS提供了巨大的机会。其任务包括获取、处理、分析和理解数字图像的方法,以及从现实世界中提取高维数据以产生数字或符号信息,例如以决策的形式。在过去的几年中,计算机视觉越来越多地从传统的统计方法转向最先进的深度学习神经网络技......