course-nlp——2-svd-nmf-topic-modeling

news2025/1/15 6:48:20

本文参考自https://github.com/fastai/course-nlp。

使用NMF and SVD进行主题建模

问题

主题建模是开始学习 NLP 的一种有趣方式。我们将使用两种流行的矩阵分解技术。考虑最极端的情况——使用两个向量的外积重建矩阵。显然,在大多数情况下,我们无法精确地重建矩阵。但是,如果我们有一个向量表示总单词数中每个词汇单词的相对频率,另一个向量表示每个文档的平均单词数,那么外积将尽可能接近。现在考虑将矩阵增加到两列和两行。现在的最佳分解是将文档聚类为两组,每组的单词分布尽可能不同,但聚类中的文档尽可能相似。我们将这两组称为“主题”。我们会根据每个主题中出现频率最高的单词将单词聚类为两组。

开始

我们将获取几个不同类别的文档数据集,并找到它们的主题(由词组组成)。了解实际类别有助于我们评估找到的主题是否有意义。
我们将使用两种不同的矩阵分解来尝试此操作:奇异值分解 (SVD) 和非负矩阵分解 (NMF)。

import numpy as np
from sklearn.datasets import fetch_20newsgroups
from sklearn import decomposition
from scipy import linalg
import matplotlib.pyplot as plt
%matplotlib inline
np.set_printoptions(suppress=True)

数据集

Scikit Learn 附带许多内置数据集,以及用于加载多个标准外部数据集的加载实用程序。这是一个很棒的资源,数据集包括波士顿房价、人脸图像、森林斑块、糖尿病、乳腺癌等。我们将使用新闻组数据集。

新闻组是 Usenet 上的讨论组,在网络真正起飞之前的 80 年代和 90 年代很流行。该数据集包括 18,000 个新闻组帖子和 20 个主题。

# 这里直接下载会出现forbidden 403的情况,所以我手动下载了数据集用load_files读取
categories = ['alt.atheism', 'talk.religion.misc', 'comp.graphics', 'sci.space']
remove = ('headers', 'footers', 'quotes')
train_data_folder = './20news-bydate/20news-bydate-train'
test_data_folder = './20news-bydate/20news-bydate-test'
newsgroups_train = load_files(train_data_folder, categories=categories, encoding='utf-8', decode_error='ignore')
newsgroups_test = load_files(test_data_folder, categories=categories, encoding='utf-8', decode_error='ignore')
# newsgroups_train = fetch_20newsgroups(subset='train', categories=categories, remove=remove)
# newsgroups_test = fetch_20newsgroups(subset='test', categories=categories, remove=remove)
newsgroups_train.filenames.shape, newsgroups_train.target.shape
((2034,), (2034,))

我们来看一个数据。你能猜出消息属于哪一类吗?

print("\n".join(newsgroups_train.data[:1]))
From: fineman@stein2.u.washington.edu (Twixt your toes)
Subject: Anyone know use "rayshade" out there?
Organization: University of Washington
Lines: 12
NNTP-Posting-Host: stein2.u.washington.edu
Keywords: rayshade, uw.

I'm using "rayshade" on the u.w. computers here, and i'd like input
from other users, and perhaps swap some ideas.  I could post
uuencoded .gifs here, or .ray code, if anyone's interested.  I'm having
trouble coming up with colors that are metallic (i.e. brass, steel)
from the RGB values.

If you're on the u.w. machines, check out "~fineman/rle.files/*.rle" on 
stein.u.washington.edu for some of what i've got.  

dan

np.array(newsgroups_train.target_names)[newsgroups_train.target[:3]]
array(['comp.graphics'], dtype='<U18')

目标属性是类别的整数索引。

newsgroups_train.target[:10]
array([1, 2, 2, 2, 2, 2, 2, 1, 2, 1])
num_topics, num_top_words = 6, 8

停用词、词干提取、词形还原

停用词

一些极其常见的单词似乎对帮助选择符合用户需求的文档没有什么价值,因此被完全排除在词汇表之外。这些单词被称为停用词。
随着时间的推移,IR 系统的总体趋势是从标准使用相当大的停用词表(200-300 个词)到非常小的停用词表(7-12 个词),再到根本不使用停用词表。网络搜索引擎通常不使用停用词表。

NLTK
from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS
sorted(list(ENGLISH_STOP_WORDS))[:20]
['a',
 'about',
 'above',
 'across',
 'after',
 'afterwards',
 'again',
 'against',
 'all',
 'almost',
 'alone',
 'along',
 'already',
 'also',
 'although',
 'always',
 'am',
 'among',
 'amongst',
 'amoungst']

