Word2Vec与文章相似度--相似度计算

news/2024/5/19 23:20:14 标签: 深度学习, 人工智能, 算法, 推荐算法

2.7.4.2 相似度计算

  • 目的:计算18号Python频道的文章之间相似度
  • 步骤:
    • 1、读取数据,进行类型处理(数组到Vector)
    • 2、BRP进行FIT

读取数据,进行类型处理(数组到Vector)

from pyspark.ml.linalg import Vectors
# 选取部分数据做测试
article_vector = w2v.spark.sql("select article_id, articlevector from article_vector where channel_id=18 limit 10")
train = articlevector.select(['article_id', 'articleVector'])

def _array_to_vector(row):
    return row.article_id, Vectors.dense(row.articleVector)

train = train.rdd.map(_array_to_vector).toDF(['article_id', 'articleVector'])

BRP进行FIT

  • class pyspark.ml.feature.BucketedRandomProjectionLSH(inputCol=None, outputCol=None, seed=None, numHashTables=1, bucketLength=None)
    • inputCol=None:输入特征列
    • outputCol=None:输出特征列
    • numHashTables=1:哈希表数量,几个hash function对数据进行hash操作
    • bucketLength=None:桶的数量,值越大相同数据进入到同一个桶的概率越高
    • method:
      • approxSimilarityJoin(df1, df2, 2.0, distCol='EuclideanDistance')
      • 计算df1每个文章相似的df2数据集的数据
from pyspark.ml.feature import BucketedRandomProjectionLSH

brp = BucketedRandomProjectionLSH(inputCol='articleVector', outputCol='hashes', numHashTables=4.0, bucketLength=10.0)
model = brp.fit(train)

计算相似的文章以及相似度

similar = model.approxSimilarityJoin(test, train, 2.0, distCol='EuclideanDistance')

similar.sort(['EuclideanDistance']).show()

2.7.4.3 问题3

对于计算出来的相似度,是要在推荐的时候使用。那么我们所知的是,HIVE只适合在离线分析时候使用,因为运行速度慢,所以只能将相似度存储到HBASE当中

  • hbase

2.7.5 文章相似度存储

  • 目的:将所有文章对应相似度文章及其相似度保存

  • 步骤:

    • 调用foreachPartition
      • foreachPartition不同于map和mapPartition,主要用于离线分析之后的数据落地,如果想要返回新的一个数据DF,就使用map后者。

我们需要建立一个HBase存储文章相似度的表

create 'article_similar', 'similar'

# 存储格式如下:key:为article_id, 'similar:article_id', 结果为相似度
put 'article_similar', '1', 'similar:1', 0.2
put 'article_similar', '1', 'similar:2', 0.34
put 'article_similar', '1', 'similar:3', 0.267
put 'article_similar', '1', 'similar:4', 0.56
put 'article_similar', '1', 'similar:5', 0.7
put 'article_similar', '1', 'similar:6', 0.819
put 'article_similar', '1', 'similar:8', 0.28

定义保存HBASE函数,确保我们的happybase连接hbase启动成功,Thrift服务打开。hbase集群出现退出等问题常见原因,配置文件hadoop目录,地址等,还有

  • ntpdate 0.cn.pool.ntp.org或者ntpdate ntp1.aliyun.com
  • hbase-daemon.sh start thrift
def save_hbase(partition):
    import happybase
    pool = happybase.ConnectionPool(size=3, host='hadoop-master')

    with pool.connection() as conn:
        # 建议表的连接
        table = conn.table('article_similar')
        for row in partition:
            if row.datasetA.article_id == row.datasetB.article_id:
                pass
            else:
                table.put(str(row.datasetA.article_id).encode(),
                         {"similar:{}".format(row.datasetB.article_id).encode(): b'%0.4f' % (row.EuclideanDistance)})
        # 手动关闭所有的连接
        conn.close()

similar.foreachPartition(save_hbase)

http://www.niftyadmin.cn/n/28856.html

相关文章

Java补充内容(Junit 反射 注解)

1 Junit测试 测试分类: 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。 2. 白盒测试:需要写代码的。关注程序具体的执行流程。 Junit使用:白盒测试 步骤: 定义一个测试类(测试…

LeetCode 1802. 有界数组中指定下标处的最大值(C++)

思路: 首先根据题目要求,相邻数字的差距不能大于1,所以数组中的元素分布一定是以最大元素位置为塔顶,向两边发散的金字塔状,最小值为1,这样的结构能保证数组元素和一定是最小的(只有1是重复元素…

C语言:文件操作

文件:储存数据文件:程序文件:(.c.obj.exe)数据文件:运行时的数据或内容文件名:文件路径文件名主干文件后缀c:\code\test.txt文件指针:每个被使用的文件都在内存中开辟了一个相应的文…

Python---列表和元组

专栏:python 个人主页:HaiFan. 专栏简介:本专栏主要更新一些python的基础知识,也会实现一些小游戏和通讯录,学时管理系统之类的,有兴趣的朋友可以关注一下。 列表和元组前言列表的的概念列表的创建访问下标…

07.C语言文件操作

1. 使用文件的原因我们前面学习结构体时,写了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下…

<Python的字典>——《Python》

目录 1. 字典 1.1 字典是什么 1.2 创建字典 1.3 查找 key 1.4 新增/修改元素 1.5 删除元素 1.6 遍历字典元素 1.7 取出所有 key 和 value 1.8 合法的 key 类型 1. 字典 1.1 字典是什么 字典是一种存储 键值对 的结构. 键值对是计算机/生活中一个非常广泛使用的概念…

论文投稿指南——中文核心期刊推荐(武器工业)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

VMware 安装 OpenWrt 旁路由并配置 PassWall

准备 OpenWrt 镜像包,本例使用的是在恩山论坛上面下载的https://www.right.com.cn/forum/thread-8271618-1-1.html也可以用我转好的 vmdk 格式的https://download.csdn.net/download/mshxuyi/87394212网络选择 NAT 模式创建虚拟机,选择自定义方式一直下一…