首页 > 其他分享 >研发LLM模型,如何用数值表示人类自然语言?

研发LLM模型,如何用数值表示人类自然语言?

时间:2024-11-09 09:44:29浏览次数:1  
标签:string tokenizer sentence tfds 数值 imdb LLM sentences 自然语言

上一篇:《人工智能——自然语言处理简介》

序言:人工智能大语言模型(LLM)如何理解人类的自然语言?这个过程的核心在于将文本转化为计算机能处理的数值形式,经过计算,最终达到对语言的理解。起初,我们只是简单的随便用一个数字来表示一个单词或一个词根,但随着研究深入,我们发现,不同的数值表达方式能显著提高模型对语言的理解效果。因此,在构建大语言模型(LLM)时,关键的一步是将人类语言转化成合适的数值表示,以便模型能够接收、处理并生成有效的输出。好了,让我们进入正题。

与真实数据源协同工作

现在你已经了解了获取句子、用词索引进行编码以及对结果进行序列化的基本知识,你可以通过使用一些著名的公共数据集,将其通过工具转换为易于序列化的格式来进一步提升技能。我们将从TensorFlow Datasets中的IMDb数据集开始,它的大部分处理工作已经为你完成了。之后,我们将亲自动手处理一个基于JSON的数据集以及几个包含情感数据的逗号分隔值(CSV)数据集!

从TensorFlow Datasets获取文本

我们在第4章探索过TFDS,因此如果你对本节中的某些概念不熟悉,可以回顾一下。TFDS的目标是尽可能简单地以标准化方式访问数据。它提供了多个基于文本的数据集,我们将探索imdb_reviews,这是一个包含5万条电影评论的IMDb数据集,每条评论的情感被标注为正面或负面。

下面的代码将加载IMDb数据集的训练集并逐项迭代,将包含评论的文本字段添加到名为imdb_sentences的列表中。每条评论由文本和表示情感的标签组成。注意,将tfds.load调用包裹在tfds.as_numpy中,确保数据以字符串而不是张量的形式加载:

imdb_sentences = []

train_data = tfds.as_numpy(tfds.load('imdb_reviews', split="train"))

for item in train_data:

imdb_sentences.append(str(item['text']))

获得句子后,可以像之前一样创建一个分词器并对它们进行拟合,还可以创建一组序列:

tokenizer = tf.keras.preprocessing.text.Tokenizer(num_words=5000)

tokenizer.fit_on_texts(imdb_sentences)

sequences = tokenizer.texts_to_sequences(imdb_sentences)

你还可以打印出你的词索引以查看:

print(tokenizer.word_index)

词索引过大无法全部显示,但以下是前20个词。注意,分词器按数据集中词的频率排列,因此“the”、“and”和“a”等常用词被索引:

{'the': 1, 'and': 2, 'a': 3, 'of': 4, 'to': 5, 'is': 6, 'br': 7, 'in': 8, 'it': 9, 'i': 10, 'this': 11, 'that': 12, 'was': 13, 'as': 14, 'for': 15, 'with': 16, 'movie': 17, 'but': 18, 'film': 19, "'s": 20, ...}

这些是停用词,如上一节所述。由于这些词出现频率最高且缺乏独特性,它们的存在会影响训练准确性。

此外,注意“br”也在列表中,因为它在该语料库中常用作HTML标签

你可以更新代码,使用BeautifulSoup移除HTML标签,添加字符串转换以移除标点符号,并从给定列表中删除停用词,如下所示:

from bs4 import BeautifulSoup

import string

stopwords = ["a", ..., "yourselves"]

table = str.maketrans('', '', string.punctuation)

imdb_sentences = []

train_data = tfds.as_numpy(tfds.load('imdb_reviews', split="train"))

for item in train_data:

sentence = str(item['text'].decode('UTF-8').lower())

soup = BeautifulSoup(sentence)

sentence = soup.get_text()

words = sentence.split()

filtered_sentence = ""

for word in words:

word = word.translate(table)

if word not in stopwords:

filtered_sentence = filtered_sentence + word + " "

imdb_sentences.append(filtered_sentence)

tokenizer = tf.keras.preprocessing.text.Tokenizer(num_words=25000)

tokenizer.fit_on_texts(imdb_sentences)

