mapreduce报错(导致mapreduce性能♥差的主要原因)

网站运维2个月前发布 Ame
276 0

服务器分布式和集群的区别

简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。  例如:  如果一个任务由10个子任务组成,每个子任务单独执行需1小时,则在一台服务器上执行改任务需10小时。  采用分布式方案,提供10台服务器,每台服务器只负责处理一个子任务,不考虑子任务间的依赖关系,执行完这个任务只需一个小时。mapreduce报错(导致mapreduce性能♥差的主要原因)(这种工作模式的一个典型代表就是Hadoop的Map/Reduce分布式计算模型)  而采用集群方案,同样提供10台服务器,每台服务器都能独立处理这个任务。假设有10个任务同时到达,10个服务器将同时工作,10小后,10个任务同时完成,这样,整身来看,还是1小时内完成一个任务!   以下是摘抄自网络文章:  一、集群概念  1. 两大关键特性  集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台。在客户端看来,一个集群就象是一个服务实体,但事实上集群由一组服务实体组成。与单一服务实体相比较,集群提供了以下两个关键特性:  · 可扩展性--集群的性能不限于单一的服务实体,新的服务实体可以动态地加入到集群,从而增强集群的性能。  · 高可用性--集群通过服务实体冗余使客户端免于轻易遇到out of service的警告。在集群中,同样的服务可以由多个服务实体提供。如果一个服务实体失败了,另一个服务实体会接管失败的服务实体。集群提供的从一个出 错的服务实体恢复到另一个服务实体的功能增强了应用的可用性。  2. 两大能力   为了具有可扩展性和高可用性特点,集群的必须具备以下两大能力:  · 负载均衡--负载均衡能把任务比较均衡地分布到集群环境下的计算和网络资源。  · 错误恢复--由于某种原因,执行某个任务的资源出现故障,另一服务实体中执行同一任务的资源接着完成任务。这种由于一个实体中的资源不能工作,另一个实体中的资源透明的继续完成任务的过程叫错误恢复。  负载均衡和错误恢复都要求各服务实体中有执行同一任务的资源存在,而且对于同一任务的各个资源来说,执行任务所需的信息视图(信息上下文)必须是一样的。  3. 两大技术  实现集群务必要有以下两大技术:  · 集群地址--集群由多个服务实体组成,集群客户端通过访问集群的集群地址获取集群内部各服务实体的功能。具有单一集群地址(也叫单一影像)是集群的一个基本特征。维护集群地址的设置被称为负载均衡器。负载均衡器内部负责管理各个服务实体的加入和退出,外部负责集群地址向内部服务实体地址的转换。有的负载均衡器实现真正的负载均衡算法,有的只支持任务的转换。只实现任务转换的负载均衡器适用于支持ACTIVE-STANDBY的集群环境,在那里,集群中只有一个服务实体工作,当正在工作的服务实体发生故障时,负载均衡器把后来的任务转向另外一个服务实体。  · 内部通信--为了能协同工作、实现负载均衡和错误恢复,集群各实体间必须时常通信,比如负载均衡器对服务实体心跳测试信息、服务实体间任务执行上下文信息的通信。  具有同一个集群地址使得客户端能访问集群提供的计算服务,一个集群地址下隐藏了各个服务实体的内部地址,使得客户要求的计算服务能在各个服务实体之间分布。内部通信是集群能正常运转的基础,它使得集群具有均衡负载和错误恢复的能力。  二、集群分类  Linux集群主要分成三大类(高可用集群, 负载均衡集群,科学计算集群)高可用集群(High Availability Cluster)负载均衡集群(Load Balance Cluster)科学计算集群(High Performance Computing Cluster)  具体包括:  Linux High Availability 高可用集群   (普通两节点双机热备,多节点HA集群,RAC, shared, share-nothing集群等)  Linux Load Balance 负载均衡集群    (LVS等….)  Linux High Performance Computing 高性能科学计算集群    (Beowulf 类集群….)  三、详细介绍  1. 高可用集群(High Availability Cluster)  常见的就是2个节点做成的HA集群,有很多通俗的不科学的名称,比如"双机热备","双机互备","双机"。  高可用集群解决的是保障用户的应用程序持续对外提供服务的能力。 (请注意高可用集群既不是用来保护业务数据的,保护的是用户的业务程序对外不间断提供服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度)。  2. 负载均衡集群(Load Balance Cluster)  负载均衡系统:集群中所有的节点都处于活动状态,它们分摊系统的工作负载。一般Web服务器集群、数据库集群和应用服务器集群都属于这种类型。  负载均衡集群一般用于相应网络请求的网页服务器,数据库服务器。这种集群可以在接到请求时,检查接受请求较少,不繁忙的服务器,并把请求转到这些服务器上。从检查其他服务器状态这一点上看,负载均衡和容错集群很接近,不同之处是数量上更多。  3. 科学计算集群(High Performance Computing Cluster)  高性能计算(High Perfermance Computing)集群,简称HPC集群。这类集群致力于提供单个计算机所不能提供的强大的计算能力。  3.1 高性能计算分类     3.1.1 高吞吐计算(High-throughput Computing)  有一类高性能计算,可以把它分成若干可以并行的子任务,而且各个子任务彼此间没有什么关联。象在家搜寻外星人( SETI@HOME — Search for Extraterrestrial Intelligence at Home )就是这一类型应用。这一项目是利用Internet上的闲置的计算资源来搜寻外星人。SETI项目的服务器将一组数据和数据模式发给Internet上参加SETI的计算节点,计算节点在给定的数据上用给定的模式进行搜索,然后将搜索的结果发给服务器。服务器负责将从各个计算节点返回的数据汇集成完整的 数据。因为这种类型应用的一个共同特征是在海量数据上搜索某些模式,所以把这类计算称为高吞吐计算。所谓的Internet计算都属于这一类。按照 Flynn的分类,高吞吐计算属于SIMD(Single Instruction/Multiple Data)的范畴。  3.1.2 分布计算(Distributed Computing)  另一类计算刚好和高吞吐计算相反,它们虽然可以给分成若干并行的子任务,但是子任务间联系很紧密,需要大量的数据交换。按照Flynn的分类,分布式的高性能计算属于MIMD(Multiple Instruction/Multiple Data)的范畴。  四、分布式(集群)与集群的联系与区别  分布式是指将不同的业务分布在不同的地方;而集群指的是将几台服务器集中在一起,实现同一业务。  分布式中的每一个节点,都可以做集群。 而集群并不一定就是分布式的。   举例:就比如新浪网,访问的人多了,他可以做一个群集,前面放一个响应服务器,后面几台服务器完成同一业务,如果有业务访问的时候,响应服务器看哪台服务器的负载不是很重,就将给哪一台去完成。   而分布式,从窄意上理解,也跟集群差不多, 但是它的组织比较松散,不像集群,有一个组织性,一台服务器垮了,其它的服务器可以顶上来。  分布式的每一个节点,都完成不同的业务,一个节点垮了,那这个业务就不可访问了。

