word2vec及其python实现
词的向量化就是将⾃然语⾔中的词语映射成是⼀个实数向量,⽤于对⾃然语⾔建模,⽐如进⾏情感分析、语义分析等⾃然语⾔处理任
务。下⾯介绍⽐较主流的两种词语向量化的⽅式:
第⼀种即One-Hot编码,,是⼀种基于词袋(bagofwords)的编码⽅式。假设词典的长度为N即包含N个词语,并按照顺序依次排列。
One-Hot编码将词语表⽰成长度为N的向量,每⼀向量分量代表词典中的⼀个词语,则One-Hot编码的词语向量只有⼀位分量值为1。假
设词语在词典中的位置为k,那么该词语基于One-Hot编码的词语向量可表⽰为第k位值为1,其他位全为0的向量。这种⽅式很容易理
解,⽐如:
假设我们有词典{今天,我,不想,去,上课,因为,我,是,⼩宝宝},那么句⼦“今天我不想去上课”就可以表⽰
为”[1,1,1,1,1,0,0,0,0],“因为我是⼩宝宝”就可以表⽰为[0,0,0,0,0,1,1,1,1]。这种编码⽅式简单明了。但是也具有明显的问题:
未能考虑词语之间的位置顺序关系;
⽆法表达词语所包含的语义信息;
⽆法有效地度量两个词语之间的相似度;
具有维度灾难。
⾸先,我们最后得到的向量只能表⽰每个词语的存在关系,⽐如[1,1,1,1,1,0,0,0,0]不仅可以表⽰“今天我不想去上课”,还可以表⽰“我不想
今天去上课”,这种词语位置顺序的差别有时带来的灾难是巨⼤了,甚⾄会出现“我是你爸爸”和“你是我爸爸”傻傻分不清楚的现象;此外,我
们这个粗糙的模型将每个词语都看成是对等的位置,主谓宾定状补完全分不开,语义信息完全被掩藏了;当词典过⼤时也会带来纬度灾难,
我们可能⽤到的词语或许成千上万个,我们采⽤成千上万维度的向量来表⽰⼀个简简单单的句⼦显然是不明智的。
第⼆种是word2vec。该模型是以⽆监督⽅式从海量⽂本语料中学习富含语义信息的低维词向量的语⾔模型,word2vec词向量模型将单
词从原先所属的空间映射到新的低维空间,使得语义上相似的单词在该空间内距离相近,word2vec词向量可以⽤于词语之间相似性度量,
由于语义相近的词语在向量⼭空间上的分布⽐较接近,可以通过计算词向量间的空间距离来表⽰词语间的语义相似度,因此word2vec词向
量具有很好的语义特性。word2vec模型是神经⽹络在⾃然语⾔处理领域应⽤的结果,它是利⽤深度学习⽅法来获取词语的分布表⽰,可以
⽤于⽂本分类、情感计算、词典构建等⾃然语⾔处理任务。
简单的举个例⼦,“⽼师”之于“学⽣”类似于“师⽗”之于“徒弟”,“⽼婆”之于“丈夫”类似于“⼥⼈”之于“男⼈”。
word2vec包含两种训练模型,分别是连续词袋模型CBOW和Skip-gram模型。其中CBOW模型是在已知词语W(t)上下⽂2n个词语
的基础上预测当前词W(t);⽽Skip-gram模型是根据词语W(t)预测上下⽂2n个词语。假设n=2,则两种训练模型的体系结构如图所
⽰,Skip-gram模型和连续词袋模型CBOW都包含输⼊层、投影层、输出层。
(左边为Skip-gram模型,右边为CBOW模型)
假设语料库中有这样⼀句话"Thecatjumpedoverthepuddle",以Skip-gram模型为例,它是要根据给定词语预测上下⽂。如果给定单
词"jumped"时,Skip-gram模型要做的就是推出它周围的词:"The","cat","over","the","puddle",如图所⽰。
要实现这样的⽬标就要让如公式1的条件概率值达到最⼤,也即在给定单词W(t)的前提下,使单词W(t)周围窗⼝长度为2n内的上下⽂
的概率值达到最⼤。为了简化计算,将公式1转化为公式2,即求公式2的最⼩值。
CBOW模型和上⾯差不多,仅仅是将条件概率的前后两项颠倒了个,它是要根据上下⽂预测⽬标词语出现的概率。如给定上下
⽂"The","cat","over","the","puddle",CBOW模型的⽬标是预测词语"jumped"出现的概率,如图所⽰:
要实现这样的⽬标就要让如公式3的条件概率值达到最⼤,即在给定单词W(t)上下⽂2n个词语的前提下,使单词W(t)出现的概率值达到最
⼤,同样为了简化计算,将公式3转化为公式4,即求公式4的最⼩值。
我们接下来会在pycharm中演⽰word2vec,这⾥⾸先要选取语料库,我从⽹上下载了⼀份三国演义的原⽂,并进⾏了中⽂分词处理,采
⽤的是jieba库。
e
2importcodecs
3
4f=('F:/nlp/','r',encoding="utf8")
5target=("F:/nlp/",'w',encoding="utf8")
6
7print('openfiles')
8line_num=1
9line=ne()
10
11#循环遍历每⼀⾏,并对这⼀⾏进⾏分词操作
12#如果下⼀⾏没有内容的话,就会readline会返回-1,则while-1就会跳出循环
13whileline:
14print('----processing',line_num,'article----------------')
15line_g="".join((line))
ines(line_g)
17line_num=line_num+1
18line=ne()
19
20#关闭两个⽂件流,并退出程序
()
()
23exit()
我们在上⾯的代码中进⾏了分词处理,得到类似下⾯的txt⽂档:
滚滚长江东逝⽔,浪花淘尽英雄。是⾮成败转头空。青⼭依旧在,⼏度⼣阳红。⽩发渔樵江渚上,惯看秋⽉春
风。⼀壶浊酒喜相逢。古今多少事,都付笑谈中。
——调寄《临江仙》
话说天下⼤势,分久必合,合久必分。周末七国分争,并⼊于秦。及秦灭之后,楚、汉分争,⼜并⼊于汉。汉
朝⾃⾼祖斩⽩蛇⽽起义,⼀统天下,后来光武中兴,传⾄献帝,遂分为三国。推其致乱之由,殆始于桓、灵⼆
帝。桓帝禁锢善类,崇信宦官。及桓帝崩,灵帝即位,⼤将军窦武、太傅陈蕃,共相辅佐。时有宦官曹节等弄权
,窦武、陈蕃谋诛之,机事不密,反为所害,中涓⾃此愈横。
建宁⼆年四⽉望⽇,帝御温德殿。⽅升座,殿⾓狂风骤起。只见⼀条⼤青蛇,从梁上飞将下来,蟠于椅上。帝
惊倒,左右急救⼊宫,百官俱奔避。须臾,蛇不见了。忽然⼤雷⼤⾬,加以冰雹,落到半夜⽅⽌,坏却房屋⽆
数。建宁四年⼆⽉,洛阳地震;⼜海⽔泛溢,沿海居民,尽被⼤浪卷⼊海中。光和元年,雌鸡化雄。六⽉朔,
⿊⽓⼗余丈,飞⼊温雄殿中。秋七⽉,有虹现于⽟堂;五原⼭岸,尽皆崩裂。种种不祥,⾮⽌⼀端。帝下诏问
群⾂以灾异之由,议郎蔡邕上疏,以为霓堕鸡化,乃妇寺⼲政之所致,⾔颇切直。帝览奏叹息,因起更⾐。曹
节在后窃视,悉宣告左右;遂以他事陷邕于罪,放归⽥⾥。后张让、赵忠、封谞、段珪、曹节、侯览、蹇硕
、程旷、夏恽、郭胜⼗⼈朋⽐为奸,号为“⼗常侍”。帝尊信张让,呼为“阿⽗”。朝政⽇⾮,以致天下⼈⼼思乱,
盗贼蜂起。
时巨⿅郡有兄弟三⼈,⼀名张⾓,⼀名张宝,⼀名张梁。那张⾓本是个不第秀才,因⼊⼭采药,遇⼀⽼⼈,碧
眼童颜,⼿执藜杖,唤⾓⾄⼀洞中,以天书三卷授之,⽈:“此名《太平要术》,汝得之,当代天宣化,普救
世⼈;若萌异⼼,必获恶报。”⾓拜问姓名。⽼⼈⽈:“吾乃南华⽼仙也。”⾔讫,化阵清风⽽去。⾓得此书,
晓夜攻习,能呼风唤⾬,号为“太平道⼈”。中平元年正⽉内,疫⽓流⾏,张⾓散施符⽔,为⼈治病,⾃称“⼤贤
良师”。⾓有徒弟五百余⼈,云游四⽅,皆能书符念咒。次后徒众⽇多,⾓乃⽴三⼗六⽅,⼤⽅万余⼈,⼩⽅六
七千,各⽴渠帅,称为将军;讹⾔:“苍天已死,黄天当⽴;岁在甲⼦,天下⼤吉。”令⼈各以⽩⼟,书“甲⼦”
⼆字于家中⼤门上。青、幽、徐、冀、荆、扬、兖、豫⼋州之⼈,家家侍奉⼤贤良师张⾓名字。⾓遣其党马元
义,暗赍⾦帛,结交中涓封谞,以为内应。⾓与⼆弟商议⽈:“⾄难得者,民⼼也。今民⼼已顺,若不乘势取
天下,诚为可惜。”遂⼀⾯私造黄旗,约期举事;⼀⾯使弟⼦唐周,驰书报封谞。唐周乃径赴省中告变。帝召
⼤将军何进调兵擒马元义,斩之;次收封谞等⼀⼲⼈下狱。张⾓闻知事露,星夜举兵,⾃称“天公将军”,张宝称“
地公将军”,张梁称“⼈公将军”。申⾔于众⽈:“今汉运将终,⼤圣⼈出。汝等皆宜顺天从正,以乐太平。”四⽅
百姓,裹黄⼱从张⾓反者四五⼗万。贼势浩⼤,官军望风⽽靡。何进奏帝⽕速降诏,令各处备御,讨贼⽴功。⼀
⾯遣中郎将卢植、皇甫嵩、朱俊,各引精兵、分三路讨之。
且说张⾓⼀军,前犯幽州界分。幽州太守刘焉,乃江夏竟陵⼈⽒,汉鲁恭王之后也。当时闻得贼兵将⾄,召校尉
邹靖计议。靖⽈:“贼兵众,我兵寡,明公宜作速招军应敌。”刘焉然其说,随即出榜招募义兵。
榜⽂⾏到涿县,引出涿县中⼀个英雄。那⼈不甚好读书;性宽和
基于上⾯已经处理好的⽂档,我们进⾏word2vec的词向量训练:
#-*-coding:utf-8-*-
importWord2Vec
2vecimportLineSentence
importlogging
onfig(format='%(asctime)s:%(levelname)s:%(message)s',level=)
#Word2Vec第⼀个参数代表要训练的语料
#sg=1表⽰使⽤Skip-Gram模型进⾏训练
#size表⽰特征向量的维度,默认为100。⼤的size需要更多的训练数据,但是效果会更好.推荐值为⼏⼗到⼏百。
#window表⽰当前词与预测词在⼀个句⼦中的最⼤距离是多少
#min_count可以对字典做截断.词频少于min_count次数的单词会被丢弃掉,默认值为5
#workers表⽰训练的并⾏数
#sample:⾼频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)
defA():
#⾸先打开需要训练的⽂本
shuju=open('F:/nlp/','rb')
#通过Word2vec进⾏训练
model=Word2Vec(LineSentence(shuju),sg=1,size=100,window=10,min_count=5,workers=15,sample=1e-3)
#保存训练好的模型
('F:/nlp/2vec')
print('训练完成')
if__name__=='__main__':
A()
显⽰“训练完成”后我们就得到了⼀个完好的模型,输出和“⾚兔马”最相关的词语,以及其词向量,测试结果如下:
本文发布于:2023-03-10 03:44:21,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/167839106121595.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:洛阳地震.doc
本文 PDF 下载地址:洛阳地震.pdf
留言与评论(共有 0 条评论) |