基于神经网络的情景喜剧笑点识别(CCL2020-EHC)

本文将通过神经网络预训练模型实现对情景喜剧笑点的识别

文章目录

本文将通过神经网络预训练模型实现对情景喜剧笑点的识别

前言 

任务背景

任务介绍

数据集介绍 

数据集属性说明:

训练集:

验证集:

测试集:

评测指标:

步骤

1.数据预处理

2.训练

2.1模型加载

2.2简单使用

2.3对test数据集进行预测

3.结果 

不足之处和改进:

总结


前言 

任务背景

任务介绍


数据集介绍 

数据集属性说明:

训练集:

验证集:

 测试集:

 评测指标:

由两个指标综合决定,即

步骤

1.数据预处理

思路:首先观察数据集本身,它是来源与情景喜剧对话,在一段对话中,存在不同角色进行交流,产生连续的对白(Utterance)。同一段对话中的对白按顺序出现,存在上下文关系。相比于单句幽默,对话中的幽默可能来自于上下文语境,而非对白内容本身。因此,需要结合上下文语境内容对对白是否幽默作出判断,识别出情景喜剧中的笑点。所以根据其特点设计了三种数据处理方法进行对比。

(1)若对数据集中的sentence不做处理,即只取Sentencelabel这两列的数据进行训练,如图: 

对应的结果:

(2)结合剧本本身的特点,将Speaker和Sentence这两列合并得到新的sentence,speaker和sentence之间用 : 隔开

 对应的结果:

 (可以看到确实有些许效果)

(3)考虑上下文关系,将前文和后文都考虑进来,每句话之间用 特殊符号。隔开(当然特殊符号可以选其他的,或者空格代替,但是经过实验我发现用。好可能稍好一些)。至于考虑前文多少句话,后文多少句话,这里经过实验比较,考虑当前语句的上一句和下一句最好。

 

 对应的结果:

(可以看到无论在中文数据集还是英文数据集上都有不小的提升) 

  代码:

  数据处理函数data_process():

#导入库
import pandas as pd
import csvdef data_process(path,filename):"""path:string 为你的训练集或验证集的文件路径filename:string 为处理后的数据文件的存放路径,因为是csv文件,所以以.csv结尾"""#读取数据data_sets=pd.read_csv(path)#读取Sentence这一列的数据data=data_sets['Sentence']#读取Speaker这一列的数据Speaker=data_sets['Speaker']#读取Label这一列的数据label=data_sets['Label']#考虑上下文信息,head表示考虑当前语句前head条对话,behind表示当前语句后behind-1条对话ahead=1behind=2#将处理后的数据写入filename文件中with open(filename, 'w', newline='',encoding='utf-8') as file:writer = csv.writer(file)#先写入属性名writer.writerow(["Sentence", "Label"])#依次读取原始数据每一行数据for i in range(len(data)):new_sentence=""#防止越界left=max(0,i-ahead)right=min(len(data),i+behind)#合并left到right-1条数据for j in range(left,right):#先合并Speaker和Sentence这两列数据speaker_sentence=Speaker[j]+":"+data[j]#再添到new_sentence中new_sentence=new_sentence+speaker_sentence+"."#print(new_sentence)#写入数据writer.writerow([new_sentence,int(label[i])])

 由于测试集没有Label属性,但又为了方便利用上面的代码,所以给它弄个伪标签

