文本挖掘从小白到精通(七)--- Word2vec的增量学习

2020 年 7 月 15 日 AINLP

写在前面:笔者最近在梳理自己的文本挖掘知识结构,借助gensim、sklearn、keras等库的文档做了些扩充,会陆陆续续介绍文本向量化、tfidf、主题模型、word2vec,既会涉及理论,也会有详细的代码和案例进行讲解,希望在梳理自身知识体系的同时也能对想学习文本挖掘的朋友有一点帮助,这是笔者写该系列的初衷。


到目前为止,word2vec在初始训练后无法增加词汇量。在处理新语料中的未知词汇(unknown words,不在之前训练的word2vec的词汇表中)时,你必须不停的对更新后的文档进行重新训练。

在本文中,笔者将详细介绍gensim中的新特性 --- 在线词汇更新(online vocaburary update), 这个附加特性克服了未知词汇的问题。 在对word2vec进行初步训练后,我们可以使用此在线训练特性不断为预训练的word2vec模型添加新的词汇表(vocaburary

在这里,笔者采用的示例语料来自于知名互联网社区 - 人人都是产品经理,选择正文或标题包含“数据分析”的文章正文作为训练语料,为了显示word2vec的增量更新特性,笔者将该语料分为2个时间段,即2012.05-2015.122016.01-2019.04。

from gensim.corpora.wikicorpus import WikiCorpusfrom gensim.models.word2vec import Word2Vec, LineSentencefrom pprint import pprintfrom copy import deepcopyfrom multiprocessing import cpu_countfrom smart_open import smart_openimport jiebaimport os

加入自定义词典,以保证分词的准确度;创建流式语料处理类,以减少对本地内存的消耗。

# 对特定长词进行控制,防止被分错词,影响后续的分析效果jieba.add_word('微信公众号')   jieba.add_word('数据分析')jieba.add_word('数据挖掘')jieba.add_word('机器学习')jieba.add_word('深度学习')jieba.add_word('文本挖掘')jieba.add_word('语义分析')
#载入包含8,000,000词汇的词典jieba.load_userdict(r"D:\ltp-models\8000000-dict.txt") # 载入停用词     stoplist = [i.strip() for i in open('datasets/stopwords_zh.txt',encoding='utf-8').readlines()]
# 编写流式语料处理类class MySentences(object): def __init__(self, fname): self.fname = fname def __iter__(self): print('正在处理文件{}'.format(self.fname))for line in smart_open(self.fname, 'r',encoding='utf-8'):    yield [i.strip() for i in jieba.lcut(line) if i not in stoplist and  len(i) > 1]yield [i.strip() for i in jieba.lcut(line) ]

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\hp\AppData\Local\Temp\jieba.cache
Loading model cost 1.100 seconds.
Prefix dict has been built succesfully.

# 载入人人都是产品经理上2012.05-2015.12关于数据分析的文章,作为“老数据”old_data = MySentences('./datasets/数据分析2012.05-2015.12.txt')  
# 载入人人都是产品经理上2016.01-2019.04关于数据分析的文章,作为“新数据”new_data = MySentences('./datasets/数据分析2016.01-2019.04.txt') # a memory-friendly iterator

1 初始训练(Initial training)

在初始化训练阶段,我们使用“数据分析2012.05-2015.12.txt”进行训练。

%%timemodel = Word2Vec(old_data, min_count = 3, window =8,workers=cpu_count())# model = Word2Vec.load('oldmodel')  #载入模型oldmodel = deepcopy(model)oldmodel.save('oldmodel')   #保存模型

正在处理文件./datasets/数据分析2012.05-2015.12.txt
正在处理文件./datasets/数据分析2012.05-2015.12.txt
正在处理文件./datasets/数据分析2012.05-2015.12.txt
正在处理文件./datasets/数据分析2012.05-2015.12.txt
正在处理文件./datasets/数据分析2012.05-2015.12.txt
正在处理文件./datasets/数据分析2012.05-2015.12.txt
Wall time: 4min 50s

训练完模型以后,我们来测试一个词汇“文本挖掘”,看看它有没有出现在人人都是产品经理涉及“数据分析”的文章中。

try:    print(oldmodel.wv.most_similar('文本挖掘'))except KeyError as e:     print(e)

"word '文本挖掘' not in vocabulary"

结果显示,该词并没有出现在2012.05-2015.12人人都是产品经理涉及“数据分析”关键词的文章中。

2 在线更新(Online update)

要使用word2vec的在线训练特性,请在对新文档使用build_vocab时设置update = True

%%timemodel.build_vocab(new_data, update=True)model.train(new_data, total_examples=model.corpus_count, epochs=model.epochs)model.save('newmodel')# model = Word2Vec.load('newmodel')

正在处理文件./datasets/数据分析2016.01-2019.04.txt
正在处理文件./datasets/数据分析2016.01-2019.04.txt
正在处理文件./datasets/数据分析2016.01-2019.04.txt
正在处理文件./datasets/数据分析2016.01-2019.04.txt
正在处理文件./datasets/数据分析2016.01-2019.04.txt
正在处理文件./datasets/数据分析2016.01-2019.04.txt

Wall time: 14min 20s

2.1 新旧模型对比(Model Comparison)

通过在线训练,词汇表的大小增加了大约5万。

for m in ['oldmodel', 'model']:   print('The vocabulary size of the', m, 'is', len(eval(m).wv.vocab))

The vocabulary size of the oldmodel is 43712
The vocabulary size of the model is 91754

在线训练后,在模型中添加“文本挖掘”这个词。 这些词与“数据分析”的联系十分紧密。

try:     pprint(model.wv.most_similar('文本挖掘',topn = 20))except KeyError as e:     pprint(e)

[('文本数据', 0.7652264833450317),
('关键词提取', 0.752141535282135),
('微博传播分析', 0.7468001842498779),
('数据地图', 0.7458974123001099),
('全唐诗', 0.7307432293891907),
('聚类分析', 0.72945237159729),
('行业报告', 0.7202303409576416),
('文本分析', 0.7192279696464539),
('大秦帝国', 0.7101942300796509),
('谁说菜鸟不会数据分析', 0.7093586325645447),
('发现规律', 0.705581784248352),
('第二部分', 0.7026551961898804),
('数据建模', 0.6997321844100952),
('词频统计', 0.6928600072860718),
('数据新闻', 0.690384030342102),
('详细内容', 0.6903268098831177),
('信息检索', 0.6893095374107361),
('李尚龙', 0.6872052550315857),
('基本原理', 0.6843768358230591),
('数据分析方法', 0.6838656067848206)]

同时,从这些相关词可以看出,大部分涉及“文本挖掘”的文章是笔者所写,比如:

  • 数据挖掘实操|用文本挖掘剖析近5万首《全唐诗》

  • 以虎嗅网4W+文章的文本挖掘为例,展现数据分析的一整套流程

  • 不会机器学习,你照样可以预测用户流失

  • 干货|作为一个合格的“增长黑客”,你还得重视外部数据的分析!

  • 【干货】用大数据文本挖掘,来洞察“共享单车”的行业现状及走势

  • 【干货】从社交媒体传播和文本挖掘角度解读《欢乐颂2》

  • 不懂数理和编程,如何运用免费的大数据工具获得行业洞察?

  • 干货|如何利用Social Listening从社会化媒体中“提炼”有价值的信息?

  • 以《大秦帝国之崛起》为例,来谈大数据舆情分析和文本挖掘

  • 以哈尔滨冰雪大世界旅游的传播效应为例,谈数据新闻可视化的“魅惑”

  • 从大数据舆情传播角度看《三生三世十里桃花》

  • 万字干货|10款数据分析“工具”,助你成为新媒体运营领域的“增长黑客”

  • 如何用数据分析,搞定新媒体运营的定位和内容初始化?

  • 当数据分析遭遇心理动力学:用户深层次的情感需求浮出水面(万字长文,附实例分析)

  • 在运营中,为什么文本分析远比数值型分析重要?一个实际案例,五点分析(下)

  • 数据运营|数据分析中,文本分析远比数值型分析重要!(上)

  • 揭开微博转发传播的规律:以“人民日报”发布的G20文艺晚会微博为例

  • 傅园慧和她的“洪荒之力”的大数据舆情分析

3 用word2vec增量更新发现词汇的语义变迁 ---以互联网领域的“增长”内涵变迁为例

基于深度神经网络的词嵌入能从大量未标注的普通文本数据中无监督地学习到词向量,这些词向量包含了词汇与词汇之间的语义关系,组合性关系(词性相异)和聚合性关系(词性相同)组合性关系,比如“苹果”和“好红”,“主席”和“伟大”,后者对前者是一种修饰关系;聚合性关系,比如“伟大”和“著名”、“可爱”和“卡哇伊”。

正如现实世界中的“物以类聚,类以群分”一样,词汇的内涵可以由它们身边的词汇来界定:

Words can be defined by the company they keep 。

再来看一个更加明显的例子,通过word2vec的语义相关性来揭示一个词汇/符号的含义变迁。

w = '增长'for m in ['oldmodel', 'model']:  print('The count of the word,'+w+', is', eval(m).wv.vocab[w].count, 'in', m)      pprint(eval(m).wv.most_similar(w,topn = 20))  print('********************************************************')

The count of the word,增长, is 447 in oldmodel
[('收入', 0.937249481678009),
('占', 0.9009126424789429),
('GDP', 0.8977611660957336),
('6600万', 0.882463812828064),
('76', 0.8792387247085571),
('占比', 0.8788177371025085),
('78', 0.8784040212631226),
('高达', 0.8732869625091553),
('60', 0.8730141520500183),
('全球手机', 0.8708820343017578),
('上年同期', 0.8694456815719604),
('销售额', 0.8646272420883179),
('38', 0.8645036220550537),
('达到', 0.8637487888336182),
('占股', 0.8631407022476196),
('增速', 0.8617026805877686),
('份额', 0.8611093759536743),
('39', 0.8593133687973022),
('全球', 0.8591316342353821),
('4%', 0.8591089248657227)
]
*********************************************************************
The count of the word,增长, is 3595 in model
[('留存', 0.6231473088264465),
('数据驱动', 0.6186549663543701),
('营收', 0.6116417050361633),
('规模', 0.5935122966766357),
('业务增长', 0.5817776918411255),
('生命周期', 0.5660185813903809),
('获客', 0.5647237300872803),
('指数级', 0.5620895624160767),
('精细化运营', 0.5600367784500122),
('快速增长', 0.547709047794342),
('变现', 0.5331612825393677),
('成长', 0.5248090624809265),
('衰退', 0.5200363993644714),
('用户量', 0.5178673267364502),
('增长黑客', 0.512256383895874),
('稳定', 0.5116002559661865),
('收入', 0.5077909231185913),
('驱动增长', 0.503570020198822),
('商业价值', 0.49839386343955994),
('拉新', 0.4945176839828491)]

从上述结果可以很容易的发现:

近些年,互联网的“增长”一词的内涵逐渐从“经济增长”、“收入增长”转向“用户增长”、“增长黑客”及“精细化运营”等。

人人都是产品经理上,从“增长”一词在2016年前后的词义变化,很明显,这两年“增长黑客”要比一般性的“经济增长”、“收入增长”来的火爆!

结语

下篇文章,笔者会基于训练好的word2vec中做一些实际应用,比如文本聚类和文本分类,谢谢大家在下方评论区留言,你的支持是我不断更新的动力!


特别推荐|【文本挖掘系列教程】:

推荐阅读

这个NLP工具,玩得根本停不下来

完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)

