深度学习----------------------文本预处理

news2024/9/20 18:30:56

目录

  • 文本预处理
    • 读取数据集
    • 词源化
    • 词表
      • 该部分总代码
      • 该部分总代码
    • 整合所有功能
      • 该部分总代码

文本预处理

文本预处理:把文本当作一个时序序列

将解析文本的常见预处理步骤。 这些步骤通常包括:

①将文本作为字符串加载到内存中。
②将字符串拆分为词元(如单词和字符)。
③建立一个词表,将拆分的词元映射到数字索引。
④将文本转换为数字索引序列,方便模型操作。

import collections
import re
from d2l import torch as d2l



读取数据集

将数据集读取到由多条文本行组成的列表中

import re
from d2l import torch as d2l

# @save
# 字典的值是一个元组,包含数据集的URL(d2l.DATA_URL + 'timemachine.txt')和数据的哈希值('090b5e7e70c295757f55df93cb0a180b9691891a')
# 用于验证下载数据的完整性。
d2l.DATA_HUB['time_machine'] = (d2l.DATA_URL + 'timemachine.txt',
                                '090b5e7e70c295757f55df93cb0a180b9691891a')


def read_time_machine():  # @save
    """将时间机器数据集加载到文本行的列表中"""
    with open(d2l.download('time_machine'), 'r') as f:
        # 打开文件取所有行到lines列表中。
        lines = f.readlines()
    # re.sub('[^A-Za-z]+', ' ', line)是将非字母字符替换为空格,这里是为了去掉标点符号
    # .strip()是去掉提取的字符串两端的空白
    # .lower()是将所有字母都设置为小写字母
    return [re.sub('[^A-Za-z]+', ' ', line).strip().lower() for line in lines]


lines = read_time_machine()
print(f'# 文本总行数: {len(lines)}')
# 看一下列表中的第1行内容和第11行内容
print(lines[0])
print(lines[10])

在这里插入图片描述




词源化

每个文本序列又被拆分成一个标记列表

文本行列表(lines)作为输入,列表中的每个元素是一个文本序列(如一条文本行)。每个文本序列又被拆分成一个词元列表,词元(token)是文本的基本单位。最后,返回一个由词元列表组成的列表,其中的每个词元都是一个字符串(string)。

import re
from d2l import torch as d2l

# @save
# 字典的值是一个元组,包含数据集的URL(d2l.DATA_URL + 'timemachine.txt')和数据的哈希值('090b5e7e70c295757f55df93cb0a180b9691891a')
# 用于验证下载数据的完整性。
d2l.DATA_HUB['time_machine'] = (d2l.DATA_URL + 'timemachine.txt',
                                '090b5e7e70c295757f55df93cb0a180b9691891a')


def read_time_machine():  # @save
    """将时间机器数据集加载到文本行的列表中"""
    with open(d2l.download('time_machine'), 'r') as f:
        # 打开文件取所有行,并将每行存储在列表 lines 中
        lines = f.readlines()
    # re.sub('[^A-Za-z]+', ' ', line)是将非字母字符替换为空格,这里是为了去掉标点符号
    # .strip()是去掉提取的字符串两端的空白
    # .lower()是将所有字母都设置为小写字母
    return [re.sub('[^A-Za-z]+', ' ', line).strip().lower() for line in lines]


def tokenize(lines, token='word'):  # @save
    """将文本行拆分为单词或字符词元"""
    if token == 'word':
        # 以空格为分隔符将每行字符串拆分为单词列表
        return [line.split() for line in lines]
    elif token == 'char':
        # 将每行字符串拆分为字符列表
        return [list(line) for line in lines]
    else:
        print('错误:未知词元类型:' + token)


lines = read_time_machine()
# 对 lines 进行分词处理,使用默认的 'word' 令牌类型
tokens = tokenize(lines)
# 打印前11行的分词结果
for i in range(11):
    # 空列表表示空行
    print(tokens[i])

在这里插入图片描述




词表

词元的类型是字符串,而模型需要的输入是数字,因此这种类型不方便模型使用。所以构建一个字典,通常也叫做词表(vocabulary),用来将字符串类型的词元映射到从0开始的数字索引中

我们先将训练集中的所有文档合并在一起,对它们的唯一词元进行统计,得到的统计结果称之为语料(corpus)。然后根据每个唯一词元的出现频率,为其分配一个数字索引。很少出现的词元通常被移除,这可以降低复杂性。 另外,语料库中不存在或已删除的任何词元都将映射到一个特定的未知词元。我们可以选择增加一个列表,用于保存那些被保留的词元。

例如:填充词元(“<pad>”); 序列开始词元(“<bos>”); 序列结束词元(“<eos>”)
class Vocab:  #@save
    """文本词表"""
    def __init__(self, tokens=None, min_freq=0, reserved_tokens=None):
        if tokens is None:
            tokens = []
        if reserved_tokens is None:
            reserved_tokens = []
        # 按出现频率排序
        counter = count_corpus(tokens)
        self._token_freqs = sorted(counter.items(), key=lambda x: x[1],
                                   reverse=True)
        # 未知词元的索引为0
        self.idx_to_token = ['<unk>'] + reserved_tokens
        self.token_to_idx = {token: idx
                             for idx, token in enumerate(self.idx_to_token)}
        for token, freq in self._token_freqs:
            # 出现频率< min_freq的token去掉,min_freq=0时表示包括所有token
            if freq < min_freq:
                break
            if token not in self.token_to_idx:
                self.idx_to_token.append(token)
                self.token_to_idx[token] = len(self.idx_to_token) - 1
 
    def __len__(self):
        return len(self.idx_to_token)
    # 返回给定tokens的indexs
    def __getitem__(self, tokens):
        if not isinstance(tokens, (list, tuple)):
            return self.token_to_idx.get(tokens, self.unk)
        return [self.__getitem__(token) for token in tokens]
	# 返回给定indexs对于的tokens
    def to_tokens(self, indices):
        if not isinstance(indices, (list, tuple)):
            return self.idx_to_token[indices]
        return [self.idx_to_token[index] for index in indices]
 
    @property
    def unk(self):  # 未知词元的索引为0
        return 0
 
    @property
    def token_freqs(self):
        return self._token_freqs
 
def count_corpus(tokens):  #@save
    """统计词元的频率"""
    # 这里的tokens是1D列表或2D列表
    if len(tokens) == 0 or isinstance(tokens[0], list):
        # 将词元列表展平成一个列表
        tokens = [token for line in tokens for token in line]
    # Counter 对象内部使用字典来存储元素及其对应的计数,元素作为键,计数作为值
    return collections.Counter(tokens)

首先使用时光机器数据集作为语料库来构建词表,然后打印前几个高频词元及其索引。

vocab = Vocab(tokens)
print(list(vocab.token_to_idx.items())[:10])



该部分总代码

import collections
import re
from d2l import torch as d2l


class Vocab:  # @save
    """文本词表"""
    # 接受三个参数:tokens(词元列表,默认为空列表)、min_freq(最小词频,默认为0)、reserved_tokens(保留词元列表,默认为空列表)。
    def __init__(self, tokens=None, min_freq=0, reserved_tokens=None):
        if tokens is None:
            tokens = []
        if reserved_tokens is None:
            reserved_tokens = []
        # 按出现频率排序
        # 统计tokens中每个词元的频率,并将结果存储在counter中。
        counter = count_corpus(tokens)
        # 对counter中的项按频率降序排序,并将排序后的列表存储在_token_freqs属性中。
        self._token_freqs = sorted(counter.items(), key=lambda x: x[1], reverse=True)
        # 未知词元的索引为0
        # 初始化一个列表,其中包含未知词元(<unk>)和保留词元(reserved_tokens),该列表用于将索引映射到词元。
        self.idx_to_token = ['<unk>'] + reserved_tokens
        # 创建一个字典,将idx_to_token列表中的词元映射到其索引。
        self.token_to_idx = {token: idx
                             for idx, token in enumerate(self.idx_to_token)}
        for token, freq in self._token_freqs:
            # 出现频率< min_freq的token去掉,min_freq=0时表示包括所有token
            if freq < min_freq:
                break
            if token not in self.token_to_idx:
                self.idx_to_token.append(token)
                self.token_to_idx[token] = len(self.idx_to_token) - 1

    def __len__(self):
        # 返回idx_to_token列表的长度,即词表的大小。
        return len(self.idx_to_token)

    # 返回给定tokens的indexs
    def __getitem__(self, tokens):
        # 检查tokens是否是列表或元组,如果不是,则假设它是一个单个词元。
        if not isinstance(tokens, (list, tuple)):
            # 如果tokens是单个词元,尝试从token_to_idx中获取其索引,如果未找到,则返回未知词元的索引(self.unk)。
            return self.token_to_idx.get(tokens, self.unk)
        return [self.__getitem__(token) for token in tokens]

    # 返回给定indexs对于的tokens
    def to_tokens(self, indices):
        # 将单个索引转换为单个词元。
        if not isinstance(indices, (list, tuple)):
            return self.idx_to_token[indices]
        # 将索引列表转换为对应的词元列表
        return [self.idx_to_token[index] for index in indices]

    @property
    def unk(self):  # 未知词元的索引为0
        return 0

    @property
    def token_freqs(self):
        # 返回按频率排序的词元频率列表。
        return self._token_freqs


# 统计给定词元列表中每个词元的频率。
def count_corpus(tokens):  # @save
    """统计词元的频率"""
    # 这里的tokens是1D列表或2D列表
    # 检查tokens是否为空或第一个元素是否为列表,以确定是否需要展平。
    if len(tokens) == 0 or isinstance(tokens[0], list):
        # 将词元列表展平成一个列表
        tokens = [token for line in tokens for token in line]
    # 统计展平后词元列表中每个词元的频率
    # Counter 对象内部使用字典来存储元素及其对应的计数,元素作为键,计数作为值
    return collections.Counter(tokens)


def read_time_machine():  # @save
    """将时间机器数据集加载到文本行的列表中"""
    with open(d2l.download('time_machine'), 'r') as f:
        # 打开文件取所有行,并将每行存储在列表 lines 中
        lines = f.readlines()
    # re.sub('[^A-Za-z]+', ' ', line)是将非字母字符替换为空格,这里是为了去掉标点符号
    # .strip()是去掉提取的字符串两端的空白
    # .lower()是将所有字母都设置为小写字母
    return [re.sub('[^A-Za-z]+', ' ', line).strip().lower() for line in lines]


def tokenize(lines, token='word'):  # @save
    """将文本行拆分为单词或字符词元"""
    if token == 'word':
        # 以空格为分隔符将每行字符串拆分为单词列表
        return [line.split() for line in lines]
    elif token == 'char':
        # 将每行字符串拆分为字符列表
        return [list(line) for line in lines]
    else:
        print('错误:未知词元类型:' + token)


# @save
# 字典的值是一个元组,包含数据集的URL(d2l.DATA_URL + 'timemachine.txt')和数据的哈希值('090b5e7e70c295757f55df93cb0a180b9691891a')
# 用于验证下载数据的完整性。
d2l.DATA_HUB['time_machine'] = (d2l.DATA_URL + 'timemachine.txt',
                                '090b5e7e70c295757f55df93cb0a180b9691891a')
lines = read_time_machine()
# 对 lines 进行分词处理,使用默认的 'word' 令牌类型
tokens = tokenize(lines)
vocab = Vocab(tokens)
# vocab.token_to_idx是字典属性,键是词汇(tokens),值是它们对应的索引(indices)
# 将items()返回的视图对象转换成一个列表(list)
print(list(vocab.token_to_idx.items())[:10])

在这里插入图片描述


将每一条文本行转换成一个数字索引列表

for i in [0, 10]:
    print('文本:', tokens[i])
    print('索引:', vocab[tokens[i]])

该部分总代码

import collections
import re
from d2l import torch as d2l