def data_process_test(path,filename):"""path:string 为你的训练集或验证集的文件路径filename:string 为处理后的数据文件的存放路径,因为是csv文件,所以以.csv结尾"""#读取数据data_sets=pd.read_csv(path)#读取Sentence这一列的数据data=data_sets['Sentence']#读取Speaker这一列的数据Speaker=data_sets['Speaker']#伪标签label=[0]*len(data)#考虑上下文信息,head表示考虑当前语句前head条对话,behind表示当前语句后behind-1条对话ahead=1behind=2#将处理后的数据写入filename文件中with open(filename, 'w', newline='',encoding='utf-8') as file:writer = csv.writer(file)#先写入属性名writer.writerow(["Sentence", "Label"])#依次读取原始数据每一行数据for i in range(len(data)):new_sentence=""#防止越界left=max(0,i-ahead)right=min(len(data),i+behind)#合并left到right-1条数据for j in range(left,right):#先合并Speaker和Sentence这两列数据speaker_sentence=Speaker[j]+":"+data[j]#再添到new_sentence中new_sentence=new_sentence+speaker_sentence+"."#print(new_sentence)#写入数据writer.writerow([new_sentence,int(label[i])])

调用:

data_process(train_cn_path,"train_cn_data.csv")
data_process(eval_cn_path,"eval_cn_data.csv")
data_process_test(test_cn_path,"test_cn_data.csv")

2.训练

处理好数据集后,就可以将训练集和验证集放入预训练模型中训练(具体内容就不展示了),得到训练好的模型,模型我放在了

EHC幽默识别英文模型-Python文档类资源-CSDN文库https://download.csdn.net/download/qq_53644346/85868692EHC幽默识别中文模型-Python文档类资源-CSDN文库https://download.csdn.net/download/qq_53644346/85868452

以下是使用它的具体方法:

2.1模型加载

from transformers import AutoModelForSequenceClassification, AutoTokenizer# 模型路径
model_path="C:/Users/86182/Desktop/cn_model_final"#加载模型
model = AutoModelForSequenceClassification.from_pretrained(model_path, use_auth_token=True)tokenizer = AutoTokenizer.from_pretrained(model_path, use_auth_token=True)

2.2简单使用

输入一句话,返回的是一个二维张量,值是归一化后的类别概率。

Input_sentence="志国:我能踏实的了么我"
# 输入数据
inputs = tokenizer(Input_sentence, return_tensors="pt")# 模型输出
outputs = model(**inputs)print(outputs.logits)
if outputs.logits[0][0]>outputs.logits[0][1]:print(0)
else:print(1)

进行简单的处理,既可以得到类别输出: 

 

 2.3对test数据集进行预测

def get_result(path,filename):"""path处理后的测试集路径filename为生成的结果文件路径"""#读取处理过的测试集test_sets=pd.read_csv(path)test_sentences=test_sets['Sentence']with open(filename, 'w', newline='') as file:writer = csv.writer(file)#写入ID和Label属性名writer.writerow(["ID", "Label"])for i in range(len(test_sentences)):inputs = tokenizer(test_sentences[i], return_tensors="pt")outputs = model(**inputs)print(outputs.logits)label=0if outputs.logits[0][0]>outputs.logits[0][1]:
#             print(0)passelse:
#             print(1)label=1writer.writerow([i, label])

3.结果 

cn_result.csv

en_result.csv


 对比baseline:

以及其他模型:

 通过对比,可以看到我的预训练模型效果还是可以的。

 不足之处和改进:

1.数据集中的Dialogue_id这一属性我并没有用到,因为数据集自身的特点,每段对话都有一个场景,而Dialogue_id蕴含着场景信息,所以在场景切换时,对数据集当前对话取上下文并不合适,改进方法就是在获取当前对话的上下文时,把Dialogue_id也考虑进来。

2.预训练模型的选择不同,获得的效果也会不同,针对模型的调参本文并没有体现出来

3.对训练集和验证集没有做交叉验证,同时也没有对测试集的预测结果进行集成

总结

本文主要是针对数据集进行处理,通过预训练模型进行训练,而没有详细的讲怎么去构建神经网络模型,以及神经网络的实现过程是什么样的,当然这也是本文的不足吧。但是通过我给出的预训练模型,可以非常简单的完成本次幽默识别的任务,效果也还算不错吧。

最后,如果博客中有什么不对的地方,请多多指教。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部