人工智能大模型-数据预处理-文本数据预处理-图像数据预处理

发布于:2025-04-01 ⋅ 阅读:(25) ⋅ 点赞:(0)

文本数据预处理

大模型常用的文本数据类型

  • 通用文本数据:网页、对话和图书资料等
  • 专用文本数据:多语言文本、科学文本、代码和指令等

构造方法

指令数据:指令(instruction)、输入(input)、输出(output)3部分组成

如果在instruction部分已经叙述详细任务目标,则input部分可以为空

instruction: " Please write a poem about the moon"
input:""
output:"..."
instruction: "Please write a poem about the following topic"
input:"moon"
output:"..."

数据集的构造方法

纯人工标注

turns代表一组多轮对话数据项,role代表角色,text代表输入内容(已省略部分内容)。

{
    "turns": [
        {
             "role": "user",
             "text": "你好,我现在准备做一名美妆博主,请问我该做些什么吗?可以给我一些详细的准备list"
        },
        {
             "role": "ai",
             "text": "当然!您可以采取以下一些步骤来为您的美妆博主之旅做准备……祝您的美妆博主之旅顺利!",
       }
    ],
},

基于现有的结构化数据重新构造问题和答案

对原有的数据集进行改进,结合特定的提示词模板生成新的指令数据

nli代表自然语言推理(Natural Language Inference,NLI)

{
    "input": "以下内容为真:“她的幽默感令我印象深刻”那么下面的陈述:“我对她没什么印象。”是真的,假的,或未知?\n答案:",
    "target": "假的",
    "answer_choices": ["真的", "假的", "未知"],
    "type": "nli"
}
self-instruct

准备少量种子任务,并为每项任务人工设计好对应的指令和实例,随后通过种子任务和语言模型生成更多的指令和实例。整个过程将多次迭代,并通过相应的过滤模块保证语料的质量。

{
  "instruction": "题目:小华手里有一个装满糖果的袋子,共有12个,小明想知道里面有多少颗糖果,于是他问小华:“你手里的糖果袋子里有偶数颗糖果吗?”小华回答:“有,而且多于10颗。”请问小华手里的糖果袋子里最少有几颗糖果?",
  "input": "",
  "output": "\n由题目可知:小华手里的糖果袋子里有偶数颗糖果;\n又知道小华手里的糖果袋子里有多于10颗的糖果。\n因为糖果数为偶数,多于10颗,所以糖果数最小必须是12。\n所以小华手里的糖果袋子里最少有12颗糖果。"
}

构造流程

“Self-Instruct: Aligning Language Model with Self-Generated Instructions”为参考,使用self-instruct方法来构造指令数据集的流程

生成指令

模型学习少量人工撰写的示例数据,生成新的指令和实例,并对这些数据进行修剪和过滤,以确保数据质量。这些由模型自己生成的数据可以被用于微调原始模型,从而提高模型对指令的理解和遵循能力。

“Self-Instruct: Aligning Language Model with Self-Generated Instructions”为参考

识别分类任务

研究者对所生成的指令进行区分,通过小样本学习方式,由大模型判断新生成的指令是不是一项分类任务

Can the following task be regarded as a classification task with finite output labels?
 
Task: Given my personality and the job, tell me if I would be suitable.
Is it classification? Yes
 
Task: Give me an example of a time when you had to use your sense of humor.
Is it classification? No

生成实例

让大模型更好地根据已经生成的指令补充input、output部分,原论文主要提出两种方式——输入优先方式(input-first approach)和输出优先方式(output-first approach)。

输入优先方式是指向大模型提供大量示例,指导大模型进行生成

由于input部分在指令数据中不是必须包含的,因此可以直接生成output部分,得到不含input部分的指令数据

Come up with examples for the following tasks. Try to generate multiple examples when possible.
If the task doesn’t require additional input, you can generate the output directly.
Task: Which exercises are best for reducing belly fat at home?
Output:
- Lying Leg Raises
- Leg In And Out
- Plank
- Side Plank
- Sit-ups

