《基于 Spark 的平替药品智能推荐方法》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

CSDN.gif

写在前面的话

本篇文章将介绍,基于 Kafka + Spark + Redis 等技术,在药品开单的过程中,实现一种智能推荐平替药品的方案。

标题:


发明目的

本专利发明的目的是基于 Kafka + Spark + Redis 等技术,在药品开单的过程中,实现一种智能推荐平替药品的方案。
该方案可以实现海量药品的平替药品推荐值管理,同时可以不断自动校准相关推荐值,进而优化医院的药品管理,更好的服务于医护和患者。

具体方案

本专利是基于 Kafka + Spark + Redis 实现平替药品智能推荐功能,具体技术方案实现如下。

一、前置环境准备
1、部署 Kafka 环境,程序引入 Kafka 相关依赖,并进行相关配置与功能集成,定义“危急值发送”和“危急值反馈”事件,同时配置事件的消息入参格式与XSD校验文本,这两个事件将作为 Kafka 的两个主题 Topic,其中,Kafka 用于充当消息中间件,负责提供生产者和消费者的协作模式;
2、部署 Redis 环境,程序引入 Redis 相关依赖,并进行相关配置与功能集成,Redis 定义若干存储结构,将作为目标药品、平替药品、推荐值等内容的存储,并利用 Sorted Sets 结构,进行统计分析;
3、部署 Spark 环境,程序引入 Spark 相关依赖,并进行相关配置与功能集成,Spark 充当呈上启下的衔接角色,一方面用于消费 Kafka 投递的主题消息,另一方面,通过相关 API,将数据运算后,输出存储到 Redis 当中;
4、药品基础数据准备,根据院内药品字典,维护药品平替关系库,并设置平替初始推荐值;

二、核心服务实现
1、提供对外的消息生产者接口
开发消息中心生产者接口,并对外部系统开放,该接口可以用于“药品扣库存”和“平替药品推荐”这两个场景。
主要逻辑是,针对消息入参进行合理性校验、解析和处理,再通过调用 Kafka API 进行消息发送,利用生产者单例去完成消息发送。

2、利用 Spark 消费 Kafka
利用 Spark 相关的API,添加 Kafka 作为数据来源,并订阅“药品扣库存”和“平替药品推荐”这两个 Topic。
针对拉取到的消息,添加消息消费处理的代码块。

3、利用 Spark 加工流数据
Spark 通过加工引擎从Kafka中消费出数据流,在 Spark Streaming 流式计算引擎中,通过编写不同规则的脚本,对实时的数据链路进行计算,得到药品各项指标数据,保证并发的效率,又可保证数据的准确性,这样才能可以使我们系统保持稳定的进行数据的批处理。
核心内容是从 Redis 提取出目标药品的关联数据和历史数据,同时根据医生的推荐状态进行相应的推荐值运算,最终再更新回Redis中,该流程不影响药品主流程的运行。
根据医生的推荐结果,具体方案包含但不限于如下:
3.1、医生从平替药品列表中,选择某药品A进行平替,说明智能推荐是有效的,程序将加大药品A的推荐指数,并更新目标药品的 Redis 相应存储信息;
3.2、医生拒绝从平替药品列表中使用任何药品平替,继续沿用原来的目标药品,则该目标药品的还没有办法用该药品平替,程序将降低平替药品的推荐指数,并更新目标药品的 Redis 相应存储信息;
3.3、医生新增了额外的平替药品A作为替换,则目标药品的平替药品列表将新增药品A,同时设置初始值和增加推荐指数,并更新目标药品的 Redis 相应存储信息;

三、与用户门户的交互实现
1、药品开单的时候,开单界面再显示平替药品推荐列表,上面会显示药品名称、药品库存、药品推荐指数等关键信息;
2、医生若选择某项平替药品,后端推荐服务将被触发,向Kafka投递相应Topic信息,传递目标药品信息、平替药品信息、以及其他患者本次就诊相关信息等参数;
3、推荐服务消费到Kafka消息后,将从Redis 提取出相关历史数据,根据推荐状态进行运算:

四、推荐值核对扩展模块
1、增加平替药品推荐值定时服务,定期遍历提取出药品相关平替信息,进行推荐值排列更新以及平替药品的关联结构,原则上非实时的大运算都放在定时服务执行;
2、通过实时推荐和定时推荐服务的运作,将产生所有目标药品的完整推荐值清单,提供前端平替药品盘点页面,让药房管理人员,进行人工盘点审核,去除不合理的选项,进一步增加平替药品推荐库的可靠性;

