本文共 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/