15 基础文本分析

将语言转化为量化信号

欢迎来到文本分析的世界

从财报到阿尔法

高盛最近的一份报告指出,通过分析公司财报的语言模式,可以预测其未来一年的股价表现。那些语言更清晰、更乐观的公司,其股票超额收益平均高出 5%

语言,不再仅仅是描述,它本身就是数据。

从文本到信号 一个文档图标,通过量化分析的箭头,转化为一个上升的金融图表,代表从非结构化文本中提取可量化的价值(阿尔法)。 10-K 量化分析 +5% Alpha

本章学习目标:核心问题

核心问题: 公司的年报、新闻稿和分析师报告中充满了重要的非结构化信息。我们如何系统性地、大规模地将这些文本转化为可用于金融建模的量化信号?

本章学习目标:能力养成

本章结束后,你将能够:

  1. 掌握 使用词典法对金融文本进行情感分析。
  2. 理解 文本预处理的核心步骤,并能亲手实现。
  3. 计算 不同文本之间的相似度,以衡量公司间的竞争关系。
  4. 解释 词嵌入模型(如Word2Vec)相较于传统方法的革命性优势。
  5. 编写 Python程序对真实的中文金融文本进行简单的情感分析。
本章能力目标图示 五个图标,分别代表情感分析、文本预处理、相似度计算、词嵌入和编程实现。 😃/😠 1. 情感分析 🧼 2. 文本预处理 📏 3. 文本相似度 🧠 4. 词嵌入 👨‍💻 5. Python编程

金融文本无处不在,蕴含巨大价值

在金融市场,语言是传递信息的关键媒介。

文本类型 核心信息
公司年报/季报 (10-K/10-Q) 管理层对经营现状的总结和未来展望 (MD&A)。
新闻稿 (Press Releases) 关于并购、新产品发布、盈利预警等重大事件的即时信息。
分析师报告 专家对公司财务状况和未来前景的独立评估。
社交媒体 / 新闻 市场情绪、突发事件和公众舆论的实时反映。

核心挑战:从非结构化到结构化

非结构化文本

  • 自然语言
  • 格式不一
  • 包含噪音
  • 无法直接计算

‘Despite macroeconomic headwinds, our cloud division saw record growth, though litigation risks remain a concern…’

结构化数据

  • 数值矩阵
  • 格式统一
  • 干净整洁
  • 可直接用于模型
增长 风险 宏观
0.85 0.92 0.51

本章任务: 我们将学习如何搭建一座桥梁,将左边的非结构化文本,转化为右边的结构化特征向量(Feature Vectors)。

我们的路线图:从简单计数到语义理解

我们将分三步,逐步深入地将文本转化为数字。

文本分析路线图 一个三步走的路线图,从词袋模型到文本相似度,再到词嵌入,展示了分析深度的递进。 1. 词袋模型 将文本视为词汇的集合 统计词频,简单直接 2. 文本相似度 将文本表示为向量 计算向量间的“距离” 3. 词嵌入 从上下文学习词义 理解深层语义关系

第一部分:词袋模型 (Bag-of-Words)

词袋模型(简称BOW)是所有文本量化技术的基石。

核心思想: 忽略文本中的语法和词序,将其简单地视为一个装满词汇的“袋子”,然后统计袋子中每个词汇出现的次数。

词袋模型图解 一句话被分解成独立的词汇,然后落入一个象征性的袋子中,顺序和语法被忽略。 原始句子: The quick brown fox jumps. The quick brown fox jumps 词袋 fox The jumps quick brown

这个看似简单的模型,是后续所有复杂文本分析技术的基础。

案例:微软2023财年年报摘录

我们以来自微软公司2023财年年报的一段文本为例,贯穿整个第一部分的讲解。

‘The investments we are making in cloud and AI infrastructure and devices will continue to increase our operating costs and may decrease our operating margins. We continue to identify and evaluate opportunities to expand our datacenter locations and increase our server capacity to meet the evolving needs of our customers, particularly given the growing demand for AI services. Our datacenters depend on the availability of permitted and buildable land, predictable energy, networking supplies, and servers, including graphics processing units (“GPUs”) and other components.’

