口语理解任务源码详解系列(一)数据集构建

news2024/12/25 1:15:45

口语理解任务源码详解系列(一)数据集构建

写在前面
本系列从零开始构建口语理解项目,整个项目分为意图分类与槽位填充两个子任务。项目采用的数据集为ATIS航空领域口语理解数据集,项目源码请传送到:github

一、处理数据

在这里插入图片描述

样本数词汇数实体数意图数
4978训练集/893测试集94312926

在这里插入图片描述
读取原始数据

import os
import pickle
import pandas as pd

base_dir = os.getcwd()

# 原始数据
atis_raw_train = os.path.join(base_dir, 'atis', 'atis.train.pkl')
atis_raw_test = os.path.join(base_dir, 'atis', 'atis.test.pkl')

# 处理后保存为csv文件
atis_train_csv = os.path.join(base_dir, 'atis', 'atis.train.csv')
atis_test_csv = os.path.join(base_dir, 'atis', 'atis.test.csv')

定义加载数据方法

def load_atis(file_path):
    with open(file_path, 'rb') as f_read:
        ds,dicts = pickle.load(f_read)
    print('done loading:', file_path)
    print('samples:{}'.format(len(ds['query'])))
    print('vocab_size:{}'.format(len(dicts['token_ids'])))
    print('slot count:{}'.format(len(dicts['slot_ids'])))
    print('intent count:{}'.format(len(dicts['intent_ids'])))
    return ds,dicts

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
处理训练数据,保存为csv结构

train_ds, train_dicts = load_atis(atis_raw_train)

t2i, s2i, in2i = map(train_dicts.get, ['token_ids', 'slot_ids', 'intent_ids'])
i2t, i2s, i2in = map(lambda d:{d[k]:k for k in d.keys()}, [t2i, s2i, in2i])
query, slots, intent = map(train_ds.get, ['query', 'slot_labels', 'intent_labels'])

代码段 t2i, s2i, in2i = map(train_dicts.get, ['token_ids', 'slot_ids', 'intent_ids'])对字典train_dicts中的键进行映射操作
对列表[‘token_ids’, ‘slot_ids’, ‘intent_ids’]中的每个元素进行迭代,
t2i将存储train_dicts字典中键为token_ids的值,s2i存储slot_ids的值,in2i存储intent_ids的值。

代码段i2t, i2s, i2in = map(lambda d:{d[k]:k for k in d.keys()}, [t2i, s2i, in2i])使用了Python的map函数和lambda表达式来进行映射操作
对列表[t2i, s2i, in2i]中的每个元素进行迭代,
对于每个元素,使用lambda d:{d[k]:k for k in d.keys()}来创建一个新的字典,其中字典的键是原字典中的值,字典的值是原字典中的键。
将每个新创建的字典分别赋给变量i2t、i2s和i2in。这样,i2t将存储由t2i字典中的值作为键、对应的键作为值的新字典,i2s将存储由s2i字典中的值作为键、对应的键作为值的新字典,i2in将存储由in2i字典中的值作为键、对应的键作为值的新字典。
这段代码的目的是将原字典中的键值对反转,以创建新的字典,新字典的键是原字典中的值,而值是原字典中的键。这样可以方便根据值查找对应的键。
在这里插入图片描述

