R语言对医学中的自然语言(NLP)进行机器学习处理(1)

什么是自然语言(NLP),就是网络中的一些书面文本。对于医疗方面,例如医疗记录、病人反馈、医生业绩评估和社交媒体评论,可以成为帮助临床决策和提高质量的丰富数据来源。如互联网上有基于文本的数据(例如,对医疗保健提供者的社交媒体评论),这些数据我们可以直接下载,有些可以通过爬虫抓取。例如:在病人论坛上发表对疾病或药物的评论,可以将它们存储在数据库中,然后进行分析。

在这里插入图片描述
在这个之前需要了解什么是情绪分析,情绪分析是指赋予词语、短语或其他文本单位主观意义的过程。情绪可以简单地分为正面或负面,也可以与更详细的主题有关,比如某些词语所反映的情绪。简单来说就是从语言从提取患者态度或者情绪的词语,然后进行分析,比如患者对这个药物的疗效,她说好,有用,我们提取出这些关键词来进行分析。

自然语言(NLP)进行机器学习分为无监督学习和有监督学习,本期咱们先来介绍无监督学习。咱们先导入R包和数据

library(tm)
library(data.table)
library(tidytext)
library(dplyr)
library(tidyr)
library(topicmodels)
library(performanceEstimation)
library(rsample)
library(recipes)
library(parsnip)
library(workflows)
library(tune)
library(dials)
library(kernlab)
library(ggplot2)
training_data <- as.data.frame(fread("E:/r/test/drugsComTrain_raw.tsv"))

咱们先来看一下数据
在这里插入图片描述
这是一个患者对药物评价的数据,该数据集提供了患者对特定药物及相关疾病的评估,以及10星级患者评级,反映了整体患者满意度。这些数据是通过爬取在线医药评论网站获得的。公众号回复:药物评论数据,可以获得该数据,我们先来看一下数据的构成,drugName:药物名称,condition (categorical)条件类别,多指患者的一些疾病类别,review:患者对药物的评论,rating患者对药物的打分,date (date)患者评论的日期,usefulCount发现评论有用的数据,代表浏览者支持这个观点。
这个数据有16万行,非常大,为了演示方便,我们只取5000个来演示

set.seed(123)
sample <- sample(nrow(training_data),5000)
data <- training_data[sample,]
dim(data)

在这里插入图片描述
因为这是网页抓取的数据,会存在一些乱码,所以咱们在分析前先要进行数据的清洗,编写一个简单的数据清洗程序,就是一些简单的正则式小知识

cleanText <- function(rawtext) {
  rawtext <- gsub("&#039;", "?", rawtext)
  # Expand contractions
  rawtext <- gsub("n?t", " not", rawtext)
  rawtext <- gsub("won?t", "will not", rawtext)
  rawtext <- gsub("wont", "will not", rawtext)
  rawtext <- gsub("?ll", " will", rawtext)
  rawtext <- gsub("can?t", "can not", rawtext)
  rawtext <- gsub("cant", "can not", rawtext)
  rawtext <- gsub("didn?t", "did not", rawtext)
  rawtext <- gsub("didnt", "did not", rawtext)
  rawtext <- gsub("?re", " are", rawtext)
  rawtext <- gsub("?ve", " have", rawtext)
  rawtext <- gsub("?d", " would", rawtext)
  rawtext <- gsub("?m", " am", rawtext)
  rawtext <- gsub("?s", "", rawtext)
  # Remove non-alphanumeric characters.
  rawtext <- gsub("[^a-zA-Z0-9 ]", " ", rawtext)
  # Convert all text to lower case.
  rawtext <- tolower(rawtext)
  # Stem words
  rawtext <- stemDocument(rawtext, language = "english")
  return(rawtext)
}

这个小程序我简单介绍一下,第一行就是就是把文字中的"&#039;"全部改成“?”,其他也是差不多的,第二行就是把"n?t"改成" not".接下来gsub("[^a-zA-Z0-9 ]", " ", rawtext)这句前面有个^,表示把没有数据和字母的字符的字符串定义为缺失。tolower(rawtext)是把数据转成小写。
写好程序后咱们运行一下

data$review <- sapply(data$review, cleanText)