Hadoop适用于实时数据库吗

hadoop一般是应用于冷数据处理,对于实时数据,如果非要使用,可以变着方法使用。

方法一:在hadoop上使用hbase数据库,以为hbase是不走Map/Reduce的,所以操作在毫秒级。

方法二:将业务数据用程序分成实时数据和冷数据,实时数据存于关系数据库,冷数据存到hadoop。比如:将最近一个月的数据存到关系数据库,用做实时响应业务处理。将一个月以前的数据存到hadoop,用作历史数据查询以及统计分析,数据挖掘等。

未来想做与java有关的工作,已学jav

– Web 基础

曾经开源中国创始人红薯写了一篇文章「初学 Java Web 开发,请远离各种框架,从 Servlet 开发」,我觉得他说的太对了,在如今 Java 开发中,很多开发者只知道怎么使用框架,但根本不懂 Web 的一些知识点,其实框架很多,但都基本是一个套路,所以在你学习任何框架前,请把 Web 基础打好,把 Web 基础打好了,看框架真的是如鱼得水。

关于 Http 协议,这篇文章就写得很清楚:[Http协议]( "HTTP协议")

各种web容器的使用如Tomcat、jetty。web服务器ngnix等。

– Web 主流框架

Java Web 框架多如牛毛,目前主流的还是spring全家桶,spring其核心思想就是 IOC 和 AOP,推荐学习Spring boot,SpringBoot 弥补了 Spring 配置上的缺点,再也不用为繁杂的 xml 费劲精力了,堪称是 Java 后端开发的颠覆者。