train_source_target = []
for i in range(len(train_ds['query'])):
    intent_source_target_lst = []
    
    # 1.存储intent ['flight']
    intent_source_target_lst.append(i2in[intent[i][0]])
    
    # 2.存储source 
    # ['BOS', 'i', 'want', 'to', 'fly', 'from', 'boston', 'at', '838', 'am', 'and', 'arrive', 'in', 'denver', 'at', '1110', 'in', 'the', 'morning', 'EOS']
    source_data = list(' '.join(map(i2t.get, query[i])).split())
    # 删除BOS
    del(source_data[0])
    # 删除EOS
    del(source_data[-1])
    # ['flight', 'i want to fly from boston at 838 am and arrive in denver at 1110 in the morning']
    intent_source_target_lst.append(' '.join(source_data))
    
    # 3.存储target
    # ['O', 'O', 'O', 'O', 'O', 'O', 'B-fromloc.city_name', 'O', 'B-depart_time.time', 'I-depart_time.time', 'O', 'O', 'O', 'B-toloc.city_name', 'O', 'B-arrive_time.time', 'O', 'O', 'B-arrive_time.period_of_day', 'O']
    target_data = [i2s[slots[i][j]] for j in range(len(query[i]))]
    # 删除BOS
    del(target_data[0])
    # 删除EOS
    del(target_data[-1])
    # ['flight', 'i want to fly from boston at 838 am and arrive in denver at 1110 in the morning', 'O O O O O B-fromloc.city_name O B-depart_time.time I-depart_time.time O O O B-toloc.city_name O B-arrive_time.time O O B-arrive_time.period_of_day']
    intent_source_target_lst.append(' '.join(target_data))
    # [['flight', 'i want to fly from boston at 838 am and arrive in denver at 1110 in the morning', 'O O O O O B-fromloc.city_name O B-depart_time.time I-depart_time.time O O O B-toloc.city_name O B-arrive_time.time O O B-arrive_time.period_of_day']]
    train_source_target.append(intent_source_target_lst)

name = ['intent', 'source', 'target']

train_csv = pd.DataFrame(columns=name, data=train_source_target)
train_csv.to_csv(atis_train_csv)

print('train data process done!')

处理测试数据,保存为csv结构

'''
    处理测试数据,保存为csv结构
'''
test_ds, test_dicts = load_atis(atis_raw_test)

t2i, s2i, in2i = map(test_dicts.get, ['token_ids', 'slot_ids', 'intent_ids'])
i2t, i2s, i2in = map(lambda d:{d[k]:k for k in d.keys()}, [t2i, s2i, in2i])

query, slots, intent = map(test_ds.get, ['query', 'slot_labels', 'intent_labels'])

test_source_target = []
for i in range(len(test_ds['query'])):
    intent_source_target_lst = []
    
    # 1.存储intent
    intent_source_target_lst.append(i2in[intent[i][0]])
    
    # 2.存储source
    source_data = list(' '.join(map(i2t.get, query[i])).split())
    # 删除BOS
    del(source_data[0])
    # 删除EOS
    del(source_data[-1])
    intent_source_target_lst.append(' '.join(source_data))
    
    # 3.存储target
    target_data = [i2s[slots[i][j]] for j in range(len(query[i]))]
    # 删除BOS
    del(target_data[0])
    # 删除EOS
    del(target_data[-1])
    intent_source_target_lst.append(' '.join(target_data))
    
    test_source_target.append(intent_source_target_lst)

name = ['intent', 'source', 'target']

test_csv = pd.DataFrame(columns=name, data=test_source_target)
test_csv.to_csv(atis_test_csv)

print('test data process done!')

展示处理过后的数据

pd_train = pd.read_csv(atis_train_csv, index_col=0)
print(pd_train.head())

在这里插入图片描述

二、构建训练集和验证集

import os
from torchtext import data, datasets
import pandas as pd
import pickle # 读取pkl文件

base_dir = os.getcwd() # 该函数不需要传递参数,它返回当前的目录。
atis_data = os.path.join(base_dir, 'atis')
def build_dataset():
    tokenize = lambda s: s.split()

将输入的字符串s按照空格进行分割,返回一个包含各个单词的列表。

SOURCE = data.Field(sequential=True, tokenize=tokenize,
                        lower=True, use_vocab=True,
                        init_token='<sos>', eos_token='<eos>',
                        pad_token='<pad>', unk_token='<unk>',
                        batch_first=True, fix_length=50,
                        include_lengths=True)  # include_lengths=True为方便之后使用torch的pack_padded_sequence

