新闻情绪与股市分析

新闻与股市的关系

我们这里使用两套数据来诉说CCTV新闻与上证指数的二三事。

在做这篇教程之前,我也没试过具体的效果会是怎么样。所以,一起来看看吧!

首先,显然,是一套中央新闻每天的新闻联播文字稿:CCTV_NEWS_20060616-20190329.csv

做金融要坚持中国特色社会主义道路,做AI也要利用新时代的新技术弘扬社会主义新价值观

我们想要预测/判断/分析的是,每日播报的新闻联播,是否会影响中国A股大盘表现。我们能否运用AI技术,进行金融市场的预测。

好,废话不多说,我们先来看数据。

text

import pandas as pd
df = pd.read_csv('./data/CCTV_NEWS_20060616-20190329.csv')
df.tail(10)
Unnamed: 0 date title content
76213 6 20190329 中宣部授予八步沙林场“六老汉”三代人治沙造林先进群体“时代楷模”称号 中共中央宣传部今天(29日)授予甘肃省古浪县八步沙林场“六老汉”三代人治沙造林先进群体“时代...
76214 7 20190329 【西藏民主改革60年·高原新时代】西藏:完善基础设施 增进民生福祉 西藏民主改革60年来,特别是党的十八大以来,水利、交通、能源、通信等基础设施得到极大改善,为...
76215 8 20190329 海南博鳌:打造美丽乡村会客厅 今年的博鳌亚洲论坛不光吸引了来自全球60多个国家和地区的2000多名嘉宾齐聚博鳌小镇,还首次...
76216 9 20190329 上海:百姓身边绿道 品质生活长廊 寸土寸金的上海市不断推进绿道建设,筑起百姓高品质生活的“走廊”。春暖花开,上海黄浦江畔绿道上...
76217 10 20190329 又是一年春光好 缤纷花海醉游人 又是一年春光好,缤纷花海醉游人。百花盛开的季节,越来越好的生态,带给人们更多美景,更多好心情...
76218 11 20190329 国内联播快讯 西藏举行纪念民主改革60周年主题晚会昨晚,纪念西藏民主改革60周年主题晚会《共产党来了苦变甜...
76219 12 20190329 “伊代”在非洲三国造成超700人死亡 本月中旬登陆的强热带气旋“伊代”在津巴布韦、莫桑比克、马拉维三个非洲国家已造成超过700人死...
76220 13 20190329 中国救援队在莫桑比克展开救援 应莫桑比克政府邀请,中国救援队抵达热带气旋“伊代”造成严重损害的贝拉市,开展医疗、消杀、物资...
76221 14 20190329 国际联播快讯 以方称或对加沙地带采取大规模行动28日,以色列总理内塔尼亚胡视察了以色列国防军在加沙地带边境...
76222 15 20190329 冰岛一廉航公司停飞 数千旅客滞留 28日,冰岛的廉价航空公司沃奥航空宣布停止运营,并取消所有航班。有大约4000名旅客受到影响...

突然发现了个问题,pandas自动把日期读入成了int。其实应该是str。

df.dtypes
Unnamed: 0     int64
date           int64
title         object
content       object
dtype: object
df.date = df.date.astype(str)

还有个垃圾column,也删了先

df = df.drop('Unnamed: 0',1)
df.head()
date title content
0 20060616 胡锦涛分别会见巴基斯坦、蒙古、伊朗总统和印度代表 中国国家主席胡锦涛今天在上海西郊宾馆分别会见了巴基斯坦总统穆沙拉夫、蒙古总统恩赫巴亚尔、伊朗...
1 20060616 胡锦涛接见上海合作组织峰会筹办工作人员 中共中央总书记、国家主席、中央军委主席胡锦涛今天下午在上海亲切接见了上海合作组织峰会筹办工作...
2 20060616 胡锦涛主席离沪赴哈萨克斯坦出席亚信会议成员国领导人会议 应哈萨克斯坦总统纳扎尔巴耶夫邀请,国家主席胡锦涛于今天乘专机离开上海,赴哈萨克斯坦阿拉木图市...
3 20060616 十届全国人大常委会第四十七次委员长会议在京举行 十届全国人大常委会第四十七次委员长会议今天上午在人民大会堂举行。吴邦国委员长主持今天的委员长...
4 20060616 吴官正会见斯里兰卡客人 中共中央政治局常委吴官正今天在人民大会堂会见了由副领袖卡鲁·贾亚苏里亚率领的斯里兰卡统一国民...

