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

大模型相关目录

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

  1. 大模型应用向开发路径及一点个人思考
  2. 大模型应用开发实用开源项目汇总
  3. 大模型问答项目问答性能评估方法
  4. 大模型数据侧总结
  5. 大模型token等基本概念及参数和内存的关系
  6. 大模型应用开发-华为大模型生态规划
  7. 从零开始的LLaMA-Factory的指令增量微调
  8. 基于实体抽取-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)
  • 37
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的 BiLSTM-CRF 实体关系抽取模型的输出预测结果的 Python 代码示例: ```python import numpy as np import tensorflow as tf # 定义标签列表 label_list = ['O', 'B-PER', 'I-PER', 'B-LOC', 'I-LOC', 'B-ORG', 'I-ORG'] # 定义模型参数 hidden_size = 128 num_layers = 2 dropout_rate = 0.5 learning_rate = 0.001 # 定义输入数据占位符 input_ids = tf.placeholder(dtype=tf.int32, shape=[None, None], name="input_ids") input_mask = tf.placeholder(dtype=tf.int32, shape=[None, None], name="input_mask") segment_ids = tf.placeholder(dtype=tf.int32, shape=[None, None], name="segment_ids") # 定义模型 bert_config = modeling.BertConfig.from_json_file("bert_config.json") model = modeling.BertModel( config=bert_config, is_training=False, input_ids=input_ids, input_mask=input_mask, token_type_ids=segment_ids, use_one_hot_embeddings=False) output_layer = model.get_sequence_output() logits = tf.layers.dense(output_layer, len(label_list), name="logits") crf_params = tf.get_variable("crf_params", shape=[len(label_list), len(label_list)], dtype=tf.float32) pred_ids, _ = tf.contrib.crf.crf_decode(logits, crf_params, tf.reduce_sum(input_mask, axis=1)) # 加载模型参数 saver = tf.train.Saver() with tf.Session() as sess: saver.restore(sess, "model.ckpt") # 加载测试数据 test_input_ids = [...] # 测试数据的 input_ids test_input_mask = [...] # 测试数据的 input_mask test_segment_ids = [...] # 测试数据的 segment_ids # 预测结果 feed_dict = { input_ids: np.array([test_input_ids]), input_mask: np.array([test_input_mask]), segment_ids: np.array([test_segment_ids]) } pred_ids_result = sess.run(pred_ids, feed_dict=feed_dict)[0] # 将预测结果转换为标签序列 pred_label_list = [label_list[id] for id in pred_ids_result] print(pred_label_list) ``` 这段代码使用了 TensorFlow 实现 BiLSTM-CRF 模型,并使用预训练的 BERT 模型作为输入。在使用时,需要将测试数据的 `input_ids`、`input_mask`、`segment_ids` 输入到模型中,并使用 `tf.contrib.crf.crf_decode()` 函数计算预测结果。最后将预测结果转换为标签序列即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

写代码的中青年

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值