确认偏差是所有医务人员必须努力克服的一个问题。无法考虑挑战现有观点的不同想法会阻碍他们面对既定诊断时考虑新诊断的能力。
这是一个源于医学文献的问题,医务人员更有可能倾向于支持其现有观点的文章。意见的多样性对于塑造能够提供有效诊断的整体视角至关重要。
为此,该 Launchpad 应用程序创建了一个语言处理机器学习管道,以消除医学文献中的确认偏差。使用 Redis,Launchpad 应用程序创建了一个管道,能够通过高效的数据传输将文本转换为知识图。
让我们研究一下该团队如何实现这一点。但在深入研究之前,请务必查看我们在 Launchpad上的所有不同且创新的应用程序。
让我们探索如何使用 Redis 为自然语言处理 (NLP) 构建管道。
我们将通过突出显示每个组件以及解压缩其功能来揭示 Redis 如何用于将此想法变为现实。
从头到尾,Redis 是此管道的数据结构。它的作用是将文本转换为知识图。让我们快速了解一下知识图是什么以及它在此项目中的作用。
如今的系统不仅仅存储文件夹、文件和网页。相反,它们是复杂性的网络,由实体组成,例如对象、情况或概念。知识图将突出显示每个实体的属性及其之间的关系。此信息通常存储在图形数据库中,并以图形结构可视化。
知识图由 2 个主要组成部分组成
以下是节点和边如何用于集成数据的示例。
在第一个管道中,您将了解如何使用医学词典为医学文献创建知识图。它使用 RedisGears 处理信息并将其存储在 RedisGraph 中。
首先,使用以下代码解压缩和解析 metadata.zip,其中文件名称、标题和年份被提取到 HASH 中
redis_client.hset(f"article_id:{article_id}",mapping={'title': each_line['title']})
redis_client.hset(f"article_id:{article_id}",mapping={'publication_date':each_line['publish_time']})
以下代码通过读取 JSON 文件工作 - data/sample_folder 中的示例:the-pattern-platform/RedisIntakeRedisClusterSample.py
它还将 JSON 解析为字符串
rediscluster_client.set(f”paragraphs:{article_id}“,” “.join(article_body))
以下代码是使用 RedisGears 的主要预处理任务:the-pattern-platform/gears_pipeline_sentence_register.py
它还监听段落的更新:键
gb = GB('KeysReader')
gb.filter(filter_language)
gb.flatmap(parse_paragraphs)
gb.map(spellcheck_sentences)
gb.foreach(save_sentences)
gb.count()
gb.register('paragraphs:*',keyTypes=['string','hash'], mode="async_local")
这使用 RedisGears 和 HSET/SADD。
如何使用 Aho-Corasick 算法将句子转换为边 (句子) 和节点 (概念)
第一步是使用以下代码
bg = GearsBuilder('KeysReader')
bg.foreach(process_item)
bg.count()
bg.register('sentence:*', mode="async_local",onRegistered=OnRegisteredAutomata)
下一行代码将在每个分片上创建一个流:
'XADD', 'edges_matched_{%s}' % shard_id, '*','source',f'{source_entity_id}','destination',f'{destination_entity_id}','source_name',source_canonical_name,'destination_name',destination_canonical_name,'rank',1,'year',year)
以下是提高句子分数的方法
zincrby(f'edges_scored:{source_entity_id}:{destination_entity_id}',1, sentence_key)
如何从 RedisGears 填充 RedisGraph
the-pattern-platform/edges_to_graph_streamed.py 通过在 RedisGraph 中创建节点、边或更新其排名来工作
"GRAPH.QUERY", "cord19medical","""MERGE (source: entity { id: '%s', label :'entity', name: '%s'})
ON CREATE SET source.rank=1
ON MATCH SET source.rank=(source.rank+1)
MERGE (destination: entity { id: '%s', label: 'entity', name: '%s' })
ON CREATE SET destination.rank=1
ON MATCH SET destination.rank=(destination.rank+1)
MERGE (source)-[r:related]->(destination)
ON CREATE SET r.rank=1, r.year=%s
ON MATCH SET r.rank=(r.rank+1)
ON CREATE SET r.rank=1
ON MATCH SET r.rank=(r.rank+1)""" % (source_id ,source_name,destination_id,destination_name,year))
the-pattern-api/graphsearch/graph_search.py
具有年份节点 ID、限制和年份的边
"WITH $ids as ids MATCH (e:entity)-[r]->(t:entity) where (e.id in ids) and (r.year in $years) RETURN DISTINCT e.id, t.id, max(r.rank), r.year ORDER BY r.rank DESC LIMIT $limits"""
节点
"""WITH $ids as ids MATCH (e:entity) where (e.id in ids) RETURN DISTINCT e.id,e.name,max(e.rank)"""
接下来,使用以下代码查找得分最高的文章:
app.py uses zrangebyscore(f"edges_scored:{edges_query}",'-inf','inf',0,5)
使用管道中最幽默的代码
向您的安全架构师展示以下代码
import httpimport
with httpimport.remote_repo(['stop_words'], "https://raw.githubusercontent.com/explosion/spaCy/master/spacy/lang/en/"):
import stop_words
from stop_words import STOP_WORDS
with httpimport.remote_repo(['utils'], "https://raw.githubusercontent.com/redis-developer/the-pattern-automata/main/automata/"):
import utils
from utils import loadAutomata, find_matches
这是必要的,因为 RedisGears 不支持提交项目或模块。
BERT 代表来自 Transformer 的双向编码器表示。它是由 Google AI 的研究人员创建的,是处理自然语言任务(包括问答 (SQuAD v1.1.)、自然语言推理 (MNLI) 等)的世界领导者。
以下是 BERT 模型的一些流行用例
最先进的代码位于the-pattern-api/qasearch/qa_bert.py 中。它查询 RedisGears + RedisAI 集群,为用户提供一个问题:
get "bertqa{5M5}_PMC140314.xml:{5M5}:44_When air samples collected?"
它查询分片 {5MP} 上的 bertqa 前缀,其中 PMC140314.xml:{5M5}:44(见下文) 是预标记 REDIS AI 张量(潜在答案)的键,而“何时收集空气样本?”是用户的问题。
PMC140314.xml:{5M5}:44
RedisGears 然后捕获 keymiss 事件 the-pattern-api/qasearch/qa_redisai_gear_map_keymiss_np.py
gb = GB('KeysReader')
gb.map(qa_cached_keymiss)
gb.register(prefix='bertqa*', commands=['get'], eventTypes=['keymiss'], mode="async_local")
RedisGears 然后运行以下操作
对于非阻塞主线程模式,模型使用 AI.modelset 在每个分片上预加载,位于 the-pattern-api/qasearch/export_load_bert.py 中。
摘要通过在句子上运行:前缀并运行 t5-base 变压器标记器来工作,使用简单的 SET 命令和 python.pickle 模块将结果保存到 RedisGraph 中,将摘要键(从 article_id 派生)添加到
rconn.sadd('processed_docs_stage3_queue', summary_key)
以下代码订阅队列并运行简单的 SET 和 SREM 命令
summary_processor_t5.py
然后,这将更新 RedisGraph 中的哈希
redis_client.hset(f"article_id:{article_id}",mapping={'summary': output})
Redis 提供 rgcluster Docker 镜像 以及 redis-cluster 脚本。重要的是要确保集群以高可用性配置部署。每个主服务器必须至少有一个副本。这是因为您在部署机器学习模型时必须重新启动主服务器。
如果主节点重启,并且没有副本,那么集群将进入故障状态,您需要手动重新创建它。
其他参数包括执行时间和内存。脏模型在内存中占用 1.4 GB,您需要在此处包含协议缓冲区内存。您还需要为集群和齿轮图表增加执行时间,因为所有任务都是计算密集型的,因此您需要确保时间限制得到满足。
确保您在系统中安装了 virtualenv、Docker 和 Docker Compose。
apt install docker-compose
brew install pyenv-virtualenv
git clone --recurse-submodules https://github.com/redis-developer/the-pattern.git
cd the-pattern
./start.sh
cd ./the-pattern-platform/
source ~/venv_cord19/bin/activate #or create new venv
pip install -r requirements.txt
bash cluster_pipeline.sh
等待一会儿,然后检查以下内容
RedisGraph 已填充
redis-cli -p 9001 -h 127.0.0.1 GRAPH.QUERY cord19medical "MATCH (n:entity) RETURN count(n) as entity_count"
redis-cli -p 9001 -h 127.0.0.1 GRAPH.QUERY cord19medical "MATCH (e:entity)-[r]->(t:entity) RETURN count(r) as edge_count"
API 是否响应
curl -i -H "Content-Type: application/json" -X POST -d '{"search":"How does temperature and humidity affect the transmission of 2019-nCoV"}' https://#:8080/gsearch
cd the-pattern-ui
npm install
npm install -g @angular/cli@9
ng serve
cd the-pattern-api/qasearch/
sh start.sh
注意:这将在每个分片上下载并预加载 1.4 GB 的 BERT QA 模型。由于其大小,它可能会在笔记本电脑上崩溃。通过运行以下命令进行验证:
curl -H "Content-Type: application/json" -X POST -d '{"search":"How does temperature and humidity affect the transmission of 2019-nCoV?"}' https://#:8080/qasearch
从“the-pattern”存储库转到 RedisGears 集群上的存储库
cd the-pattern-bart-summary
# source same enviroment with gears-cli (no other dependencies required)
source ~/venv_cord19/bin/activate
gears-cli run --host 127.0.0.1 --port 30001 tokenizer_gears_for_sum.py --requirements requirements.txt
此任务可能会超时,但您可以安全地重新运行所有内容。
在 GPU 或服务器上,配置 NVidia 驱动程序
sudo apt update
sudo apt install nvidia-340
lspci | grep -i nvidia
sudo apt-get install linux-headers-$(uname -r)
distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g')
wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-$distribution.pin
sudo mv cuda-$distribution.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/7fa2af80.pub
echo "deb http://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64 /" | sudo tee /etc/apt/sources.list.d/cuda.list
sudo apt-get update
sudo apt-get -y install cuda-drivers
# install anaconda
curl -O https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh
sh Anaconda3-2020.11-Linux-x86_64.sh
source ~/.bashrc
conda create -n thepattern_env python=3.8
conda activate thepattern_env
conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=11 -c pytorch
配置实例到 RedisGraph Docker 镜像的访问(或使用 Redis Enterprise)
git clone https://raw.githubusercontent.com/redis-developer/the-pattern-bart-summary.git
#start tmux
conda activate thepattern_env
pip3 install -r requirements.txt
python3 summary_processor_t5.py
虽然 RedisGears 允许您部署和运行机器学习库,如 spacy 和 BERT transformers,但下面的解决方案采用了一种更简单的方法
以下是整个管道的快速概述:以上 7 行允许您使用所有可用的 CPU 在分布式集群或单台机器上运行逻辑。作为旁注,在您需要扩展到超过 1000 个节点之前,不需要进行任何更改。
对所有字符串或哈希使用为命名空间段落注册的 KeysReader。您的管道需要在异步模式下运行。如果您是一位数据科学家,我们建议使用 gb.run 来帮助确保 RedisGears 工作并以批处理模式运行。然后它将以批处理模式运行。之后,将其更改为注册以捕获新数据。
默认情况下,函数将返回到输出,因此需要 count() - 为了防止将整个数据集获取回发出命令的机器(Cord19 为 90 GB)。
总的来说,预处理是一个简单的过程。您可以访问完整的代码 这里。
您可以直接从 UMLS 数据构建 Aho-Corasick 自动机。Aho-Corasick 将允许您将传入的句子匹配到节点对,并将句子作为图中的边呈现。与 Gears 相关的代码很简单:
bg = GearsBuilder('KeysReader')
bg.foreach(process_item)
bg.count()
bg.register('sentence:*', mode="async_local",onRegistered=OnRegisteredAutomata)
Redis 知识图旨在根据长而详细的查询创建知识图。
初步步骤:选择“入门”,然后选择“护士”或“医学生”。
步骤 1:在搜索栏中输入您的查询
步骤 2:选择与您的搜索最相关的查询
步骤 3:在不同的节点之间浏览,并使用底部的切换栏更改搜索日期
使用 Redis,Launchpad 应用程序创建了一个管道,帮助医务人员在不受到确认偏差的影响下浏览医学文献。紧密集成的 Redis 系统促进了组件之间数据的无缝传输,催生了医务人员可以利用的知识图。
您可以访问 Redis Launchpad,详细了解此创新应用程序的方方面面。在您访问时,您可能还想浏览我们 令人兴奋的应用程序范围。
您可以前往 Launchpad,详细了解该应用程序以及我们激动人心的应用程序集合中的许多其他应用程序。
亚历山大·米哈列夫
亚历山大是一位充满激情的研究员和开发人员,他总是乐于探索新技术并开发“新事物”。
请务必 访问他的 GitHub 页面,查看他参与的所有最新项目。