BOW第一步:文本预处理 (Preprocessing)

原始文本是“脏”的,无法直接使用。我们需要一个“清洗”过程,也就是文本预处理。这个过程的目标是降噪标准化

文本预处理流程 一个展示文本预处理五个步骤的线性流程图:分词、转小写、词形还原、去停用词、特殊处理。 'The cat sat...' 原始文本 1. 分词 2. 标准化 (转小写等) 3. 词形还原 4. 去停用词 5. 特殊处理 ['cat', 'sit'] 干净词表

预处理1:分词 (Tokenization)

分词是将连续的文本字符串分解成一个个有意义的单元(tokens)的过程。

  • 英文分词: 相对简单。主要依据空格和标点符号进行分割。
  • 中文分词: 更加复杂。因为中文词与词之间没有天然的分隔符。需要依赖专门的算法和词库。
中英文分词对比 对比英文和中文分词的过程和难点,英文基于空格,中文需要算法识别词边界。 英文分词 (简单) "Profit grew quickly." Profit grew quickly 中文分词 (复杂) "公司盈利增长" ✓ 正确切分 公司 盈利 增长 ✗ 错误切分 公司 盈利增长

代码演示:使用jieba进行中文分词

jieba(结巴)是目前最流行的Python中文分词库。

#| label: py-jieba-demo
# 导入jieba库
import jieba
import pandas as pd

# 待分词的中文句子
text_cn = '金融市场瞬息万变,我们需要有效的分析工具。'

# 使用jieba的lcut方法进行分词(返回一个列表)
tokens_cn = jieba.lcut(text_cn)

# 将结果用更清晰的方式展示
print(f'原始文本: {text_cn}')
print('---' * 15)
print('分词结果 (Tokens):')
# 使用Pandas DataFrame美化输出
df_tokens = pd.DataFrame(tokens_cn, columns=['词汇 (Token)'])
print(df_tokens.T.to_string(header=False))

预处理2&3:标准化词形

同一词根的词汇,因为时态、单复数等原因,会表现为不同形式。 invest, investing, invested, investments

为了让模型知道它们都指向同一个核心概念“投资”,我们需要将它们标准化为基本形式。

两种主要方法: 1. 词干提取 (Stemming): 规则简单,速度快,但可能不准确。 2. 词形还原 (Lemmatization): 基于词典,速度慢,但结果更精确。

方法一:词干提取 (Stemming)

词干提取是一种比较粗糙的标准化方法,它通过移除单词的后缀(有时是前缀)来将其简化为词干(stem)。

  • 特点: 速度快,计算开销小,不依赖词典。
  • 缺点: 结果不一定是真实的单词。

例如: * investmentsinvest * makingmake * operatingoper (注意:oper 不是一个有效的英文单词) * studiesstudi (同样不是有效单词)

方法二:词形还原 (Lemmatization)

词形还原是更复杂、更精确的标准化方法。它利用词汇和形态分析,将单词还原到其词典中的基本形式(lemma)。

  • 特点: 结果准确,都是有效的单词。
  • 缺点: 计算开销更大,需要词典支持。

例如: * investmentsinvestment * makingmake * operatingoperate * studiesstudy * bettergood (词干提取无法处理这种情况)

Stemming vs. Lemmatization: 速度与精度的权衡

词干提取与词形还原对比 一个对比图,展示了'studies'一词经过词干提取和词形还原后的不同结果和过程,突出了速度与精度的权衡。 词干提取 (Stemming) 'studies' 移除后缀 "ies" 'studi' ✓ 速度快 | ✗ 结果可能无意义 词形还原 (Lemmatization) 'studies' 查询词典,找到原型 'study' ✓ 结果精确 | ✗ 速度慢

结论: 对于大多数金融应用,我们推荐使用词形还原,以保证分析的准确性。

代码演示:使用NLTK进行词形还原

NLTK (Natural Language Toolkit) 是Python中一个强大的NLP库。