Field类是TorchText库中用于定义数据预处理操作的核心类之一。在这个代码中,SOURCE是一个Field对象,用于表示输入的源文本序列。

  1. sequential=True:表示数据是一个序列(如句子),将被看作一个由多个连续元素组成的序列;
  2. tokenize=tokenize:指定了分词函数,即通过调用tokenize函数将文本进行分词,返回一个单词列表;
  3. lower=True:将所有文本转换为小写;
  4. use_vocab=True:是否将构建词汇表(vocabulary),如果为True,则会根据数据集创建一个词汇表;
  5. init_token=‘< sos >’ :在每个序列开头添加起始标记;
  6. eos_token=‘< eos >’:在每个序列结尾添加结束标记;
  7. pad_token=‘< pad >’:用于将序列填充到相同长度的填充标记;
  8. unk_token=‘< unk >’:用于表示未知单词(在词汇表中不存在的单词)的标记;
  9. batch_first=True:在生成批次时,将数据维度中的批次维度放在第一维;
  10. fix_length=50:将每个序列固定为指定的长度(50),如果序列长度不足,将使用填充标记进行填充;
  11. include_lengths=True:返回批次数据时,同时返回每个序列的实际长度。
TARGET = data.Field(sequential=True, tokenize=tokenize,
                        lower=True, use_vocab=True,
                        init_token='<sos>', eos_token='<eos>',
                        pad_token='<pad>', unk_token='<unk>',
                        batch_first=True, fix_length=50,
                        include_lengths=True)
LABEL = data.Field(
        sequential=False,
        use_vocab=True)
train, val = data.TabularDataset.splits(
        path=atis_data,
        skip_header=True,
        train='atis.train.csv',
        validation='atis.test.csv',
        format='csv',
        fields=[('index', None), ('intent', LABEL), ('source', SOURCE), ('target', TARGET)])
print('train data info:')
print(len(train))
print(vars(train[0]))
print('val data info:')
print(len(val))
print(vars(val[0]))
  1. data.TabularDataset.splits() 是一个静态方法,用于加载多个具有相同格式的表格数据集;
  2. skip_header=True 表示跳过数据集文件的第一行(通常是标题行);
  3. train=‘atis.train.csv’ 指定了训练数据集文件的名称;
  4. validation=‘atis.test.csv’ 指定了验证数据集文件的名称;
  5. format=‘csv’ 表示数据集文件的格式为CSV格式;
  6. fields=[(‘index’, None), (‘intent’, LABEL), (‘source’, SOURCE), (‘target’, TARGET)] 用于定义每个列对应的字段信息。其中,‘index’ 列被忽略(设为None),‘intent’ 列使用名为LABEL的字段对象进行处理,‘source’ 列使用名为SOURCE的字段对象进行处理,‘target’ 列使用名为TARGET的字段对象进行处理。
print(vars(train[0]))

打印出训练集中第一个样本的属性和值,返回一个字典,其中键是字段名,值是对应字段的取值。
例子:

{
    'index': 1,
    'intent': 'flight',
    'source': ['show', 'me', 'the', 'flights', 'from', 'dallas'],
    'target': ['O', 'O', 'O', 'O', 'O', 'B-fromloc.city_name']
}

‘index’ 表示样本的索引,‘intent’ 表示意图类别,‘source’ 是源文本序列(单词列表形式),‘target’ 是目标文本序列(标签列表形式)。
在这里插入图片描述

	SOURCE.build_vocab(train, val)
    TARGET.build_vocab(train, val)
    LABEL.build_vocab(train, val)

SOURCE.build_vocab(train, val) 是一个用于构建词汇表(vocabulary)的操作,基于训练集和验证集数据。在这个操作中,使用了名为SOURCE的字段对象,并调用它的build_vocab()方法。
build_vocab()方法根据提供的数据集,在字段对象中构建词汇表。词汇表将每个不重复的单词映射到一个唯一的整数标识符(即单词的索引)。该操作还可选择性地根据指定的参数对词汇表进行过滤和修剪。

print('vocab info:')
print('source vocab size:{}'.format(len(SOURCE.vocab)))
print('target vocab size:{}'.format(len(TARGET.vocab)))
print('label vocab size:{}'.format(len(LABEL.vocab)))
train_iter, val_iter = data.Iterator.splits(
        (train, val),
        batch_sizes=(128, len(val)),  # 训练集设置为128,验证集整个集合用于测试
        shuffle=True,
        sort_within_batch=True,  # 为true则一个batch内的数据会按sort_key规则降序排序
        sort_key=lambda x: len(x.source))  # 这里按src的长度降序排序,主要是为后面pack,pad操作)
