10. 对文本的表达和分析

Fundamental concepts:the importance of constructing mining-friendly data representations(构造易于挖掘的数据表现形式的重要性);representation of text for data mining(文本类数据的挖掘构型)

Exemplary techniques:bag of words representation(词袋模型);TFIDF calculation(term frequency–inverse document frequency计算);N-grams(N-grams模型);Stemming(词干提取);Named entity extraction(命名实体抽取);Topic models(主题模型)

这一章,先聊聊为什么文本分析很重要,又很困难,走起!


Why Text Is Important

现在文本沟通的场景越来越多了,也都有记录,数据源比较丰富。


Why Text Is Difficult

文本是语言结构的数据,供人类消费的而不是供计算机。

词语有不同的长度,文章可以有不同的词汇数量,并且词语顺序有时有影响有时没影响。

人经常会拼错单词,也会写语法错误。

下面几个小节主要讲,如何为文本分析做数据准备和预处理。


Representation(表示法)

先明确几个术语:

information retrieval(IR):信息检索;

document:一单份文本,不论大小,都作为一个独立的分析的单元;

corpus:语料库、文集,这里指的是多个document的一个合集。


Bag of Words

我们有一个documents集,每个单元都是一个相对自由排序的词汇,我们需要把这个状态转换到特征向量的形式上。

词袋模型忽略了语法和词序、句子结构和标点。

第一步的处理通常是将单词当做标记,如果单词出现了就标注为1,不出现标注0,从而排除部分不包含关键词的文档。

Term Frequency

图10-3 经过标准化和词干提取的样本,按照频率排序

为了创造10-3的这个表格,需要进行如下几步处理:

1. 词汇标准化,所有字母变成小写;

2. 词干被提取了,词语后缀统一去掉了,复数词也被变成了单数词;

3. 停用词(stopwords)被去掉了,停用词是经常被用到的词,比如the,and,of等。

通常情况下数字会被直接忽略,但是在某些特殊场景下需要被统计,比如“4TB”和“1Q13”等。

Note:粗心地删除stopwords,就像the road和on the road是两个完全不一样的作品,有时候直接删除stopwords并不是一个好的策略。

这里还需要注意一个点,由于document集合里面的不同文章的长短不同,不能按照词的出现次数来判断,通常以这个词在文档中出现的比例来标记(频次除以总词数),避免长篇文本过多对分析结果造成影响。


Measuring Sparseness:Inverse Document Frequency(稀疏性测量:关键词频次的反向方法)

相对于词袋频次法的另外两种考量:

1. 某个词不能过于稀少,数据分析时会对词汇的出现频率设置下限;

2. 某个词不能过于普通,某个词汇在每个文档中都出现时对文档分类将没什么帮助,通常会对词语设置上限来规避这个问题。

通常,一个词,在文集中越少的文档中出现,那么这个词就越能够表示出这几个文档的特征,也就是成为这些文章的标签词。

这个稀疏性通常用下式表示,名为inverse document frequency(IDF)(逆文档频率),见公式1-01:

IDF(t)=1+log(\frac{Total-number-of-documents}{Number-of-documents-containing-t} )

图10-1 在一个100篇文档的文集里面,词汇t的IDF曲线

通过IDF的图可以看出,词汇出现的越少(越左侧),IDF值越高,向右侧时无限接近1,大部分的stopwords的IDF值都在接近1的位置。

Combining Them:TFIDF(他们结合起来,我们得到了TFIDF)(term frequency–inverse document frequency)

某个词汇 t 在文档 d 中的TFIDF,可以用下面公式表示:

TFIDF(t,d)=TF(t,d)\times IDF(t)

TF值是每个单个文档中的词汇出现频次,IDF是跨文档的基于整个corpus的统计结果。

这样每个文档就变成了一个特征向量(feature vector),然后corpus就是整个这些特征向量的一个汇集。

单词挑选的时候可能会使用information gain来给词汇做排序,ig即是某个新增特征对总体样本的熵值减少量,参考本书56页。

词袋法的问题在于,独立地对待每一个单词,把他们当做样本特征,但更多情况下,会对多种分析方法的结果进行对比。


Example:Jazz Musicians(Jazz音乐家)

