当前位置: 首页 > news >正文

NLP:从头开始的文本矢量化方法

一、说明

        NLP 项目使用文本,但机器学习算法不能使用文本,除非将其转换为数字表示。这种表示通常称为向量,它可以应用于文本的任何合理单位:单个标记、n-gram、句子、段落,甚至整个文档。

        在整个语料库的统计 NLP 中,应用了不同的向量化技术,例如 one-hot、计数或频率编码。在神经 NLP 中,词向量(也称为词嵌入)占主导地位。可以使用预先训练的向量以及复杂神经网络中学习的向量表示。

        本文解释并展示了所有提到的向量化技术的 Python 实现:one-hot 编码、计数器编码(词袋)、词频以及最后的词向量。

本文的技术背景是和几个Python v3.11附加库:gensim v4.3.1pandas v2.0.1numpy v1.26.1nltk v3.8.1scikit-learn v1.2.2所有示例也应该适用于较新的库版本。

本文最初出现在我的博客admantium.com上。

二、要求和使用的 Python 库

        请务必阅读并运行我上一篇文章的要求,以便拥有 Jupyter Notebook 来运行所有代码示例。

对于本文,需要以下库:

Collections

  • Counter用于计算文档中标记数量的对象

Gensim

  • downloader对象允许加载多个预先训练的词向量

Pandas

  • DataFrame用于存储文本、标记和向量的对象

Numpy

  • 创建和使用的几种方法arrays

NLTK

  • PlaintextCorpusReader用于提供对文档的访问、提供标记化方法并计算有关所有文件的统计信息的可遍历对象
  • sent_tokenizerword_tokenizer用于生成令牌
  • stopwords代币减持清单

SciKitLearn

  • Pipeline对象来实现处理步骤链
  • BaseEstimatorTransformerMixin构建代表管道步骤的自定义类

所有示例都需要这些导入和基类:

import numpy as np
import re
from copy import deepcopy
from collections import Counter
from gensim import downloader
from nltk.corpus import stopwords
from nltk.corpus.reader.plaintext import PlaintextCorpusReader
from nltk.tokenize import sent_tokenize, word_tokenize
from sklearn.base import BaseEstimator, TransformerMixin
from time import timeclass SciKitTransformer(BaseEstimator, TransformerMixin):def fit(self, X=None, y=None):return selfdef transform(self, X=None):return self

三、基本示例

        根据之前的文章,NLTK PlaintextCorpusReader 将被重用。

        这是该类的更新版本,WikipediaCorpus带有一个附加filter()方法 - 它将词汇表减少为仅文本,没有任何停用词。

class WikipediaCorpus(PlaintextCorpusReader):def __init__(self, root_path):PlaintextCorpusReader.__init__(self, root_path, r'.*[0-9].txt')def filter(self, word):#only keep letters, numbers, and sentence delimiterword = re.sub('[\(\)\.,;:+\--"]', '', word)#remove multiple whitespaceword = re.sub(r'\s+', '', word)if not word in stopwords.words("english"):return word.lower()return ''def vocab(self):return sorted(set([self.filter(word) for word in corpus.words()]))def max_words(self):max = 0for doc in self.fileids():l = len(self.words(doc))max = l if l > max else maxreturn maxdef describe(self, fileids=None, categories=None):started = time()return {'files': len(self.fileids()),'paras': len(self.paras()),'sents': len(self.sents()),'words': len(self.words()),'vocab': len(self.vocab()),'max_words': self.max_words(),'time': time()-started}

为了使本文中的示例向量简短易懂,该语料库由维基百科有关机器学习的文章的前三个句子组成。

