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:

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

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

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

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

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:

距离的计算结果如下表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,我们结合IDF的定义,可以得到某单词 t 的IDF为下式:

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

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

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

在本章针对单词 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

本章结束。

你可能感兴趣的:(10. 对文本的表达和分析)