对于分类任务,研究者采用了输出优先方式。首先由语言模型生成类别标签,然后生成每个类别标签对应的数据

Given the classification task definition and the class labels, generate an input that corresponds to each of the class labels. If the task doesn’t require input, just generate possible class labels.
 
Task: Classify the sentiment of the sentence into positive, negative, or mixed.
Class label: mixed
Sentence: I enjoy the flavor of the restaurant but their service is too slow.
过滤和后处理

针对指令重复问题,需要首先将生成的指令与任务池中已有指令进行ROUGE-L值计算,然后将值大于0.7的指令剔除。ROUGE是一种评估自动文摘和机器翻译的指标。该指标通过将自动生成的内容与一组参考数据(通常由人工给出)进行比较计算,以衡量两者之间的相似度。

处理手段

提取基本特征

使用Python语言的pandas库来加载数据,并提取数据集的基本特征,包括单词数量、字符数量、平均单词长度等

import pandas as pd
data = pd.read_csv("xxx.csv")
print(data.head(10))

借助split()方法将句子按空格进行切分,并对单词数量进行计数

data['word_count'] = data['SentimentText'].apply(lambda x:len(str(x).split(" ")))
print(data[['SentimentText','word_count']].head())

统计每个数据的字符数量

data['char_count']= data['SentimentText'].str.len()
print(data[['SentimentText','char_count']].head())

平均单词长度

def avg_word(sentence):
    words = sentence.split()
    return (sum(len(word) for word in words)/len(words))
 
data['avg_word'] = data['SentimentText'].apply(lambda x:avg_word(x))
print(data[['SentimentText','avg_word']].head())

常用预处理方法

(1)英文字母大小写转化

data['SentimentText']=data['SentimentText'].apply(lambda sen:" ".join(x.lower() for x in sen.split()))
print(data['SentimentText'].head())

(2)去除标点符号、特殊符号等

data['SentimentText'] = data['SentimentText'].str.replace('[^\w\s]','')
print(data['SentimentText'].head())

(3)去除停用词

from nltk.corpus import stopwords
stop = stopwords.words('english')
data['SentimentText'] = data['SentimentText'].apply(lambda sen:" ".join(x for x in sen.split() if x not in stop))
print(data['SentimentText'].head())

(4)去除稀缺词

freq = pd.Series(' '.join(data['SentimentText']).split()).value_counts()[-10:]
print(freq)
data['SentimentText'] = data['SentimentText'].apply(lambda x: " ".join(x for x in x.split() if x not in freq))

(5)拼写校正

from textblob import TextBlob
print(data['SentimentText'][5:10].apply(lambda x: str(TextBlob(x).correct())))

分词

分词的目的是将原始文本分割为词序列,实现句子到分词ID值序列的转换,进而作为大模型的输入。

(1)BPE算法

(2)WordPiece算法

WordPiece算法在合并过程中采用了不同的策略。与BPE算法关注字符对的频率不同,WordPiece算法在每次合并时会将似然概率最大的元素进行合并。

WordPiece算法在理论上具有优势,但在实际应用中,WordPiece算法和BPF算法的性能可能因数据集、任务类型等因素而有所不同。所以,在选择分词算法时,需要根据具体场景进行综合考虑。

(3)ULM算法

ULM算法是一种减量算法。它的计算方式是:首先,初始化一个大词表,该词表包含文本中出现的所有词语和单个字符;其次,利用初始化的大词表,通过暴力枚举或其他高效算法找出所有可能的分词方法,并计算每种分词方法的似然概率,将概率最大的分词结果作为当前文本的分词方式;最后,根据评估准则不断丢弃词表中的冗余数据项(词表中有些词语并没有在分词结果中出现),直到满足预定的条件[插图]。这种算法的优点在于,它能够考虑到句子的多种分词可能性,并且输出带有概率的多个子词分段,从而为后续的NLP任务提供更多的灵活性。

(4)SentencePiece