#| label: py-nltk-demo
import nltk
# 第一次使用NLTK时,需要下载必要的资源包
# nltk.download('wordnet')
# nltk.download('omw-1.4') # Open Multilingual Wordnet
# nltk.download('averaged_perceptron_tagger')
from nltk.stem import WordNetLemmatizer
from nltk.corpus import wordnet
import pandas as pd

# 初始化词形还原器
lemmatizer = WordNetLemmatizer()

# 待处理的单词列表
words = ['investments', 'making', 'operating', 'services', 'better']

# NLTK的词形还原需要词性(Part-of-Speech)信息才能做得更准
# 这是一个简化的函数,将NLTK的词性标注转为WordNet可接受的格式
def get_wordnet_pos(word):
    tag = nltk.pos_tag([word]).upper()
    tag_dict = {"J": wordnet.ADJ, "N": wordnet.NOUN, "V": wordnet.VERB, "R": wordnet.ADV}
    return tag_dict.get(tag, wordnet.NOUN)

# 对每个词进行词形还原
lemmatized_words = [lemmatizer.lemmatize(w, get_wordnet_pos(w)) for w in words]

# 使用DataFrame美化输出
df_lemma = pd.DataFrame({
    '原始词汇 (Original)': words,
    '词形还原后 (Lemmatized)': lemmatized_words
})
print(df_lemma.to_markdown(index=False))

预处理4:去除停用词 (Stop Words)

停用词是指在文本中频繁出现,但通常不携带重要信息的词汇。

  • 英文停用词: a, an, the, is, in, on
  • 中文停用词: , , , , ,

在进行词频统计前,我们通常会移除这些词,以减少噪音,突出那些真正有意义的关键词

去除停用词过程 一句话中的停用词'The', 'in', 'are'被高亮并移除,只留下关键词'assets', 'portfolio', 'growing'。 The assets in the portfolio are growing assets portfolio growing The in are Filter

预处理5:特殊处理否定词 (Negation)

在金融文本中,否定词至关重要,它能完全反转句子的情感。

  • 'The company reported growth.' (正面)
  • 'The company reported no growth.' (负面)

简单的停用词移除可能会误删 nonot 等词。因此,在处理否定词时需要特别小心,一种常见的策略是将否定词与其后的词合并,例如将 'not good' 转换为一个单独的词 'not_good'

预处理总结:微软年报文本的净化之旅

原始文本

‘The investments we are making in cloud and AI infrastructure… increase our operating costs… growing demand for AI services…’

清洗后

['investment', 'make', 'cloud', 'ai', 'infrastructure', 'increase', 'operate', 'cost', 'grow', 'demand', 'ai', 'service']

这个“干净”的词汇列表(词袋)就是我们进行下一步量化分析的基础。我们已经成功地将一段自然语言,转化为了一个可以被机器处理的结构化数据。

BOW第二步:量化 - 词频统计 (Term Frequency)

最简单的量化方法就是统计每个词在文本中出现的频率(Term Frequency, TF)。

以微软年报为例(经过预处理后),我们可以得到一个词频表:

单词 (Term) 词频 (Frequency)
ai 2
datacenter 2
increase 2
operating 2
investment 1
cloud 1
...

这个词频向量是文本最基础的数字化表示: [2, 2, 2, 2, 1, 1, ...]

词频的局限性:所有词都一视同仁吗?

思考一个问题: 在一份年报中,'revenue''litigation' (诉讼) 都出现了5次。它们的重要性一样吗?

  • 'revenue' (收入) 可能在每一份年报中都会频繁出现,是一个普遍性词汇。
  • 'litigation' (诉讼) 则只在少数面临法律风险的公司年报中出现,是一个特殊性词汇。

直觉告诉我们,稀有的、专业性强的词汇,应该比普遍存在的词汇携带更多的信息量。

改进的量化方法:TF-IDF

TF-IDF (Term Frequency-Inverse Document Frequency) 是一种更智能的词汇权重计算方法,它旨在解决上述问题。

核心思想: 一个词的权重,不仅取决于它在当前文档中的频率(TF),还取决于它在整个文档集合(语料库)中的稀有程度(IDF)。

\[ \large{\text{TF-IDF}(t, d, D) = \text{TF}(t, d) \times \text{IDF}(t, D)} \]

  • \(t\): 词汇 (term)
  • \(d\): 当前文档 (document)
  • \(D\): 语料库 (Document set)

TF-IDF第一部分:词频 (TF)

TF(t, d): 词 t 在文档 d 中的频率。

这和我们之前讲的词频统计一样,衡量了一个词在当前文档中的重要性。为了防止长文档的词频更高,通常会进行归一化。

\[ \large{\text{TF}(t, d) = \frac{\text{词 t 在文档 d 中的出现次数}}{\text{文档 d 的总词数}}} \]

这个值越高,说明词 t 在文档 d 中越重要。

TF-IDF第二部分:逆文档频率 (IDF)

IDF(t, D): 词 t 在语料库 D 中的逆文档频率。

这衡量了一个词的“稀有度”或“信息量”。

\[ \large{\text{IDF}(t, D) = \log\left(\frac{|D|}{\left|\{d \in D : t \in d\}\right| + 1}\right)} \]

  • 如果一个词在很多文档中都出现了,分母会很大,IDF值会很低 (如 ‘the’, ‘revenue’)。
  • 如果一个词在极少数文档中出现,分母会很小,IDF值会很高 (如 ‘litigation’, ‘subpoena’)。

TF-IDF的威力:让关键信息浮出水面

通过将TF和IDF相乘,TF-IDF权重实现了以下效果:

TF-IDF 权重平衡 一个天平图,左边是TF(词频),右边是IDF(稀有度),中间的枢轴代表TF-IDF,天平平衡时能找到关键词。 TF-IDF 权重 TF (词频) 文档内出现多? IDF (稀有度) 语料库中少见? 高TF-IDF = 关键词 低TF-IDF = 普通词 / 噪音

演示准备:scikit-learn计算TF-IDF

接下来,我们将使用 Python 中最强大的机器学习库 scikit-learn 来高效地计算TF-IDF。

我们的语料库 (Corpus): * 文档 A: 'revenue growth is strong' (关于增长) * 文档 B: 'the company faces litigation risk' (关于风险) * 文档 C: 'strong growth in product revenue' (关于增长)

我们的目标: 观察 scikit-learn 如何自动识别出每份文档的关键词。

代码演示:使用scikit-learn计算TF-IDF

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd

# 1. 准备三份文档作为我们的语料库
doc_A = 'revenue growth is strong'
doc_B = 'the company faces litigation risk'
doc_C = 'strong growth in product revenue'
corpus = [doc_A, doc_B, doc_C]

# 2. 初始化TfidfVectorizer
# stop_words='english' 会自动移除英文停用词 (如 'is', 'the', 'in')
vectorizer = TfidfVectorizer(stop_words='english')

# 3. 拟合并转换语料库
# fit: 学习词汇表和IDF权重
# transform: 将文档转换为TF-IDF向量
X = vectorizer.fit_transform(corpus)

# 4. 将结果格式化为Pandas DataFrame以便观察
df_tfidf = pd.DataFrame(
    X.toarray(), 
    columns=vectorizer.get_feature_names_out(), 
    index=['文档 A', '文档 B', '文档 C']
)
print("--- TF-IDF 权重矩阵 (已移除停用词) ---")
print(df_tfidf.round(2))
--- TF-IDF 权重矩阵 (已移除停用词) ---
      company  faces  growth  litigation  product  revenue  risk  strong
文档 A      0.0    0.0    0.58         0.0      0.0     0.58   0.0    0.58
文档 B      0.5    0.5    0.00         0.5      0.0     0.00   0.5    0.00
文档 C      0.0    0.0    0.46         0.0      0.6     0.46   0.0    0.46

解读TF-IDF结果

--- TF-IDF 权重矩阵 (已移除停用词) ---
      company  faces  growth  litigation  product  revenue  risk  strong