在这里插入图片描述
这样数据就被清洗一遍了,接下来咱们需要使用tidytext包中的unnest_tokens函数先把评论打散,变成一个个的单词,然后把含有stop的单词去掉,再把每行重复的词去掉,最后选择大于3个字符的词

tidydata <- data %>%
  unnest_tokens(word, review) %>%  #将句子打散变成单个词
  anti_join(stop_words) %>%  #Joining with `by = join_by(word)` remove stop words
  distinct() %>%   #去除重复
  filter(nchar(word) > 3)

我们看下整理后的数据,我们可以看到同一行被拆成多个词,当然数据也比原来大了很多
在这里插入图片描述
接下来咱们需要使用get_sentiments函数来对文本进行分析,它自带有很多字典咱们这次使用"bing"字典进行分析,咱们先来看下什么是"bing"字典

head(get_sentiments("bing"),20)

在这里插入图片描述
我们可以看到字典就是对应的字符串,假如匹配到abnormal 这个词,函数就会返回负面的negative,假如是abound这个词,函数就会返回正面的positive

tidydata %>%
  inner_join(get_sentiments("bing"))  #使用"bing"的字典进行情感分析

在这里插入图片描述
咱们看到数据很大,咱们只取其中的4种药物来分析"Levothyroxine",“Vyvanse”,“Xiidra”,“Oseltamivir”,并且计算出每种药物的评价数量和百分比

drug_polarity <- tidydata %>%
  inner_join(get_sentiments("bing")) %>%   #使用"bing"的字典进行情感分析
  filter(drugName == "Levothyroxine" |     #选定4种药物
           drugName == "Vyvanse" |
           drugName == "Xiidra" |
           drugName == "Oseltamivir") %>%
  count(sentiment, drugName) %>%           #对情感进行计数
  pivot_wider(names_from = sentiment,   #选择要访问的列
              values_from = n,           #输出列的名字
              values_fill = 0) %>%       #如果缺失的话默认填0
  mutate(polarity = positive - negative,  #评分
         percent_positive = positive/(positive+negative) * 100) %>%  #计算百分比
  arrange(desc(percent_positive))

在这里插入图片描述
上图对显示出患者对药物的一些基本反馈。
下面咱们准备开始进行无监督学习,先要建立矩阵(DTM),

drug_as_doc_dtm <- tidydata %>%
  count(drugName, word, sort = TRUE) %>%  #每种药物的评价词语的个数
  ungroup() %>% 
  cast_dtm(drugName, word, n) %>%  #将数据帧转换为tm包中DocumentTermMatrix,TermDocumentMatrix或dfm
  removeSparseTerms(0.995)

我们看一下这个矩阵

inspect(drug_as_doc_dtm)

在这里插入图片描述
建立好矩阵后主要是通过topicmodels包的LDA函数来进行无监督学习,这里的K表示你想要分成几组,control这里可以设置一个种子

lda<- LDA(drug_as_doc_dtm, k = 3,
          control = list(seed = 123))

接着咱们对数据进行进一步提取

top_terms_per_topic <- lda %>%
  tidy(matrix = "beta") %>%    #获取系数
  group_by(topic) %>%         #分组
  arrange(topic, desc(beta)) %>%    #排序
  slice(seq_len(10)) # Number of words to display per topic

看下提取后的数据,第一个是组别,第二个是它的名字,第三个是它的beta
在这里插入图片描述
接下来咱们可以做一些简单的可视化,加入咱们想看这些词的几率

ggplot(top_terms_per_topic, aes(x = beta, y = term, fill = term)) +
  geom_bar(stat = "identity", color = "black")

在这里插入图片描述
或者做个词云图

library(wordcloud)

wordcloud(top_terms_per_topic$term,top_terms_per_topic$beta,scale=c(3,0.3),min.freq=-Inf,
          max.words=Inf,colors=brewer.pal(8,'Set1'),random.order=F,random.color=F,ordered.colors=F)

在这里插入图片描述
本期先介绍到这里,下期继续介绍有监督学习,未完待续。

参考文献:

  1. tm包文档
  2. tidytext包文档
  3. topicmodels包文档
  4. Harrison, C.J., Sidey-Gibbons, C.J. Machine learning in medicine: a practical introduction to natural language processing. BMC Med Res Methodol 21, 158 (2021).
  5. https://www.cnblogs.com/jiangxinyang/p/9358339.html
  6. https://blog.csdn.net/sinat_26917383/article/details/51547298

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/242906.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AndroidStudio flutter 开发环境 绿色版,绿化方法