但是不可沉迷于框架,知其然而不知其所以然,可以继续深入学习Spring、SpringMVC、Mybatis、JPA等。

– Web 框架进阶

SpringCloud 是一个微服务架构,能够将项目按照业务分成一个个微服务,每个微服务都可独立部署,服务之间互相协调。当一个项目越来越大时,随之而来的是越来越难以维护,此时将项目拆分成若干个微服务、单独维护、单独部署,也可以降低项目不同业务间的耦合度。推荐书籍「Spring Cloud 与 Docker 微服务架构实战」,这本书将 Docker 与微服务完美地结合在一起,堪称完美!

多线程是否有意义

就老夫多年的JAVA经验来看,多线程无论应付面试还是实际中开发,都是很有必要的!

先看看什么是线程?线程是CPU调度的最小单位!换句话说你所有的数据计算,赋值,交换等都是由线程携带数据让CPU来执行的!

关于CPU执行我来打几个比方:(不懂你来打我)

单核CPU单线程:你一个人(单核CPU)吃一盘包子(单线程),一口气吃完了(CPU效率高,没有阻塞)

单核CPU的多线程:你一个人吃一桌菜(多个线程),上了一碗砂锅,但是太烫了你只能等着(线程阻塞,CPU浪费了),然后上了一盘四个包子你吃完了,配合着砂锅,花生米等菜,尽管砂锅还是烫,但是你可以吃包子和花生米,所以你总的吃饭时间变短了(CPU使用效率提高,多个线程轮换执行,不再被单个线程阻塞)!

多核CPU多线程:原来一个人吃一盘四个包子需要四分钟,但是现在有四个人(四核),只要一分钟就吃完了(多线程利用效率高,执行比单核快了四倍)!

多核CPU单线程:只上了一个包子,只能一个人吃,另外三个人干等着后面的包子(别的线程),CPU使用率极大的浪费,效率很低!

从例子来看,多核CPU多线程对于我们的执行速度和效率有了倍数级的提高!

如果只是简单的单线程不阻塞的情况,那么单核单线程就能提现出最大的执行效率!所以是否选用多线程还需要看实际情况来定!

在现在互联网快速发展的时代,数据量较大,各种页面请求也较多,服务器通常都是多进程多线程的执行才能应付不断增加的请求!

在现实编程中有哪些利用多线程的场景呢?

1,多阻塞的情况:JAVA是抢占式线程,如果在代码中有诸如读取文件,等待响应,阻塞IO的情况要用多线程减少阻塞引起的CPU使用率降低!

2,多任务可切割:比如需要下载一个G的文件,你可以分为五段,各不影响的下载,最后拼在一起成为⚘完整的文件,效率提高数倍!如果是从头到尾接受二进制流,那么不仅CPU资源浪费,而且效率很低!

3,各种连接池:数据库连接池,对象池等!

4,定时任务,批处理任务,日志同步等场景!

5,分布式计算,map reduce等,异步回调等!

怎么实现多线程的?实现runnable接口,或者继承thread类等!

多线程在JAVA的发展过程中占着举足轻重的作用,从最开始的并发包,栅栏,线程池,synchonize锁,lock锁,读写锁,callable回调,到JAVA7的fork-join框架,再到JAVA8的流式并行处理,可以说多线程技术使用越来越简单,但是功能越来越完善!

既然你买电脑喜欢讲八核,十六核!也就代表多线程技术会伴随着我们以后的所有数据处理中!

