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

news2024/12/25 20:07:59

什么是自然语言(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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Reactor线程模型详解

文章目录 传统的阻塞式 I/OReactor 模式单 Reactor 单线程单Reactor多线程主从Reactor多线程 在目前的线程模型中一种是传统阻塞的I/O模型&#xff0c;一种是Reactor线程模型。 传统的阻塞式 I/O 为了同时处理多个客户端的请求&#xff0c;服务端为每一个连接都会分配一个新的…

Freemarker基本语法与案例讲解

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《SpringBoot》。&#x1f3af;&#x1f3af; &…

搭建消息时光机:深入探究RabbitMQ_recent_history_exchange在Spring Boot中的应用【RabbitMQ实战 二】

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 搭建消息时光机&#xff1a;深入探究RabbitMQ_recent_history_exchange在Spring Boot中的应用 引言前言第一&#xff1a;开启插件支持第二&#xff1a;springboot整合第三&am…

分类预测 | Matlab实现DBO-SVM蜣螂算法优化支持向量机的数据分类预测【23年新算法】

分类预测 | Matlab实现DBO-SVM蜣螂算法优化支持向量机的数据分类预测【23年新算法】 目录 分类预测 | Matlab实现DBO-SVM蜣螂算法优化支持向量机的数据分类预测【23年新算法】分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现DBO-SVM蜣螂算法优化支持向量机的…

基于FPGA的HDMI编码模块设计(包含工程源文件)

前文已经通过FPGA实现了TMDS视频编码的算法&#xff0c;也对单沿数据采样转双沿数据采样的ODDR原语做了详细讲解和仿真验证&#xff0c;本文将这些模块结合&#xff0c;设计出HDMI编码模块&#xff0c;在HDMI接口的显示器上显示一张图片。 1、整体思路 如图1所示&#xff0c;是…

大数据机器学习与深度学习——过拟合、欠拟合及机器学习算法分类

大数据机器学习与深度学习——过拟合、欠拟合及机器学习算法分类 过拟合&#xff0c;欠拟合 针对模型的拟合&#xff0c;这里引入两个概念&#xff1a;过拟合&#xff0c;欠拟合。 过拟合&#xff1a;在机器学习任务中&#xff0c;我们通常将数据集分为两部分&#xff1a;训…

Mybatis代理对象是如何生成的

Mybatis源码解析 - mapper代理对象的生成&#xff0c;你有想过吗&#xff0c;我们讲到了mybatis操作数据库的流程&#xff1a;先创建SqlSessionFactory&#xff0c;然后创建SqlSession&#xff0c;然后再创建获取mapper代理对象&#xff0c;最后利用mapper代理对象完成数据库的…

jmeter配置使用(mac)

前言 这篇文件就是一个笔记&#xff0c;非mac用户不用看了&#xff0c;我这是换了mac&#xff0c;要用jmeter的倒腾。 一、下载 二、使用步骤 1.解压 tgz格式的直接用tar命令就行 tar -zxvf 包名2.启动 一种是进入解压包的bin目录启动 这种方式启动的就是命令框不能关闭&am…

Python实现多种图像锐化方法:拉普拉斯算子和Sobel算子

Python实现多种图像锐化方法&#xff1a;拉普拉斯算子和Sobel算子 图像和视频逐渐成为人们生活中信息获取的重要来源&#xff0c;而图像和视频在传输过程中有很多因素可能造成图像模糊&#xff0c;比如不正确的聚焦会产生离焦模糊&#xff0c;景物和照相机的相对运动会造成运动…

(开源)2023工训大赛智能垃圾分类项目(可循环播放视频,显示垃圾分类信息,拍照识别,垃圾分类,满载报警,压缩)

省赛:由于这个比赛是两年一届&#xff0c;并未做足充分的准备&#xff0c;但是通过一定的单片机基础&#xff0c;加上速成能力&#xff0c;也就是熬夜学&#xff0c;通过疯狂的网络搜索&#xff0c;在省赛第5 入选国赛 下面来简单介绍一下我们作品&#xff1a; 主控&#xff1…

代码随想录算法训练营第二十四天(回溯算法篇)|理论基础

结束了二叉树的篇章&#xff0c;我们进入到回溯啦&#xff01; 学习资料&#xff1a;代码随想录 (programmercarl.com) 理论基础 回溯算法又称回溯搜算算法&#xff0c;是一种搜索方法。 作为递归的“副产品”&#xff0c;只要右递归的地方就会有对应的回溯的过程。 回溯算…

Git命令大全:从基础到高级应用

目录 一、增加/删除文件 1.1 添加文件到暂存区 1.2 添加所有文件到暂存区 1.3 从暂存区移除文件 1.4 从版本库和工作区删除文件 二、代码提交 2.1 提交暂存区文件到本地仓库 2.2 修改最后一次提交信息 三、本地分支 3.1 创建新分支 3.2 切换分支 3.3 创建并切换到新分支 3.4 删…

微信小程序:布局样式

效果 wxml <view class"layout"><view class"left"><view>1</view><view>1</view><view>1</view><view>1</view><view>1</view></view><view class"right"&…

计算机毕业设计 基于Web的城市旅游网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

发布jar包到maven中央仓库

1. 环境 在网上找的很多文章中写得都有很多问题&#xff0c;这里记录一下最近一次成功地发布jar包到maven中央仓库的过程。并附带上每一个步骤官方的指导链接。 系统&#xff1a;mac&#xff08;windows系统在下载辅助工具时不太一样&#xff0c;在配置上和mac系统没有区别&…

rk3568 RGMII KSZ8795 MAC TO MAC

RK3568与KSZ8795交换机芯片连接&#xff0c;直接MAC TO MAC方式&#xff0c;这样一下就扩展会4路网口&#xff0c;应该场合比较多&#xff0c;移植过程如下&#xff1a; 参考《Rockchip_Developer_Guide_Linux_MAC_TO_MAC_CN.pdf》 《rockchip RGMIImv88e6390 管理型交换机功…

【HarmonyOS】【DevEco Studio】安装教程及环境配置问题解决

目录 一、DevEco Studio 安装二、配置环境ohmp安装报错问题解决方法一&#xff1a;注册表删除数值&#xff08;没解决&#xff09;方法二&#xff1a;进入DevEco Studio点击Settings进入设置&#xff08;没解决&#xff09;方法三&#xff1a;自己去官网下载ohmp的包安装&#…

13.Spring 整合 Kafka + 发送系统通知 + 显示系统通知

目录 1.Spring 整合 Kafka 2.发送系统通知 2.1 封装事件对象 2.2 开发事件的生产者和消费者 2.3 触发事件&#xff1a;在评论、点赞、关注后通知​编辑 3.显示系统通知 3.1 通知列表 3.1.1 数据访问层 3.1.2 业务层 3.1.3 表现层 3.2 开发通知详情 3.2.1 开发数据…

mac安装pnpm与使用

1、什么是pnpm&#xff1f; pnpm 全称 performant npm&#xff0c;意思是高性能的 npm。pnpm 由 npm/yarn 衍生而来&#xff0c;解决了 npm/yarn 内部潜在的 bug&#xff0c;极大的优化了性能&#xff0c;扩展了使用场景。被誉为 “最先进的包管理工具”。 2、pnpm特点 速度…

Eolink Apikit 如何进行 Websocket 接口测试?

什么是 websocket &#xff1f; WebSocket 是 HTML5 下一种新的协议&#xff08;websocket协议本质上是一个基于 tcp 的协议&#xff09;。 它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的 Websocket 是一个持久化的协议。…