return train_iter, val_iter

data.Iterator.splits() 是一个用于创建迭代器的操作,用于将数据集分割为训练集迭代器和验证集迭代器。

  1. batch_sizes=(128, len(val)):指定了批次大小,第一个元素(128)表示训练集每个批次的样本数量,第二个元素(len(val))表示验证集每个批次的样本数量;
  2. shuffle=True:表示在每个迭代周期中对训练集进行洗牌,以增加样本之间的随机性;
  3. sort_within_batch=True:表示对每个批次内的样本按照指定的键(sort_key=lambda x: len(x.source))进行排序;
  4. sort_key=lambda x: len(x.source):指定了排序键的函数,该函数根据源文本序列的长度进行排序。
train_iter, val_iter = build_dataset()
print('train_iter size:{}'.format(len(train_iter)))
print('val_iter size:{}'.format(len(val_iter)))

在这里插入图片描述
至此,该项目的数据集已全部构建完成!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/716851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络编程1—— IP地址 + 端口号 +TCP/IP协议 + 协议分层的封装与应用

文章目录 前言一、网络发展各阶段二、网络通信的三大要素1.IP地址2.端口号3.网络协议 三、TCP/IP五层网络模型各层级的用处网络设备所在分层 四、封装和分用封装分用网络传输的实际情况 总结 前言 本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各…

搞懂推荐系统中的评价指标NDCG(CG、DCG、IDCG)

这些指标都是衡量搜索引擎算法的指标。搜索引擎一般采用PI&#xff08;peritem&#xff09;的方式进行评测&#xff0c;简单地说就是逐条对搜索结果进行分等级的打分。假设我们现在在Google上搜索一个词&#xff0c;然后得到5个结果。我们对这些结果进行3个等级的区分&#xff…

cmd可以用node但是vscode报错--node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

原因&#xff1a;环境变量配置错误 解决&#xff1a; a.如果不想配置环境变量&#xff0c;可用管理员方式运行vscode后&#xff0c;重启编译器&#xff1a; 若以上方法不行&#xff0c;需要老老实实配置环境变量&#xff1a; b.配置 系统环境变量&#xff08;S&#xff09; 即…

机器学习20:嵌入-Embeddings

嵌入&#xff08;Embeddings&#xff09;是一个相对低维的空间&#xff0c;我们可以将高维向量转换到其中。嵌入使得对大型输入&#xff08;例如表示单词的稀疏向量&#xff09;进行机器学习变得更加容易。理想情况下&#xff0c;嵌入通过将语义相似的输入紧密地放置在嵌入空间…

高中生用台灯哪种好?盘点好用的高中生护眼台灯

随着科技的进步&#xff0c;台灯的外观和造型都开始不断的变化&#xff0c;而且台灯的功能也越来越多元化&#xff0c;各式各样的台灯都有。论哪种台灯最适合高中生使用&#xff0c;我的回答是护眼台灯&#xff01;因为台灯的主要作用就是照明&#xff0c;便于学习、阅读、工作…

基于Springboot+Vue的手机商城(源代码+数据库)081

基于SpringbootVue的手机商城(源代码数据库)081 一、系统介绍 本项目前后端分离&#xff08;该项目还有ssmvue版本&#xff09; 本系统分为管理员、用户两种角色 用户角色包含以下功能&#xff1a; 登录、注册、商品搜索、收藏、购物车、订单提交、评论、退款、收货地址管…

2023年5月 少儿编程 中国电子学会图形化编程等级考试Scratch编程一级真题解析(选择题)

2023年5月scratch编程等级考试一级真题 选择题(共25题,每题2分,共50分) 1、看图找规律,请问下图红框中是 A、 B、 C、 D、 答案:D 考点分析:

DS-font

paper:https://arxiv.org/pdf/2301.10008.pdf title: Few-shot Font Generation by Learning Style Difference and Similarity accepted: arXiv 2023 abstract 少镜头字体生成(FFG)旨在保留原始字符的底层全局结构,同时通过参考一些样本生成目标字体。它已应用于字体库创…