玩不转多线程,别说你会玩JAVA!

有兴趣的朋友请关注我,我们一起交流技术!不仅仅线程技术哦!

有没◐有运用机器学习处理文本分类问题的教程

这是python spaCy文本分类的使用教程,里面还有机器学习模型scikit-learn,你可以参考一下,有助于你解决问题,代码什么都有

文本是极其丰富的信息源。人们每分钟都会发送数亿封新电子邮件和短信。确实有大量的文本数据等待挖掘见解。但是,想要从所有文本数据中收集含义的数据科学家面临着一个挑战:由于它以非结构化形式存在,因此难以分析和处理。

在大数据分析Python中spaCy文本分类使用教程中,我们将研究如何使用有用的Python包spaCy(文档)将所有这些非结构化文本数据转换为对分析和自然语言处理更有用的内容。

完成此操作后,我们将能够从文本数据中得出有意义的模式和主题。这在多种数据科学应用程序中很有用:垃圾邮件过滤,支持通知单,社交媒体分析,上下文广告,查看客户反馈等。

具体来说,我们将对自然语言处理(NLP)进行更高层次的研究。然后,我们将完成一些重要的基本操作,以使用清理和分析文本数据spaCy。然后,我们将使用一些实际数据(亚马逊的Alexa智能家居扬声器的文本评论)深入研究文本分类,特别是Logistic回归分类。

什么是自然语言处理?

自然语言处理(NLP)是机器学习的一个分支,致力于处理,分析和有时生成人类语音(“自然语言”)。

毫无疑问,在确定文本字符串的含义方面,人类仍然比机器好得多。但是在数据科学中,我们经常会遇到太大的数据集,以至于人们无法在合理的时间内对其进行分析。我们还可能遇到没有人可以分析和响应一段文本输入的情况。在这种情况下,我们可以使用自然语言处理技术来帮助机器对文本的含义有所了解(并在必要时做出相应的响应)。

例如,自然语言处理在情感分析中被广泛使用,因为分析人员经常试图从大量文本数据中确定整体情感,这对于人类进行梳理是很费时的。它也用于广告匹配中-确定文本主体并自动分配相关广告。它用于聊天机器人,语音助手和其他需要机器理解并快速响应自然人类语言形式的输入的应用程序。

分析和处理文本 spaCy

spaCy是Python的开源自然语言处理库。它是专门为生产用途而设计的,它可以帮助我们构建可有效处理大量文本的应用程序。首先,让我们看一下spaCy可以处理的一些基本分析任务。

正在安装 spaCy

spaCy在继续进行操作之前,我们需要先安装它及其英语模型。我们可以使用以下命令行命令执行此操作:

pip install spacy

python -m spacy download en

我们也可以spaCy在Juypter Notebook中使用。不过,它不是Jupyter默认包含的预安装库之一,因此我们需要从笔记本计算机运行这些命令以将其spaCy安装在正确的Anaconda目录中。请注意,我们!在每个命令前面都使用来让Jupyter笔记本知道应将其作为命令行命令读取。

!pip install spacy

!python -m spacy download en

标记文本

标记化是将文本分成多个部分的过程,称为标记,并忽略标点符号(,。'')和空格之类的字符。spaCy的令牌生成器以Unicode文本形式接受输入,并输出一系列令牌对象。

让我们看一个简单的例子。假设我们有以下文本,并且我们希望对其进行标记化:

我们可以采用几种不同的方法来解决这个问题。第一种称为单词标记化,即将文本分解成单个单词。对于许多语言处理应用程序而言,这是至关重要的一步,因为它们通常需要以单个单词而不是更长的字符串形式输入。

在下面的代码中,我们将导入spaCy及其英语模型,并告诉我们将使用该模型进行自然语言处理。然后,我们将文本字符串分配给text。使用nlp(text),我们将处理该文本spaCy并将结果分配给名为的变量my_doc。