class Vocab:  # @save
    """文本词表"""
    # 接受三个参数:tokens(词元列表,默认为空列表)、min_freq(最小词频,默认为0)、reserved_tokens(保留词元列表,默认为空列表)。
    def __init__(self, tokens=None, min_freq=0, reserved_tokens=None):
        if tokens is None:
            tokens = []
        if reserved_tokens is None:
            reserved_tokens = []
        # 按出现频率排序
        # 统计tokens中每个词元的频率,并将结果存储在counter中。
        counter = count_corpus(tokens)
        # 对counter中的项按频率降序排序,并将排序后的列表存储在_token_freqs属性中。
        self._token_freqs = sorted(counter.items(), key=lambda x: x[1], reverse=True)
        # 未知词元的索引为0
        # 初始化一个列表,其中包含未知词元(<unk>)和保留词元(reserved_tokens),该列表用于将索引映射到词元。
        self.idx_to_token = ['<unk>'] + reserved_tokens
        # 创建一个字典,将idx_to_token列表中的词元映射到其索引。
        self.token_to_idx = {token: idx
                             for idx, token in enumerate(self.idx_to_token)}
        for token, freq in self._token_freqs:
            # 出现频率< min_freq的token去掉,min_freq=0时表示包括所有token
            if freq < min_freq:
                break
            if token not in self.token_to_idx:
                self.idx_to_token.append(token)
                self.token_to_idx[token] = len(self.idx_to_token) - 1

    def __len__(self):
        # 返回idx_to_token列表的长度,即词表的大小。
        return len(self.idx_to_token)

    # 返回给定tokens的indexs
    def __getitem__(self, tokens):
        # 检查tokens是否是列表或元组,如果不是,则假设它是一个单个词元。
        if not isinstance(tokens, (list, tuple)):
            # 如果tokens是单个词元,尝试从token_to_idx中获取其索引,如果未找到,则返回未知词元的索引(self.unk)。
            return self.token_to_idx.get(tokens, self.unk)
        return [self.__getitem__(token) for token in tokens]

    # 返回给定indexs对于的tokens
    def to_tokens(self, indices):
        # 将单个索引转换为单个词元。
        if not isinstance(indices, (list, tuple)):
            return self.idx_to_token[indices]
        # 将索引列表转换为对应的词元列表
        return [self.idx_to_token[index] for index in indices]

    @property
    def unk(self):  # 未知词元的索引为0
        return 0

    @property
    def token_freqs(self):
        # 返回按频率排序的词元频率列表。
        return self._token_freqs


# 统计给定词元列表中每个词元的频率。
def count_corpus(tokens):  # @save
    """统计词元的频率"""
    # 这里的tokens是1D列表或2D列表
    # 检查tokens是否为空或第一个元素是否为列表,以确定是否需要展平。
    if len(tokens) == 0 or isinstance(tokens[0], list):
        # 将词元列表展平成一个列表
        tokens = [token for line in tokens for token in line]
    # 统计展平后词元列表中每个词元的频率
    # Counter 对象内部使用字典来存储元素及其对应的计数,元素作为键,计数作为值
    return collections.Counter(tokens)


def read_time_machine():  # @save
    """将时间机器数据集加载到文本行的列表中"""
    with open(d2l.download('time_machine'), 'r') as f:
        # 打开文件取所有行,并将每行存储在列表 lines 中
        lines = f.readlines()
    # re.sub('[^A-Za-z]+', ' ', line)是将非字母字符替换为空格,这里是为了去掉标点符号
    # .strip()是去掉提取的字符串两端的空白
    # .lower()是将所有字母都设置为小写字母
    return [re.sub('[^A-Za-z]+', ' ', line).strip().lower() for line in lines]


def tokenize(lines, token='word'):  # @save
    """将文本行拆分为单词或字符词元"""
    if token == 'word':
        # 以空格为分隔符将每行字符串拆分为单词列表
        return [line.split() for line in lines]
    elif token == 'char':
        # 将每行字符串拆分为字符列表
        return [list(line) for line in lines]
    else:
        print('错误:未知词元类型:' + token)


# @save
# 字典的值是一个元组,包含数据集的URL(d2l.DATA_URL + 'timemachine.txt')和数据的哈希值('090b5e7e70c295757f55df93cb0a180b9691891a')
# 用于验证下载数据的完整性。
d2l.DATA_HUB['time_machine'] = (d2l.DATA_URL + 'timemachine.txt',
                                '090b5e7e70c295757f55df93cb0a180b9691891a')
lines = read_time_machine()
# 对 lines 进行分词处理,使用默认的 'word' 令牌类型
tokens = tokenize(lines)
vocab = Vocab(tokens)
for i in [0, 10]:
    print('文本:', tokens[i])
    print('索引:', vocab[tokens[i]])

在这里插入图片描述



整合所有功能

将所有功能打包到load_corpus_time_machine函数中,该函数返回corpus词元索引列表)和vocab时光机器语料库的词表)。 我们在这里所做的改变是:

为了简化后面章节中的训练,我们使用字符(而不是单词)实现文本词元化

时光机器数据集中的每个文本行不一定是一个句子或一个段落,还可能是一个单词,因此返回的corpus仅处理为单个列表,而不是使用多词元列表构成的一个列表。

