博客
关于我
R语言主题模型LDA评估公司面临的风险领域与可视化
阅读量:166 次
发布时间:2019-02-28

本文共 4510 字,大约阅读时间需要 15 分钟。

随着越来越多的数据被数字化,获取信息变得越来越困难。我们在本文中重点关注一个示例——评估公司面临的不同风险领域。为此,我们参考了公司提交给证券交易委员会的年度报告,其中提供了公司财务业绩的全面摘要[1],包括公司历史、组织结构、高管薪酬、股权、子公司和经审计的财务报表等信息,以及其他信息。

除了通常的信息(例如股票的波动性和季节性方面)之外,公司还会发布诸如“我们的前15名客户约占我们净销售额的80%”或“已经对我们提起产品责任诉讼”等内容,这些作为潜在投资者对公司状况的警告[3]。目的是对公司面临的风险进行分类,这可以作为对警告投资者和潜在投资者的充分建议。

其中大多数是标准的东西——例如,库存波动很大,有些企业是季节性的。我们寻找异常的信息,例如“我们的前15名客户约占我们净销售额的80%”或“对我们提起了许多产品责任诉讼”——非处方药制造商,或者考虑演唱会的发起人提出:“我们承担大量债务和租赁义务,这可能会限制我们的运营并损害我们的财务状况。”

根据David Blei的说法,主题模型是一种算法,用于发现大量、非结构化文档集合的主要主题。主题模型可以根据发现的主题来组织集合[2]。首先,清理工作环境并加载所需的程序包,如下所示:

rm(list=ls())library("tm")library("wordcloud")library("lda")

为了简便起见,我们下载了数据,并从中提取了公司的风险部分:

textdata = readRDS("data.Rds")

我们计算词频(term frequency,TF)和逆文档频率(inverse document frequency, IDF)进行评估:

stpw = c("item.","1a","risk","factors","may","and","our","the","that","for","are","also","u","able","use","will","can","s") stopwords('english')comn = unique(c(stpw, stpw1))stopwords = unique(c(gsub("'","",comn), comn))

文本清理函数定义如下:

text.clean = function(x) {  x = gsub("<.*?>", "", x)  x = gsub("[^[:alnum:]///' ]", " ", x)  x = iconv(x, "latin1", "ASCII", sub="")  x = tolower(x)  x = removePunctuation(x)  x = removeNumbers(x)  x = stripWhitespace(x)  x = gsub("^\\s+|\\s+$", "", x)  x = gsub("'", "", x)  x = gsub("[[:cntrl:]]", " ", x)  x = gsub("^[[:space:]]+", "", x)  x = gsub("[[:space:]]+$", "", x)}

定义文档矩阵函数如下:

custom.dtm = function(x1, scheme) {  for (i1 in 1:ncol(tdm.new)){    if (sum(tdm.new[, i1]) == 0) {      a0 = c(a0, i1)    }  }  length(a0)  if (length(a0) > 0) {    tdm.new1 = tdm.new[, -a0]  } else {    tdm.new1 = tdm.new  }  dim(tdm.new1)}

我们计算词频和逆文档频率:

doc.list <- strsplit(companyRDF$RF, "[[:space:")]term.table <- table(unlist(doc.list))

对于我们的分析,我们使用tf-idf,通过较小的权重来规范出现在所有文档中的关键词的影响。创建文档矩阵:

x1 = Corpus(VectorSource(companyRDF$RF))x1 = n.gram(x1, "bi", 2)dtm1 = custom.dtm(x1, "tf")dtm2 = custom.dtm(x1, "tfidf")freq1 = (sort(apply(dtm1, 2, sum), decreasing = T))

我们建立了一个包含6个主题的主题模型。主题比例(α)和主题多项式的Dirichlet超参数的值分别为0.02和0.02。使用LDAvis可视化拟合模型:

json <- createJSON(phi = RiskAnalysis$pta,                   doc.length = RiskAnalysis$doc.length,                  ...)

serVis函数可以采用json并以多种方式提供结果:

# serVis(json)

我们选择一个值K = 6,拟合K主题模型:

K = 6opics(dtm2, K = K, verb = 2)

主题一至主题六的关键词概率矩阵θ如下:

##            topic## phrase                 1            2            3            4            5            6##   tds       2.648959e-06  2.586869e-06  2.805227e-06  2.680430e-06  2.702986e-06  3.510401e-02##   brocades  2.842265e-06  2.669269e-06  2.823106e-06  2.920408e-06  2.799614e-06  2.506861e-02##   clients   3.646912e-06  3.546243e-06  3.928365e-06  3.578786e-06  1.898607e-02  3.969126e-06##   companys  3.492683e-06  3.201781e-06  3.634969e-06  3.471822e-06  1.816372e-02  3.747852e-06##   sprints   2.549403e-06  2.484293e-06  2.629347e-06  2.561769e-06  2.579702e-06  1.698829e-02##   brocade   2.856517e-06  2.680381e-06  2.839519e-06  2.936274e-06  2.811306e-06  1.651110e-02##   solar     3.302091e-06  3.124243e-06  3.361212e-06  1.292429e-02  3.270826e-06  3.614037e-06##   sprint    2.578740e-06  2.513213e-06  2.669652e-06  2.595447e-06  2.609471e-06  1.278997e-02##   reit      3.553825e-06  1.196685e-02  3.855616e-06  3.501886e-06  3.483736e-06  3.886507e-06##   clearwire 2.549970e-06  2.484945e-06  2.630211e-06  2.562457e-06  2.580352e-06  1.193481e-02

主题二和主题三彼此重叠,这从它们中的关键词也可以看出。但是,如果我们仔细观察一下,主题3则更多地涉及制造业,其中涉及供应管理、需求和供应等。主题2则更多地涉及软件产品、运营、收入和服务。

我们选择一个值K = 6。主题比例(α)和主题多项式的Dirichlet超参数的值分别为0.02和0.02。

我们为以下选择的六个主题生成一个词云:

for (i in 1:K){  a0 = which(lift[,i] > 1)  freq = theta[a0,i]  freq = sort(freq, decreasing = T)  n = ifelse(length(freq) >= 100, 100, length(freq))  wordcloud(rownames(top_word), top_word, scale = ...)}

研究共现矩阵可视化图进一步了解:

for (i in 1:K){  a0 = which(lift[,i] > 1)  freq = theta[a0,i]  freq = sort(freq, decreasing = T)  n = ifelse(length(freq) >= 20, 20, length(freq))  mat = dtm1[, match(row.names(top_word), colnames(dtm1))]  for (p in 1:nrow(mat)){    vec = cmat[p, plot(graph,     layout = layout.fruchterman.reingold,     vertex.frame.color = 'blue',     vertex.label.color = 'black',     vertex.label.font = 1,     vertex.size = 0.00001,    ...)  }}

以下是根据我们选择的主题对公司进行的分类:

eta.file = read_doc = mat[order(mat[,i], decreasing= T),]read_names = row.names(read_doc[1:n,])s[[i]] = calib[as.numeric(read_names),1]

潜在主题1主要讲与产品制造及其需求-供应链有关的风险。潜在主题2主要讲在线和移动广告相关的主题。潜在主题3主要讲以股息和养老金相关成本相关的风险。此外,我们还可以看到与宽带和有线电视运营商相关的风险。潜在主题4主要讲与太阳能行业财务/合并相关的风险。潜在主题5主要讲卫生部门,并讨论与实施政府法规有关的风险。潜在主题6主要讲制造业,涉及供应管理、需求和供应等。

最终,通过主题模型分析,我们对公司的风险进行了分类,为投资者提供了清晰的参考。

转载地址:http://jkic.baihongyu.com/

你可能感兴趣的文章
mysql 实现主从复制/主从同步
查看>>
mysql 审核_审核MySQL数据库上的登录
查看>>
mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
查看>>
mysql 导入导出大文件
查看>>
MySQL 导出数据
查看>>
mysql 将null转代为0
查看>>
mysql 常用
查看>>
MySQL 常用列类型
查看>>
mysql 常用命令
查看>>
Mysql 常见ALTER TABLE操作
查看>>
MySQL 常见的 9 种优化方法
查看>>
MySQL 常见的开放性问题
查看>>
Mysql 常见错误
查看>>
mysql 常见问题
查看>>
MYSQL 幻读(Phantom Problem)不可重复读
查看>>
mysql 往字段后面加字符串
查看>>
mysql 快照读 幻读_innodb当前读 与 快照读 and rr级别是否真正避免了幻读
查看>>
MySQL 快速创建千万级测试数据
查看>>
mysql 快速自增假数据, 新增假数据,mysql自增假数据
查看>>
MySql 手动执行主从备份
查看>>