这里写自定义目录标题 绿色版下载:绿色版制作过程参考资料1.按照正常方式配置flutter开发环境(不包括桌面开发环境),确认能够正常编译apk2.移动AndroidStudio3.修改 {Android Studio安装路径}\bin\idea.properties4.移动.android5.移动AndroidSdk6.移动gradle 绿色版下载: and…

flink yarn-session 启动失败retrying connect to server 0.0.0.0/0.0.0.0:8032

原因分析&#xff0c;启动yarn-session.sh&#xff0c;会向resourcemanager的端口8032发起请求&#xff1a; 但是一直无法请求到8032端口&#xff0c;触发重试机制会不断尝试 备注&#xff1a;此问题出现时&#xff0c;我的环境ambari部署的HA 高可用hadoop&#xff0c;三个节点…

计算机网络传输层(期末、考研)

计算机网络总复习链接&#x1f517; 目录 传输层的功能端口UDP协议UDP数据报UDP的首部格式UDP校验 TCP协议&#xff08;必考&#xff09;TCP报文段TCP连接的建立TCP连接的释放TCP的可靠传输TCP的流量控制零窗口探测报文段 TCP的拥塞控制慢开始和拥塞控制快重传和快恢复 TCP和U…

低代码 —— 饮食均衡,合理膳食

目录 一、低代码的概念 二、低代码的优缺点 &#xff08;一&#xff09;优点 &#xff08;二&#xff09;缺点 三、低代码的能力 1、场景构建能力 2、数据编排能力 3、连接生态能力 4、业务中台能力 四、你认为低代码会替代传统编程吗&#xff1f; 1、从技术特征来看…

各厂家扇区电下倾识别调整方法

一、华为设备 针对华为4488天线或44天线TDD/FDD1800/FDD900电子下倾调整步骤 步骤1&#xff1a;先通过“DSP RETPORT”命令梳理全网供电开关开启状态 操作命令如下&#xff1a; &#xff08;可通过脚本执行DSP RETPORT:;命令批量提取全网信息&#xff0c;该命令是以RRU为单位…

【深度学习】强化学习(七)基于策略函数的学习方法

文章目录 一、强化学习问题1、交互的对象2、强化学习的基本要素3、策略&#xff08;Policy&#xff09;4、马尔可夫决策过程5、强化学习的目标函数6、值函数7、深度强化学习 二、基于值函数的学习方法三、基于策略函数的学习方法 一、强化学习问题 强化学习的基本任务是通过智能…

OpenCV极坐标变换函数warpPolar的使用

学更好的别人&#xff0c; 做更好的自己。 ——《微卡智享》 本文长度为1702字&#xff0c;预计阅读4分钟 前言 前阵子在做方案时&#xff0c;得了几张骨钉的图片&#xff0c;骨科耗材批号效期管理一直是比较麻烦的&#xff0c;贴RFID标签成本太高&#xff0c;所以一般考虑还是…

【教学类-06-16】20231213 (按比例抽题+乱序or先加再减后乘)X-Y之间“加法减法乘法+-×混合题”

作品展示&#xff1a; 背景需求&#xff1a; 大三班的“第一高手”对我提供的每一套的题目都只有一种反应&#xff1a; “这个是分合题&#xff0c;太简单了” “乘法&#xff0c;乘法我也会&#xff0c;11的1 22的4 33的9&#xff0c;,44十六……” “都太简单了&#xff0…

数据通信网络基础

数据通信网络基础&#xff08;1&#xff09; 一.前言 • 在人类社会的起源和发展过程中&#xff0c;通信就一直伴随着我们。从20世纪七、八十年代开始&#xff0c; 人类社会已进入到信息时代&#xff0c;对于生活在信息时代的我们&#xff0c;通信的必要性更是不言而喻 的。…

11.仿简道云公式函数实战-逻辑函数-TRUE

1. TRUE函数 TRUE 函数可直接返回逻辑值 true。 2. 函数用法 TRUE() 3. 函数示例 TRUE 函数一般不会作为函数单独使用&#xff0c;可与其他函数一起使用&#xff0c;或作为判断逻辑的结果。如&#xff0c;判断字段值是否为空时&#xff0c;设置公式为IF(ISEMPTY(方案选择)…