不存在单一的通用停用词列表。

词干提取、词形还原

摘自《信息检索》教科书:
以下单词相同吗?
organize, organizes, and organizing
democracy, democratic, and democratization

词干提取和词形还原都生成单词的词根形式。
词形还原使用语言规则。生成的标记都是实际单词
“词干提取是穷人的词形还原。”(Noah Smith,2011)词干提取是一种粗略的启发式方法,它会切断单词的末尾。生成的标记可能不是实际单词。词干提取速度更快。

import nltk
nltk.download('wordnet')
[nltk_data] Downloading package wordnet to
[nltk_data]     C:\Users\wuzhongyanqiu\AppData\Roaming\nltk_data...
True
from nltk import stem
wnl = stem.WordNetLemmatizer()
porter = stem.porter.PorterStemmer()
word_list = ['feet', 'foot', 'foots', 'footing']
[wnl.lemmatize(word) for word in word_list]
output:['foot', 'foot', 'foot', 'footing']
[porter.stem(word) for word in word_list]
output:['feet', 'foot', 'foot', 'foot']

这里再试一下其他的单词集合,词干提取、词形还原对于形态很复杂的语言可能有更大的好处。

word_list1 = ['fly', 'flies', 'flying']
word_list2 = ['organize', 'organizes', 'organizing']
word_list3 = ['universe', 'university']
word_list = word_list + word_list1 + word_list2 + word_list3
[wnl.lemmatize(word) for word in word_list]
['foot',
 'foot',
 'foot',
 'footing',
 'fly',
 'fly',
 'flying',
 'organize',
 'organizes',
 'organizing',
 'universe',
 'university']
[porter.stem(word) for word in word_list]
['feet',
 'foot',
 'foot',
 'foot',
 'fli',
 'fli',
 'fli',
 'organ',
 'organ',
 'organ',
 'univers',
 'univers']
Spacy

Spacy 是一个非常现代且快速的 nlp 库。 Spacy 有自己的主见,它通常提供一种高度优化的方式来做某事(而 nltk 提供了各种各样的方法,尽管它们通常没有那么优化)。

import spacy
!spacy download en_core_web_sm

Spacy 不提供词干提取器(因为词形还原被认为更好——这是一个固执己见的例子!)

nlp = spacy.load("en_core_web_sm")
sorted(list(nlp.Defaults.stop_words))[:20]
["'d",
 "'ll",
 "'m",
 "'re",
 "'s",
 "'ve",
 'a',
 'about',
 'above',
 'across',
 'after',
 'afterwards',
 'again',
 'against',
 'all',
 'almost',
 'alone',
 'along',
 'already',
 'also']

练习:哪些停用词在 spacy 中出现但在 sklearn 中没有出现?

#Exercise:What stop words appear in spacy but not in sklearn?
sklearn_stop_words = set(ENGLISH_STOP_WORDS)
spacy_stop_words = set(nlp.Defaults.stop_words)
unique_to_spacy = spacy_stop_words - sklearn_stop_words
sorted(list(unique_to_spacy))[:20]
["'d",
 "'ll",
 "'m",
 "'re",
 "'s",
 "'ve",
 'ca',
 'did',
 'does',
 'doing',
 'just',
 'make',
 "n't",
 'n‘t',
 'n’t',
 'quite',
 'really',
 'regarding',
 'say',
 'unless']

练习:哪些停用词在 sklearn 中有,但在 spacy 中没有?

#Exercise:What stop words appear in sklearn but not in spacy?
unique_to_sklearn = sklearn_stop_words - spacy_stop_words
sorted(list(unique_to_sklearn))[:20]
['amoungst',
 'bill',
 'cant',
 'co',
 'con',
 'couldnt',
 'cry',
 'de',
 'describe',
 'detail',
 'eg',
 'etc',
 'fill',
 'find',
 'fire',
 'found',
 'hasnt',
 'ie',
 'inc',
 'interest']

何时使用这些?

这些长期以来被认为是标准技术,但如果使用深度学习,它们通常会损害您的表现。词干提取、词形还原和删除停用词都涉及丢弃信息。
但是,在使用较简单的模型时,它们仍然很有用。

数据处理

