Test Data for Trading—Sentiment Analysis系列文章是对《Machine Learning for Algorithmic Trading》第十四章内容的讲解以及相关代码复现。因为中英文的文本分析存在较大差异,顾此系列没有选取中国市场的材料做为代码复现的数据,而是选择书后源代码进行复现。
从token到数字:文档-术语矩阵
词袋模型根据它所包含的术语或标记的频率来表示一个文档。每个文档都是一个向量,词汇表中的每个标记都有一个条目,反映了该标记与文档的相关性。
鉴于词汇表的存在,文档-术语矩阵是可以直接计算的。然而,它也是一种粗略的简化,因为它抽象了词序和语法关系。尽管如此,它往往能在文本分类中迅速取得良好的结果,因此是一个非常有用的起点。
有几种方法来权衡一个标记的向量条目,以捕捉它与文件的相关性。我们将在下面说明如何使用sklearn来使用表示存在或不存在的二进制标志、计数和加权计数,这些计数考虑了所有文档中,即语料库中术语频率的差异。
#引入一些需要的库和包,搭建环境
from collections import Counter
from pathlib import Path
import numpy as np
import pandas as pd
from scipy import sparse
from scipy.spatial.distance import pdist
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter
import seaborn as sns
from ipywidgets import interact, FloatRangeSlider
import spacy
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer, TfidfTransformer
from sklearn.model_selection import train_test_split
导入前几节提到的bbc数据
#将数据转换成dataframe格式
docs = pd.DataFrame(doc_list, columns=['topic', 'heading', 'body'])
docs.info()
检查结果
docs.sample(10)
BBC数据是从五种文本中提取得到的。
#得到bbc数据中五种类别分别的占比
docs.topic.value_counts(normalize=True).to_frame('count').style.format({
'count': '{:,.2%}'.format})
得到的bbc文档中五种类型文本的比例如图所示。
1、对Token进行计数
#计算整个语料库中有多少个word
word_count = docs.body.str.split().str.len().sum()
print(f'Total word count: {
word_count:,d} | per article: