R2017b Text Analytics Toolbox:苹果的十年

综合技术 MATLAB

All comments and opinions expressed on Zhihu are mine alone and do not necessarily reflect those of my employers, past or present.

在R2017b中,MATLAB新增加了一个专注于文本类数据处理的Text Analytics Toolbox。笔者并不从事这方面的研究,而且曾经在经济学基础挂过科。所以一定要给大家好好讲一下如何用这个新的toolbox来分析苹果的财报。

废话不多说,我们先准备数据,下载好苹果公司2016年和2017年度的财报,今年是iPhone的10周年,为庆祝iPhone X的发布我们也下载一下2007财年的财报。

读取数据

首先,我们读入数据,我们以17年的财报为样板。Text Analytics Toolbox提供了直接读取PDF格式文本的函数 extractFileText

>> text = extractFileText("2017FY.pdf");
>> text.strlength %string类型
ans =
      442608

财报里除了眼花缭乱的数字,最吸引人的就属管理层给投资人解释公司经营状况和展望未来画大饼的段落了,这一段都集中在Item 7中。

我们提取这一段内容,并去除目录中被我们误读的部分

>> section = extractBetween(text,"Item 7.","Item 8.");
>> section(section.strlength > section.strlength
ans =
       68239

处理数据

相信专业人士对于文本的处理有很多方法,对于我们小白来说,最先想到的就是要将这一大串的string变成单独的可以理解的单词(token)。 tokenizedDocument 就是这样的一个工具

>>document = tokenizedDocument(lower(section)); %统一小写,提取单词
>>document
ans = 
  tokenizedDocument:
   11775 tokens: management’s discussion and...

一个tokenizedDocument同时也帮助我们完成了去重的工作,我们可以通过查看Vocabulary属性来简单查看不重复的单词

>>numel(document.Vocabulary)
1686

接下来一步,也是信号处理的标准步骤,除(滤)噪(波)了

文本处理中,有很多介词和代词对我们理解内容来说是没有太大意义的,比如”a”, “the”, “his”,”us”…, 这些被称为stop words,我们需要从原文中去除掉。Text Analytics Toolbox提供了一套常用的stop words,可以通过直接调用stopWords来得到, 并且用removeWords来移除不需要的单词

>> document = removeWords(document,stopWords)
document = 
  tokenizedDocument:
   8186 tokens: management’s discussion analysis

一下就少了3000多词有没有,这时就可以插播一个广告了

paper达不到5000字怎么办?用stopWords来凑!

当然你也可以移除一些特定的词,比如对于2017年的财报来说,肯定会提及“2017“,”2016“这类的数字,我们都把他们移除掉

>>document = removeWords(document,["2015","2016","2017"]);

除了stop words以外,我们还得把没用的标点符号去除,还好有方便的 erasePunctuation 函数

>>document = erasePunctuation(document)
document = 
  tokenizedDocument:
   6371 tokens: managements discussion analysis
>>numel(document.Vocabulary)
ans = 
    1558

一下子又少了2000多词,但是这时候我们如果看document.Vocabulary, 会发现唯一词并不会减少很多,毕竟我们只是去掉了一些数字和标点。而剩下有很多词虽然看上去很接近,但是还是被算成了不同的词,比如

companies vs. company
sales vs. sale
increase vs. increasing vs. increased vs. increment

这些词有些是同一个词的单复数,或是动词的不同形态,或是都出自同一词根。从数据分析的角度来说,对我们的差别不大,我们需要将这样的词都归一化,这就需要 normalizeWords

>>document = normalizeWords(document);
>>length(document.Vocabulary)
ans = 
    1213
>>document.Vocabulary
ans = 
  1×1213 string array

  Columns 1 through 9

    "manag"    "discuss"    "analysi"    "financi" ...

可以看到我们的单词都变成词根了,这样同一单词的不同形式也能基本被统一了

最后我们再去掉一些财报中经常出现的无意义的词

>>cleanDocument = removeWords(document,["compani","sale","tax","net","product","incres"]);

就可以大致完成我们的数据处理的过程了。

数据可视化

文本数据最直观的可视化效果就是文字云了,在R2017b中,就算你没有购买Text Analytics Toolbox也可以使用新增加的 wordcloud 函数,当然在购买后就更方便使用准备好的数据啦。

统计处理好的文本我们可以用现成的 bagOfWords

这里稍微介绍下文本处理中Bag of Words (BoW)的概念。BoW是为了解决如下问题而出现的:

  • 我们有一堆没有分类好的文档
  • 我们希望把这些文档分类(侦探小说,散文,科普文…)
  • 有人给了我们一篇新的文档(星期天的早晨白茫茫……)
  • 新的文档是属于之前归类好的文档中的哪一类呢?(纪实文学)

BoW的思想就是统计词频,并以此生成一个文档的“指纹”/“字典”,如果我们想用一个新的文档来检索,那只要统计新文档的词频,就可以找到其对应的分类了。

这里我们只利用了他统计词频的功能

>>bag = bagOfWords(cleanDocument)
bag = 
bagOfWords with 1205 words and 1 documents:

    manag   discuss   analysi   financi   condit   …
       29         6         4        41       19

>> wordcloud(bag)

写到这里,笔者终于可以说上两句行话了,Deep Learning刷榜之前在图像分类中有一个很成功的概念是 Bag Of Features ,很多做图像检索的同学也很熟悉这个概念,其来源就是文本处理中的Bag of words。

可以看到2017年财报回溯和展望中,billion的出现很有可能是苹果在提收益的时候提到的,我们在之前的处理中似乎可以把billion给去掉。接下来的一些有意义的热词有”Change”,”foreign”似乎都意识着苹果将持续处于这个变化的国际市场中并受其影响。

我扯不下去了

有意思的是,我们可以来对比2007,2016和2017年的财报(billion被去除,due也是个空词)

2007(左),2017(右上),2016(右下)

可见十年前,ipod和mac还是苹果的热点,十年后的热点已然转成了市场而非产品。还有有意思的就是在07年的财报中(虽然已经在图上看不出了),million的出现频率远高于billion ,而10年后的今天billion早已是随处可见了。

笔者只能感叹科技产业的兴替是多么的迅速,十年前大家还用着敲核桃核桃碎的诺基亚,十年后就已经是手机碎了,不知下一个十年……

It was the best of times, it was the worst of times…

以上就是小白对文本数据处理的初体验,Text Analytics Toolbox本身有很多更强大的功能,而且在以后也会持续更新,赶紧下单找老板报销吧!

最后附上生成三幅图的全部代码

%% read data
i = 1;
for year = ["2007","2016","2017"]
text = extractFileText(year+"FY.pdf");
section = extractBetween(text,"Item 7.","Item 8.");
section(section.strlength < 3000) = [];
document(i) = tokenizedDocument(lower(section));
i = i + 1;
end

%% cleanup data
document = removeWords(document,stopWords);
document = removeWords(document,["2016","2017","2015","2014","2007","2006"]);
document = erasePunctuation(document);
document = normalizeWords(document);
cleanDocument = removeWords(document,["compani","sale","tax","net","product","incres","increas","billion"]);

%% Create bag of words
bag2007 = bagOfWords(cleanDocument(1));
bag2016 = bagOfWords(cleanDocument(2));
bag2017 = bagOfWords(cleanDocument(3));

%% Visualize
figure;
wordcloud(bag2007)
title('2007')
figure;
wordcloud(bag2016) 
title('2016');
figure;
wordcloud(bag2017)
title('2017')

稿源:MATLAB (源链) | 关于 | 阅读提示

本站遵循[CC BY-NC-SA 4.0]。如您有版权、意见投诉等问题,请通过eMail联系我们处理。
酷辣虫 » 综合技术 » R2017b Text Analytics Toolbox:苹果的十年

喜欢 (0)or分享给?

专业 x 专注 x 聚合 x 分享 CC BY-NC-SA 4.0

使用声明 | 英豪名录