从名字就可以知道,这是CCTV新闻联播从2006年6月16日以来,每天的播报文字稿。

我们首先简单回顾一下课上讲解过的一些NLP小知识:

分词:

我们这里使用业界良心jieba分词库

a.基本分词函数与用法

jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode)

jieba.cut 方法接受三个输入参数:

  • 需要分词的字符串
  • cut_all 参数用来控制是否采用全模式
  • HMM 参数用来控制是否使用 HMM 模型

jieba.cut_for_search 方法接受两个参数

  • 需要分词的字符串
  • 是否使用 HMM 模型。

该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细

# encoding=utf-8
import jieba

seg_list = jieba.cut("中宣部授予八步沙林场“六老汉”三代人治沙造林先进群体“时代楷模”称号", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("海南博鳌:打造美丽乡村会客厅", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精确模式

seg_list = jieba.cut("上海:百姓身边绿道 品质生活长廊")  # 默认是精确模式
print(", ".join(seg_list))

seg_list = jieba.cut_for_search("冰岛一廉航公司停飞 数千旅客滞留")  # 搜索引擎模式
print(", ".join(seg_list))
Building prefix dict from the default dictionary ...
Dumping model to file cache /tmp/jieba.cache
Loading model cost 1.380 seconds.
Prefix dict has been built succesfully.

Full Mode: 中宣部/ 授予/ 八步/ 沙林/ 林场/ / / 六/ 老汉/ / / 三代/ 三代人/ 代人/ 人治/ 治沙/ 造林/ 先进/ 群体/ / / 时代/ 楷模/ / / 称号
Default Mode: 海南/ 博鳌/ :/ 打造/ 美丽/ 乡村/ 会客厅
上海, :, 百姓, 身边, 绿道,  , 品质, 生活, 长廊
冰岛, 一廉航, 公司, 停飞,  , 数千, 旅客, 滞留

可以使用jieba.lcut以及jieba.lcut_for_search直接返回 list

print(jieba.lcut("我在中国科学院研究自然语言处理"))
print(jieba.lcut_for_search("小明硕士毕业于中国科学院计算所,后在斯坦福大学深造"))
['我', '在', '中国科学院', '研究', '自然语言', '处理']
['小明', '硕士', '毕业', '于', '中国', '科学', '学院', '科学院', '中国科学院', '计算', '计算所', ',', '后', '在', '福大', '大学', '斯坦福', '斯坦福大学', '深造']
jieba.lcut("中宣部授予八步沙林场“六老汉”三代人治沙造林先进群体“时代楷模”称号", HMM=True)
['中宣部',
 '授予',
 '八步',
 '沙',
 '林场',
 '“',
 '六',
 '老汉',
 '”',
 '三代人',
 '治沙',
 '造林',
 '先进',
 '群体',
 '“',
 '时代',
 '楷模',
 '”',
 '称号']

添加用户自定义字典

很多时候我们需要针对自己的场景进行分词,会有一些领域内的专有词汇。

  • 1.可以用jieba.load_userdict(file_name)加载用户字典
  • 2.少量的词汇可以自己用下面方法手动添加:
    • 用 add_word(word, freq=None, tag=None) 和 del_word(word) 在程序中动态修改词典
    • 用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
jieba.suggest_freq(('海南博鳌'), True)
print('/'.join(jieba.cut('海南博鳌:打造美丽乡村会客厅', HMM=False)))
海南博鳌/:/打造/美丽/乡村/会客厅

b.词性标注

词性(part-of-speech)是词汇基本的语法属性,通常也称为词性。

词性标注(part-of-speech tagging),又称为词类标注或者简称标注,是指为分词结果中的每个单词标注一个正确的词性的程序,也即确定每个词是名词、动词、形容词或者其他词性的过程。

词性标注是很多NLP任务的预处理步骤,如句法分析,经过词性标注后的文本会带来很大的便利性,但也不是不可或缺的步骤。

代码 名称 说明 举例
a 形容词 取英语形容词adjective的第1个字母 最/d 大/a 的/u
ad 副形词 直接作状语的形容词.形容词代码a和副词代码d并在一起 一定/d 能够/v 顺利/ad 实现/v 。/w
ag 形语素 形容词性语素。形容词代码为a,语素代码g前面置以a 喜/v 煞/ag 人/n
an 名形词 具有名词功能的形容词。形容词代码a和名词代码n并在一起 人民/n 的/u 根本/a 利益/n 和/c 国家/n 的/u 安稳/an 。/w
b 区别词 取汉字“别”的声母 副/b 书记/n 王/nr 思齐/nr
c 连词 取英语连词conjunction的第1个字母 全军/n 和/c 武警/n 先进/a 典型/n 代表/n
d 副词 取adverb的第2个字母,因其第1个字母已用于形容词 两侧/f 台柱/n 上/ 分别/d 雄踞/v 着/u
dg 副语素  副词性语素。副词代码为d,语素代码g前面置以d 用/v 不/d 甚/dg 流利/a 的/u 中文/nz 主持/v 节目/n 。/w
e 叹词 取英语叹词exclamation的第1个字母 嗬/e !/w
f 方位词 取汉字“方” 的声母 从/p 一/m 大/a 堆/q 档案/n 中/f 发现/v 了/u
g 语素 绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母 例如dg 或ag
h 前接成分 取英语head的第1个字母 目前/t 各种/r 非/h 合作制/n 的/u 农产品/n
i 成语 取英语成语idiom的第1个字母 提高/v 农民/n 讨价还价/i 的/u 能力/n 。/w
j 简称略语 取汉字“简”的声母 民主/ad 选举/v 村委会/j 的/u 工作/vn
k 后接成分   权责/n 明确/a 的/u 逐级/d 授权/v 制/k
l 习用语 习用语尚未成为成语,有点“临时性”,取“临”的声母 是/v 建立/v 社会主义/n 市场经济/n 体制/n 的/u 重要/a 组成部分/l 。/w
m 数词 取英语numeral的第3个字母,n,u已有他用 科学技术/n 是/v 第一/m 生产力/n
n 名词 取英语名词noun的第1个字母 希望/v 双方/n 在/p 市政/n 规划/vn
ng 名语素 名词性语素。名词代码为n,语素代码g前面置以n 就此/d 分析/v 时/Ng 认为/v
nr 人名 名词代码n和“人(ren)”的声母并在一起 建设部/nt 部长/n 侯/nr 捷/nr
ns 地名 名词代码n和处所词代码s并在一起 北京/ns 经济/n 运行/vn 态势/n 喜人/a
nt 机构团体 “团”的声母为t,名词代码n和t并在一起 [冶金/n 工业部/n 洛阳/ns 耐火材料/l 研究院/n]nt
nx 字母专名   ATM/nx 交换机/n
nz 其他专名 “专”的声母的第1个字母为z,名词代码n和z并在一起 德士古/nz 公司/n
o 拟声词 取英语拟声词onomatopoeia的第1个字母 汩汩/o 地/u 流/v 出来/v
p 介词 取英语介词prepositional的第1个字母 往/p 基层/n 跑/v 。/w
q 量词 取英语quantity的第1个字母 不止/v 一/m 次/q 地/u 听到/v ,/w
r 代词 取英语代词pronoun的第2个字母,因p已用于介词 有些/r 部门/n
s 处所词 取英语space的第1个字母 移居/v 海外/s 。/w
t 时间词 取英语time的第1个字母 当前/t 经济/n 社会/n 情况/n
tg 时语素 时间词性语素。时间词代码为t,在语素的代码g前面置以t 秋/Tg 冬/tg 连/d 旱/a
u 助词 取英语助词auxiliary 的第2个字母,因a已用于形容词 工作/vn 的/u 政策/n
ud 结构助词   有/v 心/n 栽/v 得/ud 梧桐树/n
ug 时态助词   你/r 想/v 过/ug 没有/v
uj 结构助词的   迈向/v 充满/v 希望/n 的/uj 新/a 世纪/n
ul 时态助词了   完成/v 了/ ul
uv 结构助词地   满怀信心/l 地/uv 开创/v 新/a 的/u 业绩/n
uz 时态助词着   眼看/v 着/uz
v 动词   举行/v 老/a 干部/n 迎春/vn 团拜会/n
vd 副动词   强调/vd 指出/v
vg 动语素 动词性语素。动词代码为v。在语素的代码g前面置以V 做好/v 尊/vg 干/j 爱/v 兵/n 工作/vn
vn 名动词  指具有名词功能的动词。动词和名词的代码并在一起 股份制/n 这种/r 企业/n 组织/vn 形式/n ,/w
w 标点符号   生产/v 的/u 5G/nx 、/w 8G/nx 型/k 燃气/n 热水器/n
x 非语素字 非语素字只是一个符号,字母x通常用于代表未知数、符号  
y 语气词 取汉字“语”的声母 已经/d 30/m 多/m 年/q 了/y 。/w
z 状态词 取汉字“状”的声母的前一个字母 势头/n 依然/z 强劲/a ;/w
import jieba.posseg as pseg
words = pseg.cut("海南博鳌:打造美丽乡村会客厅")
for word, flag in words:
    print('%s %s' % (word, flag))
海南博鳌 x
: x
打造 v
美丽 ns
乡村 n
会客厅 n

c.关键词抽取

  • 基于 TF-IDF 算法的关键词抽取

    • import jieba.analyse

    • jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())

      • sentence 为待提取的文本
      • topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
      • withWeight 为是否一并返回关键词权重值,默认值为 False
      • allowPOS 仅包括指定词性的词,默认值为空,即不筛选
import jieba.analyse as analyse

news_sample = df.loc[df['date'] == '20190329']['content'].values
news_sample
array(['中共中央政治局3月29日召开会议,审议《中国共产党党组工作条例》和《中国共产党党员教育管理工作条例》。中共中央总书记习近平主持会议。会议指出,党组在党的组织体系中具有特殊地位。中国特色社会主义进入新时代,我们党要更好管党治党、执政兴国,必须与时俱进做好党组工作,确保党组更好发挥把方向、管大局、保落实的重要作用。《中国共产党党组工作条例》的修订,贯彻了习近平新时代中国特色社会主义思想和党的十九大精神,坚持以党章为根本依据,落实新时代党的建设总要求和新时代党的组织路线,为新形势下加强和改进党组工作提供了遵循。会议强调,做好新时代党组工作,要增强“四个意识”、坚定“四个自信”、做到“两个维护”,以贯彻落实党中央决策部署为前提,提高党组履职尽责的政治性和有效性,推动党组全面落实管党治党政治责任,履行领导职责,发挥领导作用,提高领导水',
       '28日,冰岛的廉价航空公司沃奥航空宣布停止运营,并取消所有航班。有大约4000名旅客受到影响。冰岛政府交通部门联系了其他航空公司提供紧急服务来帮助受困的旅客。近年来,受廉价航空业务竞争加剧和航空燃料价格上涨等因素的影响,沃奥航空陷入财务困难。据统计,到冰岛旅游的游客中有大约三分之一是搭乘沃奥航空的航班入境的,沃奥航空停止运营可能将使冰岛的游客数量减少16%,并对冰岛的支柱产业旅游业造成一定冲击。'],
      dtype=object)
plain_text = ''

for text in news_sample:
    plain_text += text + '\n'
plain_text
'中共中央政治局3月29日召开会议,审议《中国共产党党组工作条例》和《中国共产党党员教育管理工作条例》。中共中央总书记习近平主持会议。会议指出,党组在党的组织体系中具有特殊地位。中国特色社会主义进入新时代,我们党要更好管党治党、执政兴国,必须与时俱进做好党组工作,确保党组更好发挥把方向、管大局、保落实的重要作用。《中国共产党党组工作条例》的修订,贯彻了习近平新时代中国特色社会主义思想和党的十九大精神,坚持以党章为根本依据,落实新时代党的建设总要求和新时代党的组织路线,为新形势下加强和改进党组工作提供了遵循。会议强调,做好新时代党组工作,要增强“四个意识”、坚定“四个自信”、做到“两个维护”,以贯彻落实党中央决策部署为前提,提高党组履职尽责的政治性和有效性,推动党组全面落实管党治党政治责任,履行领导职责,发挥领导作用,提高领导水平,确保党始终成为中国特色社会主义事业的坚强领导核心。会议指出,加强党员教育管理是党的建设的基础性、根本性、经常性任务。加强党员教育管理,就是要着力激发党组织的生机活力,建设一支信念坚定、政治可靠、素质优良、纪律严明、作用突出的党员队伍。会议强调,党员教育管理工作要在提高质量上下真功,增强针对性和有效性,切实防止形式主义。要坚持以党的政治建设为统领,把用习近平新时代中国特色社会主义思想武装全党作为首要政治任务,引导党员践行新思想、适应新时代、展现新作为。\n'
print("  ".join(analyse.extract_tags(plain_text, topK=20, withWeight=False, allowPOS=())))
党员  绿道  29  党组  博鳌  习近平  中国  审批  28  库帕村  发展  改革  西藏  教育  合作  时代  农村公路  建设  交流  60

看 这里有问题 有些停止词没被我们删除。

但是呢,如果我们先去除了停止词再分词,又会导致分词不准确。所以我们一般建议先分词

分好了以后一个个的刷一遍

keywords = analyse.extract_tags(plain_text, topK=50, withWeight=False, allowPOS=())
f = open("./data/stopwords.txt", "r", encoding='utf-8')
lines = f.readlines()
stopwords = [w.rstrip('\n') for w in lines]
stopwords
['!',
 '"',
 '#',
 '$',
 '%',
 '&',
 "'",
 '(',
 ')',
 '*',
 '+',
 ',',
 '-',
 '--',
 '.',
 '..',
 '...',
 '......',
 '...................',
 './',
 '.一',
 '记者',
 '数',
 '年',
 '月',
 '日',
 '时',
 '分',
 '秒',
 '/',
 '//',
 '0',
 '1',
 '2',
 '3',
 '4',
 '5',
 '6',
 '7',
 '8',
 '9',
 ':',
 '://',
 '::',
 ';',
 '<',
 '=',
 '>',
 '>>',
 '?',
 '@',
 'A',
 'Lex',
 '[',
 '\\',
 ']',
 '【',
 '】',
 '^',
 '_',
 '`',
 'exp',
 'sub',
 'sup',
 '|',
 '}',
 '~',
 '~~~~',
 '·',
 '×',
 ...
 ...
 '当头',
 '当庭',
 '当时',
 ...]
def remove_stopwords(text_list, stopwords):
    new_w = []
    for w in text_list:
        if w not in stopwords and not w.isdigit():
            new_w.append(w)
    return new_w
clean_keywords = remove_stopwords(keywords, stopwords)
clean_keywords[:20]
['党员',
 '绿道',
 '党组',
 '博鳌',
 '习近平',
 '中国',
 '审批',
 '库帕村',
 '发展',
 '改革',
 '西藏',
 '教育',
 '合作',
 '时代',
 '农村公路',
 '建设',
 '交流',
 '管理工作',
 '文明',
 '乡村']

这样就漂亮了

  • 关于TF-IDF 算法的关键词抽取补充

    • 阅读材料:TF-IDF与关键词提取

    • 关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径

      • 用法: jieba.analyse.set_idf_path(file_name) # file_name为自定义语料库的路径
      • 关键词提取所使用停止词(Stop Words)文本语料库可以切换成自定义语料库的路径
        • 用法: jieba.analyse.set_stop_words(file_name) # file_name为自定义语料库的路径
        • 自定义语料库示例见这里
        • 用法示例见这里
    • 关键词一并返回关键词权重值示例

  • 基于 TextRank 算法的关键词抽取

    • jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,接口相同,注意默认过滤词性。
    • jieba.analyse.TextRank() 新建自定义 TextRank 实例
  • 算法论文: TextRank: Bringing Order into Texts

  • 基本思想:

    • 将待抽取关键词的文本进行分词
    • 以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图
    • 计算图中节点的PageRank,注意是无向带权图
  • 阅读资料:

keywords = analyse.textrank(plain_text, topK=50, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))
clean_keywords = remove_stopwords(keywords, stopwords)
clean_keywords[:20]
['中国',
 '发展',
 '审批',
 '党员',
 '改革',
 '时代',
 '建设',
 '教育',
 '合作',
 '提供',
 '绿道',
 '党组',
 '西藏',
 '航空',
 '乡村',
 '交流',
 '提高',
 '制度',
 '媒体',
 '国家']

好,这下想法来了,既然我们可以整出一套漂亮的关键词,那我们不妨试试,这些关键词组成的每日“重点新闻内容”,能否被我们整理成一个word embedding,并拟合A股的涨跌预测。

要想用数字表达这几个关键词,有很多种方法,其中最火的,就是word2vec。

我们这里,可以使用第三方已经训练好的word2vec模型,也可以自己训练。

首先,我们分句子。因为word2vec是对应每个单词在句子中的位置的。

import re

def split_into_sents(text):
    sentences = re.split('(。|!|\!|\.|?|\?)',text)
    new_sents = []
    for i in range(int(len(sentences)/2)):
        sent = sentences[2*i] + sentences[2*i+1]
        new_sents.append(sent)
    return new_sents
split_into_sents(plain_text)
['中共中央政治局3月29日召开会议,审议《中国共产党党组工作条例》和《中国共产党党员教育管理工作条例》。',
 '中共中央总书记习近平主持会议。',
 '会议指出,党组在党的组织体系中具有特殊地位。',
 '中国特色社会主义进入新时代,我们党要更好管党治党、执政兴国,必须与时俱进做好党组工作,确保党组更好发挥把方向、管大局、保落实的重要作用。',
 '据统计,到冰岛旅游的游客中有大约三分之一是搭乘沃奥航空的航班入境的,沃奥航空停止运营可能将使冰岛的游客数量减少16%,并对冰岛的支柱产业旅游业造成一定冲击。']

