一文读懂循环神经网络(RNN)—语言模型+n元语法(1)

目录

什么是语言模型?

语言模型的核心目的

        一.量化文本的合理性

        二.支持下游 NLP 任务

   三. 语义和上下文依赖

一元语法、二元语法和三元语法详解

核心概念:n-gram 模型

1. 一元语法(Unigram)

2. 二元语法(Bigram)

3. 三元语法(Trigram)

n-gram 模型的共性问题与扩展

总结

停用词

1.停用词的特点

2.常见的停用词类型(以中英文为例)

3.为什么要去除停用词?

马尔可夫模型与n元语法

完整代码

实验结果

词频图

一元/二元/三元语法的词频分布对比


什么是语言模型?

语言模型(Language Model, LM)是自然语言处理(NLP)中的核心技术,它的本质是对语言规律的数学建模—— 通过学习文本数据中的模式,预测 “一段文本序列出现的概率”,或在给定前文的情况下预测 “下一个词 / 字符出现的概率”。

简单来说,语言模型的核心能力是判断 “一句话是否通顺”,以及预测 “接下来会说什么”。例如:

  • 对于句子 “我想喝____”,语言模型能预测 “水”“咖啡”“茶” 等词的概率(其中 “水” 的概率通常最高);
  • 对于句子 “天空是____色的”,模型会给 “蓝” 赋予远高于 “绿”“紫” 的概率。

语言模型的核心目的

语言模型的核心目的是捕捉语言的统计规律和语义逻辑,从而实现对自然语言的理解与生成。具体可拆解为以下几个目标:

        一.量化文本的合理性

   通过计算文本序列的概率,判断其是否符合人类语言习惯。例如,“猫在追老鼠” 的概率远高于 “老鼠在追猫”(在无特殊语境下),语言模型能通过概率差异体现这种合理性。

        二.支持下游 NLP 任务

作为基础组件,语言模型为其他任务提供 “语言知识”:

  • 机器翻译:预测 “目标语言句子” 与 “源语言句子” 的匹配概率;
  • 文本生成:按概率生成通顺的句子(如写诗、写代码、聊天机器人回复);
  • 语音识别:从语音转写的多个候选文本中,选择概率最高的合理结果;

拼写纠错:对输入的错误文本,预测最可能的正确形式(如 “我去公圆”→“我去公园”)。

   三. 语义和上下文依赖
  • “苹果很好吃” 中的 “苹果” 指水果;
  • “苹果发布了新手机” 中的 “苹果” 指公司。
    语言模型通过上下文建模,能区分这两种含义。
  1. 高级语言模型(如 Transformer、BERT、GPT 系列)能捕捉词与词之间的上下文关系,理解歧义、多义词在不同语境下的含义。例如:

  2. 实现无监督 / 半监督学习
    语言模型可以仅通过海量文本(无需人工标注)学习语言规律,降低对标注数据的依赖。例如,GPT 系列通过 “预测下一个词” 的无监督任务,就能在对话、写作等任务中表现出强大能力。

一元语法、二元语法和三元语法详解

一元语法(Unigram)、二元语法(Bigram)和三元语法(Trigram)是基于n-gram 模型的基础概念,用于描述文本中词元(token)之间的序列关系。它们通过假设 “一个词的出现仅与前 n-1 个词相关”,简化了语言的概率建模过程,是早期语言模型的核心技术。

核心概念:n-gram 模型

n-gram 模型的核心思想是:将文本序列拆分为连续的 n 个词元组成的片段(n-gram),并通过统计这些片段的出现频率来计算句子的概率。 例如,对于句子 “我喜欢自然语言处理”,其 n-gram 片段为:

  • 一元语法(1-gram):["我", "喜欢", "自然", "语言", "处理"]
  • 二元语法(2-gram):["我 喜欢", "喜欢 自然", "自然 语言", "语言 处理"]
  • 三元语法(3-gram):["我 喜欢 自然", "喜欢 自然 语言", "自然 语言 处理"]

1. 一元语法(Unigram)

  • 定义:仅考虑单个词元的概率,忽略词与词之间的依赖关系,假设每个词的出现是独立的。

  • 概率计算: 对于句子S = [w_1, w_2, ..., w_n],其概率为所有词元概率的乘积:

                P(S) = P(w_1) \times P(w_2) \times ... \times P(w_n)

        其中,P(w_i) 是词w_i在语料库中出现的频率(即\text{count}(w_i) / 总词数)。

  • 示例: 句子 “猫吃鱼” 的概率 = P(猫) \times P(吃) \timesP(鱼)。

  • 优缺点

    • 优点:计算简单,数据需求量小,泛化能力强(很少出现未见过的词)。
    • 缺点:完全忽略上下文关系,合理性差(例如 “猫吃鱼” 和 “鱼吃猫” 的概率相同)。

2. 二元语法(Bigram)

  • 定义:假设一个词的出现仅依赖于前一个词,即考虑两个连续词元的概率。

  • 概率计算: 句子 S 的概率通过条件概率链表示: 

        P(S) = P(w_1) \times P(w_2|w_1) \times P(w_3|w_2) \times ... \times P(w_n|w_{n-1})

        其中,条件概率P(w_i|w_{i-1}) 近似为两个词同时出现的频率(即\text{count}(w_{i-1}, w_i) / \text{count}(w_{i-1}))。

  • 示例: 句子 “猫吃鱼” 的概率 = P(猫) \times P(吃|猫) \times P(鱼|吃)。

  • 优缺点

    • 优点:考虑了相邻词的依赖关系,比一元语法更合理(例如 “猫吃鱼” 的概率远高于 “鱼吃猫”)。
    • 缺点:仅依赖前一个词,长距离上下文(如 “猫喜欢吃鱼” 中 “喜欢” 对 “鱼” 的影响)被忽略;可能出现未见过的二元组合(如罕见短语)。

3. 三元语法(Trigram)

  • 定义:假设一个词的出现依赖于前两个词,即考虑三个连续词元的概率。

  • 概率计算: 句子 S 的概率为:

        P(S) = P(w_1) \times P(w_2|w_1) \times P(w_3|w_1, w_2) \times ... \times P(w_n|w_{n-2}, w_{n-1})

        其中,P(w_i|w_{i-2}, w_{i-1}) \approx \text{count}(w_{i-2}, w_{i-1}, w_i) / \text{count}(w_{i-2}, w_{i-1})

  • 示例: 句子 “猫喜欢吃鱼” 的概率 = P(猫) \times P(喜欢|猫) \times P(吃|猫, 喜欢) \timesP(鱼|喜欢, 吃)。

  • 优缺点

    • 优点:比二元语法更贴近实际语言规律,能捕捉更丰富的局部上下文(例如 “喜欢吃” 后面更可能接 “鱼” 而非 “石头”)。
    • 缺点:
      • 对数据量需求大,容易出现 “数据稀疏” 问题(很多三元组合在语料库中从未出现,导致概率为 0)。
      • 计算复杂度高于一元 / 二元语法,存储成本更高(需要记录大量三元组合)。

n-gram 模型的共性问题与扩展

  1. 数据稀疏性: n 越大,需要的训练数据越多,否则会出现大量未见过的 n-gram(称为 “未登录词问题”)。例如,三元语法比二元语法更容易遇到 “count=0” 的情况。

    • 解决方法:通过 “平滑技术”(如拉普拉斯平滑)给未见过的 n-gram 赋予一个极小的概率。
  2. n 的选择

    • n 越小:计算越高效,泛化能力越强,但忽略的上下文越多。
    • n 越大:捕捉的上下文越丰富,但数据需求和计算成本越高,且容易过拟合(依赖罕见组合)。 实际应用中,n 通常取 2(Bigram)或 3(Trigram),极少超过 5。

总结

模型核心假设优点缺点
一元语法词独立出现简单、泛化强忽略上下文,合理性差
二元语法依赖前一个词捕捉相邻依赖,较合理忽略长距离上下文
三元语法依赖前两个词捕捉局部上下文,更合理数据稀疏,计算成本高

停用词

停用词(Stop Words) 指的是在文本中频繁出现,但通常对文本的核心语义贡献较小的词语。这些词语由于使用过于普遍,往往被认为在文本分析、情感识别、主题提取等任务中 “信息量较低”,因此会被提前过滤掉,以简化处理流程并提升模型效率。

1.停用词的特点

  1. 高频性:在语言中出现频率极高,比如英语中的 “the”“and”“is”,中文中的 “的”“是”“在” 等。
  2. 语义弱化:本身没有明确的实义,多为辅助性词汇(如介词、连词、助词、代词等),单独出现时难以表达具体含义。
  3. 通用性:在不同主题、不同领域的文本中均大量存在,不具备区分文本特征的能力。

2.常见的停用词类型(以中英文为例)

语言停用词类型示例
英语冠词、介词、连词、代词等the, a, an, in, on, and, or, he, she
中文助词、连词、介词、代词等的、地、得、在、和、与、他、她、它

3.为什么要去除停用词?

  1. 减少数据量:停用词通常占文本总词数的 30%-50%,过滤后可大幅降低数据规模,提升模型训练和推理速度。
  2. 聚焦核心信息:过滤掉冗余词汇后,剩余词语更能反映文本的核心主题(如 “机器学习”“自然语言处理” 等实义词),帮助模型更精准地捕捉语义。
  3. 降低噪声干扰:高频且无实义的停用词可能会干扰模型对关键特征的学习(例如,在文本分类任务中,“的” 出现次数再多也无法区分 “科技” 和 “体育” 主题)。

马尔可夫模型与n元语法

完整代码

"""
文件名: 8.3 语言模型和数据集
作者: 墨尘
日期: 2025/7/14
项目名: dl_env
备注: 实现语言模型的基础数据处理流程,包括文本读取、词元化、词表构建,并分析一元/二元/三元语法的频率分布
"""
import random
import torch
import collections  # 用于统计词频
import re  # 用于文本清洗
from d2l import torch as d2l  # 提供数据下载、绘图等工具
# 手动显示图像相关库
import matplotlib.pyplot as plt  # 绘图库
import matplotlib.text as text  # 用于修改文本绘制(解决符号显示问题)# -------------------------- 核心解决方案:解决文本显示问题 --------------------------
def replace_minus(s):"""解决Matplotlib中Unicode减号(U+2212)显示异常的问题参数:s: 待处理的字符串或其他类型对象返回:处理后的字符串(替换减号)或原始对象(非字符串类型)"""if isinstance(s, str):  # 仅处理字符串return s.replace('\u2212', '-')  # 替换特殊减号为普通减号return s  # 非字符串直接返回# 重写matplotlib的Text类的set_text方法,全局修复减号显示
original_set_text = text.Text.set_text  # 保存原始方法
def new_set_text(self, s):s = replace_minus(s)  # 处理减号return original_set_text(self, s)  # 调用原始方法设置文本
text.Text.set_text = new_set_text  # 应用重写后的方法# -------------------------- 字体配置(确保中文和数学符号正常显示)--------------------------
plt.rcParams["font.family"] = ["SimHei"]  # 设置中文字体(支持中文显示)
plt.rcParams["text.usetex"] = True  # 使用LaTeX渲染文本(提升数学符号美观度)
plt.rcParams["axes.unicode_minus"] = True  # 确保负号正确显示(避免方块)
plt.rcParams["mathtext.fontset"] = "cm"  # 数学符号使用Computer Modern字体
d2l.plt.rcParams.update(plt.rcParams)  # 让d2l库的绘图工具继承配置# -------------------------- 关键修复:提前注册数据集信息 --------------------------
# 注册《时间机器》数据集到d2l的DATA_HUB(必须在read_time_machine函数前)
d2l.DATA_HUB['time_machine'] = (d2l.DATA_URL + 'timemachine.txt',  # 数据集下载地址'090b5e7e70c295757f55df93cb0a180b9691891a'  # 哈希校验值(确保文件完整)
)# -------------------------- 1. 读取数据集 --------------------------
def read_time_machine():  # @save"""读取《时间机器》文本数据集并清洗步骤:1. 下载并打开文本文件2. 清洗文本:保留字母,其他字符替换为空格,转小写,去首尾空格返回:清洗后的文本行列表(非空行)"""with open(d2l.download('time_machine'), 'r') as f:  # 下载并读取文件lines = f.readlines()  # 按行读取# 正则清洗:只保留A-Za-z,其他替换为空格,再转小写并去首尾空格return [re.sub('[^A-Za-z]+', ' ', line).strip().lower() for line in lines]# -------------------------- 2. 词元化(Tokenization) --------------------------
def tokenize(lines, token='word'):  # @save"""将文本行分割为词元(单词或字符)参数:lines: 清洗后的文本行列表(如["the time machine", ...])token: 词元类型,'word'按单词分割,'char'按字符分割返回:词元列表的列表(每行对应一个词元列表)"""if token == 'word':return [line.split() for line in lines]  # 按空格分割为单词elif token == 'char':return [list(line) for line in lines]  # 按字符分割else:print('错误:未知词元类型:' + token)# -------------------------- 3. 词表(Vocabulary) --------------------------
class Vocab:  #@save"""文本词表:映射词元到整数索引,支持词元与索引的双向转换属性:idx_to_token: 索引→词元的列表(如[<unk>, 'a', 'b', ...])token_to_idx: 词元→索引的字典(如{'<unk>':0, 'a':1, ...})_token_freqs: 词元频率列表(按频率降序)"""def __init__(self, tokens=None, min_freq=0, reserved_tokens=None):"""初始化词表参数:tokens: 词元列表(可嵌套,如[["a","b"], ["c"]])min_freq: 最小词频阈值,低于此值的词元不加入词表reserved_tokens: 预留特殊词元(如['<pad>', '<bos>'])"""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)# 初始化词表:未知词元<unk>固定在索引0self.idx_to_token = ['<unk>'] + reserved_tokensself.token_to_idx = {token: idx for idx, token in enumerate(self.idx_to_token)}# 加入高频词元(过滤低频词)for token, freq in self._token_freqs: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  # 新索引为当前长度-1def __len__(self):"""返回词表大小(词元总数)"""return len(self.idx_to_token)def __getitem__(self, tokens):"""词元→索引转换(支持单个词元或列表)参数:tokens: 单个词元(如"a")或词元列表(如["a","b"])返回:对应的索引(或列表),未知词元返回<unk>的索引(0)"""if not isinstance(tokens, (list, tuple)):return self.token_to_idx.get(tokens, self.unk)  # 单个词元return [self.__getitem__(token) for token in tokens]  # 词元列表def to_tokens(self, indices):"""索引→词元转换(支持单个索引或列表)参数:indices: 单个索引(如1)或索引列表(如[1,2])返回:对应的词元(或列表)"""if not isinstance(indices, (list, tuple)):return self.idx_to_token[indices]  # 单个索引return [self.idx_to_token[index] for index in indices]  # 索引列表@propertydef unk(self):"""未知词元的索引(固定为0)"""return 0@propertydef token_freqs(self):"""返回词元频率列表"""return self._token_freqsdef count_corpus(tokens):  #@save"""统计词元频率(展平嵌套列表)参数:tokens: 1D或2D词元列表(如["a","b"]或[["a","b"], ["c"]])返回:collections.Counter: 词元频率计数器"""if len(tokens) == 0 or isinstance(tokens[0], list):tokens = [token for line in tokens for token in line]  # 展平2D列表为1Dreturn collections.Counter(tokens)  # 计数每个词元的出现次数# -------------------------- 4. 整合预处理流程 --------------------------
def load_corpus_time_machine(max_tokens=-1):  #@save"""加载《时间机器》数据集,返回字符级语料库和词表参数:max_tokens: 最大词元数,-1表示使用全部返回:corpus: 词元索引序列(1D列表)vocab: 字符级词表"""lines = read_time_machine()  # 读取清洗后的文本tokens = tokenize(lines, 'char')  # 按字符分割词元vocab = Vocab(tokens)  # 构建字符级词表# 展平所有词元为索引序列corpus = [vocab[token] for line in tokens for token in line]if max_tokens > 0:corpus = corpus[:max_tokens]  # 截断到最大长度return corpus, vocab# -------------------------- 5. 测试代码:分析n-gram频率 --------------------------
if __name__ == '__main__':# 步骤1:读取并查看原始文本lines = read_time_machine()print(f'# 文本总行数: {len(lines)}')  # 输出清洗后的总行数(如3221)print("第0行文本:", lines[0])  # 输出:'the time machine by h g wells'print("第10行文本:", lines[10])  # 输出:'twinkled and his usually pale face was flushed and animated'# 步骤2:分析一元语法(unigram)的高频词tokens = tokenize(read_time_machine())  # 单词级词元化corpus = [token for line in tokens for token in line]  # 展平为1D词元列表vocab = Vocab(corpus)  # 基于单词构建词表print("\n前10个高频单词(一元语法):", vocab.token_freqs[:10])  # 如[('the', 2261), ('of', 1267), ...]# 步骤3:绘制一元语法的词频分布(对数坐标)freqs = [freq for token, freq in vocab.token_freqs]  # 提取所有词元的频率d2l.plot(freqs, xlabel='token: x',  # x轴:词元(按频率排序)ylabel='frequency: n(x)',  # y轴:频率xscale='log', yscale='log'  # 双对数坐标(符合齐夫定律))plt.show(block=True)  # 显示图像(词频随排名下降,符合幂律分布)# 步骤4:分析二元语法(bigram)的高频词对# 生成连续词对(如"the time"→("the", "time"))bigram_tokens = [pair for pair in zip(corpus[:-1], corpus[1:])]bigram_vocab = Vocab(bigram_tokens)  # 基于词对构建词表print("\n前10个高频词对(二元语法):", bigram_vocab.token_freqs[:10])  # 如[('of', 'the'), 130), ...]# 步骤5:分析三元语法(trigram)的高频词 triples# 生成连续三个词(如"the time machine"→("the", "time", "machine"))trigram_tokens = [triple for triple in zip(corpus[:-2], corpus[1:-1], corpus[2:])]trigram_vocab = Vocab(trigram_tokens)  # 基于三词组构建词表print("\n前10个高频三词组(三元语法):", trigram_vocab.token_freqs[:10])  # 如[('in', 'the', 'year'), 20), ...]# 步骤6:对比一元/二元/三元语法的词频分布bigram_freqs = [freq for token, freq in bigram_vocab.token_freqs]  # 二元频率trigram_freqs = [freq for token, freq in trigram_vocab.token_freqs]  # 三元频率d2l.plot([freqs, bigram_freqs, trigram_freqs],  # 三条频率曲线xlabel='token: x', ylabel='frequency: n(x)', xscale='log', yscale='log',legend=['unigram', 'bigram', 'trigram']  # 图例)plt.show(block=True)  # 显示图像(n越大,频率下降越快,符合短距离依赖)

实验结果

词频图

一元/二元/三元语法的词频分布对比

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

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

相关文章

DirectX12(D3D12)基础教程九 间接绘制

在学习directx12 microsoft提供了很多示例&#xff0c;有简单的也有复杂,下载网址&#xff1a;https://github.com/microsoft/DirectX-Graphics-Samples 本章对D3D12ExecuteIndirect 示例做了简化&#xff0c;只保留间接绘制部分&#xff0c;删除了计算着色器部分。 间接绘制…

fastApi连接数据库

1&#xff1a;pip install tortoise-orm2&#xff1a;pip install aiomysql3&#xff1a;pip install asyncmy或者使用国内清华园pip install -i https://pypi.tuna.tsinghua.edu.cn/simple asyncmy4&#xff1a;pip install aerich通过 python -m 直接运行&#xff08;推荐&a…

Apache-web服务器环境搭建

目录 实验要求 思路总结 1.常规配置web服务 2.通过用户主页配置web服务 3.通过虚拟目录配置web服务 4.添加DNS解析服务&#xff0c;访问虚拟机域名&#xff1a; www.TestWeb.com 实验要求 (ip 192.168.48.130) 1、常规配置web服务 2、通过用户主页配置web服务 3、通过虚…

Altium Designer 25 安装与配置完整教程

本教程将带您一步步完成 Altium Designer 25 的下载、安装与激活配置 第一步&#xff1a;下载安装包 首先&#xff0c;需要获取 Altium Designer 25 的完整安装程序。 &#x1f449; 下载链接&#xff1a; 百度网盘&#xff1a;百度网盘 请输入提取码 提取码: dxei 夸克网盘…

【工具】AndroidStudio修改中文语言汉化

AndroidStudio修改中文语言汉化 https://github.com/sollyu/AndroidStudioChineseLanguagePackhttps://github.com/sollyu/AndroidStudioChineseLanguagePack

代码随想录|图论|15并查集理论基础

并查集理论基础 | 代码随想录 并查集还是比较简单的&#xff0c;只要搞清楚两个事情&#xff1a; 并查集是干啥的&#xff1f;解决什么类型问题&#xff1f;并查集模板&#xff08;背下来&#xff09; 1、并查集是干啥的 并查集主要是两个功能&#xff1a; 两个元素添加到…

用MYSQL学习sql第一次总结和作业

总结 数据库&#xff08;Database&#xff09; 理解为“文件夹”&#xff0c;里面可以装很多张表。作业中要求先建一个名字叫 mydb6_product 的数据库。 表&#xff08;Table&#xff09; 理解为“Excel 工作表”&#xff0c;由“列&#xff08;字段&#xff09;”和“行&…

SQLite技术架构解析,适用场景有哪些?

一、SQLite技术架构解析 SQLite是一款轻量级、无服务器、嵌入式关系型数据库&#xff0c;其架构设计围绕“简化复杂性、提升效率”展开&#xff0c;核心由前端&#xff08;SQL处理&#xff09;、执行引擎&#xff08;VDBE&#xff09;、存储引擎&#xff08;B-Tree&#xff09;…

【Luogu】每日一题——Day3. P6392 中意 (数学 取模)

链接&#xff1a;P6392 中意 - 洛谷 题目&#xff1a; 思路&#xff1a; 数论这一块 题目让我们求这个结果对 MOD 取模&#xff0c;那么我们肯定是不像看到这个除法&#xff0c;所以考虑如何消除这个除法 我们可以想到&#xff0c;向上取整就是加上一个数&#xff0c;假设其为…

React强大且灵活hooks库——ahooks入门实践之DOM类hook(dom)详解

什么是 ahooks&#xff1f; ahooks 是一个 React Hooks 库&#xff0c;提供了大量实用的自定义 hooks&#xff0c;帮助开发者更高效地构建 React 应用。其中 DOM 类 hooks 是 ahooks 的一个重要分类&#xff0c;专门用于处理 DOM 相关操作&#xff0c;如事件监听、元素状态、拖…

GeoTools 工厂设计模式

