交易文本数据:情感分析
这是三章中的第一章,专门介绍使用自然语言处理(NLP)和机器学习从文本数据中提取交易策略信号。
文本数据内容丰富但高度非结构化,因此需要更多预处理才能使ML算法提取相关信息。一个关键挑战是在不丢失其含义的情况下将文本转换为数值格式。我们将介绍几种能够捕捉语言细微差异的技术,以便将其用作ML算法的输入。
在本章中,我们将介绍专注于个别语义单元(即单词或称为标记的短语组)的基本特征提取技术。我们将展示如何通过创建文档-术语矩阵来表示文档作为标记计数向量,然后将其用作新闻分类和情感分析的输入。我们还将介绍流行的朴素贝叶斯算法。
在接下来的两章中,我们将在这些技术的基础上使用主题建模和词向量嵌入等ML算法,以捕获更广泛上下文中包含的信息。
内容
- 使用文本数据的机器学习 - 从语言到特征
- 自然语言处理的挑战
- 应用场景
- NLP工作流程
- 从文本到标记 - NLP管道
- 代码示例:使用spaCy和textacy的NLP管道
- 数据
- 代码示例:使用TextBlob进行NLP
- 代码示例:使用spaCy和textacy的NLP管道
- 计算标记 - 文档-术语矩阵
- 代码示例:使用scikit-learn的文档-术语矩阵
- 交易中的NLP:文本分类和情感分析
- 朴素贝叶斯分类器
- 代码示例:新闻文章分类
- 代码示例:情感分析
- 二分类:Twitter数据
- 在大型多类Yelp数据集上比较不同的ML算法
使用文本数据的机器学习 - 从语言到特征
鉴于人类使用自然语言进行大量信息交流和存储,文本数据可能非常有价值。与投资相关的数据源范围从公司报表、合同或专利等正式文件,到新闻、观点和分析师研究或评论,再到各种社交媒体帖子或消息。
有用的资源包括:
- 语音和语言处理, Daniel Jurafsky & James H. Martin, 第3版, 草稿, 2018
- 统计自然语言处理和基于语料库的计算语言学, 斯坦福大学注释资源列表
- NLP数据源
自然语言处理的挑战
将非结构化文本转换为机器可读格式需要仔细的预处理,以保留数据的有价值语义方面。人类如何从语言中获取意义并理解内容并不完全被理解,通过机器提高语言理解仍然是一个非常活跃的研究领域。
NLP具有挑战性,因为将文本数据有效用于机器学习需要理解语言的内部工作原理,以及它所指的世界知识。主要挑战包括:
- 由于多义性导致的歧义(“Local High School Dropouts Cut in Half”)
- 非标准和不断发展的语言使用,特别是在社交媒体中
- 习语:“throw in the towel”
- 实体名称可能很棘手:“Where is A Bug’s Life playing?”
- 需要对世界的知识:“Mary and Sue are sisters” vs “Mary and Sue are mothers”
应用场景
应用场景 | 描述 | 示例 |
---|---|---|
聊天机器人 | 理解用户的自然语言并返回智能响应 | Api.ai |
信息检索 | 找到相关结果和相似结果 | |
信息提取 | 从非结构化文档中提取结构化信息 | 从Gmail中提取事件 |
机器翻译 | 一种语言到另一种语言 | Google翻译 |
文本简化 | 保留文本的含义,但简化语法和词汇 | Rewordify, 简体中文维基百科 |
预测性文本输入 | 更快或更容易输入 | 短语补全, 一个更好的应用 |
情感分析 | 说话者的态度 | Hater News |
自动摘要 | 提取式或抽象式摘要 | reddit的autotldr算法, autotldr示例 |
自然语言生成 | 从数据生成文本 | 计算机如何描述体育比赛, 发表者撤回120多篇胡言乱语论文 |
语音识别和合成 | 语音转文本,文本转语音 | Google的Web语音API演示, Vocalware文本转语音演示 |
问答 | 确定问题的意图,将查询与知识库匹配,评估假设 | Watson如何击败Jeopardy冠军Ken Jennings?, Watson Trivia Challenge, Watson背后的AI |
NLP工作流程
使用机器学习从文本数据中提取信号以用于算法交易的一个关键目标是从文档中提取信号。文档是相关文本数据源(如公司报告、标题或新闻文章、推文)的单个样本。语料库是文档的集合。
下图概述了将文档转换为可用于训练能够做出可操作预测的监督机器学习算法的数据集的关键步骤。
从文本到标记 - NLP管道
下表总结了NLP管道的关键任务:
特征 | 描述 |
---|---|
标记化 | 将文本分割为单词、标点符号等。 |
词性标注 | 为标记分配词类型,如动词或名词。 |
依赖解析 | 标记语法标记依赖关系,如主语<=>宾语。 |
词干化和词形还原 | 分配单词的基本形式:“was” => “be”, “rats” => “rat”。 |
句子边界检测 | 找到并分割单个句子。 |
命名实体识别 | 标记"真实世界"对象,如人物、公司或地点。 |
相似性 | 评估单词、文本段和文档的相似性。 |
代码示例:使用spaCy和textacy的NLP管道
笔记本nlp_pipeline_with_spaCy演示了如何使用开源Python库spaCy构建NLP管道。textacy库建立在spaCy之上,提供了对spaCy属性和其他功能的简单访问。
- spaCy 文档和安装说明
- textacy依赖于
spaCy
来解决其他NLP任务 - 参见文档
数据
- BBC文章,使用原始文本文件
- TED2013,15种语言的TED演讲字幕的平行语料库
代码示例:使用TextBlob进行NLP
TextBlob
库提供了一个简化的界面,用于执行常见的NLP任务,包括词性标注、名词短语提取、情感分析、分类、翻译等。
笔记本nlp_with_textblob说明了它的功能。
- 文档
- 情感分析
一个很好的替代方案是NLTK,这是一个用于处理人类语言数据的Python程序的领先平台。它提供了易于使用的接口,可访问50多个语料库和词汇资源,如WordNet,以及用于分类、标记化、词干化、标注、解析和语义推理的一套文本处理库,以及工业级NLP库的包装器,以及一个活跃的讨论论坛。
- 自然语言工具包(NLTK) 文档
计算标记 - 文档-术语矩阵
本节介绍了词袋模型,它将文本数据转换为数字向量空间表示,允许使用它们的距离比较文档。我们演示了如何使用sklearn库创建文档-术语矩阵。
- TF-IDF是关于什么重要
代码示例:使用scikit-learn的文档-术语矩阵
scikit-learn预处理模块提供了两种创建文档-术语矩阵的工具。
- CountVectorizer使用二进制或绝对计数来测量每个文档d和标记t的术语频率tf(d, t)。
- TfIDFVectorizer则将(绝对)术语频率加权为逆文档频率(idf)。因此,在更多文档中出现的术语将比具有相同频率但在所有文档中频率较低的标记获得较低的权重。
笔记本document_term_matrix演示了用法和配置。
交易中的NLP:文本分类和情感分析
一旦使用前几节讨论的自然语言处理技术将文本数据转换为数值特征,文本分类就像任何其他分类任务一样工作。
在本节中,我们将将这些预处理技术应用于新闻文章、产品评论和Twitter数据,并教会各种分类器预测离散新闻类别、评论分数和情感极性。
首先,我们将介绍朴素贝叶斯模型,这是一种概率分类算法,在处理词袋模型生成的文本特征时表现良好。
- 每日市场新闻情感和股票价格, David E. Allen & Michael McAleer & Abhay K. Singh, 2015, Tinbergen Institute讨论文件
- 使用情感合成预测经济指标, Abby Levenberg等, 2014
- 摩根大通NLP研究结果
朴素贝叶斯分类器
朴素贝叶斯算法在文本分类中非常流行,因为其低计算成本和内存需求使其能够在非常大和高维的数据集上进行训练。它的预测性能可以与更复杂的模型相媲美,提供了一个良好的基线,并以成功的垃圾邮件检测而闻名。
该模型依赖于贝叶斯定理和特征彼此独立的假设,给定结果类。换句话说,对于给定的结果,知道一个特征的值(例如文档中标记的存在)不会提供关于另一个特征值的任何信息。
代码示例:新闻文章分类
我们从一个说明朴素贝叶斯模型对2,225篇BBC新闻文章进行分类的例子开始,这些文章我们知道属于五个不同的类别。
笔记本text_classification包含相关示例。
代码示例:情感分析
情感分析是自然语言处理和机器学习在交易中最受欢迎的用途之一,因为资产或其他价格驱动因素的正面或负面观点很可能影响收益。
一般来说,情感分析的建模方法依赖于词典,如TextBlob库,或针对特定领域训练的模型。后者更可取,因为它允许更有针对性的标记,例如将文本特征与随后的价格变化联系起来,而不是间接的情感得分。
请参见data目录中有关获取数据的说明。
二分类:Twitter数据
我们使用一个带有二元极性标签的Twitter数据集以及一个带有五点结果尺度的大型Yelp商业评论数据集,说明情感分析的机器学习。
笔记本sentiment_analysis_twitter包含相关示例。
- Cheng-Caverlee-Lee 2009年9月 - 2010年1月 Twitter数据抓取
在大型多类Yelp数据集上比较不同的ML算法
为了说明大规模文本处理和分类,我们还使用了Yelp数据集。
笔记本sentiment_analysis_yelp包含相关示例。
- Yelp数据集挑战赛