接下来,scikit learn 有一个方法可以帮我们提取所有单词计数。在下一课中,我们将学习如何编写自己的 CountVectorizer 版本,以了解底层发生了什么。

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import nltk
# 一个CountVectorizer对象,用于将文本转换为特征向量
vectorizer = CountVectorizer(stop_words='english')
vectors = vectorizer.fit_transform(newsgroups_train.data).todense()
vectors.shape
(2034, 33809)
print(len(newsgroups_train.data), vectors.shape)
2034 (2034, 33809)
vocab = np.array(vectorizer.get_feature_names_out())
vocab.shape
(33809,)
vocab[7000:7020]
array(['bnn', 'bnn_post', 'bnr', 'bnsc', 'bnsgs195', 'board', 'boarded',
       'boards', 'boast', 'boasted', 'boasts', 'boat', 'boats', 'bob',
       'bobbe', 'bobbing', 'bobby', 'bobc', 'bobcat', 'bobs'],
      dtype=object)

奇异值分解 (SVD)

我们显然会期望在一个主题中出现频率最高的单词在另一个主题中出现的频率较低 - 否则该单词就不是区分这两个主题的好选择。因此,我们期望主题是正交的。
SVD 算法将矩阵分解为一个具有正交列的矩阵和一个具有正交行的矩阵(以及一个对角矩阵,其中包含每个因素的相对重要性)。
在这里插入图片描述
SVD 是一种精确分解,因为它创建的矩阵足够大,可以完全覆盖原始矩阵。SVD 在线性代数中应用极其广泛,特别是在数据科学中,包括:

  • 语义分析(潜在语义分析 (LSA) 使用 SVD。您有时会听到将主题建模称为 LSA。)
  • 协同过滤/推荐(Netflix 奖获奖作品)
  • 计算 Moore-Penrose 伪逆
  • 数据压缩
  • 主成分分析
%time U, s, Vh = linalg.svd(vectors, full_matrices=False)
CPU times: total: 1min 57s
Wall time: 15.7 s
print(U.shape, s.shape, Vh.shape)
(2034, 2034) (2034,) (2034, 33809)

确认这是输入的分解。

s[:4]
output:
array([449.50641673, 303.09932748, 260.75217804, 233.74189479])
s[:4].shape
output:
(4,)
np.diag(s[:4])
output:
array([[449.50641673,   0.        ,   0.        ,   0.        ],
       [  0.        , 303.09932748,   0.        ,   0.        ],
       [  0.        ,   0.        , 260.75217804,   0.        ],
       [  0.        ,   0.        ,   0.        , 233.74189479]])

练习:确认U, s, Vh是向量的分解

# Exercise: confrim that U, s, Vh is a decomposition of `vectors`
# allclose()用于匹配两个数组输出为布尔值,默认在1e-05的误差范围内
vectors_check = np.dot(U, np.dot(np.diag(s), Vh))
assert np.allclose(vectors, vectors_check), 'The decomposition is wrong!'
print('The decomposition is confirmed.')
The decomposition is confirmed.

练习:确认U, Vh是正交的

# Exercise: Confirm that U, Vh are orthonormal
assert np.allclose(np.dot(U.T, U), np.eye(U.shape[0])), 'U is not orthonormal'
assert np.allclose(np.dot(Vh, Vh.T), np.eye(Vh.shape[0])), 'Vh is not orthonormal'
print('True')
True

关于奇异值 s 我们能说些什么呢?

plt.plot(s)

在这里插入图片描述

plt.plot(s[:10])

在这里插入图片描述

num_top_words = 8

# vocab是词汇表,top_words是lambda函数,接收权重向量t,先对t进行排序,然后选取top_words
def show_topics(a):
    top_words = lambda t: [vocab[i] for i in np.argsort(t) [:-num_top_words-1:-1]]
    topic_words = ([top_words(t) for t in a])
    return [' '.join(t) for t in topic_words]
show_topics(Vh[:10])
['antti siivonen suut imein siberian stint siis tuusniemi',
 'jpeg gif file image color quality format jfif',
 'god jesus people space atheists does matthew don',
 'space launch satellite nasa commercial satellites year market',
 'edu jpeg space graphics ray mail pub com',
 'jesus matthew prophecy messiah isaiah psalm david said',
 'launch satellite commercial market graphics god atheists satellites',
 'edu writes lines com organization article launch subject',
 'image probe lunar surface mars argument probes moon',
 'god atheists image religious atheism jesus probe religion']

我们得到的主题与我们预期的集群类型相匹配!尽管这是一个无监督算法,这意味着我们从未真正告诉算法我们的文档是如何分组的。

我们稍后会更详细地介绍 SVD。现在,重要的是我们有一个工具,可以让我们准确地将矩阵分解为正交列和正交行。