至此,我们的文本已经被标记化了,但是spaCy将标记化的文本存储为文档,我们希望以列表形式查看它,因此我们将创建一个for循环遍历文档的循环,并为其添加每个单词标记在文本字符串中找到一个名为的列表,token_list以便我们可以更好地了解单词的标记。

如我们所见,spaCy生成一个包含每个标记作为单独项目的列表。请注意,它已经认识到诸如之类的收缩实际上不应代表两个不同的词,因此已将它们分解为两个不同的标记。

首先,我们需要加载语言词典,在上面的示例中,我们使用English()类加载英语词典并创建nlp nlp对象。“ nlp”对象用于创建具有语言注释和各种nlp属性的文档。创建文档后,我们将创建令牌列表。

如果需要,我们还可以将文本分为句子而不是单词。这称为句子标记化。在执行句子标记化时,标记化程序会查找介于句子之间的特定字符,例如句点,惊叹号和换行符。对于句子标记化,我们将使用预处理管道,因为使用的句子预处理spaCy包括标记器,标记器,解析器和实体识别器,我们需要访问它们才能正确识别什么是句子,什么不是。

在下面的代码中,spaCy标记文本并创建一个Doc对象。这个Doc对象使用我们预处理管道的组件标记器,解析器和实体识别器将文本分解为组件。从该管道中,我们可以提取任何组件,但是在这里,我们将使用该sentencizer组件访问句子标记。

同样,spaCy已将文本正确解析为所需的格式,这一次输出了在源文本中找到的句子列表。

清理文本数据:删除停用词

我们使用的大多数文本数据将包含许多实际上对我们没有用的单词。这些称为停用词的词在人类语音中很有用,但对数据分析没有多大帮助。删除停用词可以帮助我们消除文本数据中的杂音和干扰,还可以加快分析时间(因为要处理的词更少)。

让我们看看spaCy默认情况下包含的停用词。我们将spaCy其英语模型中的停用词导入并分配给名为的变量,spacy_stopwords以便我们进行查看。

如我们所见,spaCy的默认停用词列表包括312个条目,每个条目都是一个单词。我们还可以看到为什么其中许多单词对数据分析没有用处。例如,尽管如此,过渡词对于理解句子的基本含义并不是必需的。而诸如“ 某人”之类的词太含糊,以至于无法用于NLP任务。

如果需要,我们还可以创建自己的自定义停用词列表。但是出于我们在大数据分析Python中spaCy文本分类使用教程中的目的,spaCy提供的默认列表会很好。

从我们的数据中删除停用词

现在我们有了停用词列表,让我们使用它从上一部分中正在研究的文本字符串中删除停用词。我们的文本已经存储在变量中text,因此我们不需要再次定义它。

相反,我们将创建一个名为的空列表filtered_sent,然后遍历doc变量以查看源文本中每个标记化的单词。spaCy包括一堆有用的标记属性,我们将使用其中的一个is_stop来识别不在停用词列表中的单词,然后将它们附加到filtered_sent列表中。

不难理解为什么停用词会有所帮助。删除它们将我们的原始文本简化为仅几个单词,这使我们对句子正在讨论的内容有了一个很好的了解:学习数据科学,并在此过程中避免挑战和挫折。

词汇规范化

词典标准化是文本数据清除过程中的又一步。总体而言,归一化将高维特征转换为适合任何机器学习模型的低维特征。出于这里的目的,我们只考虑lemmatization,即一种处理单词以使其根源减少的方法。

合法化

合法化是一种处理以下事实的方法:尽管connect,connection,connecting,connected等词并不完全相同,但它们都具有相同的基本含义:connect。拼写上的差异在口语中具有语法功能,但是对于机器处理,这些差异可能会造成混淆,因此我们需要一种方法来将所有单词形式的单词connect变成单词connect self。

一种执行此操作的方法称为“ 阻止”。词干涉及简单地去除容易识别的前缀和后缀,以产生通常是单词最简单的版本。例如,连接将删除-ion后缀,并正确地减小以连接。这种简单的词干通常是需要的,但是词义化(实际上是查看字典中描述的词及其词根(称为lemma))(只要词存在于字典中)更为精确。