def load_corpus_time_machine(max_tokens=-1):  #@save
    """返回时光机器数据集的词元索引列表和词表"""
    lines = read_time_machine()
    tokens = tokenize(lines, 'char')
    vocab = Vocab(tokens)
    # 因为时光机器数据集中的每个文本行不一定是一个句子或一个段落,
    # 所以将所有文本行展平到一个列表中
    corpus = [vocab[token] for line in tokens for token in line]
    # max_tokens>0意为限制返回的词元数量,为-1即为返回所有词元
    if max_tokens > 0: 
        corpus = corpus[:max_tokens]
    return corpus, vocab
 
corpus, vocab = load_corpus_time_machine()
len(corpus), len(vocab)

该部分总代码

import collections
import re
from d2l import torch as d2l


class Vocab:  # @save
    """文本词表"""

    # 接受三个参数:tokens(词元列表,默认为空列表)、min_freq(最小词频,默认为0)、reserved_tokens(保留词元列表,默认为空列表)。
    def __init__(self, tokens=None, min_freq=0, reserved_tokens=None):
        if tokens is None:
            tokens = []
        if reserved_tokens is None:
            reserved_tokens = []
        # 按出现频率排序
        # 统计tokens中每个词元的频率,并将结果存储在counter中。
        counter = count_corpus(tokens)
        # 对counter中的项按频率降序排序,并将排序后的列表存储在_token_freqs属性中。
        self._token_freqs = sorted(counter.items(), key=lambda x: x[1], reverse=True)
        # 未知词元的索引为0
        # 初始化一个列表,其中包含未知词元(<unk>)和保留词元(reserved_tokens),该列表用于将索引映射到词元。
        self.idx_to_token = ['<unk>'] + reserved_tokens
        # 创建一个字典,将idx_to_token列表中的词元映射到其索引。
        self.token_to_idx = {token: idx
                             for idx, token in enumerate(self.idx_to_token)}
        for token, freq in self._token_freqs:
            # 出现频率< min_freq的token去掉,min_freq=0时表示包括所有token
            if freq < min_freq:
                break
            if token not in self.token_to_idx:
                self.idx_to_token.append(token)
                self.token_to_idx[token] = len(self.idx_to_token) - 1

    def __len__(self):
        # 返回idx_to_token列表的长度,即词表的大小。
        return len(self.idx_to_token)

    # 返回给定tokens的indexs
    def __getitem__(self, tokens):
        # 检查tokens是否是列表或元组,如果不是,则假设它是一个单个词元。
        if not isinstance(tokens, (list, tuple)):
            # 如果tokens是单个词元,尝试从token_to_idx中获取其索引,如果未找到,则返回未知词元的索引(self.unk)。
            return self.token_to_idx.get(tokens, self.unk)
        return [self.__getitem__(token) for token in tokens]

    # 返回给定indexs对于的tokens
    def to_tokens(self, indices):
        # 将单个索引转换为单个词元。
        if not isinstance(indices, (list, tuple)):
            return self.idx_to_token[indices]
        # 将索引列表转换为对应的词元列表
        return [self.idx_to_token[index] for index in indices]

    @property
    def unk(self):  # 未知词元的索引为0
        return 0

    @property
    def token_freqs(self):
        # 返回按频率排序的词元频率列表。
        return self._token_freqs


# 统计给定词元列表中每个词元的频率。
def count_corpus(tokens):  # @save
    """统计词元的频率"""
    # 这里的tokens是1D列表或2D列表
    # 检查tokens是否为空或第一个元素是否为列表,以确定是否需要展平。
    if len(tokens) == 0 or isinstance(tokens[0], list):
        # 将词元列表展平成一个列表
        tokens = [token for line in tokens for token in line]
    # 统计展平后词元列表中每个词元的频率
    # Counter 对象内部使用字典来存储元素及其对应的计数,元素作为键,计数作为值
    return collections.Counter(tokens)


def read_time_machine():  # @save
    """将时间机器数据集加载到文本行的列表中"""
    with open(d2l.download('time_machine'), 'r') as f:
        # 打开文件取所有行,并将每行存储在列表 lines 中
        lines = f.readlines()
    # re.sub('[^A-Za-z]+', ' ', line)是将非字母字符替换为空格,这里是为了去掉标点符号
    # .strip()是去掉提取的字符串两端的空白
    # .lower()是将所有字母都设置为小写字母
    return [re.sub('[^A-Za-z]+', ' ', line).strip().lower() for line in lines]