sequences = tokenizer.texts_to_sequences(imdb_sentences)

print(tokenizer.word_index)

注意,在处理之前将句子转换为小写,因为所有的停用词都存储为小写。现在打印出的词索引如下所示

{'movie': 1, 'film': 2, 'not': 3, 'one': 4, 'like': 5, 'just': 6, 'good': 7, 'even': 8, 'no': 9, 'time': 10, 'really': 11, 'story': 12, 'see': 13, 'can': 14, 'much': 15, ...}

可以看到现在比之前干净了许多。不过,仍有改进空间,我注意到在查看完整索引时,一些不常见的词在末尾显得无意义。评论者经常将词组合在一起,比如用连字符(“annoying-conclusion”)或斜杠(“him/her”),移除标点会错误地将这些词合并为一个词。

你可以添加代码,在句子创建后立即在这些字符周围添加空格

sentence = sentence.replace(",", " , ")

sentence = sentence.replace(".", " . ")

sentence = sentence.replace("-", " - ")

sentence = sentence.replace("/", " / ")

这样,类似“him/her”这样的组合词会被转换为“him / her”,然后/被去掉,分词后会成为两个词。这样可能会带来更好的训练效果。

现在你已经有了语料库的分词器,可以对句子进行编码。例如,前面章节的简单句子会变成这样

sentences = [

'Today is a sunny day',

'Today is a rainy day',

'Is it sunny today?'

]

sequences = tokenizer.texts_to_sequences(sentences)

print(sequences)

结果为:

[[516, 5229, 147], [516, 6489, 147], [5229, 516]]

如果解码,可以看到停用词已被删除,句子被编码为“today sunny day”、“today rainy day”和“sunny today”。

如果想在代码中解码,可以创建一个新字典,将键和值反转(即词索引中的键值对互换)并进行查找。代码如下:

reverse_word_index = dict(

[(value, key) for (key, value) in tokenizer.word_index.items()])

decoded_review = ' '.join([reverse_word_index.get(i, '?') for i in sequences[0]])

print(decoded_review)

这将输出:

today sunny day

使用IMDb子词数据集

TFDS还包含几个使用子词预处理的IMDb数据集。在这里,你不需要按词分割句子,它们已经按子词进行分割。使用子词是一种在按字母(少量低语义令牌)和按词(大量高语义令牌)之间的折中方法,通常可以非常有效地训练语言分类器。这些数据集还包含用于分割和编码语料库的编码器和解码器。

要访问它们,可以调用tfds.load并传入imdb_reviews/subwords8k或imdb_reviews/subwords32k,例如

(train_data, test_data), info = tfds.load(

'imdb_reviews/subwords8k',

split=(tfds.Split.TRAIN, tfds.Split.TEST),

as_supervised=True,

with_info=True

)

可以通过info对象访问编码器,这将帮助查看词汇量大小

encoder = info.features['text'].encoder

print('Vocabulary size: {}'.format(encoder.vocab_size))

输出8185,因为在此实例中词汇量由8,185个令牌组成。若想查看子词列表,可以使用encoder.subwords属性获取:

print(encoder.subwords)

输出类似以下内容

['the_', ', ', '. ', 'a_', 'and_', 'of_', 'to_', 's_', 'is_', 'br', 'in_', 'I_', 'that_', ...]

这里可以注意到,停用词、标点和语法在语料库中都有,还有像
这样的HTML标签。空格用下划线表示,因此第一个令牌是“the”。

若想编码字符串,可以使用编码器

sample_string = 'Today is a sunny day'

encoded_string = encoder.encode(sample_string)

print('Encoded string is {}'.format(encoded_string))

输出将是令牌列表

Encoded string is [6427, 4869, 9, 4, 2365, 1361, 606]

你的五个词被编码为七个令牌。查看令牌,可以用编码器的subwords属性返回一个数组。它是从零开始的,例如“Today”中的“Tod”编码为6427,是数组中的第6426项:

print(encoder.subwords[6426])

输出:

Tod

若要解码,可以使用编码器的decode方法:

encoded_string = encoder.encode(sample_string)

original_string = encoder.decode(encoded_string)

test_string = encoder.decode([6427, 4869, 9, 4, 2365, 1361, 606])