由于spaCy包含了将单词分解为引理的内置方法,因此我们可以简单地将其用于引理。在以下非常简单的示例中,我们将使用它.lemma_为要分析的每个单词产生引理。

词性(POS)标记

单词的词性定义了它在句子中的功能。例如,名词标识一个对象。形容词描述一个对象。动词描述动作。在句子的上下文中识别和标记每个单词的语音部分称为词性标记或POS标记。

让我们尝试使用POS标记spaCy!我们需要导入其en_core_web_sm模型,因为其中包含进行此分析所需的字典和语法信息。然后,我们需要做的就是将这个模型加载.load()并遍历我们的新docs变量,使用确定每个单词的词性.pos_。

(注意û中u"All is well that ends well."表示该字符串是Unicode字符串。)

spaCy已正确识别出该句子中每个单词的词性。能够识别词性在各种与NLP相关的上下文中很有用,因为它有助于更准确地理解输入句子并更准确地构建输出响应。

实体检测

实体检测,也称为实体识别,是语言处理的一种更高级形式,它可以识别文本输入字符串中的重要元素,例如位置,人物,组织和语言。这对于快速从文本中提取信息非常有帮助,因为您可以快速挑选出重要的主题或确定文本的关键部分。

我们将为.label文本中检测到的每个实体获取一个标签,然后使用spaCy的displaCy显示工具以更直观的格式查看这些实体。

使用这种技术,我们可以识别文本中的各种实体。该spaCy文档提供了受支持的实体类型的完整列表,从上☺面的简短示例中我们可以看出,它能够识别各种不同的实体类型,包括特定位置(GPE),与日期相关的单词(DATE),重要数字(CARDINAL),特定个人(PERSON)等。

使用displaCy我们还可以可视化我们的输入文本,每个标识的实体都用颜色突出显示并标记。我们将style = "ent"用来告诉displaCy我们要在此处可视化实体。

依赖解析

独立性分析是一种语言处理技术,它使我们可以通过分析句子的构造来确定各个单词之间的相互关系,从而更好地确定句子的含义。

例如,考虑句子“比尔掷球”。我们有两个名词(比尔和球)和一个动词(掷)。但是我们不能只单独看这些话,否则我们可能最终以为球在扔比尔!为了正确理解句子,我们需要查看单词顺序和句子结构,而不仅仅是单词及其词性。

这样做非常复杂,但值得庆幸的是,spaCy它将为我们完成工作!在下面,让我们spaCy从新闻头条中再加上一句话。然后,我们将使用另一个spaCy名为的noun_chunks,它将输入分解为名词和描述它们的单词,并遍历源文本中的每个块,从而识别单词,其词根,其依赖项标识以及它属于哪个块。

该输出可能有点难以理解,但是由于我们已经导入了displaCy可视化工具,因此我们可以使用它来查看依赖关系图,其中使用style = "dep"起来更容易理解:

当然,我们还可以查看有关依赖关系解析spaCy的文档,以更好地了解根据解释每个句子的可能应用于文本的不同标签。

词向量表示

当我们单看单词时,机器很难理解人类会立即理解的联系。例如,引擎和汽车似乎有一个明显的连接(汽车使用引擎运行),但是这种连接对计算机而言并不那么明显。

值得庆幸的是,有一种方法可以表示可以捕获更多此类连接的单词。甲字矢量是commuicates其换句话说关系的词的数字表示。

每个单词都被解释为唯一且冗长的数字数组。您可以将这些数字视为GPS坐标之类的东西。GPS坐标由两个数字(纬度和经度)组成,如果我们看到两组GPS坐标在数字上彼此接近(如43–70和44–70),我们会知道这两个位置相对紧靠在一起。词矢量与此类似,虽然有很多分配给每个单词超过两个坐标,所以他们对人类眼球更难。

使用spaCy的en_core_web_sm模型,让我们看一个单词的向量长度,以及使用.vector和看起来的向量.shape。

