自然语言处理:文本表示
介绍
大家好,博主又来给大家分享知识了。今天给大家分享的内容是自然语言处理中的文本表示。
在当今数字化信息爆炸的时代,自然语言处理作为人工智能领域的重要分支,发挥着越来越关键的作用。
而文本表示,则是自然语言处理的基石之一,它就像是一把神奇的钥匙,能够将人类丰富多样、充满语义的自然语言,转化为计算机可以理解和处理的形式。话不多说,我们直接进入正题。
文本表示
概念阐述
在自然语言处理(NLP)中,文本表示是将人类自然语言文本转化为计算机能够理解和处理的形式的过程,其目的是用一种合适的数据结构或数学模型来表达文本的语义、语法等信息,以便后续进行各种自然语言处理任务。
文本表示是自然语言处理的基础和关键步骤,合适的文本表示方法能够显著提高自然语言处理任务(如文本分类、机器翻译、信息检索等)的效果。
词的表示
概念阐述
在自然语言处理中,词的表示是指将自然语言中的单词转化为计算机能够理解和处理的形式,其目的是用一种合适的方式来表达词的语义、语法等特征信息。
词的表示形式主要涵盖离散符号表示、稀疏向量表示以及稠密向量表示这三种。
离散符号表示
离散符号表示是自然语言处理领域中用于表示词的一种传统方式,它主要有两种常见形式:将词表示为字符串,或者将词表示为固定词表中的索引编号。
字符串形式
字符串形式直接把词当作一个字符序列,也就是我们日常看到和书写的词汇形式。例如,“book”,“apple”,“cat”等词,在这种表示下,它们就是以原本的字符串呈现。这种表示符合人们对词的直观认知,就像在字典中查阅单词时,看到的就是单词的字符串形式。
完整代码
# 定义一个名为NLPTextRepresentation的类,用于处理文本表示相关任务
class NLPTextRepresentation:# 类的初始化方法,此处不做任何初始化操作def __init__(self):# pass语句占位,不进行实际操作pass# 定义一个实例方法text_representation用于文本表示处理def text_representation(self):# 定义几个以字符串形式表示的词word1 = "book"word2 = "apple"word3 = "cat"# 将这些词存储在一个列表中word_list = [word1, word2, word3]# 打印每个词及其类型,以展示它们是以字符串形式表示的for word in word_list:print(f"词: {word}, 类型: {type(word)}")# 定义一个句子,句子也是由多个以字符串形式表示的词组成sentence = "I have a cat and an apple on the table near the book"# 对句子进行简单的按空格分词,每个分词结果也是字符串形式words_in_sentence = sentence.split()# 打印分词后的结果及每个词的类型print("\n句子分词结果:")for w in words_in_sentence:print(f"词: {w}, 类型: {type(w)}")# 当脚本作为主程序运行时执行以下代码
if __name__ == "__main__":# 创建NLPTextRepresentation类的一个实例nlp_text_representation = NLPTextRepresentation()# 调用实例的text_representation方法进行文本表示处理nlp_text_representation.text_representation()
运行结果
词: book, 类型: <class 'str'>
词: apple, 类型: <class 'str'>
词: cat, 类型: <class 'str'>句子分词结果:
词: I, 类型: <class 'str'>
词: have, 类型: <class 'str'>
词: a, 类型: <class 'str'>
词: cat, 类型: <class 'str'>
词: and, 类型: <class 'str'>
词: an, 类型: <class 'str'>
词: apple, 类型: <class 'str'>
词: on, 类型: <class 'str'>
词: the, 类型: <class 'str'>
词: table, 类型: <class 'str'>
词: near, 类型: <class 'str'>
词: the, 类型: <class 'str'>
词: book, 类型: <class 'str'>进程已结束,退出代码为 0
索引编号形式
索引符号形式先构建一个包含众多词汇的固定词表,然后给词表中的每个词分配一个独一无二的索引编号。比如有一个词表包含“dog”,“elephant”,“fish”等词,“dog”可能被赋予编号1,“elephant”被赋予编号2等。当处理文本时,文本中的词会被转换为词表中对应的索引编号。例如文本“I have a dog”,经过处理后,在计算机内部“dog”可能就被记录为其在词表中的索引编号1(假设其他词也有相应编号)。
完整代码
# 定义一个名为NLPTextRepresentation的类,用于处理文本表示相关任务
class NLPTextRepresentation:# 类的初始化方法,此处不做任何初始化操作def __init__(self):# pass语句占位,不进行实际操作pass# 定义一个实例方法text_representation用于文本表示处理def text_representation(self):# 定义一个固定的词表,包含多个常见的单词vocabulary = ["dog", "elephant", "fish", "cat", "bird", "rabbit", "I", "have", "a", "and"]# 使用字典推导式创建一个字典,将词表中的每个单词映射到一个从1开始的唯一索引编号word_to_index = {word: index for index, word in enumerate(vocabulary, start=1)}# 定义一个待处理的文本字符串text = "I have a dog and a cat"# 对文本进行分词,按空格将文本拆分成多个单词并存储在列表中words = text.split()# 初始化一个空列表,用于存储转换后的索引编号indexes = []# 遍历分词后的每个单词for word in words:# 检查当前单词是否存在于词表对应的索引字典中if word in word_to_index:# 如果存在,将该单词对应的索引编号添加到indexes列表中indexes.append(word_to_index[word])else:# 如果不存在,将-1添加到indexes列表中,表示该单词是未知词indexes.append(-1)# 打印原始输入的文本print("原始文本:", text)# 打印分词后的单词列表print("分词结果:", words)# 打印转换后的索引编号列表print("转换后的索引编号:", indexes)# 当脚本作为主程序运行时执行以下代码
if __name__ == "__main__":# 创建NLPTextRepresentation类的一个实例nlp_text_representation = NLPTextRepresentation()# 调用实例的text_representation方法进行文本表示处理nlp_text_representation.text_representation()
运行结果
原始文本: I have a dog and a cat
分词结果: ['I', 'have', 'a', 'dog', 'and', 'a', 'cat']
转换后的索引编号: [7, 8, 9, 1, 10, 9, 4]进程已结束,退出代码为 0
稀疏向量表示
在文本表示中,需要将文本转化为计算机能够处理的形式,而稀疏向量表示就是其中一种有效的手段。例如在词袋模型中,通过构建一个包含大量词汇的词表,将每个文档表示为一个向量,这个向量的维度与词表大小相同。
对于文档中出现的词,在向量对应位置上标记其出现的次数或其他相关统计值,而未出现的词对应的位置则为0,这样得到的就是一个稀疏向量。
此外,在一些基于统计的文本分析任务(如文本分类、信息检索等)中,稀疏向量表示能够简洁地表示文本的特征,便于后续的计算和分析。尽管它在语义表达方面存在一定的局限性,但在许多场景下依然是一种重要且实用的文本表示方法。
稀疏向量表示详解内容,请大家阅读博主的这篇博文:自然语言处理:稀疏向量表示-CSDN博客
稠密向量表示
在文本表示中,为了让计算机能够理解和处理文本信息,需要将文本转化为合适的表示形式。稠密向量表示就是其中一种非常有效的方式。通过将文本中的词、短语甚至整个文档映射为固定维度且元素较为密集(几乎没有零值)的向量,这些向量蕴含了丰富的语义信息。
- 例如,在自然语言处理任务中,像词嵌入技术生成的词向量(如GloVe、Word2Vec产生的向量),将每个词表示为一个稠密向量,词与词之间的语义关系能够通过向量之间的运算(如距离计算)来体现。在文档层面,也可以通过一些方法将整个文档表示为一个稠密向量,用于文档分类、信息检索等任务。
所以,稠密向量表示是文本表示的重要组成部分,它在挖掘文本语义信息和支持各种自然语言处理任务方面发挥着关键作用。
GloVe
在众多实现稠密向量表示的方法中,词嵌入技术脱颖而出。词嵌入能够学习到词在上下文语境中的语义表示,为NLP任务带来了显著的性能提升。而Gensim作为一个强大的Python工具包,为我们提供了便捷的词嵌入操作接口。下面,我们将通过一个具体的例子,展示如何使用Gensim加载 GloVe词嵌入模型,进一步了解词的稠密向量表示。
下载预先训练好的词向量
我们首先需要从GloVe: Global Vectors for Word Representation下载预先训练好GloVe词向量集合压缩包(这里博主为了做讲解,下载的是glove.6B)。
下载完成后,解压压缩包,选择自己要使用的预训练的词向量集合(博主这里使用的是glove.6B.200d)。
注:
- “6B”代表该词向量集合是基于大约60亿个词(6 billion tokens)的语料库训练得到的。这个大规模的语料库包含了丰富的词汇和语言信息,使得训练出的词向量能够更好地反映语言的实际使用情况和语义关系。
- “200d”表示每个词对应的向量维度为200。也就是说,在这个glove.6B.200d词向量集合中,每个词都被表示为一个长度为200的实数向量。向量的每个维度都包含了一定的语义信息,这些维度共同编码了词的语义特征。一般来说,较高的维度可以容纳更多的语义信息,但也会增加计算和存储的成本。
将该词向量集合(glove.6B.200d)放到代码加载的路径。例如:博主放到了"D:\Software\PythonProjects\NaturalLanguageProcessing",这也是博主自然语言处理项目所在的目录。
完整代码
# 导入pprint模块,用于美观地打印数据结构
import pprint
# 从gensim库的models模块中导入KeyedVectors类,用于加载预训练词向量
from gensim.models import KeyedVectors# 定义一个名为NLPTextRepresentation的类,用于处理文本表示相关任务
class NLPTextRepresentation:# 类的初始化方法,初始化时将预训练词向量模型设为Nonedef __init__(self):# 初始化实例属性,用于存储预训练的词向量模型self.pretrained_word_vector_model = None# # 定义一个实例方法text_representation用于文本表示处理def text_representation(self):# 加载GloVe200维的预训练词向量模型self.pretrained_word_vector_model = KeyedVectors.load_word2vec_format(# 指定要加载的GloVe词向量文件的路径"D:/Software/PythonProjects/NaturalLanguageProcessing/glove.6B.200d.txt",# 表明加载的文件不是二进制格式binary=False,# 表明文件没有标题行no_header=True)# 打印与'book'最相似的词pprint.pprint(self.pretrained_word_vector_model.most_similar('book'))# 打印与'plane'最相似的词pprint.pprint(self.pretrained_word_vector_model.most_similar('plane'))# 定义一个实例方法solve_word_analogy用于解决词语类比问题def solve_word_analogy(self, base_word_1, related_word_1, base_word_2):# 根据输入的词语进行类比计算,找到最相似的词analogy_result = self.pretrained_word_vector_model.most_similar(# 正向词列表,用于计算类比关系positive=[base_word_2, related_word_1],# 负向词列表,用于计算类比关系negative=[base_word_1])# 返回类比结果中的第一个词return analogy_result[0][0]# 当脚本作为主程序运行时执行以下代码
if __name__ == "__main__":# 创建NLPTextRepresentation类的一个实例nlp_text_representation = NLPTextRepresentation()# 调用实例的text_representation方法进行文本表示处理nlp_text_representation.text_representation()# 进行词语类比计算,打印英国和中国语言类比的结果print(nlp_text_representation.solve_word_analogy("britain", "british", "china"))# 进行词语类比计算,打印加拿大和挪威代表性事物类比的结果print(nlp_text_representation.solve_word_analogy("canada", "maple", "norway"))# 进行词语类比计算,打印形容词最高级类比的结果print(nlp_text_representation.solve_word_analogy("high", "highest", "large"))# 进行词语类比计算,打印不同程度描述词类比的结果print(nlp_text_representation.solve_word_analogy("nice", "wonderful", "awful"))# 进行词语类比计算,打印性别相关词语类比的结果print(nlp_text_representation.solve_word_analogy("boy", "girl", "uncle"))
运行结果
[('books', 0.8452467918395996),('author', 0.7746455669403076),('novel', 0.7485204935073853),('published', 0.7451642751693726),('memoir', 0.7047821283340454),('wrote', 0.6971326470375061),('written', 0.6967507004737854),('essay', 0.6844283938407898),('biography', 0.681260347366333),('autobiography', 0.6770558953285217)]
[('airplane', 0.7965999245643616),('planes', 0.7498337626457214),('crashed', 0.7370129823684692),('jet', 0.7351437211036682),('flight', 0.734633207321167),('aircraft', 0.7169479727745056),('crash', 0.7128624320030212),('airliner', 0.6871931552886963),('flew', 0.6739749908447266),('helicopter', 0.6698653101921082)]
chinese
spruce
largest
horrible
aunt进程已结束,退出代码为 0
Word2Vec
在自然语言处理的文本表示中,Word2Vec是一种非常重要且广泛应用的词嵌入(Word Embedding)技术,它旨在将文本中的每个词映射为一个低维的连续向量,从而实现对词的数值化表示。
Word2Vec基于分布式假设,即如果两个词在文本中经常出现在相似的上下文环境中,那么它们的语义也很可能相似。它通过构建一个预测模型,利用词的上下文信息来预测目标词,或者利用目标词来预测其上下文,从而学习到词的向量表示。
在这个过程中,每个词都被映射到一个低维的向量空间中,在这个空间里,语义相近的词在位置上也更接近。
接下来,将为大家展示Word2Vec相关代码。该代码包含文本预处理环节、Skip-Gram算法的具体实现,并且会借助PyTorch框架完成优化过程。在本次代码实践中,我们选用《牧羊少年奇幻之旅》(The Alchemist)这本书的文本内容作为训练语料。
完整代码
在执行此部分代码之前,大家需预先安装代码所依赖的库。具体的安装命令为:
pip install numpy
pip install nltk
pip install torch torchvision torchaudio
pip install matplotlib
注:
- numpy全称为Numerical Python,是Python科学计算的基础库,它提供了高效的多维数组对象(ndarray)以及对这些数组进行快速操作的各类函数。
- nltk全称为Natural Language Toolkit,即自然语言工具包,是Python中一个广泛使用的用于自然语言处理(NLP)的开源库。nltk提供了丰富的工具、数据集和算法,可帮助开发者进行文本处理、分析和理解,覆盖了自然语言处理的多个基础任务和高级技术,让开发者能够更便捷地实现各种自然语言处理应用。
- torch是PyTorch深度学习框架的核心库。PyTorch是一个开源的深度学习框架,被广泛应用于自然语言处理、计算机视觉、语音识别等领域。torchvision是PyTorch的一个扩展库,专门用于计算机视觉任务。torchaudio是PyTorch的另一个扩展库,用于音频处理任务。
- matplotlib是Python中一个非常流行且功能强大的用于数据可视化的第三方库,matplotlib提供了一整套用于创建各种静态、动态和交互式可视化图表的工具,涵盖了从简单的折线图、散点图到复杂的多子图布局、3D图形等多种类型。
text_representation_dataset.py文件中的TextRepresentationDataset类:
# 从nltk库的tokenize模块导入句子分词和单词分词的函数
from nltk.tokenize import sent_tokenize, word_tokenize
# 从collections模块导入defaultdict类,用于创建具有默认值的字典
from collections import defaultdict
# 导入numpy库,用于进行数值计算和数组操作
import numpy as np# 定义一个名为TextRepresentationDataset的类,用于文本表示数据集的处理
class TextRepresentationDataset:# 类的构造函数,初始化对象时调用,默认对文本进行分词def __init__(self, do_tokenize=True):# 初始化单词频率字典,用于记录每个单词的出现频率self.word_frequency = None# 初始化单词到索引的映射字典self.word_to_id = None# 初始化索引到单词的映射字典self.id_to_word = None# 初始化存储单词索引列表的变量self.word_id_list = None# 以只读模式打开指定文本文件,并以UTF-8编码读取文件内容raw_text = open('The Alchemist.txt', 'r', encoding='utf-8').read()# 判断是否需要对文本进行分词操作if do_tokenize:# 对读取的文本进行句子分词,并将所有单词转换为小写self.sentence_list = sent_tokenize(raw_text.lower())# 对每个句子进行单词分词,将结果存储在列表中self.word_list = [word_tokenize(sent) for sent in self.sentence_list]else:# 如果不进行分词,直接将原始文本存储在对象属性中self.raw_text = raw_text# 定义创建词汇表的方法,可指定最小词频,低于该频率的词会被丢弃def create_vocabulary(self, minimum_frequency=1):# 创建一个默认值为0的字典,用于统计单词频率word_freq = defaultdict(int)# 遍历每个句子for single_sentence in self.word_list:# 遍历句子中的每个单词for single_word in single_sentence:# 统计每个单词的出现次数word_freq[single_word] += 1# 将统计好的单词频率字典存储在对象属性中self.word_frequency = word_freq# 初始化单词到索引的映射字典,添加特殊标记<unk>和<pad>self.word_to_id = {'<unk>': 1, '<pad>': 0}# 初始化索引到单词的映射字典,添加特殊标记<unk>和<pad>self.id_to_word = {1: '<unk>', 0: '<pad>'}# 对统计好的单词频率字典按频率从高到低排序for word, freq in sorted(word_freq.items(), key=lambda x: -x[1]):# 注释说明:丢弃低频词# 判断单词频率是否大于最小词频要求if freq > minimum_frequency:# 将单词添加到单词到索引的映射字典中self.word_to_id[word] = len(self.word_to_id)# 将索引和单词的映射添加到索引到单词的映射字典中self.id_to_word[len(self.id_to_word)] = wordelse:# 如果单词频率低于最小词频,停止添加break# 定义获取单词分布的方法def obtain_word_distribution(self):# 创建一个长度为词汇表大小的全零数组,用于存储单词分布dist = np.zeros(len(self.word_to_id))# 遍历统计好的单词频率字典for word, freq in self.word_frequency.items():# 判断单词是否在词汇表中if word in self.word_to_id:# 将单词的频率存储到对应索引的位置dist[self.word_to_id[word]] = freqelse:# 如果单词不在词汇表中,将其频率累加到<unk>对应的位置dist[1] += freq# 对存储单词分布的数组进行归一化处理dist /= dist.sum()# 返回归一化后的单词分布数组return dist# 定义将单词转换为索引的方法,可选择移除单单词的句子def transform_tokens_to_ids(self, remove_single_word=True):# 初始化存储单词索引列表的变量self.word_id_list = []# 遍历每个句子for single_sentence in self.word_list:# 将句子中的每个单词转换为对应的索引,如果单词不在词汇表中,使用<unk>的索引ids = [self.word_to_id.get(word, 1) for word in single_sentence]# 判断转换后的索引列表长度是否为1且需要移除单单词的句子if len(ids) == 1 and remove_single_word:# 如果满足条件,跳过该句子continue# 将转换后的索引列表添加到存储单词索引列表的变量中self.word_id_list.append(ids)# 返回存储单词索引列表的变量return self.word_id_list
该类的主要作用是对文本数据进行预处理,包括分词、构建词汇表、统计单词频率、计算单词分布以及将单词转换为索引等操作,为后续的自然语言处理任务(如文本分类、语言模型训练等)提供必要的数据准备。
skip_gram_with_nce.py文件中的SkipGramWithNCE类和BatchDataCollator类:
# 导入PyTorch库,用于深度学习任务
import torch
# 从PyTorch中导入神经网络模块
from torch import nn
# 导入PyTorch的函数式接口,用于常用的神经网络函数
import torch.nn.functional as functional
# 导入NumPy库,用于数值计算
import numpy as np# 定义一个名为BatchDataCollator的类,用于批量数据的整理
class BatchDataCollator:# 定义一个类方法,用于整理一批数据@classmethoddef collate_data_batch(cls, batch_data):# 将输入的批量数据转换为NumPy数组batch_data = np.array(batch_data)# 从批量数据中提取输入索引,并转换为PyTorch的长整型张量input_indices = torch.tensor(batch_data[:, 0], dtype=torch.long)# 从批量数据中提取目标标签,并转换为PyTorch的长整型张量target_labels = torch.tensor(batch_data[:, 1], dtype=torch.long)# 返回一个字典,包含输入索引和目标标签return {'input_indices': input_indices, 'target_labels': target_labels}# 定义一个名为SkipGramWithNCE的类,继承自PyTorch的神经网络模块
class SkipGramWithNCE(nn.Module):# 类的构造函数,初始化模型的参数def __init__(self, vocabulary_size, embedding_dim, word_distribution, negative_sample_num=20):# 调用父类的构造函数super(SkipGramWithNCE, self).__init__()# 打印模型的参数信息,包括词汇表大小、嵌入维度和负样本数量print(f'vocabulary_size = {vocabulary_size}, embedding_dim = {embedding_dim}, ' + f'negative_sample_num = {negative_sample_num}')# 定义输入嵌入层,将词汇表中的单词映射到指定维度的向量空间self.input_embedding_layer = nn.Embedding(vocabulary_size, embedding_dim)# 定义输出嵌入层,将词汇表中的单词映射到指定维度的向量空间self.output_embedding_layer = nn.Embedding(vocabulary_size, embedding_dim)# 对单词分布进行0.75次幂运算word_distribution = np.power(word_distribution, 0.75)# 对处理后的单词分布进行归一化处理word_distribution /= word_distribution.sum()# 将处理后的单词分布转换为PyTorch张量self.word_distribution_tensor = torch.tensor(word_distribution)# 保存负样本的数量self.negative_sample_num = negative_sample_num# 定义前向传播方法,用于计算模型的输出def forward(self, input_indices, target_labels):# 通过输入嵌入层将输入索引转换为嵌入向量input_embedded = self.input_embedding_layer(input_indices)# 通过输出嵌入层将目标标签转换为嵌入向量output_embedded = self.output_embedding_layer(target_labels)# 获取输入嵌入向量的批次大小batch_size_val = input_embedded.size(0)# 根据单词分布张量,随机采样负样本单词的索引negative_word_indices = torch.multinomial(self.word_distribution_tensor,batch_size_val * self.negative_sample_num, replacement=True).view(batch_size_val, -1)# 通过输出嵌入层将负样本单词的索引转换为嵌入向量negative_embedded = self.output_embedding_layer(negative_word_indices)# 计算正样本项,使用logsigmoid函数对输入嵌入向量和输出嵌入向量的点积求和positive_term = functional.logsigmoid(torch.sum(input_embedded * output_embedded, dim=1))# 计算负样本项,使用logsigmoid函数对负样本嵌入向量和输入嵌入向量的批量矩阵乘法结果取负negative_term = functional.logsigmoid(- torch.bmm(negative_embedded, input_embedded.unsqueeze(2)).squeeze())# 对负样本项在维度1上求和negative_term = torch.sum(negative_term, dim=1)# 计算损失值,取正样本项和负样本项之和的平均值的负值loss_value = -torch.mean(positive_term + negative_term)# 返回计算得到的损失值return loss_value
BatchDataCollator类主要用于将批量数据进行整理和处理,使其能够以合适的格式输入到模型中进行训练。
SkipGramWithNCE类实现了带有负采样对比估计(Negative Sampling with Contrastive Estimation,NCE)的Skip-Gram模型,用于学习词向量。Skip-Gram模型的目标是根据中心词预测其上下文词,而NCE是一种用于提高训练效率的技术,通过采样少量的负样本(即非上下文词)来近似计算损失。
nlp_text_normalization.py文件中的NLPTextRepresentation类(此文件被设定为主运行文件):
# 从skip_gram_with_nce模块中导入SkipGramWithNCE类和BatchDataCollator类
from skip_gram_with_nce import SkipGramWithNCE, BatchDataCollator
# 从text_representation_dataset模块中导入TextRepresentationDataset类
from text_representation_dataset import TextRepresentationDataset
# 导入numpy库,用于数值计算和数组操作
import numpy as np
# 从 tqdm库中导入trange函数,用于显示训练进度条
from tqdm import trange
# 导入matplotlib库,用于数据可视化
import matplotlib# 设置matplotlib的后端为TkAgg,用于显示图形界面
matplotlib.use('TkAgg')
# 从matplotlib库中导入pyplot模块,并将其重命名为plt
from matplotlib import pyplot as plt
# 从torch.utils.data模块中导入DataLoader类,用于批量加载数据
from torch.utils.data import DataLoader
# 从torch.optim模块中导入Adam优化器
from torch.optim import Adam# 定义一个名为NLPTextRepresentation的类,用于处理文本表示相关任务
class NLPTextRepresentation:# 类的初始化方法,此处不做任何初始化操作def __init__(self):# pass 语句占位,不进行实际操作pass# 定义一个实例方法text_representation用于文本表示处理def text_representation(self):# 创建TextRepresentationDataset类的实例,用于处理文本数据text_repr_dataset = TextRepresentationDataset()# 调用实例的create_vocabulary方法,创建词汇表,最小词频设为 1text_repr_dataset.create_vocabulary(minimum_frequency=1)# 调用实例的transform_tokens_to_ids方法,将分词结果转换为索引序列token_index_sentences = text_repr_dataset.transform_tokens_to_ids()# 设置上下文窗口大小为2context_window_size = 2# 初始化一个空列表,用于存储训练数据training_data = []# 遍历每个句子的索引序列for sentence in token_index_sentences:# 遍历句子中的每个词的索引for i in range(len(sentence)):# 遍历当前词索引前后的上下文窗口范围for j in range(i - context_window_size, i + context_window_size + 1):# 跳过自身索引、越界索引if j == i or j < 0 or j >= len(sentence):continue# 获取中心词的索引central_word_index = sentence[i]# 获取上下文词的索引context_word_index = sentence[j]# 将中心词索引和上下文词索引作为一个样本添加到训练数据列表中training_data.append([central_word_index, context_word_index])# 将训练数据列表转换为numpy数组training_data = np.array(training_data)# 打印训练数据的形状和内容print(training_data.shape, training_data)# 获取词汇表的大小vocabulary_size = len(text_repr_dataset.word_to_id)# 设置嵌入维度为128embedding_dimension = 128# 调用实例的obtain_word_distribution方法,获取单词分布word_distribution = text_repr_dataset.obtain_word_distribution()# 打印单词分布print(word_distribution)# 创建SkipGramWithNCE类的实例,初始化模型skip_gram_model = SkipGramWithNCE(vocabulary_size, embedding_dimension, word_distribution)# 定义训练参数以及训练循环# 设置训练的轮数为100training_epochs = 100# 设置每个批次的数据数量为128batch_size = 128# 设置学习率为0.001learning_rate = 1e-3# 初始化一个空列表,用于存储每一轮的损失值epoch_losses = []# 创建BatchDataCollator类的实例,用于整理批量数据data_collation_helper = BatchDataCollator()# 创建DataLoader实例,用于批量加载训练数据data_loader = DataLoader(training_data, batch_size=batch_size, shuffle=True,collate_fn=data_collation_helper.collate_data_batch)# 创建Adam优化器实例,用于更新模型参数optimizer = Adam(skip_gram_model.parameters(), lr=learning_rate)# 清空模型的梯度skip_gram_model.zero_grad()# 将模型设置为训练模式skip_gram_model.train()# 训练过程,每步读取数据,送入模型计算损失,并使用PyTorch进行优化# 使用trange函数创建一个进度条,显示训练轮数with trange(training_epochs, desc='epoch', ncols=60) as progress_bar:# 遍历每一轮训练for epoch in progress_bar:# 遍历每个批次的数据for step, batch_data in enumerate(data_loader):# 将批次数据输入模型,计算损失loss = skip_gram_model(**batch_data)# 更新进度条的描述信息,显示当前轮数和损失值progress_bar.set_description(f'epoch-{epoch}, loss={loss.item():.4f}')# 反向传播计算梯度loss.backward()# 使用优化器更新模型参数optimizer.step()# 清空模型的梯度skip_gram_model.zero_grad()# 将当前轮的损失值添加到损失列表中epoch_losses.append(loss.item())# 将损失列表转换为numpy数组epoch_losses = np.array(epoch_losses)# 绘制损失值随训练轮数变化的折线图plt.plot(range(len(epoch_losses)), epoch_losses)# 设置 x 轴标签为训练轮数plt.xlabel('training epochs')# 设置 y 轴标签为损失值plt.ylabel('loss value')# 显示绘制的图形plt.show()# 当脚本作为主程序运行时执行以下代码
if __name__ == "__main__":# 创建NLPTextRepresentation类的一个实例nlp_text_representation = NLPTextRepresentation()# 调用实例的text_representation方法进行文本表示处理nlp_text_representation.text_representation()
该类整合了文本数据处理、模型构建、训练以及结果可视化等一系列操作,实现了基于Skip-Gram 模型的词向量训练和相关分析任务。
运行结果
(15326, 2) [[ 1 1][ 1 20][ 1 1]...[28 1][ 1 2][ 1 28]]
[0. 0.46239338 0.42310675 0.02326182 0.00827087 0.007753940.00646162 0.00465236 0.00361851 0.00361851 0.00361851 0.003360040.00310158 0.00232618 0.00206772 0.00206772 0.00206772 0.002067720.00206772 0.00180925 0.00155079 0.00155079 0.00155079 0.001550790.00155079 0.00129232 0.00129232 0.00103386 0.00103386 0.001033860.00103386 0.00103386 0.00103386 0.00077539 0.00077539 0.000775390.00077539 0.00077539 0.00077539 0.00077539 0.00051693 0.000516930.00051693 0.00051693 0.00051693 0.00051693 0.00051693 0.000516930.00051693 0.00051693 0.00051693 0.00051693 0.00051693 0.000516930.00051693 0.00051693 0.00051693 0.00051693 0.00051693 0.00051693]
vocabulary_size = 60, embedding_dim = 128, negative_sample_num = 20
epoch-99, loss=3.9004: 100%|█| 100/100 [00:18<00:00, 5.29it
运行结果解析
图表坐标轴含义
- 横坐标(training epochs):表示训练轮数,范围从0到100,对应代码中设置的training_epochs=100,即模型对整个训练数据集进行100次遍历训练。
- 纵坐标(loss value):表示损失值,反映了模型在训练过程中预测结果与真实结果之间的差距。损失值越低,说明模型的预测效果越好。
折线走势分析
- 起始阶段(0-10轮左右):损失值从接近19迅速下降,在下降过程中出现了一定波动。这是因为在训练初期,模型的参数是随机初始化的,对数据的拟合能力较差,损失值较高。随着训练的进行,优化器(代码中使用的是Adam优化器)开始调整模型参数,使得损失值快速下降。波动可能是由于不同批次数据的分布差异以及随机初始化的影响。
- 中间阶段(10-40轮左右):损失值下降速度变缓,并且在一定范围内波动。此时模型已经初步学习到了数据中的一些特征,但还没有完全收敛,继续在调整参数以更好地拟合数据,所以损失值虽然仍在下降,但幅度变小,且由于数据的随机性和模型训练的不稳定性,存在一定波动。
- 后期阶段(40-100轮左右):损失值趋于平稳,基本在4附近小范围波动。这表明模型已经接近收敛状态,进一步调整参数对损失值的降低作用不大,模型在当前的训练设置下已经达到了一个相对稳定的拟合程度。
与代码的关联
- 在代码中,每一轮训练结束后,会将当前轮的损失值(loss.item())记录到epoch_losses列表中,训练完成后将该列表转换为numpy数组,然后使用plt.plot(range(len(epoch_losses)), epoch_losses)绘制损失值随训练轮数的变化曲线,横坐标是训练轮数序列,纵坐标是对应的损失值序列,最终呈现出这张可视化图表。
稠密向量表示详解内容,请大家阅读博主的这篇博文:自然语言处理:稠密向量表示-CSDN博客
文档表示
概念阐述
在自然语言处理的文本表示中,文档表示是将文本形式的文档转化为计算机可处理的数字形式,以让计算机理解文档语义和特征,进而实现信息检索、文本分类、情感分析等任务。
TF-IDF
TF-IDF(Term Frequency-Inverse Document Frequency):即词频-逆文档频率,是一种用于信息检索和文本挖掘的常用加权技术,也是一种统计方法,用以评估一个字词对于文件集或语料库中某一份文件的重要程度。
TF-IDF是常见的文档表示方法一只,它基于词袋模型,不仅考量词在文档中的出现频率(TF),还结合词在整个文档集合中的稀有程度(IDF)。在情感分析等自然语言处理任务中,积极的词可通过TF-IDF体现其重要性。如果某个积极词,像 “很棒”,“超赞”,“喜欢”等,在一篇文档中出现频率(TF)较高,同时在整个文档集合中出现的文档数量较少(IDF较高),那么这个词的TF-IDF值就高,能突出该文档在情感表达上的特点。
在众多实际场景中,常常会对文档所对应的TF-IDF向量进一步执行L2归一化操作。通过这种方式,能够让不同文档的TF-IDF向量具备相同的模长属性,从而更有利于对它们进行相互间的比较分析。接下来,我用具体代码来给大家展示TF-IDF的实现。
完整代码
# 导入NumPy库,用于数值计算
import numpy as np# 定义TFIDF类,用于计算文本的TF-IDF值
class TFIDF:# 类的构造函数,初始化类的属性def __init__(self, vocabulary_size, normalization='l2', smooth_inverse_document_frequency=True,sublinear_term_frequency=True):# 初始化逆文档频率为None,后续会在fit方法中计算self.inverse_document_frequency = None# 存储词汇表的大小self.vocabulary_size = vocabulary_size# 存储归一化的方式,默认为'l2'self.normalization = normalization# 存储是否对逆文档频率进行平滑处理的标志,默认为Trueself.smooth_inverse_document_frequency = smooth_inverse_document_frequency# 存储是否使用次线性词频的标志,默认为Trueself.sublinear_term_frequency = sublinear_term_frequency# 该方法用于计算逆文档频率(IDF)def fit(self, document_collection):# 创建一个全零数组,用于存储每个词的文档频率document_frequency = np.zeros(self.vocabulary_size, dtype=np.float64)# 遍历文档集合中的每个文档for document in document_collection:# 遍历文档中出现的唯一词for word_id in set(document):# 对应词的文档频率加 1document_frequency[word_id] += 1# 如果开启平滑处理,文档频率数组每个元素加1document_frequency += int(self.smooth_inverse_document_frequency)# 计算文档总数,若开启平滑处理则总数加1total_documents = len(document_collection) + int(self.smooth_inverse_document_frequency)# 根据公式计算逆文档频率并存储在类的属性中self.inverse_document_frequency = np.log(total_documents / document_frequency) + 1# 该方法用于将文档集合转换为TF-IDF矩阵def transform(self, document_collection):# 确保已经调用fit方法计算了逆文档频率assert hasattr(self, 'inverse_document_frequency')# 创建一个全零矩阵,用于存储词频矩阵term_frequency_matrix = np.zeros((len(document_collection), self.vocabulary_size), dtype=np.float64)# 遍历文档集合,获取文档的索引和内容for index, document in enumerate(document_collection):# 遍历文档中的每个词for word in document:# 对应位置的词频加1term_frequency_matrix[index, word] += 1# 如果使用次线性词频,对词频矩阵取对数if self.sublinear_term_frequency:term_frequency_matrix = np.log(term_frequency_matrix + 1)# 计算TF-IDF矩阵,词频矩阵乘以逆文档频率tfidf_matrix = term_frequency_matrix * self.inverse_document_frequency# 如果开启了归一化if self.normalization:# 计算TF-IDF矩阵每行的L2范数row_norm = (tfidf_matrix ** 2).sum(axis=1)# 将范数为0的行的范数设为1,避免除零错误row_norm[row_norm == 0] = 1# 对TF-IDF矩阵进行L2归一化tfidf_matrix /= np.sqrt(row_norm)[:, None]# 返回最终的TF-IDF矩阵return tfidf_matrix# 该方法先调用fit方法,再调用transform方法def fit_transform(self, document_collection):# 调用fit方法计算逆文档频率self.fit(document_collection)# 调用transform方法计算并返回TF-IDF矩阵return self.transform(document_collection)# 当此Python文件作为主程序直接运行时,执行下面的代码块
if __name__ == "__main__":# 定义一个简单的文档集合,每个文档用单词的索引列表表示document_collection = [[0, 1, 2],[1, 2, 3],[0, 2, 3]]# 假设词汇表大小为4,因为document_collection中出现的最大索引为3vocabulary_size = 4# 创建TFIDF类的实例tfidf = TFIDF(vocabulary_size)# 调用fit_transform方法计算TF-IDF矩阵tfidf_matrix = tfidf.fit_transform(document_collection)# 打印计算得到的TF-IDF矩阵print("TF-IDF矩阵:")print(tfidf_matrix)
运行结果
TF-IDF矩阵:
[[0.61980538 0.61980538 0.48133417 0. ][0. 0.61980538 0.48133417 0.61980538][0.61980538 0. 0.48133417 0.61980538]]进程已结束,退出代码为 0
代码分析
该类的核心功能是计算TF-IDF值。TF-IDF是一种用于评估一个字词对于一个文档集或语料库中的某一份文档的重要程度的统计方法。该类通过fit和transform方法,结合fit_transform这个便捷方法,完成了TF-IDF值的计算。
- fit方法:此方法会遍历输入的文档集合,统计每个词在多少个文档中出现过,以此计算逆文档频率(IDF)。逆文档频率反映了一个词的普遍重要性,一个词在越少的文档中出现,其IDF值越高。
- transform方法:该方法先计算每个文档中各个词的词频(TF),即一个词在文档中出现的频率。然后将词频与之前计算好的IDF相乘,得到TF-IDF值。最终形成一个矩阵,每一行代表一个文档,每一列代表一个词,矩阵中的元素就是对应文档中对应词的TF-IDF值。
- fit_transform方法:它是fit和transform方法的组合,方便用户一次性完成IDF计算和TF-IDF矩阵的生成。
TF-IDF详解内容,请大家阅读博主的这篇博文:自然语言处理:词频-逆文档频率-CSDN博客
结束
好了,本次分享就到这里。相信通过刚刚的内容,大家对自然语言处理里的文本表示有了更多的理解,也对它在实际应用中蕴藏的巨大潜力有了全新的认知。真心希望这次分享能成为大家在自然语言处理学习与实践旅程中的助力,给大家带来一些启发。
总的来说,自然语言处理领域正蓬勃发展,充满无限生机与可能,而文本表示作为其中的核心基础,其重要性不言而喻,且相关技术也在不断推陈出新。相信大家也能在这片充满活力与机遇的领域中,始终保持热情,积极探索,勇于实践,不断收获成长与进步。
那么本次分享就到这里了。最后,博主还是那句话:请大家多去大胆的尝试和使用,成功总是在不断的失败中试验出来的,敢于尝试就已经成功了一半。如果大家对博主分享的内容感兴趣或有帮助,请点赞和关注。大家的点赞和关注是博主持续分享的动力🤭,博主也希望让更多的人学习到新的知识。
相关文章:
自然语言处理:文本表示
介绍 大家好,博主又来给大家分享知识了。今天给大家分享的内容是自然语言处理中的文本表示。 在当今数字化信息爆炸的时代,自然语言处理作为人工智能领域的重要分支,发挥着越来越关键的作用。 而文本表示,则是自然语言处理的基…...
flutter 网络请求封装与json序列化与反序列化
一、用到的工具库 网络请求库 dioflutter pub add diojson序列化与反序列化库 json_annotation//终端直接键入下命令安装 flutter pub add json_annotation dev:build_runner dev:json_serializable二、返回结果泛化封装 以 https://www.wanandroid.com/ api 接口返回结果为例…...
生成网页链接二维码
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>生成二维码</title><script src"http…...
java关键字-instanceof
主要作用 A instanceof B主要判断以下三个内容(即左边的类型A能否转换为右边的B): 判断对象A是否是B类的对象;判断对象A实现了B接口;判断对象A是否继承了B类; A表示对象,B表示接口/类&#x…...
验证码识别:一文掌握手机验证码的自动化处理
文章目录 一、获取手机验证码1.1 通过短信接收验证码1.2 使用第三方短信接收服务1.3 使用ADB读取手机短信1.4 通过API获取验证码1.5 通过邮件接收验证码二、解析和提取验证码2.1 正则表达式提取2.2 JSON解析三、自动化输入验证码3.1 使用Selenium自动化Web应用3.2 使用Appium自…...
Uppy - 免费开源、功能强大的新一代 web 文件上传组件,支持集成到 Vue 项目
Uppy 这个优质的前端组件,可以解决几乎所有的文件上传问题,最近发布了 TS 重写的 4.0 新版本,实用性更强了。 Uppy 是一个 UI 外观时尚、模块化的 JavaScript 文件上传组件,这个组件可以与任何 web 技术栈集成,不仅轻…...
神经网络参数量计算
算一个只有两层的神经网络的参数量,我们需要考虑两层之间的连接权重和偏置项。以下是详细的计算步骤: 网络结构 输入层(第一层): 有 2 个神经元。 输出层(第二层): 有 3 个神经元。…...
如何为Java面试准备项目经验
1 提出问题 应届生朋友或Java程序员在找Java方面的工作时,一定会需要准备Java项目经验,但事实上不少求职者,是没有项目经验,或者只具有开源社区等的学习项目经验,这样的话,就很有可能在面试时无法有效地证…...
DeepSeek 与云原生后端:AI 赋能现代应用架构
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 在当今快速发展的互联网时代,云原生(Cloud Native)架构已成为后端开发的主流趋势。云…...
自定义异常
在 Java 中,自定义异常是指根据特定需求创建的异常类。通过自定义异常,可以更好地表示应用程序中的特定错误情况,并提供更清晰的错误信息。以下是关于自定义异常的详细介绍和实现方法: 一、为什么需要自定义异常? 明确…...
题解:洛谷 P2199 最后的迷宫
题目https://www.luogu.com.cn/problem/P2199 显然,数据最大 ,数组我们开不下,动态开数组。 对于每一个查询,从起点开始,走一步判断是否能看到火焰杯。 如果已经没法走了,直接拆墙,输出 Poor…...
JDK包含内容的正确说法及API文档下载
JDK包含内容的正确说法及API文档下载 正确说法:JDK包含JRE和JDK开发工具,而JRE主要包含JVM和核心类库。 因为 旧版 JRE(Java 8 及之前):确实包含 Java 插件(Applet) 和 Java Web Start…...
CTF-web: 查看python代码抽象语法树
抽象语法树(Abstract Syntax Tree,简称 AST)是源代码的树状表示,展示了代码的语法结构。在 Python 中,ast 模块可以帮助你解析和操作 Python 代码的 AST。 1. 使用 ast 模块解析 Python 代码 我们可以使用 ast.parse …...
前端学习——HTML
VSCode常用快捷键 代码格式化:ShiftAltF 向上或向下移动一行:AltUp或AltDown 快速复制一行代码:ShiftAltUp或者ShiftAltDown 快速替换:CtrlH HTML标签 文本标签 定义着重文字 定义粗体文字 定义斜体文字 加重语气 删除字 无特…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_open_file
ngx_open_file 定义在src/os/unix/ngx_files.h #define ngx_open_file(name, mode, create, access) \open((const char *) name, mode|create, access)#define NGX_FILE_RDONLY O_RDONLY #define NGX_FILE_WRONLY O_WRONLY #de…...
Window C++模拟单片机控制TFT屏幕和SD卡
因为每次都要做大量的测试,上传到单片机实在是太费事,所以写了这个模拟项目用来测试 很多方法我没有补充进去,因为太多了,如果有需要请自行补充 stdafx.h #pragma once#include<iostream> #include<atlimage.h> #in…...
记录一次FastDFS内部文件迁移过程
场景:dockr部署下的一个DFS环境,切换环境将原DFS内的所有文件全部迁移走,老版本的镜像包现不可使用,所以重新搭建并迁移外挂包下的所有文件 一、定位存储路径及备份 确定容器内存储路径 根据使用的Docker镜像不同࿰…...
【数据挖掘】Matplotlib
Matplotlib 是 Python 最常用的 数据可视化 库之一,在数据挖掘过程中,主要用于 数据探索 (EDA)、趋势分析、模式识别 和 结果展示。 📌 1. Matplotlib 基础 1.1 安装 & 导入 # 如果未安装 Matplotlib,请先安装 # pip instal…...
Python数据序列化技术:高效存储与传输的最佳实践
在现代软件开发中,数据序列化是一个关键环节,它允许我们将复杂的数据结构转换为可存储或可传输的格式,以便在不同的系统或程序之间共享和持久化。Python提供了多种数据序列化技术,每种技术都有其独特的性能优势和适用场景。本文将…...
大模型function calling:让AI函数调用更智能、更高效
大模型function calling:让AI函数调用更智能、更高效 随着大语言模型(LLM)的快速发展,其在实际应用中的能力越来越受到关注。Function Calling 是一种新兴的技术,允许大模型与外部工具或API进行交互,从而扩…...
HarmonyOS学习第12天:解锁表格布局的奥秘
表格布局初相识 不知不觉,我们在 HarmonyOS 的学习旅程中已经走到了第 12 天。在之前的学习里,我们逐步掌握了 HarmonyOS 开发的各种基础与核心技能,比如组件的基本使用、布局的初步搭建等,这些知识就像一块块基石,为我…...
基于 MetaGPT 自部署一个类似 MGX 的多智能体协作框架
MGX(由 MetaGPT 团队开发的 mgx.dev)是一个收费的多智能体编程平台,提供从需求分析到代码生成、测试和修复的全流程自动化功能。虽然 MGX 本身需要付费,但您可以通过免费服务和开源项目搭建一个类似的功能。以下是一个分步骤的实现…...
Cargo, the Rust package manager, is not installed or is not on PATH.
今天在Windows操作系统上通过pip 安装jupyter的时候遇到这个报错,Cargo, the Rust package manager, is not installed or is not on PATH.。 解决办法 官网:https://rustup.rs/# 下载:https://win.rustup.rs/x86_64 安装完成之后,…...
Spring AI:开启Java开发的智能新时代
目录 一、引言二、什么是 Spring AI2.1 Spring AI 的背景2.2 Spring AI 的目标 三、Spring AI 的核心组件3.1 数据处理3.2 模型训练3.3 模型部署3.4 模型监控 四、Spring AI 的核心功能4.1 支持的模型提供商与类型4.2 便携 API 与同步、流式 API 选项4.3 将 AI 模型输出映射到 …...
华为昇腾910b服务器部署DeepSeek翻车现场
最近到祸一台HUAWEI Kunpeng 920 5250,先看看配置。之前是部署的讯飞大模型,发现资源利用率太低了。把5台减少到3台,就出了他 硬件配置信息 基本硬件信息 按照惯例先来看看配置。一共3块盘,500G的系统盘, 2块3T固态…...
c++ 文件及基本读写总结
在 C 中,文件操作是非常重要的一部分,主要用于将数据存储到文件中,或者从文件中读取数据。C 标准库提供了fstream头文件,其中包含了用于文件操作的类,主要有ifstream(用于输入文件流,即从文件读…...
千峰React:组件与逻辑封装(上)
UI组件库及antd安装 UI组件库就是把页面的组件写好了,用的时候直接调用好了 进行一个安装的动作: 总之就是搭积木,可以调用里面写好的组件库拼接,也可以结合使用 antd布局和导航组件 组件总览 - Ant Design 这是通用部分 在用…...
Windows 10 远程桌面连接使用指南
目录 一、引言 二、准备工作 1、确认系统版本 2、服务器端设置 三、客户端连接 1、打开远程桌面连接程序 2、输入连接信息 3、输入登录凭证 4、开始使用远程桌面 四、移动端连接(以 iOS 为例) 1、下载安装应用 2、添加远程计算机 3、进行连接…...
使用Kali中的Metasploit生成木马控制Windows系统
使用Kali中的Metasploit生成木马控制Windows系统 (第九天 9.20) 一、kali及Metasploit kali基于debin的数字取证系统,上面集成很多渗透测试工具,其前身是BT5 R3(BrackTrack),在信息搜集方面发…...
Python与Web3.py库:构建去中心化应用的未来
Python与Web3.py库:构建去中心化应用的未来 在区块链的世界里,“去中心化”是最核心的理念之一,它赋予了用户更多的控制权和自由,消除了传统中心化系统中的单点故障和信任问题。而在这场技术革命中,Web3.0无疑是最受瞩…...
《Python实战进阶》No 8:部署 Flask/Django 应用到云平台(以Aliyun为例)
第8集:部署 Flask/Django 应用到云平台(以Aliyun为例) 2025年3月1日更新 增加了 Ubuntu服务器安装Python详细教程链接。 引言 在现代 Web 开发中,开发一个功能强大的应用只是第一步。为了让用户能够访问你的应用,你需…...
RAP: Efficient Text-Video Retrieval with Sparse-and-Correlated Adapter
标题:RAP:基于稀疏相关适配器的高效文本视频检索 原文链接:RAP: Efficient Text-Video Retrieval with Sparse-and-Correlated Adapter - ACL Anthology 发表:ACL-2024(NLP领域CCF A类) 摘要 文本-视频检索(TVR࿰…...
C++ ++++++++++
初始C 注释 变量 常量 关键字 标识符命名规则 数据类型 C规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存 整型 sizeof关键字 浮点型(实型) 有效位数保留七位,带小数点。 这个是保…...
用Python之requests库调用大型语言模型(LLM)API的流式输出与非流式输出比较
文章目录 1. 非流式输出与流式输出概述2. 非流式输出2.1 代码实例12.2 代码实例2 3. 流式输出3.1 流式输出的定义和作用3.2 流式输出适用的场景3.3 流式输出的实现方式与实现技术3.4 代码实例33.5 代码实例4 4. 小结 1. 非流式输出与流式输出概述 大模型收到输入后并不是一次性…...
JavaEE基础之- 过滤器和监听器Filter and Listener
目录 1. 过滤器 Filter 1.1. 初识过滤器 1.1.1. 过滤器概念 1.1.2. 过滤器例子 1.2. 过滤器详解 1.2.1. 过滤器生命周期 1.2.2. FilterConfig 1.2.3. FilterChain 1.1.4. 过滤器执行顺序 1.2.5. 过滤器应用场景 1.2.6. 过滤器设置目标资源 1.2.7. 过滤器总结 1.3 过滤…...
JavaAdv01——字节流和字符流
一、核心概念解析 1. 字节流(Byte Streams) 字节流家族: 输入流:InputStream(抽象类) FileInputStream ByteArrayInputStream BufferedInputStream 输出流:OutputStream FileOutputStream…...
HarmonyOS 5.0应用开发——多线程Worker和@Sendable的使用方法
【高心星出品】 文章目录 多线程Worker和Sendable的使用方法开发步骤运行结果 多线程Worker和Sendable的使用方法 Worker在HarmonyOS中提供了一种多线程的实现方式,它允许开发者在后台线程中执行长耗时任务,从而避免阻塞主线程并提高应用的响应性。 S…...
AI赋能传热学研究:创新与乐趣的深度融合
在科技飞速发展的当下,人工智能(AI)已逐渐渗透到各个领域,为不同行业带来了前所未有的变革与机遇。对于传热学研究而言,AI的介入不仅极大地提高了研究效率,还为研究者带来了全新的体验和思考。本文将深入探…...
Hive-03之传参、常用函数、explode、lateral view、行专列、列转行、UDF
大数据分析利器之hive 一、目标 掌握hive中select查询语句中的基本语法掌握hive中select查询语句的分组掌握hive中select查询语句中的join掌握hive中select查询语句中的排序 二、要点 1、hive的参数传递 1、Hive命令行 语法结构 hive [-hiveconf xy]* [<-i filename&…...
如何将Vue项目部署至 nginx
一、准备工作 1.确保安装了开发软件VS Code(此处可查阅安装 VS Code教程),确保相关插件安装成功 2.安装Node.js和创建Vue项目(此处可查阅安装创建教程) 3.成功在VS Code运行一个Vue项目(此处可查阅运行教…...
SwiftUI之状态管理全解析
文章目录 引言一、`@State`1.1 基本概念1.2 初始化与默认值1.3 注意事项二、`@Binding`2.1 基本概念2.2 初始化与使用2.3 注意事项三、`@ObservedObject`3.1 基本概念3.2 初始化与使用3.3 注意事项四、`@EnvironmentObject`4.1 基本概念4.2 初始化与使用4.3 注意事项五、`@Stat…...
Java-servlet(一)Web应用与服务端技术概念知识讲解
Java-servlet(一)Web应用与服务端技术概念知识讲解 前言一、Web 应用1.WEB CS BS 对比2.WEB 介绍3.web 与 http 的关系 二、servlet服务端技术1. 公共网关接口(CGI)2. servlet 是什么3.servlet 作用4. servlet 特性 前言 在当今时…...
多个pdf合并成一个pdf的方法
将多个PDF文件合并优点: 能更容易地对其进行归档和备份.打印时可以选择双面打印,减少纸张的浪费。比如把住宿发票以及滴滴发票、行程单等生成一个pdf,双面打印或者无纸化办公情况下直接发送给财务进行存档。 方法: 利用PDF24 Tools网站 …...
数据集笔记:新加坡停车费
data.gov.sg 该数据集包含 新加坡各停车场的停车费,具体信息包括: 停车场名称(Carpark):如 Toa Payoh Lorong 8、Ang Mo Kio Hub、Bras Basah Complex 等。停车区域类别(Category):…...
易错点abc
在同一个输入流上重复创建Scanner实例可能会导致一些问题,包括但不限于输入流的混乱。尤其是在处理标准输入(System.in)时,重复创建Scanner对象通常不是最佳实践,因为这可能导致某些输入数据丢失或者顺序出错。 为什么…...
leetcode第39题组合总和
原题出于leetcode第39题https://leetcode.cn/problems/combination-sum/description/题目如下: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以…...
【iOS】小蓝书学习(七)
小蓝书学习(七) 前言第47条:熟悉系统框架第48条:多用枚举块,少用for循环第50条:构建缓存使选用NSCache而非NSDictionary第51条:精简initialize与load的实现代码第52条:别忘了NSTimer…...
基于第三方SDK的Windows平台全功能RTMP|RTSP直播播放器深度解析
一、引言 在当今数字化时代,直播技术的应用场景不断拓展,从娱乐直播到教育、医疗、工业等多个领域,都对直播播放器的功能和性能提出了更高的要求。本文将介绍一款基于第三方SDK实现的全功能直播播放器,从技术实现、功能特点、用户…...
命名实体识别与文本生成算法
在自然语言处理(NLP)的浩瀚星空中,命名实体识别(Named Entity Recognition, NER)与文本生成算法如同两颗璀璨的星辰,各自闪耀,又相互辉映,共同推动着人工智能技术在语言理解与生成领…...
题解 | 牛客周赛83 Java ABCDEF
目录 题目地址 做题情况 A 题 B 题 C 题 D 题 E 题 F 题 牛客竞赛主页 题目地址 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 做题情况 A 题 输出两个不是同一方位的字符中的任意一个就行 import java.io.*; import java.math.*; import java…...