_Source: [Wikipedia](https://en.wikipedia.org/wiki/Artificial_intelligence)_Artificial intelligence (AI) is intelligence-perceiving, synthesizing, and inferring information-demonstrated by machines, as opposed to intelligence displayed by humans or by other animals.
Example tasks in which this is done include speech recognition, computer vision, translation between (natural) languages, as well as other mappings of inputs.
As machines become increasingly capable, tasks considered to require "intelligence" are often removed from the definition of AI, a phenomenon known as the AI effect. For instance, optical character recognition is frequently excluded from things considered to be AI, having become a routine technology.

使用语料库类来解析这些句子,得到以下统计数据: 词汇量为 49 个单词,总单词数为 113 个。它的大小足以让下面的解释保持简短。

corpus = WikipediaCorpus('ai_sentences')print(corpus.fileids())
# ['sent1.txt', 'sent2.txt', 'sent3.txt']print(corpus.describe())
# {'files': 3, 'paras': 3, 'sents': 3, 'words': 91, 'vocab': 40, 'max_words': 32, 'time': 0.01642608642578125}print(corpus.vocab())
# ['', 'ai', 'animals', 'artificial', 'as', 'become', 'capable', 'computer', 'considered', ..., 'well']

四、一次性编码

        one-hot 编码基于所有文档的总词汇量来表示单词在特定文档中出现的关系。因此,实施需要以下步骤:

  • 计算所有文档的总有序词汇表
  • 迭代每个文档并标记出现的单词

        以下实现构建一个vocab_dict填充有默认浮点值的对象0.0,然后将这些值设置1.0为出现在句子中的每个标记。

class OneHotEncoder(SciKitTransformer):def __init__(self, vocab):self.vocab_dict = dict.fromkeys(vocab, 0.0)def one_hot_vector(self, tokens):vec_dict = deepcopy(self.vocab_dict)for token in tokens:if token in self.vocab_dict:vec_dict[token] = 1.0vec = [v for v in vec_dict.values()]return np.array(vec)

以下是前两个句子的 one-hot 向量:

encoder = OneHotEncoder(corpus.vocab())sent1 = [word for word in word_tokenize(corpus.raw('sent1.txt'))]
vec1 = encoder.one_hot_vector(sent1)print(vec1)
# [0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. 0.
# 1. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]print(vec1.shape)
# (40,)sent2 = [word for word in word_tokenize(corpus.raw('sent2.txt'))]
vec2 = encoder.one_hot_vector(sent2)print(vec2)
# [0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 0. 0. 1. 0. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1.
# 0. 1. 1. 0. 0. 0. 0. 1. 0. 0. 1. 0. 1. 1. 1. 1.]print(vec2.shape)
# (40,)

五、计数器编码

        计数器编码是创建向量的中间形式。基于所有文档的完整有序词汇表,确定文档中所有单词的数量和出现次数。该数字通常按比例缩放,例如按文档的长度。

        这是 Python 中的计数器编码实现。和以前一样,它构建一个vocab_dict填充有默认浮点值 的对象0.0,并为每个文档设置一个值number(word)/len(document)

from collections import Counterclass CountEncoder(SciKitTransformer):def __init__(self, vocab):self.vocab = dict.fromkeys(vocab, 0.0)def count_vector(self, tokens):vec_dict = deepcopy(self.vocab)token_vec = Counter(tokens)doc_length = len(tokens)for token, count in token_vec.items():if token in self.vocab:vec_dict[token] = count/doc_lengthvec = [v for v in vec_dict.values()]return np.array(vec)

使用计数器编码会产生以下结果:

encoder = CountEncoder(corpus.vocab())sent1 = [word for word in word_tokenize(corpus.raw('sent1.txt'))]
vec1 = encoder.count_vector(sent1)print(vec1)
# [0.         0.         0.03571429 0.         0.03571429 0.
# 0.         0.         0.         0.         0.         0.03571429
# 0.         0.         0.         0.03571429 0.         0.
# 0.03571429 0.         0.         0.07142857 0.         0.
# 0.03571429 0.         0.         0.         0.03571429 0.
# 0.         0.         0.         0.         0.         0.03571429
# 0.         0.         0.         0.        ]print(vec1.shape)
# (40,)
sent2 = [word for word in word_tokenize(corpus.raw('sent2.txt'))]
vec2 = encoder.count_vector(sent2)print(vec2)
# [0.         0.         0.         0.         0.06896552 0.
#  0.         0.03448276 0.         0.         0.         0.
#  0.03448276 0.         0.         0.         0.03448276 0.
#  0.         0.         0.03448276 0.         0.         0.03448276
#  0.         0.03448276 0.03448276 0.         0.         0.
#  0.         0.03448276 0.         0.         0.03448276 0.
#  0.03448276 0.03448276 0.03448276 0.03448276]print(vec2.shape)
# (40,)

六、词频编码

        前两种编码导致的问题是,当与机器学习算法一起使用时,非常罕见的术语没有足够的权重来发挥重要作用。特别是为了解决这个问题,术语频率、术语间接频率指标平衡了大型文档语料库中的罕见术语。详细的数学可以在TfIdf 维基百科文章中研究- 以下是基本摘要:

  • TF,术语频率,是术语在文档中出现的次数除以文档的总长度,以伪代码表示word_occurences_in_doc/doc_len
  • IDF,间接文档频率,是包含某个单词的文档数除以语料库中文档总数的对数,以伪代码表示log(number_of_docs/number_of_docs_containing_word)

实现非常复杂,根据以下考虑因素构建:

  1. 编码器以列表形式接收语料库词汇,并接收以下形式的字典对象{document_name: [tokens]}(否则此实现将与语料库对象耦合得太紧)
  2. 在初始化过程中,会创建一个word_frequency字典,其中包含某个术语在所有文档中出现的频率总数
  3. TfIdf 方法确定文档总数为number_of_docs,文档长度为doc_lenCounter然后,它为文档中的所有单词创建一个 TfIdf值,然后为词汇表中包含的每个单词计算 TfIdf 值
  4. 所有值都转换为 Numpy 数组并返回

这是实现:

class TfIdfEncoder(SciKitTransformer):def __init__(self, doc_arr, vocab):self.doc_arr = doc_arrself.vocab = vocabself.word_frequency = self._word_frequency()def _word_frequency(self):word_frequency = dict.fromkeys(self.vocab, 0.0)for doc_name in self.doc_arr:doc_words = Counter([word for word in self.doc_arr[doc_name]])for word, _ in doc_words.items():if word in self.vocab:word_frequency[word] += 1.0return word_frequencydef TfIdf_vector(self, doc_name):if not doc_name in self.doc_arr:print(f'Document "{doc_name}" not found.')returnnumber_of_docs = len(self.doc_arr)doc_len = len(self.doc_arr[doc_name])doc_words = Counter([word for word in self.doc_arr[doc_name]])TfIdf_vec = dict.fromkeys(self.vocab, 0.0)for word, word_count in doc_words.items():if word in self.vocab:tf = word_count/doc_lenidf = np.log(number_of_docs/self.word_frequency[word])idf = 1 if idf == 0 else idfTfIdf_vec[word] = tf * idfvec = [v for v in TfIdf_vec.values()]return np.array(vec)

        对于我们只有三个句子的示例,向量足以表示文档,但它们的全部潜力只有在大型校园中才能实现。

doc_list = [doc for doc in corpus.fileids()]
words_list = [corpus.words(doc) for doc in [doc for doc in corpus.fileids()]]
doc_arr = dict(zip(doc_list, words_list))encoder = TfIdfEncoder(doc_arr, corpus.vocab())
vec1 = encoder.TfIdf_vector('sent1.txt')print(vec1)
# [0.         0.         0.03433163 0.         0.03125    0.
#  0.         0.         0.         0.         0.03433163 0.03433163
#  0.         0.         0.         0.03433163 0.         0.
#  0.03433163 0.03433163 0.         0.03801235 0.         0.
#  0.01267078 0.         0.         0.         0.03433163 0.03433163
#  0.         0.         0.         0.         0.         0.03433163
#  0.         0.         0.         0.        ]print(vec1.shape)
# (40,)
vec2 = encoder.TfIdf_vector('sent2.txt')print(vec2)
# [0.         0.         0.         0.         0.06896552 0.
# 0.         0.03788318 0.         0.         0.         0.
# 0.03788318 0.         0.         0.         0.03788318 0.
# 0.         0.         0.03788318 0.         0.         0.03788318
# 0.         0.03788318 0.03788318 0.         0.         0.
# 0.         0.03788318 0.         0.         0.03788318 0.
# 0.01398156 0.03788318 0.03788318 0.03788318]print(vec2.shape)
# (40,)

七、词向量

        最终的编码类型是词向量。本质上,每个单词都用一个 n 维向量表示。该向量表示单词之间的细粒度关系,并且它使向量算术能够进行向量的比较和组合,例如满足 的向量代数king + women = queen

        词向量为大规模自然语言处理任务提供了巨大且令人惊讶的价值。三个主要的词向量实现是原始的 Word2Vec、FastText 和 Glove。

       Word2Vec是第一个模型,根据新闻文章进行训练,并使用不同的 n-gram 大小来捕获周围上下文中单词的含义。FastText使用类似的连续 n 元语法方法,但它不仅考虑训练数据中单词的实际上下文,还考虑其他上下文。这改善了稀疏单词的表示并处理训练期间不存在的未知单词。Glove考虑整个语料库,根据训练数据计算词与词的共现矩阵,并构建一个关于采样数据中任何词出现的可能性的概率模型。

        词向量表示训练数据中出现的结构。如果该数据足够大并且接近语料库的文本,则可以使用预训练的向量。否则,他们需要在校园内接受培训。

        在下面的实现中,Gensim库将用于加载预训练的Word2Vec向量并将其应用到语料库中。要使用预训练模型之一,您需要使用 Gensim 助手下载其模型。请注意,模型可能非常大。例如,word2vec-google-news-300模型为 1.6GB,为每个单词提供 300 维向量。

>>> wv = downloader.load('word2vec-google-news-300')
# [=======-------------------------------------------] 15.5% 258.5/1662.8MB downloaded

        矢量化器实现使用与其他结构相同的已知结构。它的实现非常简单:它将处理文档标记列表并输出一个向量,其中包含存在向量表示的每个单词的数值。

class Word2VecEncoder(SciKitTransformer):def __init__(self, vocab):self.vocab = vocabself.vector_lookup = downloader.load('word2vec-google-news-300')def word_vector(self, tokens):vec = np.array([])for token in tokens:if token in self.vocab:if token in self.vector_lookup:print(f'Add {token}')vec = np.append(self.vector_lookup[token], vec)return vec

这是一个示例输出。

encoder = Word2VecEncoder(corpus.vocab())sent1 = [word for word in word_tokenize(corpus.raw('sent1.txt'))]
vec1 = encoder.word_vector(sent1)print(vec1)
# [ 0.01989746  0.24707031 -0.23632812 ... -0.24707031  0.05249023
#  0.19824219]print(vec1.shape)
# (3000,)sent2 = [word for word in word_tokenize(corpus.raw('sent2.txt'))]
vec2 = encoder.word_vector(sent2)print(vec2)
# [-0.11767578 -0.13769531 -0.140625   ... -0.03295898 -0.01733398
#  0.13476562]print(vec2.shape)
# (4500,)

        正如您所看到的,两个句子的向量分别为 3000 和 4500 个值。结果是特定于文档的矩阵,其中每列代表按原样出现的文档标记,列数是列中包含的单词数。

八、结论

        本文展示了如何从头开始实现文本矢量化方法。它展示了 one-hot 编码、计数器编码、TfIdf 频率编码以及 Word2Vec 词向量的实现。它还展示了将所得向量应用于维基百科有关人工智能的文章中的句子时的具体示例。

参考资料:

NLP: Text Vectorization Methods from Scratch | by Sebastian | Oct, 2023 | Medium

 

相关文章:

NLP:从头开始的文本矢量化方法

一、说明 NLP 项目使用文本,但机器学习算法不能使用文本,除非将其转换为数字表示。这种表示通常称为向量,它可以应用于文本的任何合理单位:单个标记、n-gram、句子、段落,甚至整个文档。 在整个语料库的统计 NLP 中&am…...

Kotlin 中 apply、let、also、run的区别

apply apply 函数接收一个目标并回来该目标自身。它答应您在目标上履行一些操作&#xff0c;同时仍然回来原始目标。 fun <T> T.apply(block: T.() -> Unit): TT 是目标的类型&#xff0c;block 是一个 lambda 表达式&#xff0c;能够在该目标上履行一些操作。在这个…...

Android JKS MD5 SHA1 公钥生成 私钥生成 APP备案 内容获取

1 查看 jks keytool -list -v -keystore /Users/lipengfei/Desktop/android/androidproject.jks密钥库类型: jks 密钥库提供方: SUN您的密钥库包含 1 个条目别名: ddgj 创建日期: 2018-11-16 条目类型: PrivateKeyEntry 证书链长度: 1 证书[1]: 所有者: CNcn, OUcn, Ocn, Lcn,…...

常用linux的命令(持续更新)

1.防火墙相关 centos7 防火墙 查状态&#xff1a;systemctl status firewalld.service 关闭&#xff1a;systemctl disable firewalld.service 重启生效 关闭&#xff1a;systemctl stop firewalld.service 马上生效 systemctl stop firewalld 临时关闭防火墙 systemctl disabl…...

《动手学深度学习 Pytorch版》 8.7 通过时间反向传播

8.7.1 循环神经网络的梯度分析 本节主要探讨梯度相关问题&#xff0c;因此对模型及其表达式进行了简化&#xff0c;进行如下表示&#xff1a; h t f ( x t , h t − 1 , w h ) o t g ( h t , w o ) \begin{align} h_t&f(x_t,h_{t-1},w_h)\\ o_t&g(h_t,w_o) \end{ali…...

2023-10-20 游戏开发-cocos旧版本2.0.6-下载地址-记录

官方下载地址: Cocos Creator 下载 - 轻量高效的开发引擎 Tags cocos/cocos-engine GitHub cocos creater 旧版本: Tool/Package/REAMDE.md adofsauron/CocosCreatorFAQ - Gitee.com v2.0.6版本: Mac版&#xff1a;http://cocos2d-x.org/filedown/CocosStudioForMac-v2.0.…...

Python 框架学习 Django篇 (三) 链接数据库

只要你是做后端开发的&#xff0c;那么就离不开各种数据库&#xff0c;Django框架对各种数据库都非常友好&#xff0c;比如常见的PostgreSQL、MySQL、SQLite、Oracle&#xff0c;django都对他们提供了统一调用api&#xff0c;我们这里主要使用mysql数据库作为演示 一、ORM机制 …...

【debug】安装diffusion的bug解决合集

环境问题 ImportError: cannot import name ‘CLIPImageProcessor’ from ‘transformers’ (D:\Python\lib\site-packages\transformers_init_.py) https://github.com/huggingface/transformers/issues/23340 解决&#xff1a;查看更详细信息&#xff0c;安装环境 transfor…...

面试题 01.02. 判定是否互为字符重排

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;面试题 01.02. 判定是否互为字符重排 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 遍历计数即可。 解题代码&#xff1a; class Solution { public:bool CheckPermutation(string s1, …...

笔记39:在Pycharm中为项目添加新解释器

很久不用pycharm都生疏了 a a a 第一步&#xff1a;创建虚拟环境 略 a a a 第二步&#xff1a;将虚拟环境应用到项目中去 【File】----【Settings】----【Project:~~~】-----【Project Interpreter】----【选择合适的解释器】 ​​​​​​​ 因为我们要用新的解释…...

C#—VB.NET的相同点与不同点

目录 前言 一、相同之处 二、不同之处 三、总结 前言 VB.NET 和C#是两种由微软公司开发的面向对象编程语言。它们在语法上有很多相似之处&#xff0c;但也有一些不同之处。本文将讨论 VB.NET 和C#之间的相同之处和不同之处。 一、相同之处 1.面向对象编程语言&#xff1a…...

【Edabit 算法 ★☆☆☆☆☆】【返回数组第一个元素】 Return the First Element in an Array

【Edabit 算法 ★☆☆☆☆☆】【返回数组第一个元素】 Return the First Element in an Array arrays language_fundamentals Instructions Create a function that takes an array containing only numbers and return the first element. Examples getFirstValue([1, 2, 3…...

在Qt中怎么操作MySQL数据库

一、安装驱动 &#xff08;1&#xff09;安装 在Qt中操作MySQL数据库首先要安装mysql的驱动文件&#xff0c;将MySQL下的libmusql.dll文件复制到Qt的安装路径下的bin文件夹下即可。 本文福利&#xff0c;莬费领取Qt开发学习资料包、技术视频&#xff0c;内容包括&#xff08;…...

C/C++网络编程基础知识超详细讲解上部分(系统性学习day11)

目录 前言 一、网络的含义与构成 含义&#xff1a; 构成&#xff1a; 二、网络的体系结构 1>OSI七层模型 2>TCP/IP协议体系结构 3>数据经过体系结构&#xff0c;怎么封装? 4>端口号 5>大小端序 6>TCP/UDP传输层的协议 三、系统函数API学习框…...

chrome Driver 使用教程

ChromeDriver是一款实用的chrome浏览器驱动工具,能够用于自动化测试、网络爬虫和操作浏览器,其主要作用是模拟浏览器操作。 ## 下载地址 [Chrome for Testing availability]&#xff08;Chrome for Testing availability&#xff09;...

目标检测YOLO实战应用案例100讲-面向恶劣环境下的多模态 行人识别

目录 前言 国内外研究现状 可见光行人目标识别 红外行人目标识别...

react-router-dom v6版本实现Tabs路由缓存切换

目录 文章目录 概要 效果 完整代码 概要 摆了半年摊&#xff0c;好久没写代码了&#xff0c;今天有人问我怎么实现React-Router-dom类似标签页缓存。后面看了一下router的官网。很久以前用的是react-router v5那个比较容易实现。v6变化挺大&#xff0c;但了解react的机制和rea…...

ArcGIS笔记9_数据源缺少空间参考信息?如何定义坐标系?

本文目录 前言Step 1 确定好要赋予给目标文件的恰当坐标系Step 2 定义坐标系 前言 有时从其他软件转换得到了shp文件&#xff0c;拖到ArcGIS后却出现“未知的空间参考&#xff1a;添加的数据源缺少空间参考信息 不能投影”的提示&#xff0c;如下图所示&#xff1a; 这种情况就…...

Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现

可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个全文搜索引擎&#xff0c;它还提供了分布式的多用户能力&#xff0c;实时的分析&#xff0c;以及对复杂搜索语句的处理能力&#xff0c;使其在众多场景下&#xff0c;如企业搜索&#xff0c;日志和事件数据分析等…...

离线语音与IoT结合:智能家居发展新增长点

离线语音控制和物联网&#xff08;IoT&#xff09;相结合在家居中具有广泛的应用和许多优势。离线语音控制是指在设备在本地进行语音识别和处理&#xff0c;而不需要依赖云服务器进行处理。IoT是指借助网络&#xff0c;通过手机APP、小程序远程控制家居设备。 启英泰伦基于AI语…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...