从数据到模型,你可能需要1篇详实的pytorch踩坑指南

如何让Bert在finetune小数据集时更“稳”一点

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)

文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化

Node2Vec 论文+代码笔记

模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结

中文命名实体识别工具(NER)哪家强?

学自然语言处理,其实更应该学好英语

斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。


阅读至此了,分享、点赞、在看三选一吧🙏

登录查看更多
0

相关内容

分散式表示即将语言表示为稠密、低维、连续的向量。 研究者最早发现学习得到词嵌入之间存在类比关系。比如apple−apples ≈ car−cars, man−woman ≈ king – queen 等。这些方法都可以直接在大规模无标注语料上进行训练。词嵌入的质量也非常依赖于上下文窗口大小的选择。通常大的上下文窗口学到的词嵌入更反映主题信息,而小的上下文窗口学到的词嵌入更反映词的功能和上下文语义信息。
【文本分类大综述:从浅层到深度学习,35页pdf】
专知会员服务
187+阅读 · 2020年8月6日
【经典书】Python金融大数据分析,566页pdf
专知会员服务
122+阅读 · 2020年8月1日
【2020新书】Python金融大数据分析宝典,426页pdf与代码
专知会员服务
150+阅读 · 2020年7月11日
R语言自然语言处理:文本分类
R语言中文社区
7+阅读 · 2019年4月27日
NLP - 15 分钟搭建中文文本分类模型
AINLP
79+阅读 · 2019年1月29日
[机器学习] 用KNN识别MNIST手写字符实战
机器学习和数学
4+阅读 · 2018年5月13日
在Python中使用SpaCy进行文本分类
专知
24+阅读 · 2018年5月8日
word2vec中文语料训练
全球人工智能
12+阅读 · 2018年4月23日
【干货】--基于Python的文本情感分类
R语言中文社区
5+阅读 · 2018年1月5日
自然语言处理(4)之中文文本挖掘流程详解(小白入门必读)
机器学习算法与Python学习
5+阅读 · 2017年12月22日
文本分类实战: 机器学习vs深度学习算法对比(附代码)
机器学习研究会
35+阅读 · 2017年10月25日
NLP自然语言处理(二)——基础文本分析
乐享数据DataScientists
12+阅读 · 2017年2月7日
Arxiv
9+阅读 · 2019年4月19日
Arxiv
3+阅读 · 2018年5月28日
VIP会员
相关资讯
R语言自然语言处理:文本分类
R语言中文社区
7+阅读 · 2019年4月27日
NLP - 15 分钟搭建中文文本分类模型
AINLP
79+阅读 · 2019年1月29日
[机器学习] 用KNN识别MNIST手写字符实战
机器学习和数学
4+阅读 · 2018年5月13日
在Python中使用SpaCy进行文本分类
专知
24+阅读 · 2018年5月8日
word2vec中文语料训练
全球人工智能
12+阅读 · 2018年4月23日
【干货】--基于Python的文本情感分类
R语言中文社区
5+阅读 · 2018年1月5日
自然语言处理(4)之中文文本挖掘流程详解(小白入门必读)
机器学习算法与Python学习
5+阅读 · 2017年12月22日
文本分类实战: 机器学习vs深度学习算法对比(附代码)
机器学习研究会
35+阅读 · 2017年10月25日
NLP自然语言处理(二)——基础文本分析
乐享数据DataScientists
12+阅读 · 2017年2月7日
Top
微信扫码咨询专知VIP会员