def tokenize(lines, token='word'):  # @save
    """将文本行拆分为单词或字符词元"""
    if token == 'word':
        # 以空格为分隔符将每行字符串拆分为单词列表
        return [line.split() for line in lines]
    elif token == 'char':
        # 将每行字符串拆分为字符列表
        return [list(line) for line in lines]
    else:
        print('错误:未知词元类型:' + token)


def load_corpus_time_machine(max_tokens=-1):  # @save
    """返回时光机器数据集的词元索引列表和词表"""
    lines = read_time_machine()
    tokens = tokenize(lines, 'char')
    vocab = Vocab(tokens)
    # 因为时光机器数据集中的每个文本行不一定是一个句子或一个段落,
    # 所以将所有文本行展平到一个列表中
    corpus = [vocab[token] for line in tokens for token in line]
    # max_tokens>0意为限制返回的词元数量,为-1即为返回所有词元
    if max_tokens > 0:
        corpus = corpus[:max_tokens]
    return corpus, vocab


corpus, vocab = load_corpus_time_machine()
print(len(corpus))
print(len(vocab))

在这里插入图片描述

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

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

相关文章

Redis的存储原理和数据模型

一、Redis是单线程还是多线程呢&#xff1f; 我们通过跑redis的代码&#xff0c;查看运行的程序可以得知&#xff0c;Redis本身其实是个多线程&#xff0c;其中包括redis-server&#xff0c;bio_close_file&#xff0c;bio_aof_fsync&#xff0c;bio_lazy_free&#xff0c;io_t…

Python如何导入自定义包?

在 Python 中&#xff0c;导入包是日常开发的基础操作之一。Python 通过其模块化设计&#xff0c;使得代码可以组织成模块和包&#xff0c;提升了代码的复用性和可维护性。而当开始构建复杂的Python项目时&#xff0c;通常会发现将代码组织在各种模块和包中是非常有帮助的。自定…

【C++】list常见用法

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;C从小白到高手 &#x1f339;往期回顾&#x1f339;&#xff1a;[C]vector常见用法 &#x1f516; 流水不争&#xff0c;争的是滔滔不息。 文章目录 一、list的介绍li…

JVM 调优篇6 可视化性能监控工具-JVisual VM

一 Visual VM 1.1 概述 Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具。 它集成了多个JDK命令行工具&#xff0c;使用Visual VM可用于显示虚拟机进程及进程的配置和环境信息(jps,jinfo)&#xff0c;监视应用程序的CPU、GC、堆、方法区及线程的信息(jstat…

Celery的使用

Celery 一、Celery概述1. 特点:2. celery组成3. 安装与使用4. 邮箱配置二、Celery的使用实操——发送邮件1. 安装2. 配置一、Celery概述 1. 特点: 2. celery组成 配置任务队列Broker,采用redis保存要执行的任务队列 Client:任务的发出者 Worker:任务的处理者 3. 安装与使用…

从0-1 用AI做一个赚钱的小红书账号(不是广告不是广告)

大家好&#xff0c;我是胡广&#xff01;是不是被标题吸引过来的呢&#xff1f;是不是觉得自己天赋异禀&#xff0c;肯定是那万中无一的赚钱天才。哈哈哈&#xff0c;我告诉你&#xff0c;你我皆是牛马&#xff0c;不要老想着突然就成功了&#xff0c;一夜暴富了&#xff0c;瞬…

信奥初赛解析:1.2-计算机系统的基本结构

目录 知识要点 一、概述 二、计算机硬件系统 &#xff08;一&#xff09;处理器 &#xff08;二&#xff09;存储器 (1)内存储器 (2)外存储器 ①固态硬盘存储器 ②机械硬盘存储器 ③闪存 (三)输入设备 (四)输出设备 (五)总线结构 (六)主要的性能指标 1.字长 2.运…

计算机毕业设计 网上书店系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

JVM OutOfMemoryError 与 StackOverflowError 异常

目录 前言 堆溢出 虚拟机栈和本地方法栈溢出 方法区溢出 前言 JVM规范中规定, 除了程序计数器之外, 其他的运行时数据区域, 例如堆栈, 方法区, 都会出现OutOfMemoryError异常. 那么到底是怎么样的代码, 才会引起堆溢出, 栈溢出, 或者是方法区的溢出呢? 如果遇到了又该如何…