技术补充

1、基于 Kafka + Spark 组合实现,利用了大数据流式引擎技术的优势,针对关联平替药品的推荐值运算,实现高可靠、高效实时、高扩展性的数据加工,最终实现平替药品清单的智能推荐;
2、将消息中心事件驱动机制应用于平替药品推荐值运算场景,从海量的诊疗事件中,为药品推荐相关的关键节点建立消息事件,通过动态订阅的方式为事件指定订阅服务,流程清晰可插拔。

{
  "全局配置": {
	"单次推荐缺省添加值" : 5,
  "单次不推荐缺省扣除值" : 5,
  "同医生重复推荐模式" : "allow",
  "同医生重复推荐增加值" : 1,
  "推荐同步计算模式" : "high",
  "推荐药品展示模式" : "common",
  ...
},

"药品A的配置": {
  "药品A的平替药品清单": [{...}],
  .... 
  /*配置包含全局配置,优先级覆盖全局配置*/
},
}

总结陈词

💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

CSDN_END.gif

  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
除了ALS方法Spark还提供了基于均值的协同过滤推荐方法和基于随机梯度下降的协同过滤推荐方法。具体实现步骤如下: 1. 基于均值的协同过滤推荐方法 ```scala import org.apache.spark.ml.evaluation.RegressionEvaluator import org.apache.spark.ml.recommendation.AverageRating import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("Collaborative Filtering Example") .getOrCreate() val ratings = spark.read.format("csv") .option("header", "true") .option("inferSchema", "true") .load("ratings.csv") .drop("timestamp") //计算每个物品的平均评分 val averageRatings = ratings.groupBy("movieId").agg(avg("rating").alias("avgRating")) //将每个用户对每个物品的评分减去该物品的平均评分,得到用户对物品的相对评分 val relativeRatings = ratings.join(averageRatings, "movieId").withColumn("relativeRating", $"rating" - $"avgRating") //训练模型 val model = new AverageRating() .setUserCol("userId") .setItemCol("movieId") .setRatingCol("relativeRating") .fit(relativeRatings) //评估模型效果 val predictions = model.transform(relativeRatings) val evaluator = new RegressionEvaluator() .setMetricName("rmse") .setLabelCol("relativeRating") .setPredictionCol("prediction") val rmse = evaluator.evaluate(predictions) //生成推荐结果 val userRecs = model.recommendForAllUsers(10) val movieRecs = model.recommendForAllItems(10) ``` 该方法先计算每个物品的平均评分,然后将每个用户对每个物品的评分减去该物品的平均评分,得到用户对物品的相对评分。接着,使用相对评分训练模型,并评估模型效果。最后,生成用户和物品的推荐结果。 2. 基于随机梯度下降的协同过滤推荐方法 ```scala import org.apache.spark.ml.evaluation.RegressionEvaluator import org.apache.spark.ml.recommendation.{ALS, ALSModel} import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("Collaborative Filtering Example") .getOrCreate() val ratings = spark.read.format("csv") .option("header", "true") .option("inferSchema", "true") .load("ratings.csv") .drop("timestamp") //将评分数据随机划分为训练集和测试集 val Array(training, test) = ratings.randomSplit(Array(0.8, 0.2)) //训练模型 val als = new ALS() .setMaxIter(5) .setRegParam(0.01) .setUserCol("userId") .setItemCol("movieId") .setRatingCol("rating") .setImplicitPrefs(true) //使用隐式反馈 val model = als.fit(training) //评估模型效果 val predictions = model.transform(test) val evaluator = new RegressionEvaluator() .setMetricName("rmse") .setLabelCol("rating") .setPredictionCol("prediction") val rmse = evaluator.evaluate(predictions) //生成推荐结果 val userRecs = model.recommendForAllUsers(10) val movieRecs = model.recommendForAllItems(10) ``` 该方法使用ALS算法,但设置了`setImplicitPrefs(true)`来使用隐式反馈,即只考虑用户行为数据中的“喜欢”和“不喜欢”,而不考虑具体评分。其他步骤与ALS方法类似,包括划分训练集和测试集、训练模型、评估模型效果和生成推荐结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

战神刘玉栋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值