到目前为止,word2vec在初始训练后无法增加词汇量。在处理新语料中的未知词汇(unknown words,不在之前训练的word2vec的词汇表中)时,你必须不停的对更新后的文档进行重新训练。
在本文中,笔者将详细介绍gensim中的新特性 --- 在线词汇更新(online vocaburary update), 这个附加特性克服了未知词汇的问题。 在对word2vec进行初步训练后,我们可以使用此在线训练特性不断为预训练的word2vec模型添加新的词汇表(vocaburary)。
在这里,笔者采用的示例语料来自于知名互联网社区 - 人人都是产品经理,选择正文或标题包含“数据分析”的文章正文作为训练语料,为了显示word2vec的增量更新特性,笔者将该语料分为2个时间段,即2012.05-2015.12和2016.01-2019.04。
from gensim.corpora.wikicorpus import WikiCorpus
from gensim.models.word2vec import Word2Vec, LineSentence
from pprint import pprint
from copy import deepcopy
from multiprocessing import cpu_count
from smart_open import smart_open
import jieba
import 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
在初始化训练阶段,我们使用“数据分析2012.05-2015.12.txt”进行训练。
%%time
model = 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人人都是产品经理涉及“数据分析”关键词的文章中。
要使用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.txtWall 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中做一些实际应用,比如文本聚类和文本分类,谢谢大家在下方评论区留言,你的支持是我不断更新的动力!
特别推荐|【文本挖掘系列教程】:
推荐阅读
完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)
模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法
征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)
文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化
斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用
关于AINLP
AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。
阅读至此了,分享、点赞、在看三选一吧🙏