常见的模型如LLaMA、ChatGLM-6B、BLOOM的分词器都依靠SentencePiece实现。

通过如下代码安装SentencePiece和所需的构建工具

pip install sentencepiece
apt-get install cmake build-essential pkg-config libgoogle-perftools-dev

下载Google公司的SentencePiece仓库中的内容 进入sentencepiece目录

cd sentencepiece

创建build目录并安装命令行工具

mkdir build
cd build
cmake ..
make -j $(nproc)
make install
ldconfig -v

SentencePiece的使用方式分为两部分——训练模型和使用模型

训练模型

spm_train --input = hongloumeng.txt --model_prefix = hongloumeng-tokenizer --vocab_size = 1000 --character_coverage = 0.9995 --model_type = bpe
参数 说明
input 训练所需的语料文件,也可以传递以逗号分割的文件列表
model_prefix 输出模型名称前缀,训练完成后将生成<model_name>.model和<nodel__name>.vocab两个文件
vocab_size 训练后的词表大小,例如8000、16000、32000
character_coverage 模型覆盖的字符数量,对于字符集丰富的语言(如中文),推荐值为0.9995,对于其他字符集较小的语言,推荐值为1.0
model_type 模型类型,可选值有unigram(默认)、bpe、char或word

训练完成后,项目的根目录下会生成model(模型)和vocab(词表)两个文件。

使用load()方法加载已训练好的模型

import sentencepiece as spm
sp = spm.SentencePieceProcessor()
sp.load('hongloumeng-tokenizer.model')

encode_as_pieces()方法用于对句子进行分词

encode_as_ids()方法则可以将句子转化为ID序列(因为词表的每个单词均有ID值)。

print(sp.encode_as_pieces('花果山福地,水帘洞洞天'))
print(sp.encode_as_ids('花果山福地,水帘洞洞天'))

结果:

['▁ ','花', '果', '山', '福', '地', ',', '水', '帘', '洞', '洞', '天']
[896, 1046, 1171, 1340, 1610, 1103, 892, 1190, 1600, 2413, 2413, 1002]

常用类库

1. re模块(正则表达式操作)

基本功能:

re是Python内置的一个模块,用于处理正则表达式。正则表达式是一种强大的字符串匹配工具,能够快速定位和处理符合特定模式的文本。

适用场景:
  • 文本数据的清洗与预处理。
  • 从大量文本中提取特定信息,如日期、电话号码、邮件地址等。
  • 替换或删除文本中的特定模式。
主要特点:
  • 支持完整的正则表达式功能:包括字符类、量词、组、转义序列等。
  • 高效的字符串操作:通过编译正则表达式,可以显著提高匹配效率。
  • 模块化设计:提供了多种函数来满足不同的字符串处理需求。
常用函数:
  • re.search(pattern, string):在字符串中搜索模式。
  • re.findall(pattern, string):返回所有匹配的子串列表。
  • re.sub(pattern, repl, string):替换匹配的子串。
  • re.split(pattern, string):按照模式分割字符串。
示例代码:
import re
text = "Hello, my email is example@example.com."
# 提取邮箱地址
emails = re.findall(r'\b[\w.-]+@[\w.-]+\.\w+\b', text)
print(emails)  # 输出: ['example@example.com']

2. numpy库(科学计算)

基本功能:

numpy是Python中用于科学计算的核心库,提供了高效的多维数组对象ndarray以及丰富的数学函数来处理这些数组。

适用场景:
  • 数值计算:处理大量数据时,numpy的数组运算比Python内置数据结构快得多。
  • 线性代数和矩阵运算:支持矩阵乘法、分解等高级操作。
  • 数据分析:作为pandas库的基础,numpy在处理数据时提供底层支持。
主要特点:
  • 高效性:基于C语言实现,运算速度快。
  • 多维数组支持:支持一维、二维及高维数组。
  • 丰富的数学库:内置了大量的数学函数,如统计、傅里叶变换、线性代数等。