人们无法观察到该数组并将其识别为☠“芒果”的含义,但是以这种表示该单词对机器而言效果很好,因为它使我们能够代表该单词的含义及其与其他相似单词的“接近度”使用数组中的坐标。

文字分类

现在,我们已经看了一些spaCy一般可以完成的很酷的事情,让我们看一下这些自然语言处理技术中的一些更大的实际应用:文本分类。通常,我们可能会发现自己想要根据一些参数(例如,每个片段的主题)进行分类的一组文本数据,而文本分类将帮助我们做到这一点。

下图显示了在对文本进行分类时我们想要做什么的全景视图。首先,我们从源文本(及其附带的任何标签或元数据)中提取所需的功能,然后将清理后的数据馈送到为我们进行分类的机器学习算法中。

导入库

我们将从导入此任务所需的库开始。我们已经导入了spaCy,但是我们也想要pandas并scikit-learn帮助进行分析。

加载数据中

上面,我们看了一些使用进行文本分析的简单示例spaCy,但是现在我们将使用进行一些Logistic回归分类scikit-learn。为了使这一点更加现实,我们将使用真实的数据集-这组Amazon Alexa产品评论。

该数据集以制表符分隔的文件(.tsv)的形式出现。它已经有五列:rating,date,variation,verified_reviews,feedback。

rating表示每个用户给Alexa的评分(满分5分)。date指示审查日期,并variation描述用户审查的型号。verified_reviews包含每个评论的文本,并feedback包含一个情感标签,其中1表示正面情绪(用户喜欢),0表示负面情绪(用户不喜欢)。

该数据集包含消费者对亚马逊Echos,Echo Dots,Alexa Firesticks等Alexa产品的评论。我们要做的是开发一个分类模型,该模型查看评论文本并预测评论是正面还是负面。由于此数据集已在该feedback列中包含评论是肯定的还是否定的,因此我们可以使用这些答案来训练和测试我们的模型。我们的目标是生成一个准确的模型,然后将其用于处理新的用户评论,并快速确定它们是正面还是负面。

首先,将数据读取到数据pandas框中,然后使用pandas的内置函数来帮助我们仔细查看数据。

使用标记数据 spaCy

现在我们知道我们正在使用什么,让我们使用创建一个自定义标记器函数spaCy。我们将使用此功能自动从每个评论中剥离不需要的信息,例如停用词和标点符号。

我们将从导入所需的英语模型spaCy以及Python的string模块开始,该模块包含一个有用的清单,其中列出了我们可以在中使用的所有标点符号string.punctuation。我们将创建包含要删除的标点符号和停用词的变量,以及一个通过spaCy英文模块运行输入的解析器。

然后,我们将创建一个spacy_tokenizer()函数,该函数接受一个句子作为输入,并将该句子处理为标记,执行词形化,小写并删除▨停用词。这类似于我们在大数据分析Python中spaCy文本分类使用教程前面的示例中所做的操作,但是现在我们将所有内容放到一个函数中,以预处理要分析的每个用户评论。

定义自定义变压器

为了进一步清除文本数据,我们还需要创建一个自定义转换器,以删除开头和结尾的空格并将文本转换为小写形式。在这里,我们将创建一个predictors继承TransformerMixin类的自定义类。该类重写transform,fit和get_parrams方法。我们还将创建一个clean_text()删除空格并将文本转换为小写字母的函数。

矢量化特征工程(TF-IDF)

在对文本进行分类时,最终得到的是与相应标签匹配的文本片段。但是我们不能在我们的机器学习模型中简单地使用文本字符串。我们需要一种将文本转换为可以用数字表示的内容的方法,就像标签(正数为1,负数为0)一样。在正面和负面标签中对文本进行分类称为情感分析。因此,我们需要一种数字表示文本的方法。

我们可以用来执行此操作的一种工具称为Word of Words。BoW将文本转换为给定文档中单词出现的矩阵。它着眼于给定单词在文档中是否出现,并生成一个矩阵,我们可以将其称为BoW矩阵或文档术语矩阵。