书生大模型全链路开源体系,学习

优点 书生浦语开源大模型&#xff0c;是一个开源的大模型&#xff0c;大家可以一起学习 还有配套的教学视频&#xff0c;很快就能上手&#xff0c;而且还奖励算力&#xff0c;可以直接训练&#xff0c;讨论学习&#xff0c;非常nice。 教学视频 书生浦语大模型全链路开源开…

FastAPI与环境变量:实现无缝切换与高效运维

在现代软件开发中&#xff0c;尤其是构建RESTful API时&#xff0c;环境变量的管理显得尤为重要。它们不仅允许我们在不同环境中&#xff08;如开发、测试、生产&#xff09;灵活地调整应用的行为&#xff0c;还极大地增强了应用的安全性和可维护性。FastAPI作为一个新兴的、高…

ROS组合导航笔记1:融合传感器数据

使用机器人定位包&#xff08;robot_localization package&#xff09;来合并来自不同传感器的数据&#xff0c;以改进机器人定位时的姿态估计。 基本概念 在现实生活中操作机器人时&#xff0c;有时我们需要处理不够准确的传感器数据。如果我们想要实现机器人的高精度定位&am…

苍穹外卖 修改nginx的端口后websocket连接失败解决

苍穹外卖 修改nginx的端口后websocket连接失败解决 问题&#xff1a; 后端配置好websocket后前端仍显示如图所示的错误 解决&#xff1a; 先用websocket在线工具测试后端是否能正常连接&#xff08;这个基本上不会出现问题&#xff09;用f12观察前端发送的请求 正常来说这个请…

chatgpt个人版ssrf漏洞

文章目录 免责申明搜索语法漏洞描述漏洞复现修复建议 免责申明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 搜索语法 fofa title"ChatGPT个人专用版"漏洞描述 该系统是一个开源的…

【两方演化博弈代码复现】:双方演化博弈的原理、概率博弈仿真、相位图、单个参数灵敏度演化

目录-基于MatLab2016b实现 一、演化博弈的原理1. 基本概念2. 参与者的策略3.演化过程 二、MATLAB 代码解读&#xff08;博弈参与主体&#xff08;双方&#xff09;策略选择的动态演化讨程&#xff09;三、MATLAB 代码解读&#xff08;博弈主体随着时间策略选择的动态演化讨程&a…

若依nday复现

前言 声明&#xff1a;此文章仅做学习&#xff0c;未经授权严禁转载。请勿利用文章内的相关技术从事非法测试&#xff0c;如因此产生的一切不良后果与文章作者无关 本文章只做简单汇总&#xff0c;在此感谢其他师傅的文章和分享 前置准备 环境搭建 下载&#xff1a;https:/…

访谈心脑血管名医黄力医生:医术精湛,心系患者

黄力医生&#xff0c;一位在心脑血管领域深耕多年的杰出医者&#xff0c;其医学之路同样始于对国内顶尖医学院校的刻苦钻研。在那里&#xff0c;她不仅打下了坚实的医学理论基础&#xff0c;更培养了对医学事业的无限热爱与崇高追求。毕业后&#xff0c;黄力医生毅然选择了心脑…

django-prometheus使用及源码分析

简介 在django服务运行过程中&#xff0c;希望可以对其获取promethues指标进行监控&#xff0c;这样可以实时知道其运行状态&#xff0c;当它运行异常时可以及时进行告警&#xff0c;并且帮助我们可以对其针对性进行优化。比如请求量过大是否要进行限流或者扩容&#xff0c;再…

【黄力医生】血栓隐患大排查:七类人群如何自我监测静脉血栓风险

血栓&#xff0c;这一看似无声无息的健康杀手&#xff0c;实则潜藏着巨大的风险。静脉血栓作为血栓的一种常见类型&#xff0c;其形成与多种因素密切相关&#xff0c;并可能引发严重的并发症&#xff0c;如肺栓塞等。黄力医生指出&#xff0c;有七类人群特别需要关注自身静脉血…

2024/9/16 dataloader、tensorboard、transform

一、pytorch两大法宝元素 假设有一个名为pytorch的包 dir()&#xff1a;用于打开包&#xff0c;看里面的内容 help():用于查看具体的内容的用处 二、python文件&#xff0c;python控制台和jupyter的使用对比 三、pytorch读取数据 pytorch读取数据主要涉及到两个类&#xff1…