很好,很实用。那么我们要做的就是。把全数据库中的中文取出来,然后都做成一句一句的词汇列表。

titles = df['title'].values
titles
array(['胡锦涛分别会见巴基斯坦、蒙古、伊朗总统和印度代表', '胡锦涛接见上海合作组织峰会筹办工作人员',
       '胡锦涛主席离沪赴哈萨克斯坦出席亚信会议成员国领导人会议', ..., '中国救援队在莫桑比克展开救援', '国际联播快讯',
       '冰岛一廉航公司停飞 数千旅客滞留'], dtype=object)

content部分稍微麻烦点,我们先把他们都取出来,但是不能直接做成list,因为一个文章里可能有好几句话。我们先都拉成纯文本,然后再一个个分句子。

contents_df = df['content']
contents = ''
for item in contents_df:
    contents += str(item) + '\n'

contents = split_into_sents(contents)
contents
['中国国家主席胡锦涛今天在上海西郊宾馆分别会见了巴基斯坦总统穆沙拉夫、蒙古总统恩赫巴亚尔、伊朗总统内贾德、印度石油和天然气部部长迪奥拉。',
 '\n在会见穆沙拉夫时胡锦涛指出,今年是中巴建交55周年。',
 ...
 ...
 '目前,他们手中持有87艘船的订单,生产任务已经安排到了2009年。',
 '\n大连船舶重工集团有限公司董事长总经理孙波:我们在2010年我们的(造船)产量将要超过500万吨,那么产值也要超过200多个亿。',
 ...]
