基于Spark分布式计算的商品名余弦相似度匹配方法与流程
- 国知局
- 2024-09-19 14:41:29
本发明涉及大数据处理,尤其涉及一种基于spark分布式计算的商品名余弦相似度匹配方法。
背景技术:
1、现有技术在数据库中处理包含高相似性字段的数据例如商品数据表时,往往面临工作效率低下以及过多冗余操作的问题。这些问题不仅降低了数据处理效率,还增加了系统资源的开销。当数据库中具有海量数据时,如何高效快速的找出相似数据是一项非常重大的挑战。
2、spark采用了存储器内运算技术,使得在数据尚未写入硬盘时即可进行分析和计算。相较于hadoop mapreduce,spark在存储器内运行程序能够实现高达100倍的计算速度提升,即便在硬盘上运行程序时,速度也能提高10倍。spark项目的核心理念源于hadoopmapreduce中“移动数据不如移动计算”的思想,旨在优化系统性能:提高容错性和支持高并发,支持在内存中存储迭代计算和交互映射之间的中间结果,降低计算负担,并提供简单且可组合的多种编程语言api,作为灵活的编程模型。
3、spark sql模块与结构化数据配合使用非常合适。可以读取存储在rdbms表中的数据,或从具有结构化数据的文件格式中读(csv、text、json、avro、orc、parquet等),然后在spark中构造成永久性的或临时的表。此外,当在java、python、scala或r使用spark的结构化api时,可以结合类似sql的查询来查询数据,只要读入spark数据框架。
4、spark分区是rdd内部并行计算的一个计算单元,rdd的数据集在逻辑上被划分为多个分片,每一个分片称为分区,分区的格式决定了并行计算的粒度,而每个分区的数值计算都是在一个任务中进行的,因此任务的个数,也是由rdd(准确来说是作业最后一个rdd)的分区数决定。
5、spark sql的核心是catalyst优化器,它以一种全新的方式利用高级语言的特性(例如:scala的模式匹配和quasiquotes)构建一个可扩展的查询优化器。catalyst核心是表示树和操作树的规则。在框架的顶层,构建了专门用于关系型查询处理的库(表达式,逻辑查询计划)以及处理查询执行的不同阶段的几组规则(分析,逻辑优化,物理计划和将部分查询编译为java字节码的代码生成)。最后,catalyst提供了若干公共的扩展点,包括扩展数据源和用户自定义类型。
6、对spark这样的分布式大数据系统来讲,数据量大并不可怕,可怕的是数据倾斜。
7、对于分布式系统而言,理想情况下,随着系统规模(节点数量)的增加,应用整体耗时线性下降。如果一台机器处理一批大量数据需要120分钟,当机器数量增加到3台时,理想的耗时为120/3=40分钟。但是,想做到分布式情况下每台机器执行时间是单机时的1/n,就必须保证每台机器的任务量相等。不幸的是,很多时候,任务的分配是不均匀的,甚至不均匀到大部分任务被分配到个别机器上,其它大部分机器所分配的任务量只占总得的小部分。比如一台机器负责处理80%的任务,另外两台机器各处理10%的任务。
8、不患多而患不均,这是分布式环境下最大的问题。意味着计算能力不是线性扩展的,而是存在短板效应:一个stage所耗费的时间,是由最慢的那个task决定。
9、由于同一个stage内的所有task执行相同的计算,在排除不同计算节点计算能力差异的前提下,不同task之间耗时的差异主要由该task所处理的数据量决定。所以,要想发挥分布式系统并行计算的优势,就必须解决数据倾斜问题。
10、tf-idf是一种经典的文本相似性度量方法,将文本视为词项的集合,并通过词频信息将文本表示为一个向量,以此计算文本的相似性。
11、tf-idf也叫做词频反文档频率,结合了词频计算公式和反文档频率的计算公式。
12、tf(term frequency,词频)表示词条在文本中出现的频率,这个数字通常会被归一化,以防止它偏向长的文件(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否)。
13、idf(inverse document frequency,逆文件频率)表示关键词的普遍程度。如果包含词条i的文档越少,idf越大,则说明该词条具有很好的类别区分能力。tf-idf的计算公式如下:
14、
15、其中,nij,表示词条ti在文档dj中出现的次数,tfij就是表示词条ti在文档dj中出现的频率。
16、
17、其中,|d|表示所有文档的数量,|j:ti∈dj|表示包含词条ti的文档数量,加1呢主要是防止包含词条ti的数量为0从而导致运算出错的现象发生。
18、tf-idf=tf·idf
19、某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的tf-idf。因此,tf-idf倾向于过滤掉常见的词语,保留重要的词语,但是,该方法并没有降低文本模型的维度。对于项目文本,由于词项数目巨大,因此,基于词频向量模型的文本表示是高维、稀疏的,这将导致低效的计算性能。
20、余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。这结果是与向量的长度无关的,仅仅与向量的指向方向相关。余弦相似度通常用于正空间,因此给出的值为-1到1之间。假定a和b是两个n维向量,a是[a1,a2,...,an],b是[b1,b2,...,bn],则a与b的夹角θ的余弦等于:
21、
22、当文本的特征向量维度过高或数据量过于庞大时,余弦相似度计算将会导致极大的集群计算资源的开销。
23、修正的余弦相似度在余弦相似度的基础上,进一步把所有评分都减去该评分所对应的用户的评分均值,结果越大,相似度越高。修正的余弦相似度计算公式为将向量中心化后再计算余弦相似度,假定文档中文本的平均向量为则修正的余弦相似度计算公式如下:
24、
25、海量短文本相似度计算遇到的数据倾斜和过多冗余计算导致计算性能和速度完全取决于集群规模。
技术实现思路
1、本发明针对现有技术的缺陷,提供了一种基于spark分布式计算的商品名余弦相似度匹配方法。
2、为了实现以上发明目的,本发明采取的技术方案如下:
3、步骤(1)、在物理服务器上构建具有虚拟机的hdfs文件系统和spark平台,并将数据集(来源公司,其中商品表字段包括商品名、商品id、分类id,其中分类统计表字段包括分类id、数据量区间)上传到hdfs文件系统中。
4、步骤(2)、通过客户端向spark平台提交作业,spark平台通过sparksql从hdfs文件系统中读取数据,将读取的数据表转换为弹性分布式数据集dataframe并划分为训练集和测试集,将其存储在内存中。
5、步骤(3)、通过sample算子对训练集进行采样,统计采样结果并将训练集划分为倾斜数据集和不倾斜数据集。
6、步骤(4)、对于倾斜数据集,进行join自连接后在分区内采用传统算法计算相似度。对于不倾斜数据集采用步骤(5)~(11)计算相似度。
7、步骤(5)、在spark平台将训练集通过发明的方法获取最大最小相似度阈值及最佳相似度阈值。
8、步骤(6)、在spark平台将测试集中的商品名字段进行分词并合并到dataframe中。
9、步骤(7)、通过商品集的分类字段进行分类,并将同一分类中的数据的字段聚合并将聚合。
10、步骤(8)、数据重新进行哈希分区,通过catalyst优化策略减少因哈希冲突导致的数据倾斜。
11、步骤(9)、在分区内通过改进的相似度算法及策略计算同一分类的各个商品间相似度。
12、步骤(10)、通过步骤(4)的获得的最大最小相似度阈值及最佳相似度阈值以及改进算法的规则对计算后的dataframe进行过滤并输出。
13、步骤(11)、通过catalyst优化策略,最后将结果输出。
14、其中,所述步骤(2)中,根据用户程序设定的rdd中partition数目来启动一定数目的并发线程数读取数据。
15、其中,所述步骤(3)中,各个工作节点从rdd中读取数据进行转换操作,filter操作,过滤掉其中的停用词,以去除文本中的一些对分类无实际作用的噪声数据。之后通过jieba分词以及sparksql自定义函数对对应字段数据进行分词。
16、其中,所述步骤(4)中,由于需要进行group以及aggrate操作,分区数据会进行shuffle并根据对应的key进行分区,会造成数据倾斜。并且会根据哈希分区策略进行均匀地重新分区,防止数据倾斜影响算法整体速度。
17、其中,所述步骤(5)中,通过改进的相似度算法及策略计算同一分类的各个商品间相似度。优化单一余弦相似度或tf-idf导致的结果精度,以及根据策略削减两两匹配次数。
18、其中,所述步骤(7)中,catalyst优化策略会在分区计算中并不断合并小分区来提高计算性能,并将结果输出到hdfs文件系统上。
19、本发明实施例公开了一种基于spark分布式计算的商品名余弦相似度匹配方法,传统相似度匹配算法将表进行内连接或外连接,暴力求解所有商品间的相似度,无效计算过多、且商品名文本的向量维度过高导致计算效率低下。本发明主要解决对商品名特征向量维度过高、空间复杂度高、不便于存储和计算等问题,以及根据分区策略和优化算法去除无效计算。
20、本发明的优点及有益效果如下:
21、1、将数据集按照分类字段分组后,将分组数据按照哈希分区策略均匀地进行重新分区,防止数据倾斜算法整体速度。
22、2、不倾斜数据集在分区内部计算商品间的相似度,与传统表与表join相比,有效地缓解了内存压力和数据倾斜,并且有针对性地计算同一分类地相似度,将时间复杂度由n2降至为(k为分区数)
23、3、不倾斜数据集计算相似度时采用优化算法和改进的匹配策略,极大地减少了冗余计算,若每个分类的平均数据量为n,相似商品的平均数量为x,则该改进算法将分区内时间复杂度由降低至
24、4、只针对分区内商品名的分词集构建词典,再构建特征向量,相比于传统方法,极大地降低了特征向量维度,对于相似度地计算效率有很大提升。
25、5、相似度计算时先将特征向量由idf公式加权,再将加权后的特征向量与修正的余弦相似度结合,相较于传统相似度算法,考虑了商品名中特殊词(如品牌、规格)等的重要性,算法准确度得到极大提高。
26、将余弦相似度计算进行拆分,统一计算向量的模并进行保存,防止重复计算,可以极大地提高相似度计算效率。
本文地址:https://www.jishuxx.com/zhuanli/20240919/299655.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 YYfuon@163.com 举报,一经查实,本站将立刻删除。