这里列举了15份音乐家的自传文本,已经有2000个特征词了,在去掉了stopwords之后。

这里的分析过程如下:

第一步,基础的词干提取,结果如下图10-2:

图10-2 针对句子“famous jazz saxophonist born in Kansas who played bebop and Latin”的词干提取后的结果

第二步,去除stopwords,并且所有的词针对文档长度进行了标准化,如下图10-3:

图10-3 针对句子“famous jazz saxophonist born in Kansas who played bebop and Latin”在去除stopwords后并进行了出现频次标准化后的结果。

在文本中jazz和play在jazz音乐的文档中过于常见,所以不能从IDF中得到增值数值,已经变得类似于stopwords。

这个句子的TFIDF如下图10-4所示:

图10-4 针对句子“famous jazz saxophonist born in Kansas who played bebop and Latin”的TFIDF值。

我们在做KNN的时候,使用了距离来聚类,此处我们使用类似的方法:

1. 将句子转换为TFIDF表现,如图10-4;

2. 计算每个音乐家的自传和这个句子的距离,并且选中距离最近的项。为了计算距离,我们使用余弦相似度公式(Cosine Similarity funnction)公式6-5:

d_{Jaccard} (X,Y)=1- \frac{X\ast Y}{\vert\vert X \vert\vert_{2}\ast \vert\vert Y \vert\vert_{2}}

距离的计算结果如下表10-4:

表10-4 每个音乐家的自传和句子“famous jazz saxophonist born in Kansas who played bebop and Latin”的相似度,以相似度降序排列

从数据相似度中可以看出最接近的是Charlie Parker,一个萨克斯管吹奏者,Kansas出生,还挺符合这个句子的关键词描述的。


*The Relationship of IDF to Entropy(IDF和熵的关系)

我们从公式开始一步步往下推导,首先一个单词 t 在文集中出现的概率可以如下式(书里面写document set,实际上应该理解为在corpus中某个文档中是否出现单词 t 的概率):

p(t)=\frac{Number-of-documents-containing-t}{Total-number-of-documents}

为了简化理解,我们把p(t)简化写为p,我们结合IDF的定义,可以得到某单词 t 的IDF为下式:

IDF(t)=1+\lg (\frac{Total-number-of-documents}{Number-of-ducuments-containing-t} )

这里1是一个不变量,我们忽略他,我们看到IDF(t)实际上就是\lg (\frac{1 }{p} ),然后又有\lg (\frac{1 }{p} )等于-\lg (p),考虑到corpus中的文档要么就包含 t (概率是p),要么就不包含t(概率是1-p),然后我们定义一个新的变量not- t,表示文档中不包含单词 t,那么这个新变量的IDF是多少?如下式:

IDF(not-T)=\lg (\frac{1}{1-p} )=-\lg (1-p)

图10-5 关于IDF(t)和IDF(not-t)的各个不同的情况的曲线

图10-5的左上,两个图像是镜像分布的,现在回忆下公式3-1中对熵的定义,在一个二元概率p_{2}=1-p_{1}  中,熵值公式如下:

entropy=-p_{1}\lg (p_{1} )- p_{2}\lg (p_{2} )

在本章针对单词 t 的分析中,熵值的定义简化为如下式所示:

entropy(t)=-p\lg (p)-(1-p)\lg (1-p)

现在引入IDF(t)IDF(not-t),我们可以简化上方的公式,过程如下:

entropy(t)=-p\lg (p)-(1-p)\lg (1-p)

=p\cdot IDF(t)-(1-p)[-IDF(not-t)]

=p\cdot IDF(t)+(1-p)[IDF(not-t)]

可以看到公式已经简化成了一个简单的期望计算式,我们可以把熵值当做IDF(t)IDF(not-t)的的期望值来算,基于t在corpus里面出现的概率。它的图形在图10-5的左下角,可以对比下,和第三章的图3-3的熵值曲线是一致的。


Beyond Bag of Words(词袋法延伸)

词袋法是一般情况下的首选,而且很多时候效果也不错,也会被当做文本分析的起手方法,但是有时候其他方法更优秀,下面介绍几个。

N-gram Sequences(N-gram序列)

N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。

每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。

该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。

(来自知乎摘录https://zhuanlan.zhihu.com/p/32829048)

n-Gram的主要缺陷就是会导致feature的巨量增加,并且很多feature都是无用的,需要考虑用一些特殊手段来应对多feature的状况。

Name Entity Extraction(命名实体提取)

许多的文本处理工具会自带一个名字实体提取库。名字实体是对知识体系敏感的一种方法,需要对大量的文集进行训练才能得到名字实体清单。这些命名实体必须要大量学习来提前提取出来,或者手动录入进去词库。通常名字实体词库有行业或领域的特征,针对不同领域使用不同的词库。

Topic Models(主题模型)

考虑到语言的复杂性,有时我们会想要在文档和模型中间加入一个新的层级,如下图10-6所示:

图10-6 通过一个topic layer(主题层)来对文档建模

topic通常是通过非监督学习得到的结果,在执行搜索引擎检索时,可以使用主题检索来代替具体的item检索。

我们可以把topic层当成一个词汇聚类分析的结果,由于是纯粹的算法聚类的,topic的结果有时候并不是为人们熟知的词汇,当然大部分情况下还是易于识别的。

词汇聚类算法包括:matrix factorization methods(矩阵因子分解法)(如Latent Semantic Indexing)、Probabilistic Topic Models(概率主题模型)(如Latent Dirichlet Allocation),算法很复杂本书不展开,学有余力的同学可以自行研究。

Note:Topic as Latent Information(作为潜在信息的主题)

潜在信息挖掘的相关问题我们将在第12章讨论,这是一个在模型和具体词汇中间的一个神秘而力量强大的存在。


Example:Mining News Stories to Predict Stock Price Movement(挖新闻故事来预测股价,刺激!)

先提几个困难和简化的假设:

1. 新闻对股价的远期影响是难以预测的,所以我们预测新闻当天的股价;

2. 预测股票的价格是困难的,所以我们只预测方向,甚至只预测变或不变;

3. 股价的小幅变动是不好预测的,所以我们来预测相对大的变动;

4. 任何一个新闻都有可能影响任何一个股票的价格,他们之间的关联关系是难以判断的,所以我们要缩小因果半径(causal radius),我们假设只有这个文章提及了这个股票,才会对这个股票的股价有影响,这个假设不严格,因为竞争对手的新闻、客户的新闻都会影响股价,而这个文章中不会提到所有这些相关因素,但为了简化分析我们最好还是接受这个假设。

如果一个股票涨超5%,我们称之为surge(飙升),如果跌超5%我们称之为plunge(跳水),这两者之间我们叫stable(稳定),同时我们加上一个灰度空间,避免4.9%和5%被判定为不同的结果,如下图10-7:

针对这个问题,我们创造一个二分类问题,我们把surge和plunge当做change,为正,stable为负。

The Data

sidebar:The News Is Messy

第一,消息的类型很多;第二,消息的格式很多;第三,文章中股票名称标记并不完全准确。

Data Preprocessing(数据预处理)

首先为了排除交易时间外事件的影响,排除掉这些事件导致的交易不稳定,我们用10点开始到下午4点收盘的价格当做价差算涨跌幅;

由于我们想要增加文章和股票的关联性,所以去除掉提及了多个股票的文章;

然后对剩下的文章进行标准化和词干提取并去除stopwords,最后,创造一个2阶n-grams模型,用terms和n-grams来表示每个新闻文章。

数据分析完成后,发现75%的文章属于stable,13%属于surge,12%属于plunge,也就是25%属于change,75%属于no change。

Results(结果)

图10-9 新闻分类问题的ROC曲线

排除股价预测和交易策略,单从图10-9看模型应用情况,有以下特征:

1. 几种模型相对于随机挑选都有上弓,表示文章分析确实有有效性;

2. 逻辑回归和朴素贝叶斯表现差不多,但决策树表现相对较差;

3. 模型建对比,并没有发现显著的相对优势区域。

剩下的分析感觉没啥可总结的,看看就好。

sidebar:Prior Work on Predicting Stock Price from Financial News

sidebar介绍了一些历史,当故事看。


summary

本章结束。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容