后面的代码行将产生相同的结果,因为encoded_string尽管名字如此,其实是一个和下一行硬编码的列表相同的令牌列表。

本节总结:本节主要介绍了如何将文本表达转化为计算机可理解的数字表达形式。 具体来说,就是通过TensorFlow Datasets对文本进行预处理,包括分词、去停用词等步骤,最终将文本转换为数字序列,为后续的自然语言处理任务做好准备;下一篇是这一篇的补充,主要讲述如何从CSV和JSON文件中提取文本用于训练模型。

标签:string,tokenizer,sentence,tfds,数值,imdb,LLM,sentences,自然语言
From: https://www.cnblogs.com/jellyai/p/18536333

相关文章

  • Springboot 整合 Java DL4J 打造自然语言处理之语音识别系统
    ......
  • c语言中返回整数值的长度
     001、方法1while循环[root@PC1test]#lstest.c[root@PC1test]#cattest.c##测试c程序#include<stdio.h>intget_length(inta){intlength=0;while(a>0){length++;a/=10;......
  • MLLM_20241101
    Paper1题目:LongVU:SpatiotemporalAdaptiveCompressionforLongVideo-LanguageUnderstanding作者团队:MetaAI,KAUST,KoreaUniversity链接:https://arxiv.org/abs/2410.174341.论文试图解决什么问题?是否是一个新问题?MLLM长视频理解问题。是新问题。2.有哪......
  • 向量数据库 PieCloudVector 进阶系列丨打造以 LLM 为基础的聊天机器人
    本系列前两篇文章深入探讨了PieCloudVector在图片和音频数据上的应用之后,本文将聚焦于文本数据,探索PieCloudVector对于文本数据的向量化处理、存储以及检索,并最终结合LLM打造聊天机器人的全流程。在自然语言处理任务中涉及到大量对文本数据的处理、分析和理解,而向量数据库......
  • MLLM_20241025
    Paper1题目:Yo’LLaVA:YourPersonalizedLanguageandVisionAssistant作者:ThaoNguyen,HaotianLiu,YuhengLi,MuCai,UtkarshOjha,YongJaeLee团队:UniversityofWisconsin–Madison(LLaVA原作者团队)链接:https://thaoshibe.github.io/YoLLaVA/1.论文试......
  • LLM APPLICATIONS ABILITIES LIMITS
    applicationandabilityhttps://arxiv.org/pdf/2402.15116LMAs,proficientinprocessingdiversedatamodalities,surpasslanguage-onlyagentsindecision-makingandresponsegenerationacrossvariedscenarios.Theiradaptabilitymakesthemexceptionallyu......
  • LLM | 论文精读 | CVPR | 基于问题驱动图像描述的视觉问答增强引言
    论文标题:EnhancingVisualQuestionAnswering throughQuestion-DrivenImageCaptionsasPrompts作者:Övg̈uÖzdemir,ErdemAkagünd̈uz期刊:CVPR2024引言视觉问答(VisualQuestionAnswering,VQA)是计算机视觉与自然语言处理交叉领域中的典型多模态任......
  • Shell概述、编写及执行脚本、Shell变量+数值运算
    一、shell基本介绍 1.1 什么是shell◆ 在Linux内核与用户之间的解释器程序◆通常指/bin/bash◆负责向内核翻译及传达用户/程序指令◆相当于操作系统的“外壳”1.2 shell使用方式◆交互式 ——命令行-----人工干预、智能化程度高-----逐条解释执行、效率......
  • load_allmotor
    XGO使用树莓派做为机器狗的大脑,推荐使用VScode对XGO进行编程,可以通过一下步骤进行开发:准备工作安装VScode:确保你已经在你的电脑上安装了VScode。你可以从VScode官网下载并安装。连接网络:根据快速入门让XGO连上网络,操作机器狗按键让机器狗显示IP地址如下图所示在VScode......
  • 【NLP】使用 SpaCy 通过 LLM 合成数据微调 NER 模型
    在我们之前的文章“使用SpaCy、ollama创建用于命名实体识别的合成数据集”中,我们探讨了如何使用Qwen生成合成数据,以自动化命名实体识别(NER)的注释过程。通过利用合成数据,我们能够高效地准备来自SmoothNLP金融新闻数据集  的高质量数据集。现在,在这篇文章中,我们将更进......