我们可以通过为我们的文本数据弓矩阵scikit-learn的CountVectorizer。在下面的代码中,我们告诉CountVectorizer使用spacy_tokenizer构建的自定义函数作为其标记生成器,并定义所需的ngram范围。

N-gram是给定文本中相邻单词的组合,其中n是插入标记中的单词数。例如,句子“谁将在2022年赢得世界杯足球赛?” 字母组合是一个单词序列,例如“ who”,“ will”,“ win”等。二元组将是两个连续单词的序列,例如“谁将”,“将获胜”,等等。大数据分析Python中spaCy文本分类使用教程-cg.com.cn/xmt/2338.html因此,ngram_range我们将在下面的代码中使用的参数设置ngram的上下限(我们将使用unigram)。然后,我们将ngram分配给bow_vector。

我们还希望查看术语的TF-IDF(术语频率-反文档频率)。这听起来很复杂,但这只是通过查看每个单词的频率与文档频率的比较来规范我们的单词袋(BoW)的一种。换句话说,这是一种表示特定术语在给定文档中的重要性的方法,它基于该术语出现了多少次以及该术语出现在其他文档中的数量。TF-IDF越高,这个词对那个文件更重要。

我们可以用以下数学方程式表示:

当然,我们不必手工计算!我们可以使用scikit-learn的TfidfVectorizer 自动生成TF-IDF 。再次,我们将告诉它使用与我们一起构建的自定义标记生成器,spaCy然后将结果分配给变量tfidf_vector。

将数据分为训练集和测试集

我们正在尝试建立分类模型,但是我们需要一种方法来了解其实际表现。将数据集分为训练集和测试集的方法是经过实践检验的。我们将一半的数据集用作训练集,其中将包含正确的答案。然后,我们将使用数据集的另一半测试模型,而无需给出答案,以查看其执行的准确性。

便利,scikit-learn为我们提供了一个内置的这样做的功能:train_test_split()。我们只需要告诉它要分割的功能集(X),要对其进行测试的标签(ylabels)以及要用于测试集的大小(以十进制形式的百分比表示)。

创建管道并生成模型

现在我们已经完成了所有的设置,现在是时候实际构建模型了!我们将从导入LogisticRegression模块并创建LogisticRegression分类器对象开始。

然后,我们将创建一个包含三个组件的管道:清理器,向量器和分类器。清洁器使用我们的predictors类对象来清洁和预处理文本。向量器使用countvector对象为文本创建词袋矩阵。分类器是执行逻辑回归以对情感进行分类的对象。

建立此管道后,我们将使用来装配管道组件fit()。

评估模型

让我们看一下我们的模型实际表现如何!我们可以使用中的metrics模块执行此操作scikit-learn。现在我们已经训练了模型,我们将把测试数据通过管道进行预测。然后,我们将使用metrics模块的各种功能来查看模型的准确性,准确性和召回率。

1)准确性是指我们的模型做出的完全正确的预测总数中的百分比。

2)精度描述了我们预测中真实阳性与真实阳性加假阳性的比率。

3)回忆描述了我们的预测中真实阳性与真实阳性加假阴性的比率。

上面的文档链接提供了每个术语的更多详细信息和更精确的定义,但最重要的是,所有三个指标的测量范围均为0到1,其中1完全正确地预测了所有指标。因此,模型的得分越接近1,就越好。

换句话说,总体而言,我们的模型在94.1%的时间内正确地识别了评论的情绪。当它预测评论是正面的时,该评论实际上在95%的时间内是正面的。当进行正面评价时,我们的模型将其确定为正面评价的时间为98.6%

资源和后续步骤

在大数据分析Python中spaCy文本分类使用教程的整个过程中,我们已经从执行一些非常简单的文本分析操作spaCy到使用来构建自己的机器学习模型scikit-learn。当然,这仅仅是个开始,两者还有很多spaCy,scikit-learn必须提供给Python数据科学家。

mapreduce报错(导致mapreduce性能♥差的主要原因)
© 版权声明

相关文章

暂无评论

none
暂无评论...