常用函数:
  • numpy.array():创建数组。
  • numpy.shape():获取数组的形状。
  • numpy.random:生成随机数。
  • numpy.dot():矩阵点积。
示例代码:
import numpy as np
# 创建一个2x3的随机数组
arr = np.random.rand(2, 3)
print(arr)
# 输出类似:
# [[0.12345678 0.23456789 0.3456789 ]
#  [0.45678901 0.56789012 0.67890123]]
# 计算数组的均值
mean = np.mean(arr)
print(mean)  # 输出:约0.385左右

3. pandas库(数据分析)

基本功能:

pandas是基于numpy的Python库,主要用于数据分析和操作。它提供了两种主要的数据结构:Series(一维)和DataFrame(二维),能够高效处理结构化数据。

适用场景:
  • 数据清洗:处理缺失值、重复值等。
  • 数据转换:合并、拆分、重塑数据。
  • 数据分析:进行分组、排序、统计分析。
  • 数据可视化:与matplotlib等库结合,生成图表。
主要特点:
  • 高效的数据处理:利用内置函数快速进行数据操作。
  • 灵活的数据结构DataFrame支持多种数据类型和索引。
  • 强大的数据读写:支持读取CSV、Excel、SQL等多种数据源。
常用函数:
  • pd.read_csv():读取CSV文件。
  • pd.DataFrame():创建DataFrame对象。
  • df.groupby():按列分组。
  • df.merge():合并数据框。
  • df.fillna():填充缺失值。
示例代码:
import pandas as pd
# 创建一个简单的DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'], 
        'Age': [25, 30, 35],
        'City': ['New York', 'Paris', 'London']}
df = pd.DataFrame(data)
print(df)
# 输出:
#       Name  Age      City
# 0    Alice   25  New York
# 1      Bob   30     Paris
# 2  Charlie   35    London
# 计算年龄的平均值
average_age = df['Age'].mean()
print(average_age)  # 输出:30.0

总结

  • re模块:专注于正则表达式的字符串处理,适合文本挖掘和数据清洗。
  • numpy:提供高效的数值计算功能,是科学计算和数据分析的基础。
  • pandas:专注于结构化数据的处理,是数据分析和可视化的核心工具。
    这三个库在Python生态系统中扮演着不可或缺的角色,掌握它们对于数据处理、科学计算和机器学习都至关重要。

图像数据预处理

图像去噪

空间域去噪法

空间域去噪法是指通过不同的图像平滑模板对原始图像进行卷积处理的方法。

常用的空间域去噪法包括高斯滤波、算术均值滤波和中值滤波。

1. 高斯滤波
  • 基本原理
    高斯滤波使用高斯函数生成的核进行卷积运算。高斯函数在中心位置权重最大,向四周逐渐减小,这样处理后的图像在平滑的同时保留边缘信息。
  • 特点
    • 有效抑制高斯噪声。
    • 保持图像边缘,适合边缘检测前的预处理。
    • 计算较为复杂,但效果良好。
  • 应用场景
    • 图像去噪,特别是在高斯噪声环境下。
    • 边缘检测前的预处理步骤。
2. 算术均值滤波
  • 基本原理
    用滤波器窗口内所有像素的平均值替代中心像素值,实现图像平滑。
  • 特点
    • 简单易实现,计算量小。
    • 对椒盐噪声效果差,可能引入模糊。
    • 边缘信息模糊,整体平滑效果有限。
  • 应用场景
    • 简单的平滑处理,但实际应用中较少使用,因效果有限。
3. 中值滤波
  • 基本原理
    用滤波器窗口内的中值替代中心像素值,有效去除椒盐噪声。
  • 特点
    • 对椒盐噪声效果显著,保持边缘。
    • 对高斯噪声效果较差,可能产生阶梯效应。
    • 计算复杂度较高。
  • 应用场景
    • 处理椒盐噪声,常见于图像扫描或传输中。