非负矩阵分解(NMF)

除了将因子限制为正交之外,另一个想法是将它们限制为非负。NMF 是非负数据集V的因式分解:
V = W H V=WH V=WH
转换为非负矩阵 W , H W, H W,H。通常积极因素会更容易解释(这也是 NMF 受欢迎的原因)。
在这里插入图片描述
非负矩阵分解 (NMF) 是一种非精确分解,可分解为一个细正矩阵和一个短正矩阵。NMF 是 NP-hard 且非唯一的。它有许多变体,可通过添加不同的约束来创建。

NMF from sklearn

我们将使用 scikit-learn 的 NMF 实现:

m, n = vectors.shape
d = 5 # num topics

clf = decomposition.NMF(n_components=d, random_state=1)

W1 = clf.fit_transform(np.asarray(vectors))
H1 = clf.components_

show_topics(H1)
['edu graphics pub mail ray 128 send ftp',
 'jpeg image gif file color images format quality',
 'god jesus people does atheists matthew atheism just',
 'space launch satellite nasa commercial year satellites data',
 'image data available software processing ftp analysis images']

TF-IDF

主题频率-逆文档频率 (TF-IDF) 是一种通过考虑术语在文档中出现的频率、文档的长度以及术语的常见/罕见程度来规范化术语计数的方法。

TF = (文档中术语 t 的出现次数) / (文档中的单词数量)

IDF = log(文档数量/包含术语 t 的文档数量)

vectorizer_tfidf = TfidfVectorizer(stop_words='english')
vectors_tfidf = vectorizer_tfidf.fit_transform(newsgroups_train.data) # (documents, vocab)