内网服务器部署maven私服简记

前言 很多企业希望创建自己的maven私服&#xff0c;但服务器无法和外网连通&#xff0c;所以这里介绍一套完整的内网部署nexus的解决方案。实现的方式也很简单&#xff0c;将下载好的nexus安装和项目所需的依赖仓库都上传到服务i去上去&#xff0c;通过脚本的方式实现批量导入…

基于vue实现的疫情数据可视化分析及预测系统-计算机毕业设计推荐 django

本疫情数据可视化分析及预测系统 开发&#xff0c;用小巧灵活的MySQL数据库做完后台存储解释。本系统不仅主要实现了注册登录&#xff0c;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;全国实时数据管理&#xff0c;每日实时数据管理&#xff0c;国内实时动态…

蓝牙物联网全屋智能系统解决方案

#蓝牙物联网# 蓝牙物联网全屋智能系统解决方案是一种通过低功耗蓝牙技术将家中的各种设备连接到一起&#xff0c;实现家居物联智能操控的方案。 全屋智能系统解决方案是一种将智能家居设备、传感器、照明、安防等系统集成在一起&#xff0c;实现全屋智能化控制的方案。 蓝牙物…

基于docker容器化部署微服务

前言 在笔者系列文章中微服务配置隔离已经完成服务之间的配置隔离&#xff0c;服务整体来说是已经通了。 为了方便后续测试已经环境统一&#xff0c;笔者本章节会对服务进行容器化部署。由于服务器性能问题&#xff0c;本次部署采用maven完成镜像构建&#xff0c;结合docker-c…

C#实现支付宝转账功能

环境 .net 6 AlipaySDKNet.OpenAPI 2.4.0 申请证书 登录支付宝开放平台https://open.alipay.com/ 进入控制台 授权回调地址也设置一下&#xff0c;加密方式AES 新建.net 6空白的web项目 证书除了java都需要自己生成一下pkcs1的密钥 privatekey.txt就是根据应用私钥生成…

星辰天合获评年度数智转型“优秀服务商”

近日&#xff0c;由中国智能制造百人会、中国智能制造产业网主办的“专精特新 单冠领航”-2023 制造业高质量发展大会暨数字化标准化创新高峰论坛在南京顺利举办&#xff0c;大会颁发了 2022-2023 年度数智转型“优秀服务商”奖项&#xff0c;星辰天合凭借在先进制造领域的优秀…

【论文阅读】MAKE-A-VIDEO: TEXT-TO-VIDEO GENERATION WITHOUT TEXT-VIDEO DATA

Make-a-video:没有文本-视频数据的文本-视频生成。 paper&#xff1a; code&#xff1a; ABSTRACT 优点: (1)加速了T2V模型的训练(不需要从头开始学习视觉和多模态表示)&#xff0c; (2)不需要配对的文本-视频数据&#xff0c; (3)生成的视频继承了当今图像生成模型的庞大…

SQL、Jdbc、JdbcTemplate、Mybatics

数据库&#xff1a;查询&#xff08;show、select&#xff09;、创建&#xff08;create)、使用(use)、删除(drop)数据库 表&#xff1a;创建&#xff08;【字段】约束、数据类型&#xff09;、查询、修改&#xff08;alter *add&#xff09;、删除 DML&#xff1a;增加(inse…

关于职场伪勤奋

前段时间看了一些关于勤奋学习、职场成长类的书籍&#xff0c;就在思考勤奋学习和职场的关系时&#xff0c;结合个人的理解&#xff0c;我定义了一种勤奋叫职场“伪勤奋”。那关于职场“伪勤奋”的定义和理解&#xff0c;与大家分享&#xff1a; 1、选择性任务完成 伪勤奋特征…

西电计科微机原理实验二(详细注释版)

西电计科微机原理实验二(详细注释版) 环境:VSCodeMASM/TASM插件(建议使用相同环境,学校机房环境有点老,可能会出一些奇怪的问题) 实验室:EⅡ-522 实验要求 输入一个不超过5位的十进制数,回车结束输入,并将其转换为二进制数,输出到屏幕上输入非数字字符,报错,重新输入输入q或…