4. 三种滤波方法比较
  • 高斯滤波在去高斯噪声方面表现最佳,适合保留边缘。
  • 中值滤波最适合椒盐噪声,但对高斯噪声效果一般。
  • 算术均值滤波去噪效果最差,模糊明显,常被更优方法取代。

1. 均值滤波

import cv2
import numpy as np
# 读取图像
image = cv2.imread('input.jpg')
# 均值滤波:使用3x3的核
blurred_mean = cv2.blur(image, (3, 3))
# 保存结果
cv2.imwrite('mean_filtered.jpg', blurred_mean)

2. 高斯双边滤波

import cv2
# 读取图像
image = cv2.imread('input.jpg')
# 双边滤波:直径d=9,sigmaColor和sigmaSpace都为75
blurred_bilateral = cv2.bilateralFilter(image, d=9, sigmaColor=75, sigmaSpace=75)
# 保存结果
cv2.imwrite('bilateral_filtered.jpg', blurred_bilateral)

3.中值滤波函数

import cv2
import numpy as np
def median_blur_demo():
    # 读取原始图像
    image = cv2.imread('lena.jpg')
    if image is None:
        print("Error: 无法读取图像文件。请确保文件路径正确。")
        return
    # 添加椒盐噪声
    row, col = image.shape[:2]
    noise = np.random.rand(row, col)
    salt = 0.05  # 盐噪声的比例
    pepper = 0.05  # 胡椒噪声的比例
    # 添加盐噪声
    image[noise < salt] = 255
    # 添加胡椒噪声
    image[noise > 1 - pepper] = 0
    # 应用中值滤波
    median_filtered = cv2.medianBlur(image, 3)  # 使用3x3的核进行中值滤波
    # 显示图像
    cv2.namedWindow('原始图像', cv2.WINDOW_NORMAL)
    cv2.namedWindow('添加噪声后的图像', cv2.WINDOW_NORMAL)
    cv2.namedWindow('中值滤波后的图像', cv2.WINDOW_NORMAL)
    cv2.imshow('原始图像', image)
    cv2.imshow('添加噪声后的图像', image.copy())
    cv2.imshow('中值滤波后的图像', median_filtered)
    # 等待用户按键
    cv2.waitKey(0)
    # 释放窗口
    cv2.destroyAllWindows()
# 运行示例
median_blur_demo()
频域去噪法

以频域的角度对图像进行处理,首先对相应系数进行变换,然后将处理得到的图像进行逆变换,如傅里叶变换和小波变换等。

图像重采样

通过修改图像尺寸的方法(即改变图像的长和宽)来进行重采样。其中,将放大图像称为上采样(Upsampling)或插值,缩小图像称为下采样(Downsampling)。

图像重采样的操作过程:

  1. 使用SimpleITK库读取数据,获取原始图像对应的Spacing值和Size值
  2. 将原始图像的大小除以新的Spacing值以得到新的Size值
  3. 将新的Spacing值和Size值赋值到读取的数据

定义相关类库以及resample_image()方法。此处设置的输出Spacing值为1.0、1.0和2.0

import SimpleITK as sitk
import numpy as np
def resample_image(itk_image, out_spacing = [1.0, 1.0, 2.0]):
    original_spacing = itk_image.GetSpacing()
    original_size = itk_image.GetSize()
    out_size = [
        int(np.round(original_size[0] * original_spacing[0] / out_spacing[0])),
        int(np.round(original_size[1] * original_spacing[1] / out_spacing[1])),
        int(np.round(original_size[2] * original_spacing[2] / out_spacing[2]))
    ]
    resample = sitk.ResampleImageFilter()
    resample.SetOutputSpacing(out_spacing)
    resample.SetSize(out_size)
    resample.SetOutputDirection(itk_image.GetDirection())
    resample.SetOutputOrigin(itk_image.GetOrigin())
    resample.SetTransform(sitk.Transform())
    resample.SetDefaultPixelValue(itk_image.GetPixelIDValue())
    resample.SetInterpolator(sitk.sitkBSpline)
    return resample.Execute(itk_image)

读取数据,并输出重采样后的图像数据