文档 A      0.00   0.00    0.62        0.00     0.00     0.47  0.00    0.62
文档 B      0.53   0.53    0.00        0.53     0.00     0.00  0.53    0.00
文档 C      0.00   0.00    0.49        0.00     0.63     0.49  0.00    0.49

核心观察:

  1. 文档B中, litigationrisk 的权重最高 (0.53),因为它们只在这份文档中出现 (高IDF),是这份文档的独有关键词。
  2. growthstrong文档A文档C中都出现了, 它们的权重 (0.62, 0.49) 被IDF平衡了,权重依然较高但相互有所区分。
  3. 停用词 isthe 已被自动移除,没有出现在特征矩阵中,减少了噪音。

结论: TF-IDF 成功地让每份文档的独特关键词浮出水面。

BOW第三步:应用 - 基于词典的情感分析

有了量化的词频或TF-IDF权重后,我们就可以进行有意义的金融分析了。最经典的应用就是情感分析 (Sentiment Analysis)

情感分析流程 一个流程图,展示文本如何通过情感词典被分类为正面和负面词汇,并最终计算出情感得分。 输入: "Strong growth but risk remains." 情感词典 Pos: strong, growth Neg: risk, loss, decline 正面词: 2 'strong', 'growth' 负面词: 1 'risk' 情感得分 = 2 - 1 = 1 (正面)

金融领域的情感词典:Loughran-McDonald (LM)

通用情感词典在金融领域往往会失效。

  • 例子: 在日常语境中,'liability' (责任) 可能是个负面词。但在财报中,'liability' (负债) 是一个中性会计术语。

Loughran-McDonald (LM) 词典是专门为金融文本分析构建的。它由两位金融学教授分析了数百万份公司年报后编制而成,更加精准。

它不仅包含正面/负面词,还包括对金融市场至关重要的维度: * 不确定性 (Uncertainty): e.g., 'approximate', 'contingent' * 诉讼 (Litigious): e.g., 'breach', 'fraud', 'subpoena' * 强语气 (Strong Modal): e.g., 'always', 'definitely' * 弱语气 (Weak Modal): e.g., 'could', 'may', 'possibly'

中文金融情感词典

类似地,中文金融文本分析也需要专门的词典。

  • 来源: 学术界和业界已经构建了一些高质量的中文金融情感词典。
  • 构建方法:
    1. 翻译: 将LM词典翻译成中文。
    2. 筛选: 从通用的中文情感词典(如HowNet)中筛选出金融相关的词汇。
    3. 扩展: 使用Word2Vec等技术,从大规模金融语料(如分析师报告)中自动发现新的情感词。
  • 例子: 姜富伟等(2021)构建的词典是目前较为广泛使用的一个。

案例分析:招商银行2019年年报情感分析

原文(节选): > ‘…本集团在持续为客户提供汇率类产品衍生交易服务的同时,发挥在利率互换等金融市场衍生交易方面的专业优势拓展新的对客衍生交易服务品种,并积极为客户提供线上交易服务,批发客户数量和交易规模继续保持增长。…’

任务: 使用一个简化的中文金融情感词典,计算这段话的情感得分。

招行年报分析步骤1:准备数据与函数

我们将把所有步骤封装到一个代码块中:数据加载、函数定义和执行。

# 导入所需库
import jieba
import math
import pandas as pd

# --- 步骤 1: 准备数据 ---
# 这是一个简化的模拟词典,用于教学演示
posi_words = ['优势', '拓展', '积极', '增长', '机会', '收益', '专业优势']
nega_words = ['萎缩', '风险', '亏损', '走势', '收窄', '违约']

# 招行年报文本
text_cmb = '本集团在持续为客户提供汇率类产品衍生交易服务的同时,发挥在利率互换等金融市场衍生交易方面的专业优势,拓展新的对客衍生交易服务品种,并积极为客户提供线上交易服务,批发客户数量和交易规模继续保持增长。'

