Healthsea:基于spaCy的补剂效果分析管道

张开发
2026/4/10 7:40:28 15 分钟阅读

分享文章

Healthsea:基于spaCy的补剂效果分析管道
Healthsea用于探索健康补剂效果的端到端spaCy管道2021年12月15日 • 38分钟阅读博客spaCy, Prodigy | 命名实体识别 | 文本分类 | 生物医学利用机器学习和自然语言处理创造更好的健康获取方式。本文介绍了Healthsea的开发历程这是一个端到端的spaCy管道用于分析用户对补充产品的评论并提取其对健康的潜在影响。大家好我是Edward我是一名机器学习工程师。在团队的共同努力下我们一直在开发Healthsea以进一步扩展spaCy宇宙。在这篇博客中我将带大家了解训练不同NLP模型、创建自定义组件并将它们组装成spaCy v3管道的过程目录 第1节Healthsea介绍 第2节理解问题✨ 第3节命名实体识别 第4节Clausecat⚙️ 第5节生产环境中的Healthsea 第6节历程第1节Healthsea介绍1.1 创造更好的健康获取方式Healthsea分析与健康影响相关的补充剂用户评论。基于此分析为特定用户查询提供产品推荐。对于许多人来说补充剂是维持健康和实现个人目标的补充手段。由于越来越受欢迎消费者可以获得更多种类的产品。例如维生素D3胆钙化醇维生素D的四种形式之一当皮肤暴露在UVB光下时会自然产生。特别是在冬季和阳光不足的地方人们经常补充维生素D3以预防缺乏并支持健康生活方式。然而市场上大多数产品可能是多余的或者以“数量优先于质量”的方式生产以最大化利润。由此产生的产品白噪声使得很难找到合适的补充剂。1.2 预期内容本文介绍了一种分析用户评论的技术方法并作为概念验证。我们利用spaCy内置的命名实体识别和文本分类功能结合自定义创建的子句分割和实体掩码组件构建并训练了一个机器学习管道。重要提示Healthsea是一个实验性项目结果不应作为解决健康问题的基础。在谨慎解读的前提下探索这一领域的数据可能具有价值。第2节理解问题2.1 解构评论大多数情况下评论是衡量产品质量的良好指标。它们可以提供关于口味、服务、运输尤其是健康效果的有趣见解。基于此第一个挑战是检测并过滤与健康相关的评论。我们可以将“关节疼痛”作为一个指标因为它与健康问题相关联。可以安全地假设每次提到健康方面如关节疼痛都与描述该方面如何被产品影响的描述相关。2.2 健康方面为了找到健康方面我们需要定义它们。首先想到的概念是疾病和症状通常希望通过“减少”它们来改善。ICD-11国际疾病分类是一个包含各种疾病和症状健康信息的数据库。评论也可能包含更普遍的健康问题如“吃饭时疼痛”。我们将ICD-11分类术语和普遍健康问题这一组标记为Condition。我们还希望检测既不是疾病也不是症状的健康方面例如“让我的皮肤焕发光泽”、“现在睡眠好多了”、“提高了我的精力水平”。这些是通常希望“增加”的健康方面我们称之为Benefit。2.3 健康效果检测到Condition或Benefit实体后下一步是提取它们如何受到产品影响。我们可以使用“增加”和“减少”作为指标将健康效果分类为正向或负向“这增加了我的condition” → 负向“这减少了我的condition” → 正向“这增加了我的benefit” → 正向“这减少了我的benefit” → 负向如果健康方面既未增加也未减少则视为Neutral效果。我们还添加了一个Anamnesis既往史类作为一个临时缓存用于收集和链接相关信息。2.4 数据是一切我们使用来自某在线补剂市场的数据。数据集包含多达100万条匿名评论涵盖10,000种产品并包含有用的元信息如产品评分和有用计数。数据还包含产品成分使我们能够提供产品和成分推荐。在数据清洗方面我们过滤了所有非英语评论排除了词数低于一定阈值的评论并将它们格式化为utf-8。2.5 完整管道我们将分析分解为多个较小的处理步骤检测健康方面、分类健康效果、汇总所有信息等。因此我们将其实现为端到端管道可以添加只关注单一任务的模块化组件。第3节命名实体识别为了检测健康方面我们使用命名实体识别NER即识别文本中不重叠的跨度如专有名词和类似表达的任务。我们将使用spaCy内置的NER架构训练带有两个标签Condition和Benefit的模型。3.1 标注规则标注数据是训练模型的第一步事先考虑一致的标注规则至关重要。我们使用第2.2节中为健康方面定义的规则。标注过程中我们将确保考虑由多个词/数字组成的实体如“2型糖尿病”和缩写如“ADHD”。3.2 Prodigy本项目使用Prodigy进行数据标注。Prodigy是一个由主动学习驱动的强大标注工具支持各种NLP任务。其可视化界面使得标注和处理大量数据更加容易同时通过为当前任务提供特殊配方来提高效率。3.3 标注NER模型的标注包含5060个示例其中1893个示例提及一个或多个实体3167个无实体示例类型数量百分比有实体189337.41%无实体316762.59%总计5060100%3.4 训练spaCy v3引入了一个配置系统允许在单个文件中管理管道中的所有超参数和设置。管道目前包含一个Tok2Vec组件和一个EntityRecognizer组件。我们准备了三种配置进行评估Tok2Vec嵌入带预训练向量的Tok2Vec嵌入Transformer嵌入albert-base-v23.5 评估使用Weights Biases跟踪训练结果。预训练帮助模型表现稍好并在训练早期提高准确率。两者平均F1分数均接近0.8。Transformer表现更好但运行时间更慢。第4节Clausecat为了将健康效果分类为正向、负向、中性和既往史四类我们使用文本分类。目标是让模型学习哪些词表示“增加”、“减少”或都不表示。4.1 子句分割当句子包含多个健康方面时我们需要将句子分割成子句。例如“这对关节疼痛很好但也引起了皮疹。”分割后得到两个子句每个子句恰好包含一个健康方面。为了处理类似“这对关节疼痛很好但对髋部疼痛不好”的情况我们不进行简单分割而是创建同一句子的两个版本每个版本掩码不同的实体。掩码使用通用标记如_CONDITION_替换相关实体有助于模型更好地泛化。4.2 Benepar我们使用Benepar解析器实现子句分割这是一个执行成分句法分析的spaCy宇宙组件。成分句法分析提供了更多关于并列结构的细节。4.3 分割组件创建自定义spaCy组件ClauseSegmentation执行基于Benepar和NER结果的分割和掩码逻辑。组件将分割索引保存在自定义属性._.clauses中。4.4 Clausecat组件修改内置的textcat组件以支持掩码和分割逻辑命名为Clausecat。创建自定义Thinc模型将自定义掩码层链接到现有textcat模型。4.5 聚合组件聚合组件合并Clausecat的预测并创建患者信息缓存以链接健康方面和健康效果。当同一健康方面在评论中被多次提及时聚合多个预测为最终分类保存在._.health_effects中。4.6 标注在标注Clausecat数据之前我们以与训练时相同的方式预处理数据分割评论、掩码实体然后进行标注。4.7 训练最终管道包含以下组件sentencizer、tok2vec、ner、benepar、segmentation、clausecat、aggregation。4.8 评估预训练对clausecat性能的提升远大于对NER模型的提升。负向和既往史类由于样本不平衡表现较差但预训练显著提升了这两个类的准确率。第5节生产环境中的Healthsea管道构建完成后可通过spacy package打包并通过pip安装使用。5.1 端到端评估管道能正确处理简单评论也能处理复杂情况如“这对膝盖疼痛完美但对髋部疼痛无效” → 正确分割并分别预测为正向和中性。既往史类和工作 “医生诊断我患有失眠。服用产品后症状消失” → 正确识别为既往史后接正向。5.2 大规模分析使用Healthsea分析了100万条评论的完整数据集基于结果提供产品推荐。5.3 虚假评论通过检测可疑行为如每天写多条评论、许多5星或0星评论、完全相同内容的评论来识别虚假评论。约12%的客户被标记为“可疑”其评论将受到惩罚分数以降低影响。5.4 评分结果评分公式考虑了效果分数、评分分数、有用分数和可疑分数。产品分数还考虑了提及比例帮助评论较少但提及率高的产品获得更高分数。5.5 聚类健康方面使用预训练权重计算相似度在90%相似度阈值下对实体进行聚类以改善搜索。第6节历程成功构建了Healthsea管道现在可以根据评论者的反馈提供产品推荐。Healthsea的架构历经两年开发从简单的基于规则的完全不奏效的情感分析开始。未来计划应用关系抽取和共指消解识别文本中的产品提及将实体链接与ICD-11集成获取更多数据和标注使用图数据库和搜索引擎返回产品推荐FINISHED更多精彩内容 请关注我的个人公众号 公众号办公AI智能小助手或者 我的个人博客 https://blog.qife122.com/对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号网络安全技术点滴分享

更多文章