gz_path = 'PANCREAS_0015.nii.gz'
print('测试文件名为:', gz_path)
Original_img = sitk.ReadImage(gz_path)
print('原始图像的Spacing:', Original_img.GetSpacing())
print('原始图像的Size:', Original_img.GetSize())
Resample_img = resample_image(Original_img)
print('经过重采样之后图像的Spacing是:', Resample_img.GetSpacing())
print('经过重采样之后图像的Size是:', Resample_img.GetSize())

图像增强

根据图像特点和处理目的突出图像中观察者感兴趣的区域及特征,最大限度地保留图像边界和结构信息,提高图像的可判读性,改善图像质量。

直方图均衡化

灰度直方图展示图像的灰度分布范围和每个灰度级别的像素数量

在一幅灰度图像中,每一个灰度值出现的概率都不相同。这种不均等性有时会导致图像中的某些细节信息不够突出,难以被观察者直接察觉。为了改善这一情况,我们可以采用直方图均衡化方法,它通过调整图像的灰度分布,使得变换后的图像中每个灰度级别出现的概率大致相等。

图像的对比度得到增强,原先难以察觉的细节信息也得以凸显。

使用cv2.equalizeHist()方法来实现直方图均衡化操作

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('图像文件地址',0)
equ = cv2.equalizeHist(img)
res = np.hstack((img,equ))
cv2.imshow('img',res)
cv2.waitKey()
cv2.destroyAllWindows()

CLAHE有限对比适应性直方图均衡化方法的处理效果

import numpy as np
import cv2
img = cv2.imread('读者的本地图像文件地址',0)
clahe = cv2.createCLAHE(clipLimit = 2.0, tileGridSize = (8,8))
cl1 = clahe.apply(img)
cv2.imwrite('clahe_2.jpg',cl1)

彩色图像进行直方图均衡化

split()方法表示通道分解(可以将3通道BGR彩色图像分离为B、G、R单通道图像),merge()方法表示通道合成

import cv2
import numpy as np
img = cv2.imread('图像文件地址',1)
(b,g,r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
result = cv2.merge((bH,gH,rH),)
res = np.hstack((img,result))
cv2.imshow('dst',res)
cv2.waitKey(0)

图文对数据预处理

图文对数据的预处理过程包括图像预处理、文本预处理以及图文数据整合。

● 图像比例:需要根据图像的大小及长宽比例进行清洗,例如对于长宽比大于某个阈值或分辨率较低的图像进行过滤。

● 图像内容筛选:在DALL·E 2模型发布以后,很多用户使用其生成含有危害身心健康和政治敏感主题的图像。在对数据进行清洗时,除了关注图像质量方面的问题以外,还应对图像内容、图像主题等进行筛选。

● 图像压缩与格式:采用统一的编码格式对数据进行压缩和存储。

文本数据预处理

● 删除冗余文字:删除文本中的重复性内容。

● 过滤敏感词:与图像预处理类似,在文本处理上应过滤或屏蔽涉及暴力、赌博、毒品等方面的敏感词。

● 保护个人隐私:应对数据集中出现的个人隐私信息进行隐藏或替换。

● 去除无效信息:统计文本中出现的高频词语(特别是以网页为主要来源的文本),对“查看原文”“点击链接”等无效信息进行过滤。

图文数据整合

● 去除低相关性图文:首先对图文的相关性进行计算(此处可以使用模型进行处理),然后去除相关性较低的图文。

● 数据去重:因为可能会出现多幅图像对应相同文本的情况,例如不同种类的苹果图像对应相同的文本“苹果”。在图文对数据处理过程中,应对重复数据进行删除或合并。

Datasets库

Hugging Face网站的Datasets库可以让开发者非常方便地访问和分享数据集,并且提供了丰富的预处理、模型评估方法,支持多种数据格式。

安装Datasets库

pip install datasets

安装语音数据集库

pip install datasets[audio]

安装图像数据集库

pip install datasets[vision]

使用方法

加载数据集

Hugging Face网站提供的数据集通常包含多个子集(Subset),并且分成train(训练集)、validation(验证集)和test(测试集)3部分

from datasets import load_dataset
dataset = load_dataset("glue",name = "cola")
print(dataset)

输出结果

DatasetDict({
    train: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 8551
    })
    validation: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 1043
    })
    test: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 1063
    })
})