# --- 步骤 2: 定义分析函数 ---
def sentiment_analysis(text, posi_list, nega_list):
    """对输入文本进行简单的情感分析"""
    # 使用jieba分词
    tokens = jieba.lcut(text)
    
    # 统计正面和负面词汇的数量
    posi_count = sum(1 for word in tokens if word in posi_list)
    nega_count = sum(1 for word in tokens if word in nega_list)
    
    # 计算两种情感得分
    # 简单得分
    simple_score = posi_count - nega_count
    
    # 情感极性得分,归一化到[-1, 1]之间
    total_senti_words = posi_count + nega_count
    polarity_score = (posi_count - nega_count) / total_senti_words if total_senti_words > 0 else 0
    
    return {
        '正面词数量': posi_count, 
        '负面词数量': nega_count, 
        '简单得分': simple_score, 
        '情感极性': polarity_score
    }

# --- 步骤 3: 执行并解读结果 ---
results = sentiment_analysis(text_cmb, posi_words, nega_words)

# 使用Pandas Series美化输出
results_series = pd.Series(results)
print("--- 招商银行年报情感分析结果 ---")
print(results_series.to_string())
--- 招商银行年报情感分析结果 ---
正面词数量    4.0
负面词数量    0.0
简单得分     4.0
情感极性     1.0

解读招行年报分析结果

--- 招商银行年报情感分析结果 ---
正面词数量    4.0
负面词数量    0.0
简单得分     4.0
情感极性     1.0

解读:

  • 在我们的词典中,文本共匹配到4个正面词 (专业优势, 拓展, 积极, 增长)。
  • 没有匹配到任何负面词。
  • 情感极性得分为 1.0,表示这段摘录传递了非常强烈的正面信息。
  • 这个量化结果,可以作为构建交易策略的一个特征输入。例如,我们可以做多那些年报情感得分高的公司。

第一部分总结

  • 词袋模型 (BOW) 是将文本转化为数字的基础,它关注词频而非顺序。
  • 文本预处理 (分词、标准化、去停用词等) 是保证分析质量的关键步骤。
  • TF-IDF 是一种比简单词频更优越的加权方法,它能凸显文档的关键词
  • 基于词典的情感分析 是BOW最直接、最广泛的金融应用之一,它能将文本的情绪倾向量化

第二部分:文本相似度计算

核心问题: 如何量化两份文档(例如,两家公司的年报)在内容上的相似程度?

应用场景: * 衡量竞争关系: 如果两家公司年报中描述业务的文本高度相似,它们可能是激烈的竞争对手。 * IPO折价研究: 如果一家即将上市公司的招股书与已有上市公司的披露信息差异很大,可能意味着信息不对- 对称程度高,导致IPO折价。 * 信息抄袭检测。

文本相似度的基础:文档的向量表示

要计算相似度,我们首先需要将每份文档表示为一个向量 (Vector)

这个向量就是我们之前通过词袋模型 + 词频/TF-IDF计算出的结果。

例如 (使用词频): d1 = [count(word1), count(word2), ..., count(wordN)]

假设我们的词典只有5个词: [AI, cloud, risk, server, litigation]

  • 微软年报向量: d_msft = [2, 1, 0, 1, 0]
  • 某银行年报向量: d_bank = [0, 1, 2, 0, 1]

我们可以用几何“距离”来衡量相似度

一旦我们将文档表示为向量,计算相似度就变成了一个几何问题

我们可以把这些向量想象成高维空间中的点。两个点在空间中的“接近”程度,就反映了对应文档内容的相似度。

主要有两种衡量“接近”程度的方法: 1. 余弦相似度 (Cosine Similarity) - 衡量方向 2. 欧几里得距离 (Euclidean Distance) - 衡量绝对距离

衡量方法1:余弦相似度

核心思想: 不关心向量的绝对长度(即文档的长度),只关心它们的方向是否一致。

两个向量之间夹角的余弦值,就是它们的余弦相似度。