newsgroups_train.data[10:20]
['From: jbrandt@NeoSoft.com (J Brandt)\nSubject: Beta Testers Wanted for Graphics Libraries\nOrganization: NeoSoft Communications Services -- (713) 684-5900\nKeywords: xeg ceg beta imsl vni x graphics\nLines: 48\n\n\n  Visual Numerics Inc. (formerly IMSL and Precision Visuals) is in the\nprocess of securing sites for beta testing X Exponent Graphics 1.0 \nand C Exponent Graphics 2.0.  (Both X Exponent Graphics and C Exponent\nGraphics are 3GL products).  The beta period is from April 26 through \nJune 18.  The platform is HP9000/700 running under OS 8.07 with \nansi C 8.71 compiler.  The media will be sent on 4mm DAT cartridge \ntape.  Here are some of the key facts about the two products.\n \nX Exponent Graphics 1.0 key facts:\n \n1. Complete collection of high-level 2D and 3D application plot types\n   available through a large collection of X resources.\n2. Cstom widget for OSF/Motif developers.\n3. Built-in interactive GUI for plot customization.\n4. Easily-implemented callbacks for customized application feedback.\n5. XEG 1.0, being built on the Xt Toolkit provides the user a widget \n   library that conforms to the expected syntax and standards familar \n   to X programmers.\n6. XEG will also be sold as a bundle with Visual Edge\'s UIM/X product.\n   This will enable user to use a GUI builder to create the graphical\n   layout of an application.\n \nC Exponent Graphics 2.0 key facts:\n \n1. Written in C for C application programmers/developers.  The library\n   is 100% written in C, and the programming interface conforms to C\n   standards, taking advantage fo the most desirable features of C.\n2. Build-in GUI for interactive plot customization.  Through mouse \n   interaction, the user has complete interactive graph output control\n   with over 200 graphics attributes for plot customization.\n3. Large collection of high-level application functions for "two-call"\n   graph creation.  A wide variety of 2D and 3D plot types are available\n   with minimal programming effort.\n4. User ability to interrupt and control the X event.  By controlling\n   the X event loop, when the user use the mouse to manipulate the  plot\n   the user can allow CEG to control the event loop or the user can \n   control the event loop.\n \nIf anyone is interested in beta testing either of the products, please\ncontact Wendy Hou at Visual Numerics via email at hou@imsl.com or call\n713-279-1066.\n \n \n-- \nJaclyn Brandt\njbrandt@NeoSoft.com\n--\n',......
W1 = clf.fit_transform(vector_tfidf)
H1 = clf.components_

show_topics(H1)
['god edu people jesus bible believe say don',
 'space nasa edu gov access com graphics digex',
 'sandvik kent apple newton com alink ksand private',
 'keith caltech livesey sgi morality solntze wpd jon',
 'henry toronto zoo spencer zoology edu work utzoo']
plt.plot(clf.components_[0])

在这里插入图片描述

# 模型对象clf在使用训练数据进行拟合后,重建数据与原始数据之间的误差
clf.reconstruction_err_
44.03858988389047

截断 SVD

通过仅计算我们感兴趣的列子集,我们在计算 NMF 时节省了大量时间。有没有办法用 SVD 获得这种好处?有!这叫做截断 SVD。我们只对与最大奇异值相对应的向量感兴趣。在这里插入图片描述

经典分解算法的缺点:

  • 矩阵“非常大”
  • 数据经常缺失或不准确。当输入的不精确性限制了输出的精度时,为什么要花费额外的计算资源?
  • 数据传输现在在算法时间中起着重要作用。需要较少数据传递的技术可能会快得多,即使它们需要更多的浮点运算(浮点运算 = 浮点运算)。
  • 充分利用 GPU 很重要。

随机算法的优点:

  • 固有稳定性
  • 性能保证不依赖于微妙的光谱特性
  • 所需的矩阵向量积可以并行完成

时间比较

%time u, s, v = np.linalg.svd(vectors, full_matrices=False)
CPU times: total: 43.2 s
Wall time: 36.3 s
from sklearn import decomposition
import fbpca

%time u, s, v = decomposition.randomized_svd(vectors, 10)
CPU times: total: 2.7 s
Wall time: 4.18 s

来自 Facebook 库 fbpca 的随机 SVD:

%time u, s, v = fbpca.pca(vectors, 10)
CPU times: total: 953 ms
Wall time: 1.23 s

很明显,随机算法大大减少了时间,fbpca的随机SVD更快。

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

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

相关文章

【微机原理与汇编语言】循环程序设计

一、实验目的 1.熟练掌握8086/8088常用汇编指令的使用方法 2.熟练掌握循环结构程序编程技巧 3.熟练掌握汇编语言程序运行调试方法 二、实验要求 认真分析实验题目&#xff0c;设计程序流程图&#xff0c;独立完成代码编写及运行调试。 三、实验题目 给出不大于255的十个…

电子电器架构 --- 智能座舱技术分类

电子电器架构 — 智能座舱技术分类 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,…

纯血鸿蒙开发教程:如何实现运动饮食卡片效果

开发背景 人们对健康的要求越来越高&#xff0c;从单纯的健康饮食到健康运动&#xff0c;再到两者的结合。但是&#xff0c;饮食和运动之间的平衡一般人很难掌握&#xff0c;而我们这款 APP 将饮食、运动、以及自身身体状况&#xff08;如体脂、体重、内脂等&#xff09;有机结…

React + SpringBoot开发用户中心管理系统

用户中心项目搭建笔记 技术栈 前端技术栈 “react”: “^18.2.0”,ant-design-pro 后端技术栈 SpringBoot 2.6.x 项目源码地址 https://gitee.com/szxio/user-center 前端项目搭建 快速搭建一个后端管理系统项目框架 初始化 antDesignPro 官网&#xff1a; https://…

zdppy_amauth 实现给角色批量绑定权限

新增接口 api.resp.post("/auth/role_auth", amauth.role.add_auths)如何测试 如何测试能不能给指定的角色批量的添加权限呢&#xff1f; 1、需要新建一个角色2、需要拿到这个角色的ID3、需要新增三个权限4、需要拿到新增的三个权限的ID5、拿着角色ID和权限ID列表…

11. RBAC权限管理从零到一实现(二)

前端页面已提交至git https://github.com/SJshenjian/cloud-web默认用户名密码admin 1

深度解析:ISP代理与住宅代理区别

代理充当用户和互联网之间的中介&#xff0c;提供各种功能以增强安全性、隐私性和可访问性。在众多代理类型中&#xff0c;ISP 和住宅代理脱颖而出&#xff0c;每种代理都具有独特的功能和应用。 了解 ISP 代理 代理ISP&#xff0c;通常称为互联网服务提供商代理&#xff0c;通…

在cmd菜单中使用自定义命令通过bat和powershell命令调用翻译API

先说一个血淋淋的结果&#xff0c;这个小功能其实在github已经有大佬帮我们封装好了&#xff0c;我也是自己刚倒腾好之后才发现的&#xff0c;所以如果只是需要这个功能的朋友可以直接移步这个项目&#xff1a;https://github.com/kenshinji/yddict&#xff0c;自己电脑安装一个…

HarmonyOS应用开发深度指南:从基础到高级实践

1. HarmonyOS开发概述 HarmonyOS是华为推出的分布式操作系统,旨在为不同设备提供统一的体验。它支持多种编程语言,包括ArkTS、JS、C/C++和Java。开发者需要了解HarmonyOS的分布式架构,包括Ability、Service、Data Ability等核心概念。 了解HarmonyOS的分布式架构:HarmonyO…

今时今日蜘蛛池还有用吗?

最近不知道哪里又开始刮起“蜘蛛池”这个风气了&#xff0c;售卖、购买蜘蛛池的行为又开始在新手站长圈里开始蔓延和流行了起来&#xff0c;乍一看到“蜘蛛池”这个词给明月的感受就是陌生&#xff0c;要经过回忆才能想起来一些残存的记忆&#xff0c;所谓的蜘蛛池说白了就是利…

废品回收小程序开发,助力商家拓展回收市场

随着互联网的快速发展&#xff0c;废品回收行业也走向了数字化发展&#xff0c;废品回收小程序成为了拓展市场的重要方式。在当下万亿元下的回收市场中&#xff0c;废品回收小程序的发展也能够发挥重要作用&#xff0c;提高市场回收效率&#xff0c;提高大众的回收意识&#xf…

Ubuntu 20.04 LTS配置JDK、Git

一、配置JDK 1.1 更新系统 执行以下命令 sudo apt update 出现以下界面即为安装成功 1.2 安装openjdk-11-jdk Ubuntu20.04中没有默认JDK&#xff0c;执行以下指令安装&#xff0c;默认会自动配置一些必要环境变量 sudo apt install openjdk-11-jdk 1.3 配置环境变量&…

MQTT.FX的使用

背景 在如今物联网的时代下&#xff0c;诞生了许多的物联网产品&#xff0c;这些产品通过BLE、WIFI、4G等各种各样的通信方式讲数据传输到各种各样的平台。 除了各个公司私有的云平台外&#xff0c;更多的初学者会接触到腾讯云、阿里云之类的平台。设备接入方式也有着多种多样…

大模型时代,是 Infra 的春天还是冬天?

Highlights 大模型时代元年感悟 Scaling Laws 是大模型时代的摩尔定律,是最值得研究的方向 LLM 发展的三个阶段: 算法瓶颈 -> 数据瓶颈 -> Infra 瓶颈 为什么 GPT 一枝独秀, BERT、T5 日落西山? 大模型时代,是大部分 Infra 人的冬天,少部分 Infra 人的春天(算法研…

网工内推 | 联通公司,云计算售前,AWS认证优先

01 联通数字科技有限公司 &#x1f537;招聘岗位&#xff1a;云计算售前工程师 &#x1f537;职责描述&#xff1a; 1.了解私有云&#xff0c;公有云&#xff0c;混合云等云计算技术知识&#xff0c;了解云计算行业现状及发展趋势。 2.承担区域项目售前工作支持&#xff0c;为…

Glide支持通过url加载本地图标

序言 glide可以在load的时候传入一个资源id来加载本地图标&#xff0c;但是在开发过程中。还得区分数据类型来分别处理。这样的使用成本比较大。希望通过自定义ModelLoader实现通过自定义的url来加载Drawab。降低使用成本 实现 一共四个类 类名作用GlideIcon通过自定义url的…

【保姆级讲解Outlook邮箱的使用技巧】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

海南聚广众达电子商务咨询有限公司靠谱吗?

在数字经济的浪潮中&#xff0c;抖音电商作为新兴业态&#xff0c;正以其独特的魅力和强大的势能&#xff0c;改变着传统商业模式&#xff0c;引领着新一轮的消费潮流。海南聚广众达电子商务咨询有限公司&#xff0c;作为抖音电商服务领域的佼佼者&#xff0c;凭借其专业的团队…

三十六、openlayers官网示例Earthquake Clusters解析——在聚合图层鼠标触摸显示五角星

官网demo地址&#xff1a; Earthquake Clusters 这篇展示了鼠标触摸聚合图层点位显示五角星的效果。 首先是初始化地图&#xff0c;加载了一个KML格式的矢量数据源&#xff0c;extractStyles为false表示不从kml数据源中提取样式。使用Select添加了鼠标选中的交互事件 vector …

postman教程-14-生成随机数

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了Postman关联接口的调用方法&#xff0c;本小节我们讲解一下Postman生成随机数的方法。 在接口测试中&#xff0c;经常需要向接口发送不同的输入数据&#xff0c;以确保接口的健壮性和可靠性。…