只输出训练集

print(dataset['train'])
Dataset({
    features: ['sentence', 'label', 'idx'],
    num_rows: 8551
})

输出该数据集前5个

print(dataset['train']['sentence'][:5])
["Our friends won't buy this analysis, let alone the next one we propose.", "One more pseudo generalization and I'm giving up.", "One more pseudo generalization or I'm giving up.", 'The more we study verbs, the crazier they get.', 'Day by day the facts are getting murkier.']

Datasets库支持的数据

数据格式
CSV、TSV load_dataset(“csv”,data_files=“my_file.csv”)
纯文本 load_dataset(“text”,data_files=“my_file.text”)
JSON、JSON Lines load_dataset(“json”,data_files=“my_file.json”)
DataFrame load_dataset(“pandas”,data_files=“my_file.pkl”)

数据集划分

加载数据集 提取其中的train

from datasets import load_dataset
data = load_dataset("e_v1.0")
data = data ['train']
print (data)

结果

Dataset({
    features: ['input', 'output', 'instruction'],
    num_rows: 693987
})

查看第一个数据

print(data[0])

{'input': '', 'output': '地球上有适宜生命存在的条件和多样化的生命形式。', 'instruction': '用一句话描述地球为什么是独一无二的。\\n\n'}

train_test_ split()方法对数据集进行切分train、test 按照9:1的比例对该数据集进行重新划分

dataset = data.train_test_split(test_size = 0.1)
print(dataset)

DatasetDict({
    train: Dataset({
        features: ['input', 'output', 'instruction'],
        num_rows: 624588
    })
    test: Dataset({
        features: ['input', 'output', 'instruction'],
        num_rows: 69399
    })
})

数据过滤

通过select()方法挑选出其中的前两个数据

tmp = dataset["train"].select([0, 1])
print(tmp)

通过filter()方法对数据集进行过滤

统计input中含有“地球”的数据的数量

tmp = dataset["train"].filter(lambda example: "地球" in example["input"])
print(tmp)

数据映射

通过传入自定义函数map()方法来实现

在每条数据前加入“Prefix”前缀

def add_prefix(example):
    example["instruction"] = 'Prefix: ' + example["instruction"]
    return example

prefix_dataset = dataset.map(add_prefix)
print (prefix_dataset["train"] ["instruction"][2:5])

['Prefix: 请说出一个提高英文对话能力的好方法',
 'Prefix: 提示用户输入一个数字,判断该数字是否为质数。\n数字:19',
 'Prefix: 为一篇将用于招募信息的招聘广告撰写标题。\\n\n\\n职位: 软件工程师。\\n']

使用transformers库加载bert-base-chinese模型提供的分词器,以便对原语料进行编码

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
def preprocess_function(example):
    model_inputs = tokenizer(example["instruction"], max_length = 512, truncation = True)
    labels = tokenizer(example["output"], max_length = 32, truncation = True)
    model_inputs["labels"] = labels["input_ids"]
    return model_inputs
processed_dataset = dataset.map(preprocess_function)
print(processed_dataset)

DatasetDict({
    train: Dataset({
        features: ['input', 'output', 'instruction', 'input_ids', 'token_type_ids', 'attention_mask', 'labels'],
        num_rows: 624588
    })
    test: Dataset({
        features: ['input', 'output', 'instruction', 'input_ids', 'token_type_ids', 'attention_mask', 'labels'],
        num_rows: 69399
    })
})

数据保存

from datasets import load_from_disk
processed_dataset.save_to_disk("文件地址")
disk_datasets = load_from_disk("文件地址")

网站公告

今日签到

点亮在社区的每一天
去签到