corpus = titles.tolist() + contents
corpus[0]
'胡锦涛分别会见巴基斯坦、蒙古、伊朗总统和印度代表'
len(corpus)
806914

然后我们再把句子都刷成单词

new_corpus = []
for sent in corpus:
    new_corpus.append(jieba.lcut(str(sent), HMM=True))
new_corpus[100]
['温家宝', '与', '安哥拉', '总统', '举行会谈']

然后清空停止词

clean_corpus = []
for sent in new_corpus:
    clean_corpus.append(remove_stopwords(sent, stopwords))
clean_corpus[900]
['落实', '科学', '发展观', '建设', '节约型', '社会', '昔日', '绿洲', '水困']

接下来训练word2vec,使用Gensim库

from gensim.models.word2vec import Word2Vec

model = Word2Vec(clean_corpus, size=256, window=5, min_count=5, negative=3, sample=0.001, sg=1, hs=1, workers=4)

存起来备用

model.save('./model/CCTV_w2v.model')

我们来看看w2v惊人的性质:

model.most_similar(positive=['习近平'])[:3]
/usr/local/lib/python3.5/dist-packages/ipykernel_launcher.py:1: DeprecationWarning: Call to deprecated `most_similar` (Method will be removed in 4.0.0, use self.wv.most_similar() instead).
  """Entry point for launching an IPython kernel.
/usr/local/lib/python3.5/dist-packages/gensim/matutils.py:737: FutureWarning: Conversion of the second argument of issubdtype from `int` to `np.signedinteger` is deprecated. In future, it will be treated as `np.int64 == np.dtype(int).type`.
  if np.issubdtype(vec.dtype, np.int):

[('胡锦涛', 0.7185623645782471),
 ('总书记', 0.6694536209106445),
 ('习', 0.6248663067817688)]

改革春风吹满地,这波训练没毛病!

接下来我们就可以顺手把每天前20个关键词,做成20*256的vector,并对应上后一天股市指数变化,来做我们经典的ML拟合

标签Label

labels_df = pd.read_csv('./data/000001sh_daily.csv')
labels_df.head()
Unnamed: 0 ts_code trade_date close open high low pre_close change pct_chg vol amount
0 0 000001.SH 20190329 3090.7580 3000.6783 3093.0329 2999.9866 2994.9434 95.8146 3.1992 375082991.0 386699608.7
1 1 000001.SH 20190328 2994.9434 3009.7988 3025.7789 2991.7789 3022.7196 -27.7762 -0.9189 288106425.0 289554565.5
2 2 000001.SH 20190327 3022.7196 3012.2573 3022.7623 2987.7717 2997.0954 25.6242 0.8550 291390357.0 295075954.8
3 3 000001.SH 20190326 2997.0954 3057.5590 3062.6896 2988.4905 3043.0313 -45.9359 -1.5095 353498021.0 341444826.6
4 4 000001.SH 20190325 3043.0313 3058.8016 3086.9961 3041.9504 3104.1487 -61.1174 -1.9689 380278762.0 375375662.8

对应新闻的日期,我们也只需要20060616 - 20190330

labels_df = labels_df.loc[(labels_df['trade_date'] >= 20060616) & (labels_df['trade_date'] <= 20190330)]

labels_df.tail()
Unnamed: 0 ts_code trade_date close open high low pre_close change pct_chg vol amount
3108 3108 000001.SH 20060622 1596.066 1593.097 1605.252 1587.799 1598.116 -2.050 -0.1283 32465888.0 1.831009e+07
3109 3109 000001.SH 20060621 1598.116 1590.607 1617.714 1570.083 1592.332 5.784 0.3632 39705880.0 2.242654e+07
3110 3110 000001.SH 20060620 1592.332 1583.871 1592.832 1572.582 1586.286 6.046 0.3811 35537111.0 2.065872e+07
3111 3111 000001.SH 20060619 1586.286 1559.985 1591.850 1544.931 1574.467 11.819 0.7507 35562047.0 2.063520e+07
3112 3112 000001.SH 20060616 1574.467 1540.187 1574.475 1540.187 1533.980 40.487 2.6393 33572612.0 1.877371e+07
labels_df.trade_date = labels_df.trade_date.astype(str)
labels_df = labels_df.drop('Unnamed: 0',1)
labels_df.head()
ts_code trade_date close open high low pre_close change pct_chg vol amount
0 000001.SH 20190329 3090.7580 3000.6783 3093.0329 2999.9866 2994.9434 95.8146 3.1992 375082991.0 386699608.7
1 000001.SH 20190328 2994.9434 3009.7988 3025.7789 2991.7789 3022.7196 -27.7762 -0.9189 288106425.0 289554565.5
2 000001.SH 20190327 3022.7196 3012.2573 3022.7623 2987.7717 2997.0954 25.6242 0.8550 291390357.0 295075954.8
3 000001.SH 20190326 2997.0954 3057.5590 3062.6896 2988.4905 3043.0313 -45.9359 -1.5095 353498021.0 341444826.6
4 000001.SH 20190325 3043.0313 3058.8016 3086.9961 3041.9504 3104.1487 -61.1174 -1.9689 380278762.0 375375662.8

组合XY集

df.head()
date title content
0 20060616 胡锦涛分别会见巴基斯坦、蒙古、伊朗总统和印度代表 中国国家主席胡锦涛今天在上海西郊宾馆分别会见了巴基斯坦总统穆沙拉夫、蒙古总统恩赫巴亚尔、伊朗...
1 20060616 胡锦涛接见上海合作组织峰会筹办工作人员 中共中央总书记、国家主席、中央军委主席胡锦涛今天下午在上海亲切接见了上海合作组织峰会筹办工作...
2 20060616 胡锦涛主席离沪赴哈萨克斯坦出席亚信会议成员国领导人会议 应哈萨克斯坦总统纳扎尔巴耶夫邀请,国家主席胡锦涛于今天乘专机离开上海,赴哈萨克斯坦阿拉木图市...
3 20060616 十届全国人大常委会第四十七次委员长会议在京举行 十届全国人大常委会第四十七次委员长会议今天上午在人民大会堂举行。吴邦国委员长主持今天的委员长...
4 20060616 吴官正会见斯里兰卡客人 中共中央政治局常委吴官正今天在人民大会堂会见了由副领袖卡鲁·贾亚苏里亚率领的斯里兰卡统一国民...
df = df.set_index('date', inplace=False)
df.head()
title content
date
20060616 胡锦涛分别会见巴基斯坦、蒙古、伊朗总统和印度代表 中国国家主席胡锦涛今天在上海西郊宾馆分别会见了巴基斯坦总统穆沙拉夫、蒙古总统恩赫巴亚尔、伊朗...
20060616 胡锦涛接见上海合作组织峰会筹办工作人员 中共中央总书记、国家主席、中央军委主席胡锦涛今天下午在上海亲切接见了上海合作组织峰会筹办工作...
20060616 胡锦涛主席离沪赴哈萨克斯坦出席亚信会议成员国领导人会议 应哈萨克斯坦总统纳扎尔巴耶夫邀请,国家主席胡锦涛于今天乘专机离开上海,赴哈萨克斯坦阿拉木图市...
20060616 十届全国人大常委会第四十七次委员长会议在京举行 十届全国人大常委会第四十七次委员长会议今天上午在人民大会堂举行。吴邦国委员长主持今天的委员长...
20060616 吴官正会见斯里兰卡客人 中共中央政治局常委吴官正今天在人民大会堂会见了由副领袖卡鲁·贾亚苏里亚率领的斯里兰卡统一国民...

建立两个表,一个纯title(类似于标题新闻),一个全部文档

title_df = df['title'].to_frame()
news_df = df['content'].to_frame()
title_df = title_df.groupby('date').sum()
news_df = news_df.groupby('date').sum()

给每一天配上Label。

没有(双休日)的情况,就默认0了。这是个很粗浅的做法。

大家可以思考一些更加靠谱的玩法,比如,周末的新闻累积到周一爆发 等等。

from datetime import datetime,timedelta

def plusday(date, day=1):
    time_object = datetime.strptime(date,'%Y%m%d') + timedelta(days=day)
    newdate = time_object.strftime('%Y%m%d')
    return newdate

def add_label(df1, df2, offset=1, startdate='20060616', enddate='20190330'):
    currentdate = startdate
    while currentdate != enddate:
        try:
            df1.loc[currentdate]['label'] = df2.loc[plusday(currentdate, day=offset)]['label']
        except: 
            try:
                df1.loc[currentdate]['label'] = 0
            except:
                pass
        currentdate = plusday(currentdate)
    return df1
labels_df = labels_df.set_index('trade_date')
title_df['label'] = None
combined_title_df = add_label(title_df, labels_df)
combined_title_df.head()
title label
date
20060616 胡锦涛分别会见巴基斯坦、蒙古、伊朗总统和印度代表胡锦涛接见上海合作组织峰会筹办工作人员胡锦涛... 0
20060617 亚信成员国领导人第二次会议在阿拉木图举行 胡锦涛出席会议并发表重要讲话温家宝离开北京访问非洲... 0
20060618 胡锦涛主席出席亚信成员国领导人会议后回到北京温家宝会见埃及总统穆巴拉克温家宝抵达开罗开始对埃... 1
20060619 胡锦涛主持仪式欢迎阿富汗总统访华胡锦涛与阿富汗总统会谈温家宝、胡锦涛签署命令 给武警部队一个... 1
20060620 【落实科学发展观·建设创新型国家】自主创新造就青海百万吨钾肥项目吴邦国、贾庆林分别会见阿富汗... 1

为者常成,行者常至