spark Word2Vec+LSH相似文本推荐(scala)

2024-08-28 20:18

本文主要是介绍spark Word2Vec+LSH相似文本推荐(scala),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上一篇博客,我们使用spark CountVectorizer与IDF进行了关键词提取,博客地址:

spark CountVectorizer+IDF提取中文关键词(scala)

本篇博客在上一篇博客的基础上,介绍如何根据关键词获取文档的相似度,进行相似文本的推荐。在这里我们需要使用到两个算法:Word2Vec与LSH。

其中Word2Vec即将词转换为词向量,这样词之间的关系就可以向量距离去定量计算,距离越近的两个词相似性也较高,而spark中文档的词向量,即是这个文档所有词的词向量的平均值(这也就是为什么要使用关键词来计算文档的词向量,而不是直接计算文档的词向量的原因),Word2Vec的原理网上详细的教程 比较多,这里就不再累述了。

LSH可能使用得相对不那么频繁。LSH即Locality Sensitive has,局部敏感哈希,主要用来解决海量数据的相似性检索。由spark的官方文档翻译为:LSH的一般思想是使用一系列函数将数据点哈希到桶中,使得彼此接近的数据点在相同的桶中具有高概率,而数据点是远离彼此很可能在不同的桶中。spark中LSH支持欧式距离与Jaccard距离。

之所以使用Word2Vec+LSH,是因为Word2Vec将文档转换成了一个向量,而要求两篇文章的相似度,就是通过求其词向量的欧式距离,距离越近的则越相似。但对于海量的数据,要对文档两两求距离在寻找与当前文档最相似的文档,显然是不可能的。所以通过LSH来进行相似性检索。下面直接上代码(scala):

1、提取关键词后的初始数据集:

2、使用Word2Vec获取词向量:

        //Word2Vec获取关键词词向量val word2Vec = new Word2Vec().setInputCol("keywords").setOutputCol("wordvec").setVectorSize(15).setMinCount(0);val wvModel = word2Vec.fit(keyWordsDf);val w2vDf = wvModel.transform(keyWordsDf);w2vDf.show(false);

3、获取LSH模型

        val brp = new BucketedRandomProjectionLSH().setBucketLength(4.0).setNumHashTables(10).setInputCol("wordvec").setOutputCol("hashes")val brpModel = brp.fit(w2vDf);val tsDf = brpModel.transform(w2vDf);

4、使用LSH模型获取每个文档的相似文档(欧式距离在某个范围内)

        val brpDf = brpModel.approxSimilarityJoin(tsDf, tsDf, 0.015, "EuclideanDistance");brpDf.show(false);

5、整理计算结果

       val getIdFun = udf((input:Row)=> {input(0).toString.toInt;});val corrDf = brpDf.withColumn("id",getIdFun(col("datasetA"))).withColumn("id_sim",getIdFun(col("datasetB"))).drop("datasetA").drop("datasetB").drop("EuclideanDistance");corrDf.show(false);corrDf.createOrReplaceTempView("test");val resDf = sparkSQL.sql("select id,concat_ws(',',collect_set(id_sim)) as sim from test where id != id_sim group by id");resDf.show(false);

计算结果如下截图:

其中id为每篇文章的id,sim为相似的文档的id。可以看到,由于是推荐欧式距离在一定范围内的文档,所以对于每篇文档,推荐的结果的数量是不一致的。

这篇关于spark Word2Vec+LSH相似文本推荐(scala)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115775

相关文章

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

MySql9.1.0安装详细教程(最新推荐)

《MySql9.1.0安装详细教程(最新推荐)》MySQL是一个流行的关系型数据库管理系统,支持多线程和多种数据库连接途径,能够处理上千万条记录的大型数据库,本文介绍MySql9.1.0安装详细教程,... 目录mysql介绍:一、下载 Mysql 安装文件二、Mysql 安装教程三、环境配置1.右击此电脑

在 Windows 上安装 DeepSeek 的完整指南(最新推荐)

《在Windows上安装DeepSeek的完整指南(最新推荐)》在Windows上安装DeepSeek的完整指南,包括下载和安装Ollama、下载DeepSeekRXNUMX模型、运行Deep... 目录在www.chinasem.cn Windows 上安装 DeepSeek 的完整指南步骤 1:下载并安装

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出