前言使用GeoTools开发时有必要了解其工厂设计模式&#xff0c;作为软件开发核心设计模式&#xff0c;其设计思想具有普遍性和研究性。明白方法原理有助于提高开发效率&#xff0c;达到事半功倍的效果。1. 工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是面向对象中…

npu-smi info命令参数解释

华为昇腾npu-smi显示npu-smi工具的帮助信息npu-smi -h字段说明-h命令的帮助信息–help命令的帮助信息-vnpu-smi版本信息info显示硬件详细信息set修改设备配置属性clear清除设备信息upgrade升级MCU固件 npu-smi info 用于监控和管理华为NPU的状态和性能字段值说明npu-smi24.1.rc…

OneCode3.0 通信架构简介——MCPServer微内核设计哲学与实现

在数字化转型加速的今天&#xff0c;低代码平台已成为企业快速交付应用的核心基础设施。然而&#xff0c;通用消息中间件与低代码开发范式之间存在难以调和的矛盾&#xff1a;标准化协议无法匹配可视化编排的动态性&#xff0c;通用架构难以满足低代码场景下高频短消息的性能需…

Android14 Launcher3 修改All App上下滑动头部显示阴影

正常情况下的样子&#xff1a; 下拉App抽屉后的样子&#xff1a;修改方案&#xff1a;qssi14/packages/apps/Launcher3/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.javaprotected void updateHeaderScroll(int scrolledOffset) {float prog1 Utilities…

Zookeeper入门安装与使用详解

文章目录一、简介二、下载安装1、安装jdk2、windows&#xff08;1&#xff09;下载&#xff08;2&#xff09;配置与启动一、简介 略。 二、下载安装 1、安装jdk 安装jdk8&#xff0c;高版本可能会有问题。 2、windows &#xff08;1&#xff09;下载 官网地址&#xff…

设计模式之适配器模式:让不兼容的接口协同工作的艺术

适配器模式&#xff1a;让不兼容的接口协同工作的艺术在软件开发中&#xff0c;我们经常会遇到系统整合的挑战——如何让新旧组件协同工作&#xff1f;适配器模式正是解决这类接口不兼容问题的利器&#xff0c;本文将深入探讨这一经典设计模式。1. 引言&#xff1a;接口不兼容的…

AI驱动的软件工程(中):文档驱动的编码与执行

&#x1f4da; 系列文章导航 AI驱动的软件工程&#xff08;上&#xff09;&#xff1a;人机协同的设计与建模 AI驱动的软件工程&#xff08;中&#xff09;&#xff1a;文档驱动的编码与执行 AI驱动的软件工程&#xff08;下&#xff09;&#xff1a;AI辅助的质检与交付 大家好…

HTML应用指南:利用GET请求获取河南省胖东来超市门店位置信息

胖东来作为中国知名的零售企业&#xff0c;自1995年成立以来&#xff0c;始终致力于为消费者提供丰富、新鲜的商品选择与优质的购物体验。经过近30年的稳步发展&#xff0c;目前已在河南省内的许昌、新乡等地共开设13家门店&#xff0c;涵盖大型综合百货商场、中型社区超市及服…

8.服务通信:Feign深度优化 - 解密声明式调用与现代负载均衡内核

让服务调用更优雅 在微服务架构中,服务间通信如同血液流动般重要。传统方式中,开发者需要手动拼接URL、处理负载均衡、管理连接池——这些重复性工作不仅效率低下,还容易出错。Spring Cloud OpenFeign 的诞生,正是为了解决这一核心痛点。它通过声明式接口将HTTP请求模板化…

Docker入门指南(超详细)

一、什么是docker 在云计算和微服务架构盛行的今天&#xff0c;Docker 作为容器技术的标杆&#xff0c;彻底改变了应用部署和运行的方式。简单来说&#xff0c;Docker 是一个开源的容器化平台&#xff0c;它通过将应用程序及其依赖环境打包成一个轻量级、可移植的容器&#xff…