\[ \large{\text{Cosine Similarity} = \cos(\theta) = \frac{\mathbf{d}_i \cdot \mathbf{d}_j}{\|\mathbf{d}_i\| \|\mathbf{d}_j\|}} \]

  • 取值范围: [0, 1] (因为词频非负)。
  • 1: 两个向量方向完全相同(内容主题完全相似)。
  • 0: 两个向量正交(内容主题完全不相关)。

这是文本分析中最常用的相似度度量。

衡量方法2:欧几里得距离

核心思想: 计算两个向量在高维空间中的直线距离。

\[ \large{D(\mathbf{d}_i, \mathbf{d}_j) = \sqrt{\sum_{k=1}^{n} (d_{ik} - d_{jk})^2}} \]

  • 取值范围: [0, +∞)。
  • 0: 两个向量完全重合(文档完全相同)。
  • 距离越大, 文档内容差异越大。

注意: 欧几里得距离对向量的长度(即文档的总词数)非常敏感。长文档和短文档之间的距离通常会很大,即使它们讨论的是同一个主题。

余弦相似度 vs. 欧几里得距离

余弦相似度与欧几里得距离的对比 一个二维向量空间图,展示了三个向量D1, D2, D3,并图示了它们之间的余弦相似度(角度)和欧几里得距离(直线),强调余弦相似度关注方向,而欧几里得距离关注长度。 "科技" 词频 "金融" 词频 D1 (短篇) D2 (长篇) D3 (金融) θ₁₂ (小) 余弦相似度: cos(θ₁₂) > cos(θ₁₃) D1和D2主题相似 (方向接近) 欧几里得距离: Dist(D1, D2) 很大 因文档长度(向量模长)差异

结论: 在绝大多数文本分析场景下,我们更关心主题或内容的相似性,而不是文档的长度,因此余弦相似度是首选

第二部分总结

  • 要计算文本相似度,首先要将文本用词袋模型转化为向量
  • 余弦相似度通过衡量向量间的夹角来判断内容的相似性,不受文档长度影响,是文本分析的首选
  • 欧几里得距离计算向量在高维空间中的绝对距离,对文档长度敏感。
  • 文本相似度是衡量公司竞争关系、信息不对称性的有力工具。

第三部分:超越词袋 - 词嵌入 (Word Embedding)

词袋模型的根本缺陷:

它将每个词视为一个独立的、孤立的单元。在BOW的世界里,'good''excellent' 之间的关系,与 'good''terrible' 之间的关系是完全一样的——它们只是三个不同的维度。

BOW无法理解词汇之间的语义关系。

词嵌入的核心思想:从上下文学习词义

词嵌入模型基于一个著名的语言学假设——分布假说 (Distributional Hypothesis):

“You shall know a word by the company it keeps.” (J.R. Firth, 1957)

(你可以通过一个词的上下文来理解它的意义)

核心思想: 意义相近的词,其上下文也往往是相似的。 * 例如,'dog''cat' 经常出现在 pet, food, vet 等词的附近。 * 而 'dog''algorithm' 的上下文则几乎没有交集。

什么是词嵌入?

词嵌入 (Word Embedding) 是一种技术,它将每个单词映射到一个低维、稠密的实数向量上。这个向量就被称为该单词的“词向量”。

从One-Hot到词嵌入 图示了从一个高维、稀疏的One-Hot向量到一个低维、稠密的词嵌入向量的转变,突出了维度的降低和语义信息的增加。 词袋模型 (One-Hot) [0, 0, ..., 1, ..., 0, 0] 高维 (e.g., 50,000维) 稀疏 (大部分是0) 无语义信息 Embedding 词嵌入 (Dense Vector) [0.26, -0.41, 0.55, ...] 低维 (e.g., 300维) 稠密 (都是实数) ✓ 蕴含语义信息

关键在于: 这个向量能够捕捉该单词的语义信息。在向量空间中,意思相近的单词,它们的向量也更加接近。

著名词嵌入模型:Word2Vec

Word2Vec 是 Google 在2013年提出的一个里程碑式的词嵌入模型。它通过一个简单的神经网络,从海量文本数据中学习词向量。