怎么解决找不到msvcp120.dll,msvcp120.dll一键修复方法

小伙伴们知道msvcp120.dll是什么文件吗?那么今天小编就来讲解电脑出现msvcp120.dll丢失的解决方法介绍&#xff0c;希望能够帮助到大家呢。 msvcp120.dll 是windows系统中必备的动态链接库文件。msvcp120.dll可以解决某些大型游戏、程序由于vs2010编译系统中缺失此dll的问题。…

R 语言的安装(详细教程)

文章目录 前言一、R 语言是什么&#xff1f;二、R 下载1. 官网2. download base3. download Rtools 三、Rstudio 下载1. 官网2. download Rstudio 四、R 安装五、Rtools 安装六、Rstudio 安装七、java 的环境配置八、运行 RStudio十、R 包安装策略1. 配置镜像1. 修改配置文件1.…

Microsoft遭遇DDoS攻击,3000万客户数据遭窃

6月初&#xff0c;微软部分服务遭遇严重中断&#xff0c;包括Outlook电子邮件、OneDrive文件共享应用程序和云计算基础设施Azure。 一个名为”匿名苏丹”的(又名“风暴-1359”)的组织声称对此次DDoS攻击负责。 匿名苏丹组织自2023年1月以来一直活动频繁&#xff0c;声称其目标…

SpinalHDL的使用和开发经验研讨会

SpinalHDL始于2014年&#xff0c;最初是作为VHDL/Verilog的替代而做的创新尝试&#xff0c;伴随着数年来开源硬件设计的蓬勃发展&#xff0c;基于开源技术的硬件设计方法和范式逐渐受到业界的关注。 达坦科技&#xff08;DatenLord&#xff09;致力于打造高性能跨云存储&#…

oracle 基础2

目录 1.oracle字符函数 2.oracle数值函数 3.Oracle日期函数 4.oracle转换函数 5.oracle多表实战 1.oracle字符函数 拼接 concat或 || 拼接三个参数 首字母大写函数 initcap 字符串改为小写 lower 转大写 upper 删除两边空格 trim 截取字符串 substr 替换字符串 repl…

html,css笔记1

这里写目录标题 一、快捷键及基础常识基础框架2.lang语言种类3.字符集4.HTML常用标签4.1标题标签&#xff08;重要&#xff09;4.2段落和换行标签(重要)4.3文本格式化标签 一、快捷键及基础常识 1.快速复制一行 快捷键&#xff1a;shiftalt下箭头 光标定位到要复制的一行 2.…

Python_元类

目录 什么是元类 理解类也是对象 动态地创建类 使用type创建类 使用type创建带有属性的类 使用type创建带有方法的类 那么再来思考一下&#xff0c;到底什么是元类 __metaclass__属性 自定义元类 究竟为什么要使用元类&#xff1f; 什么是元类 我们知道&#xff0c;实…

性能测试该怎么做,终于找到方法了

目录 开头 分类 服务器与场景设计 计算TPS 设计场景 场景运用 单交易最大压力&#xff1a; 单交易稳定性&#xff1a; 混合场景稳定性&#xff1a; 业务指标&#xff1a; 数据库 中间件 负载均衡&#xff1a; 最后&#xff1a; 开头 性能测试的工具有很多&#xf…

Unity中的Bezier曲线与曲面上点的计算

上代码&#xff1a; //获取基于4个控制点的Bezier曲线上的点 Vector3 GetBezierPoint(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t) {t Mathf.Clamp01(t);float s 1f - t;return s * s * s * p0 3f * s * s * t * p1 3f * s * t * t * p2 t * t * t * p3; …

如何在 OpenCV 和 Python 中使用滑动窗口进行物体检测

文末附源代码的免费下载链接 目录 物体检测的滑动窗口技术讲解 使用 OpenCV 和 Python 实现滑动窗口技术 结论 代码下载链接

Python采集某漫画网站<灵剑尊>VIP漫画内容

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 Pycharm 模块使用: requests >>> pip install requests 数据请求模块 parsel >>> pip install parsel 数据解析模块 安装方法&#xff1a; win R 输入cmd 输入安装命令…