每个程序员都应该知道的 40 个算法(三)(2)https://developer.aliyun.com/article/1506356
第十章:推荐引擎
**推荐引擎是利用用户偏好和产品详情提供明智建议的一种方式。推荐引擎的目标是了解一组项目之间的相似性模式和/或制定用户和项目之间的互动。
本章首先介绍了推荐引擎的基础知识。然后,讨论了各种类型的推荐引擎。接下来,本章讨论了推荐引擎如何用于向不同用户建议项目和产品以及推荐引擎的各种限制。最后,我们将学习如何使用推荐引擎解决现实问题。
本章讨论了以下概念:
- 推荐系统的介绍
- 推荐引擎的类型
- 了解推荐系统的限制
- 实际应用领域
- 一个实际的例子——创建一个推荐引擎向订阅者推荐电影
在本章结束时,您应该能够理解如何使用推荐引擎根据一些偏好标准建议各种项目。
让我们从推荐引擎的背景概念开始。
推荐系统的介绍
推荐系统代表研究人员最初开发的方法,用于预测用户最有可能感兴趣的项目。推荐系统在给出关于项目的个性化建议方面的能力使其可能是在线购买世界中最重要的技术。
在电子商务应用中,推荐引擎使用复杂的算法来改善购物体验,允许服务提供商根据用户的偏好定制产品。
2009 年,Netflix 向任何能够通过超过 10%改进其现有推荐引擎(Cinematch)的算法提供 100 万美元的奖金。奖金被 BellKor 的 Pragmatic Chaos 团队赢得。
推荐引擎的类型
通常有三种不同类型的推荐引擎:
- 基于内容的推荐引擎
- 协同过滤引擎
- 混合推荐引擎
基于内容的推荐引擎
基于内容的推荐引擎的基本思想是建议与用户先前表现出兴趣的项目相似的项目。基于内容的推荐引擎的有效性取决于我们量化项目与其他项目的相似性的能力。
让我们看看下面的图表。如果用户 1已阅读文档 1,那么我们可以向用户推荐与文档 1相似的文档 2:
现在的问题是如何确定哪些项目彼此相似。让我们看看找到不同项目之间相似性的几种方法。
查找非结构化文档之间的相似性
确定不同文档之间相似性的一种方法是首先处理输入文档。处理非结构化文档后得到的数据结构称为术语文档矩阵(TDM),如下图所示:
TDM 具有所有术语的词汇表作为行,所有文档作为列。它可以用于根据所选的距离度量确定哪些文档与其他文档相似。例如,Google 新闻根据与用户已经表现出兴趣的新闻相似性向用户推荐新闻。
一旦我们有了 TDM,有两种方法可以量化文档之间的相似性:
- 使用频率计数:这意味着我们假设一个词的重要性与每个词的频率成正比。这是计算重要性的最简单方法。
- 使用 TFIDF(词频-逆文档频率的缩写):这是一个计算每个词在我们试图解决的问题的上下文中重要性的数字。它是两个术语的乘积:
- 词频(TF):这是一个词或术语在文档中出现的次数。词频直接与一个词的重要性相关联。
- 逆文档频率(IDF):首先,文档频率(DF)是包含我们搜索的术语的文档数量。作为 DF 的相反,IDF 给出了一个词所代表的独特性的度量,并将其与其重要性相关联。
- 由于 TF 和 IDF 都量化了我们试图解决的问题的上下文中一个词的重要性,它们的组合 TF-IDF 是每个词的重要性的一个很好的度量,是使用简单频率计数的更复杂的替代方法。
使用共现矩阵
这种方法基于这样的假设:如果两个物品大多数情况下一起购买,那么它们很可能是相似的,或者至少属于通常一起购买的物品类别。
例如,如果人们大多数情况下一起使用剃须膏和剃刀,那么如果有人买了剃刀,建议他也买剃须膏是有道理的。
让我们分析这四个用户的历史购买模式:
剃刀 | 苹果 | 剃须膏 | 自行车 | 鹰嘴豆泥 | |
迈克 | 1 | 1 | 1 | 0 | 1 |
泰勒 | 1 | 0 | 1 | 1 | 1 |
埃琳娜 | 0 | 0 | 0 | 1 | 0 |
阿明 | 1 | 0 | 1 | 0 | 0 |
这将创建以下共现矩阵:
剃刀 | 苹果 | 剃须膏 | 自行车 | 鹰嘴豆泥 | |
剃刀 | - | 1 | 3 | 1 | 1 |
苹果 | 1 | - | 1 | 0 | 1 |
剃须膏 | 3 | 1 | - | 1 | 2 |
自行车 | 1 | 0 | 1 | - | 1 |
鹰嘴豆泥 | 1 | 1 | 2 | 1 | - |
前述共现矩阵总结了一起购买两件物品的可能性。让我们看看如何使用它。
协同过滤推荐引擎
协同过滤的推荐是基于用户的历史购买模式的分析。基本假设是,如果两个用户对大多数相同的物品表现出兴趣,我们可以将两个用户都归类为相似。换句话说,我们可以假设以下内容:
- 如果两个用户的购买历史重叠超过阈值,我们可以将它们归类为相似用户。
- 查看相似用户的历史,购买历史中不重叠的物品将成为协同过滤推荐的基础。
例如,让我们看一个具体的例子。我们有两个用户,迈克和埃琳娜,如下图所示:
请注意以下内容:
- 迈克和埃琳娜都对文档 1和文档 2表现出了完全相同的兴趣。
- 根据他们相似的历史模式,我们可以将他们两个都归类为相似用户。
- 如果埃琳娜现在阅读文档 3,那么我们也可以建议迈克阅读文档 3。
请注意,根据用户历史记录向用户推荐物品的策略并不总是有效的。
假设埃琳娜和迈克对文档 1都表现出了兴趣,这是关于摄影的(因为他们对摄影有共同的爱好)。此外,他们两个都对文档 2表现出了兴趣,这是关于云计算的,同样是因为他们对这个主题有兴趣。根据协同过滤,我们将他们归类为相似用户。现在埃琳娜开始阅读文档 3,这是一本关于女性时尚的杂志。如果我们遵循协同过滤算法,我们会建议迈克也阅读,而他可能对此并不感兴趣。
回到 2012 年,美国超市 Target 正在尝试使用协同过滤为购买者推荐产品。该算法根据他们的档案将一个父亲归类为他的十几岁的女儿。结果,Target 最终向父亲发送了一个关于尿布、婴儿奶粉和婴儿床的折扣券。他并不知道他女儿怀孕了。
请注意,协同过滤算法不依赖于任何其他信息,是一种独立的算法,基于用户的变化行为和协同推荐。
混合推荐引擎
到目前为止,我们已经讨论了基于内容和基于协同过滤的推荐引擎。这两种类型的推荐引擎可以结合起来创建混合推荐引擎。为此,我们按照以下步骤进行:
- 生成物品的相似矩阵。
- 生成用户的偏好矩阵。
- 生成推荐。
让我们逐步了解这些步骤。
生成物品的相似矩阵
在混合推荐中,我们首先通过使用基于内容的推荐创建物品的相似矩阵。这可以通过使用共现矩阵或使用任何距离度量来量化物品之间的相似性来实现。
假设我们目前有五种物品。使用基于内容的推荐,我们生成一个捕捉物品之间相似性的矩阵,看起来像这样:
让我们看看如何将这个相似矩阵与偏好矩阵结合起来生成推荐。
生成用户的参考向量。
基于系统中每个用户的历史,我们将产生一个捕捉这些用户兴趣的偏好向量。
假设我们想为名为KentStreetOnline的在线商店生成推荐,该商店销售 100 种独特的物品。KentStreetOnline 很受欢迎,拥有 100 万活跃订阅者。重要的是要注意,我们只需要生成一个 100x100 维度的相似矩阵。我们还需要为每个用户生成一个偏好向量;这意味着我们需要为 100 万用户中的每一个生成 100 万个偏好向量。
性能向量的每个条目表示对项目的偏好。第一行的值表示项目 1的偏好权重为4。例如,第二行的值表示对项目 2没有偏好。
以下是图形显示:
现在,让我们看看如何基于相似矩阵 S 和用户偏好矩阵 U 生成推荐。
生成推荐
为了进行推荐,我们可以将这些矩阵相乘。用户更有可能对经常与他们给出高评分的物品共现的物品感兴趣:
Matrix[S] x Matrix[U] = Matrix[R]
这个计算在以下图表中显示:
为每个用户生成一个单独的结果矩阵。推荐矩阵*Matrix[R]*中的数字量化了用户对每个物品的预测兴趣。例如,在结果矩阵中,第四个物品的数字最高,为 58。因此,这个物品对这个特定用户来说是高度推荐的。
现在,让我们来看看不同推荐系统的局限性。
了解推荐系统的局限性
推荐引擎使用预测算法向一群用户建议推荐。这是一种强大的技术,但我们应该意识到它的局限性。让我们来看看推荐系统的各种局限性。
冷启动问题
显然,为了使协同过滤起作用,我们需要有关用户偏好的历史数据。对于新用户,我们可能没有任何数据,因此我们的用户相似性算法将基于可能不准确的假设。对于基于内容的推荐,我们可能不会立即获得有关新物品的详细信息。需要有关物品和用户的数据来生成高质量推荐的要求被称为冷启动问题。
元数据要求
基于内容的方法需要明确的物品描述来衡量相似性。这种明确的详细描述可能不可用,影响预测的质量。
数据稀疏问题
在大量物品中,用户只会对少数物品进行评分,导致非常稀疏的用户/物品评分矩阵。
亚马逊有大约十亿用户和十亿物品。据说亚马逊的推荐引擎是世界上数据最稀疏的推荐引擎。
由于社交影响而产生的偏见
社交影响在推荐系统中可以起到重要作用。社交关系可以被视为影响用户偏好的因素。朋友倾向于购买类似的物品并给出类似的评分。
有限的数据
有限数量的评论使得推荐系统难以准确衡量用户之间的相似性。
实际应用领域
让我们看看推荐系统在实际世界中的应用:
- Netflix 上的电影有三分之二是推荐的。
- 亚马逊的三分之一的销售额来自推荐。
- 在 Google 新闻上,推荐引擎产生的点击率增加了 38%。
- 尝试预测用户对物品的偏好是基于其他物品的过去评分。
- 他们可以根据学生的需求和偏好为大学生推荐课程。
- 他们可以在在线求职门户网站上将简历与工作匹配。
现在,让我们尝试使用推荐引擎来解决一个现实世界的问题。
实际示例 - 创建推荐引擎
让我们构建一个可以向一群用户推荐电影的推荐引擎。我们将使用明尼苏达大学 GroupLens 研究小组收集的数据。
按照以下步骤:
- 首先,我们将导入相关的包:
import pandas as pd import numpy as np
- 现在,让我们导入
user_id
和item_id
数据集:
df_reviews = pd.read_csv('reviews.csv') df_movie_titles = pd.read_csv('movies.csv',index_col=False)
- 我们通过电影 ID 合并了这两个 DataFrame:
df = pd.merge(df_users, df_movie_titles, on='movieId')
在运行上述代码后,df DataFrame 的标题如下:
列的详细信息如下:
- userid:每个用户的唯一 ID
- 电影 id:每部电影的唯一 ID
- rating:每部电影的评分从 1 到 5
- timestamp:电影被评分的时间戳
- title:电影的标题
- genres:电影的流派
- 为了了解输入数据的摘要趋势,让我们使用
groupby
按title
和rating
列计算每部电影的平均评分和评分次数:
。
- 现在让我们为推荐引擎准备数据。为此,我们将把数据集转换为一个具有以下特征的矩阵:
- 电影标题将成为列。
User_id
将成为索引。- 评分将是值。
我们将使用 DataFrame 的pivot_table
函数来完成它:
movie_matrix = df.pivot_table(index='userId', columns='title', values='rating')
请注意,上述代码将生成一个非常稀疏的矩阵。
- 现在,让我们使用我们创建的推荐矩阵来推荐电影。为此,让我们考虑一个特定的用户,他观看了电影Avatar (2009)。首先,我们将找到所有对*Avatar (2009)*表现出兴趣的用户:
Avatar_user_rating = movie_matrix['Avatar (2009)'] Avatar_user_rating = Avatar_user_rating.dropna() Avatar_user_rating.head()
- 现在,让我们尝试推荐与*Avatar (2009)*相关的电影。为此,我们将计算
Avatar_user_rating
DataFrame 与movie_matrix
的相关性,如下所示:
similar_to_Avatar=movie_matrix.corrwith(Avatar_user_rating) corr_Avatar = pd.DataFrame(similar_to_Avatar, columns=['correlation']) corr_Avatar.dropna(inplace=True) corr_Avatar = corr_Avatar.join(df_ratings['number_of_ratings']) corr_Avatar.head()
这会产生以下输出:
这意味着我们可以将这些电影作为用户的推荐。
总结
在本章中,我们学习了推荐引擎。我们研究了根据我们试图解决的问题选择合适的推荐引擎。我们还研究了如何准备数据以创建相似性矩阵,以供推荐引擎使用。我们还学习了推荐引擎如何用于解决实际问题,比如根据用户过去的模式推荐电影。
在下一章中,我们将专注于用于理解和处理数据的算法。
第三部分:高级主题
正如名称所示,本节将涉及算法的更高级概念。密码学和大规模算法是本节的重点亮点。本节的最后一章,也是本书的最后一章,探讨了在实施这些算法时应该牢记的实际考虑因素。本节包括的章节有:
- 第十一章,数据算法
- 第十二章,密码学
- 第十三章,大规模算法
- 第十四章,实际考虑因素
第十一章:数据算法
本章讨论了数据中心算法的三个方面:存储、流式处理和压缩。本章首先简要概述了数据中心算法,然后讨论了可以用于数据存储的各种策略。接下来,描述了如何将算法应用于流式数据,然后讨论了压缩数据的不同方法。最后,我们将学习如何使用本章中开发的概念来使用最先进的传感器网络监测高速公路上行驶车辆的速度。
通过本章的学习,您应该能够理解设计各种数据中心算法所涉及的概念和权衡。
本章讨论了以下概念:
- 数据分类
- 数据存储算法
- 如何使用算法来压缩数据
- 如何使用算法来流式处理数据
让我们首先介绍基本概念。
数据算法简介
无论我们是否意识到,我们生活在一个大数据时代。只需了解一下不断产生的数据量,看一下谷歌在 2019 年发布的一些数字就可以了。众所周知,Google Photos 是谷歌创建的存储照片的多媒体库。2019 年,平均每天有 12 亿张照片和视频上传到 Google Photos。此外,每天平均有 400 小时的视频(相当于 1 PB 的数据)上传到 YouTube。我们可以肯定地说,正在产生的数据量简直是爆炸式增长。
当前对数据驱动算法的兴趣是因为数据包含有价值的信息和模式。如果以正确的方式使用,数据可以成为政策制定、营销、治理和趋势分析的基础。
由于处理数据的算法变得越来越重要,有明显的原因。设计能够处理数据的算法是一个活跃的研究领域。毫无疑问,探索最佳利用数据以提供一些可量化的好处是全世界各种组织、企业和政府的关注焦点。但原始形式的数据很少有用。要从原始数据中挖掘信息,需要对其进行处理、准备和分析。
为此,我们首先需要将其存储在某个地方。高效存储数据的方法变得越来越重要。请注意,由于单节点系统的物理存储限制,大数据只能存储在由高速通信链路连接的多个节点组成的分布式存储中。因此,对于学习数据算法来说,首先看不同的数据存储算法是有意义的。
首先,让我们将数据分类为各种类别。
数据分类
让我们来看看在设计数据算法的背景下如何对数据进行分类。正如在第二章中讨论的那样,算法中使用的数据结构,量化数据的容量、多样性和速度可以用来对其进行分类。这种分类可以成为设计数据算法的基础,用于其存储和处理。
让我们在数据算法的背景下逐个查看这些特征:
- 容量 量化了需要在算法中存储和处理的数据量。随着容量的增加,任务变得数据密集,并需要足够的资源来存储、缓存和处理数据。大数据是一个模糊定义的术语,用来描述无法由单个节点处理的大量数据。
- 速度定义了新数据生成的速率。通常,高速数据被称为“热数据”或“热流”,低速数据被称为“冷流”或简单地称为“冷数据”。在许多应用中,数据将是热流和冷流的混合,首先需要准备并合并到一个表中,然后才能与算法一起使用。
- 多样性指的是需要将不同类型的结构化和非结构化数据合并到一个表中,然后才能被算法使用。
下一节将帮助我们理解涉及的权衡,并在设计存储算法时提出各种设计选择。
数据存储算法介绍
可靠和高效的数据存储库是分布式系统的核心。如果这个数据存储库是为分析而创建的,那么它也被称为数据湖。数据存储库将来自不同领域的数据汇集到一个地方。让我们首先了解分布式存储库中与数据存储相关的不同问题。
了解数据存储策略
在数字计算的最初几年,设计数据存储库的常规方式是使用单节点架构。随着数据集的不断增大,数据的分布式存储现在已经成为主流。在分布式环境中存储数据的正确策略取决于数据的类型、预期的使用模式以及其非功能性需求。为了进一步分析分布式数据存储的需求,让我们从**一致性可用性分区容忍(CAP)**定理开始,这为我们提供了制定分布系统数据存储策略的基础。
介绍 CAP 定理
1998 年,Eric Brewer 提出了一个定理,后来被称为 CAP 定理。它突出了设计分布式存储系统涉及的各种权衡。
为了理解 CAP 定理,首先让我们定义分布式存储系统的以下三个特性:一致性、可用性和分区容忍。CAP 实际上是由这三个特性组成的首字母缩写:
- 一致性(简称 C):分布式存储由各种节点组成。这些节点中的任何一个都可以用于读取、写入或更新数据存储库中的记录。一致性保证在某个时间t[1],无论我们使用哪个节点来读取数据,我们都会得到相同的结果。每个读操作要么返回跨分布式存储库一致的最新数据,要么给出错误消息。
- 可用性(简称 A):可用性保证分布式存储系统中的任何节点都能立即处理请求,无论是否具有一致性。
- 分区容忍(简称 P):在分布式系统中,多个节点通过通信网络连接。分区容忍保证在一小部分节点(一个或多个)之间的通信失败的情况下,系统仍然可以正常运行。请注意,为了保证分区容忍,数据需要在足够数量的节点上复制。
使用这三种特性,CAP 定理仔细总结了分布系统的架构和设计中涉及的权衡。具体来说,CAP 定理规定,在存储系统中,我们只能拥有以下两种特性中的两种:一致性或 C,可用性或 A,以及分区容忍性或 P。
这在以下图表中显示:
CAP 定理也意味着我们可以有三种类型的分布式存储系统:
- CA 系统(实现一致性-可用性)
- AP 系统(实现可用性-分区容忍)
- CP 系统(实现一致性-分区容忍)
让我们依次来看看它们。
CA 系统
传统的单节点系统是 CA 系统。这是因为如果我们没有分布式系统,那么我们就不需要担心分区容忍性。在这种情况下,我们可以拥有既有一致性又有可用性的系统,即 CA 系统。
传统的单节点数据库,如 Oracle 或 MySQL,都是 CA 系统的例子。
AP 系统
AP 系统是为可用性调整的分布式存储系统。设计为高度响应的系统,它们可以牺牲一致性,以适应高速数据。这意味着这些是设计为立即处理用户请求的分布式存储系统。典型的用户请求是读取或写入快速变化的数据。典型的 AP 系统用于实时监控系统,如传感器网络。
高速分布式数据库,如 Cassandra,是 AP 系统的良好例子。
让我们看看 AP 系统可以在哪些地方使用。如果加拿大交通部想要通过在渥太华一条高速公路上安装的传感器网络监控交通情况,建议使用 AP 系统来实现分布式数据存储。
CP 系统
CP 系统具有一致性和分区容忍性。这意味着这些是调整为在读取过程可以获取值之前保证一致性的分布式存储系统。
CP 系统的典型用例是当我们想要以 JSON 格式存储文档文件时。像 MongoDB 这样的文档数据存储系统是为分布式环境中的一致性而调整的 CP 系统。
分布式数据存储越来越成为现代 IT 基础设施中最重要的部分。分布式数据存储应该根据数据的特性和我们想要解决的问题的要求进行精心设计。将数据存储分类为 CA、AP 和 CP 系统有助于我们理解在设计数据存储系统时涉及的各种权衡。
现在,让我们来看看流数据算法。
呈现流数据算法
数据可以被分类为有界或无界。有界数据是静态数据,通常通过批处理过程处理。流式处理基本上是对无界数据进行数据处理。让我们看一个例子。假设我们正在分析银行的欺诈交易。如果我们想要查找 7 天前的欺诈交易,我们必须查看静态数据;这是一个批处理的例子。
另一方面,如果我们想要实时检测欺诈,那就是流式处理的一个例子。因此,流数据算法是处理数据流的算法。其基本思想是将输入数据流分成批次,然后由处理节点处理。流算法需要具有容错能力,并且应该能够处理数据的传入速度。随着对实时趋势分析的需求增加,对流处理的需求也在这些天增加。请注意,为了使流处理工作,数据必须快速处理,而在设计算法时,这一点必须始终牢记在心。
流应用
流数据及其有意义的利用有许多应用。一些应用如下:
- 欺诈检测
- 系统监控
- 智能订单路由
- 实时仪表板
- 高速公路上的交通传感器
- 信用卡交易
- 用户在多用户在线游戏中移动
现在,让我们看看如何使用 Python 实现流处理。
呈现数据压缩算法
数据压缩算法参与了减小数据大小的过程。
在这一章中,我们将深入研究一种名为无损压缩算法的特定数据压缩算法。
无损压缩算法
这些算法能够以一种可以在解压缩时不丢失信息的方式压缩数据。当重要的是在解压缩后检索到确切的原始文件时,它们被使用。无损压缩算法的典型用途如下:
- 压缩文件
- 压缩和打包源代码和可执行文件
- 将大量小文件转换为少量大文件
了解无损压缩的基本技术
数据压缩是基于这样一个原则,即大多数数据使用的位数比其熵所指示的最佳位数多。回想一下,熵是一个用来指定数据所携带信息的术语。这意味着可以有更优化的位表示相同信息。探索和制定更有效的位表示成为设计压缩算法的基础。无损数据压缩利用这种冗余来压缩数据而不丢失任何信息。在 80 年代后期,Ziv 和 Lempel 提出了基于字典的数据压缩技术,可以用于实现无损数据压缩。由于其速度和良好的压缩率,这些技术一炮而红。这些技术被用于创建流行的基于 Unix 的compress工具。此外,普遍存在的gif
图像格式使用了这些压缩技术,因为它们可以用较少的位数表示相同的信息,节省了空间和通信带宽。这些技术后来成为开发zip
实用程序及其变体的基础。调制解调器中使用的压缩标准 V.44 也是基于它。
现在让我们逐一查看即将到来的部分中的技术。
Huffman 编码
Huffman 编码是压缩数据的最古老方法之一,它基于创建 Huffman 树,用于对数据进行编码和解码。Huffman 编码可以通过利用某些数据(例如字母表的某些字符)在数据流中更频繁地出现这一事实,以更紧凑的形式表示数据内容。通过使用不同长度的编码(对于最常见的字符较短,对于最不常见的字符较长),数据占用的空间更少。
现在,让我们学习一些与 Huffman 编码相关的术语:
- **编码:**在数据的上下文中,编码表示将数据从一种形式表示为另一种形式的方法。我们希望结果形式简洁。
- **码字:**编码形式中的特定字符称为码字。
- **固定长度编码:**每个编码字符,即码字,使用相同数量的位。
- **可变长度编码:**码字可以使用不同数量的位。
- **代码评估:**这是每个码字的预期位数。
- **前缀自由码:**这意味着没有码字是任何其他码字的前缀。
- **解码:**这意味着可变长度编码必须不受任何前缀的限制。
要理解最后两个术语,您首先需要查看此表:
字符 | 频率 | 固定长度编码 | 可变长度编码 |
L | .45 | 000 | 0 |
M | .13 | 001 | 101 |
N | .12 | 010 | 100 |
X | .16 | 011 | 111 |
Y | .09 | 100 | 1101 |
Z | .05 | 101 | 1100 |
现在,我们可以推断以下内容:
- **固定长度编码:**该表的固定长度编码为 3。
- **可变长度编码:**该表的可变长度编码为45(1) + .13(3) + .12(3) + .16(3) + .09(4) + .05(4) = 2.24。
以下图表显示了从上面的例子创建的 Huffman 树:
请注意,Huffman 编码是将数据转换为 Huffman 树以实现压缩。解码或解压缩将数据恢复到原始格式。
一个实际的例子- Twitter 实时情感分析
据说 Twitter 每秒有近 7000 条关于各种话题的推文。让我们尝试构建一个情感分析器,可以实时捕捉来自不同新闻来源的新闻的情绪。我们将从导入所需的包开始:
- 导入所需的包:
import tweepy,json,time import numpy as np import pandas as pd import matplotlib.pyplot as plt from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer analyzer = SentimentIntensityAnalyzer()
请注意,我们使用以下两个包:
- VADER情感分析,代表Valence Aware Dictionary and Sentiment Reasoner。这是一种流行的基于规则的情感分析工具,专为社交媒体开发。如果您以前从未使用过它,那么您首先需要运行以下命令:
pip install vaderSentiment
Tweepy
,这是一个用于访问 Twitter 的基于 Python 的 API。同样,如果您以前从未使用过它,您需要首先运行这个:
pip install Tweepy
- 下一步有点棘手。您需要向 Twitter 发出请求,创建一个开发者帐户,以获取对推文的实时流的访问权限。一旦您获得 API 密钥,您可以用以下变量表示它们:
twitter_access_token = <your_twitter_access_token> twitter_access_token_secret = <your_twitter_access_token_secret> twitter_consumer_key = <your_consumer_key> twitter_consumer_secret = <your_twitter_consumer_secret>
- 然后,让我们配置
Tweepy
API 的身份验证。为此,我们需要提供先前创建的变量:
auth = tweepy.OAuthHandler(twitter_consumer_key, twitter_consumer_secret) auth.set_access_token(twitter_access_token, twitter_access_token_secret) api = tweepy.API(auth, parser=tweepy.parsers.JSONParser())
- 现在是有趣的部分。我们将选择我们想要监控情感分析的新闻来源的 Twitter 句柄。在这个例子中,我们选择了以下新闻来源:
news_sources = ("@BBC", "@ctvnews", "@CNN","@FoxNews", "@dawn_com")
- 现在,让我们创建主循环。这个循环将从一个名为
array_sentiments
的空数组开始,用于保存情感。然后,我们将循环遍历所有五个新闻来源,并收集每个 100 条推文。然后,对于每条推文,我们将计算其极性:
- 现在,让我们创建一个图表,显示来自这些个别新闻来源的新闻的极性:
请注意,每个新闻来源都用不同的颜色表示。
- 现在,让我们看一下摘要统计信息:
上述数字总结了情感的趋势。例如,BBC 的情感被发现是最积极的,而加拿大新闻频道 CTVnews 似乎带有最消极的情绪。
摘要
在本章中,我们研究了以数据为中心的算法的设计。我们关注了数据为中心算法的三个方面:存储、压缩和流式处理。
我们研究了数据特征如何决定数据存储设计。我们研究了两种不同类型的数据压缩算法。然后,我们研究了一个实际示例,说明了如何使用数据流算法来计算文本数据流中的单词计数。
在下一章中,我们将研究加密算法。我们将学习如何利用这些算法的力量来保护交换和存储的消息。
第十二章:密码学
本章向您介绍了与密码学相关的算法。我们将首先介绍背景,然后讨论对称加密算法。然后我们将解释消息摘要 5(MD5)算法和安全哈希算法(SHA),并介绍实施对称算法的局限性和弱点。接下来,我们将讨论非对称加密算法以及它们用于创建数字证书的方式。最后,我们将提供一个总结所有这些技术的实际示例。
通过本章的学习,您将对与密码学相关的各种问题有一个基本的了解。
本章讨论以下主题:
- 密码学简介
- 了解密码学技术的类型
- 示例-部署机器学习模型时的安全问题
让我们先从基本概念开始。
密码学简介
保护秘密的技术已经存在了几个世纪。最早的保护和隐藏数据免受敌人侵害的尝试可以追溯到埃及的古代铭文,那里使用了只有少数信任的人知道的特殊字母表。这种早期的安全形式被称为模糊,今天仍然以不同的形式使用。为了使这种方法有效,保护字母表的含义至关重要。随后,在一战和二战中,寻找保护重要消息的绝对可靠方法变得非常重要。20 世纪末,随着电子和计算机的引入,开发了复杂的算法来保护数据,从而产生了一个全新的领域,称为密码学。本章讨论了密码学的算法方面。这些算法的目的是允许两个进程或用户之间进行安全数据交换。密码算法找到了使用数学函数来确保所述安全目标的策略。
了解最弱链接的重要性
有时,在构建数字基础设施的安全性时,我们过分强调个体实体的安全性,而忽视了端到端的安全性。这可能导致我们忽视系统中的一些漏洞和弱点,这些漏洞和弱点后来可能被黑客利用来获取敏感数据。要记住的重要一点是,整个数字基础设施的强度取决于它的最弱链接。对于黑客来说,这个最弱链接可以提供对数字基础设施中敏感数据的后门访问。在某个程度上,加固前门而不关闭所有后门并没有太多好处。
随着数字基础设施的算法和技术变得越来越复杂,攻击者也在不断升级他们的技术。要记住的一点是,攻击者入侵数字基础设施最简单的方法之一就是利用这些漏洞来获取敏感信息。
2014 年,对加拿大联邦研究机构——国家研究委员会(NRC)的网络进行了一次网络攻击,据估计造成了数亿美元的损失。攻击者能够窃取数十年的研究数据和知识产权材料。他们利用了网页服务器上使用的 Apache 软件中的一个漏洞来获取对敏感数据的访问权限。
在本章中,我们将重点介绍各种加密算法的漏洞。
让我们首先来看看使用的基本术语。
基本术语
让我们先来看看与密码学相关的基本术语:
- 密码:执行特定加密功能的算法。
- 明文:可以是文本文件、视频、位图或数字化语音的原始数据。在本章中,我们将表示明文为P。
- 密文:应用加密后得到的混乱文本。在本章中,我们将其表示为C。
- 密码套件:一组或套件的加密软件组件。当两个独立节点想要使用加密交换消息时,它们首先需要就密码套件达成一致。这对于确保它们使用完全相同的加密函数实现非常重要。
- 加密:将明文P转换为密文C的过程称为加密。在数学上,它表示为encrypt§ = C。
- 解密:将密文转换回明文的过程。在数学上,它表示为decrypt© = P。
- 密码分析:用于分析加密算法强度的方法。分析人员试图在没有秘密访问的情况下恢复明文。
- 个人可识别信息(PII):PII 是指可以单独使用或与其他相关数据一起用于追踪个人身份的信息。一些例子包括受保护的信息,如社会安全号码、出生日期或母亲的婚前姓氏。
了解安全需求
首先了解系统的确切安全需求是很重要的。了解这一点将帮助我们使用正确的加密技术,并发现系统中的潜在漏洞。为了做到这一点,我们首先需要更好地了解系统的需求。为了了解安全需求,我们执行以下三个步骤:
- 识别实体。
- 确立安全目标。
- 了解数据的敏感性。
让我们逐一看看这些步骤。
识别实体
识别实体的一种方法是首先回答以下四个问题,这将帮助我们了解系统在安全环境中的需求:
- 哪些应用程序需要受到保护?
- 我们要保护应用程序免受谁的攻击?
- 我们应该在哪里保护它们?
- 我们为什么要保护它们?
一旦我们更好地了解这些要求,我们就可以确立我们数字系统的安全目标。
确立安全目标
通常使用加密算法来满足一个或多个安全目标:
- 认证:简单来说,认证是我们如何证明用户是其所声称的人的方式。通过认证的过程,我们确保用户的身份得到验证。认证的过程始于用户提供其身份。接着是提供只有用户知道的信息,因此只能由他们产生。
- 机密性:需要受到保护的数据称为敏感数据。机密性是将敏感数据限制为仅授权用户的概念。为了在传输或存储过程中保护敏感数据的机密性,您需要使数据变得不可读,除了授权用户之外。这是通过使用加密算法来实现的,我们将在本章后面讨论。
- 完整性:完整性是指建立数据在传输或存储过程中没有被任何方式改变的过程。例如,TCP/IP(传输控制协议/互联网协议)使用校验和或循环冗余校验(CRC)算法来验证数据的完整性。
- 不可否认性:不可否认性是指信息发送方收到数据已被接收的确认,接收方收到发送方身份的确认的概念。这提供了无可辩驳的证据,证明了消息的发送或接收,这可以在以后用来证明数据的接收和通信中的故障点。
每个程序员都应该知道的 40 个算法(三)(4)https://developer.aliyun.com/article/1506362