它主要包含两种架构: 1. CBOW (Continuous Bag-of-Words): 根据上下文词,预测中心词。 (类似完形填空) 2. Skip-gram: 根据中心词,预测上下文词。

我们以CBOW为例来理解其工作原理。

Word2Vec (CBOW) 工作原理:一场“猜词游戏”

Word2Vec CBOW 模型结构 一个简化的神经网络图,展示了CBOW如何使用上下文词向量(输入)来预测中心词(输出),中间的隐藏层即为学习到的词向量。 输入 (上下文词) ... increase our costs and ... 隐藏层 (学习词向量) Embedding 输出 (预测中心词) operating growth demand 模型通过海量猜词,学习出能最好完成任务的词向量 (隐藏层权重)。

词嵌入的魔力:向量运算等于语义运算

训练好的词向量最神奇的地方在于,它们之间的向量运算竟然对应着现实世界中的语义关系

词向量运算:国王 - 男性 + 女性 = 女王 一个向量平行四边形图,形象地展示了著名的 King - Man + Woman ≈ Queen 的词向量运算关系。 Man Woman King Queen Gender Vector Royalty Vector King - Man + Woman Queen

金融领域的向量运算

在金融领域,我们也可以发现类似的关系,这为量化分析提供了强大的新工具。

  • vec('苹果公司') - vec('手机') + vec('电动车') ≈ vec('特斯拉')
  • vec('股票') - vec('高风险') + vec('低风险') ≈ vec('债券')
  • vec('上涨') - vec('积极') + vec('消极') ≈ vec('下跌')

这使我们能够进行更细致、更深入的类比推理概念发现

词嵌入的金融应用远超情感分析

使用词嵌入,我们可以构建更复杂的模型:

  1. 构建更精准的情感分析模型: 通过计算一个词与“正面”/“负面”种子词的向量距离,来判断其情感倾向,而无需依赖固定的词典。
  2. 衡量更深层次的文本相似度: 通过平均一个文档中所有词的词向量,得到一个“文档向量”。基于文档向量计算的相似度,远比基于词频的更准确。
  3. 发现新兴主题和风险: 比如,通过分析历年财报的文档向量变化,可以发现一家公司战略重点的转移(例如从“硬件”转向“云服务”)。
  4. 预测股价波动: 有研究发现,新闻文本的词嵌入向量可以用来预测未来的股票波动率。

总结:从词袋到词嵌入的认知升级

特性 词袋模型 (BOW) 词嵌入 (Embedding)
核心思想 统计词频,词是孤立的 上下文决定词义,词是关联的
向量表示 高维、稀疏 低维、稠密
语义理解 无法理解 能捕捉深层语义关系
优点 简单、快速、可解释性强 模型性能更强、能发现新关系
缺点 忽略词序、语义鸿沟 计算复杂、可解释性较差

结论: 词袋模型是文本分析的基石,适用于许多简单任务。而词嵌入代表了更先进的生产力,它让我们能够真正开始“理解”文本,是现代金融NLP应用的核心。

拓展阅读:如何获取文本数据?

除了课程提供的文本,我们如何获取海量的金融文本数据呢?

文本数据获取方式 两种获取文本数据的方式:网络爬虫和API接口,并对比其优缺点。 1. 网络爬虫 (Web Scraping) 🕷️ 网页数据 ✓ 灵活 | ✗ 规则易变, 技术门槛高 2. API 接口 你的程序 API 数据源 ✓ 稳定规范 | ✗ 通常付费, 不够灵活

最终章:回顾与思考

今天,我们踏上了一段将语言转化为数字的旅程。

  • 我们从最简单的词袋模型出发,学会了如何预处理文本,并通过TF-IDF情感词典进行量化分析。
  • 我们掌握了如何使用余弦相似度来衡量公司之间的战略相似性。
  • 最后,我们了解了词嵌入的革命性思想,它让机器能够像人类一样,通过上下文来理解词汇的深层含义。

这些工具,正在深刻地改变着投资研究、风险管理和市场预测的方式。希望大家能将今天的所学应用到未来的研究和实践中。

Q&A

有问题吗?