简介

word2vec是一种向量化技术,主要用来将词或字转为向量,可以根据向量之间的距离来衡量他们之间的相似度,从而挖掘出他们之间潜在的关系。同样的道理,根据词或字的向量可以将一句话或者一篇文章表示为向量。word2vec是nlp领域中一个非常重要的概念。

为什么用它

向量化技术有很多,常见的有FastText(与Word2Vec同一个作者),Embedding(词嵌入)等,很多技术在精度和性能上其实已经超过了Word2Vec,只不过Word2Vec作为最经典的向量化技术,是很有必要掌握的。

训练方法

Word2Vec的训练方法有跳字模型和词袋模型两种,效果其实差不多,两种方法的具体原理就不再多讲,网上这类讲原理的文章很多,每个人都有自己的看法,说多了反而容易迷惑。因此本文更加注重如何训练一个Word2Vec模型,同时使用负采样加快训练速度。负采样是什么同样可以网上查阅。

环境准备

  • 合适的IDE(PyCharm/VSCode/…)
  • Python(3.6以上)
  • Pytorch(版本别太旧就行,以免有些API不通用,我的1.11.0)

开始训练

1. 准备一个数据集

中华女子学院:本科层次仅1专业招男生
两天价网站背后重重迷雾:做个网站究竟要多少钱
东5环海棠公社230-290平2居准现房98折优惠
卡佩罗:告诉你德国脚生猛的原因 不希望英德战踢点球
82岁老太为学生做饭扫地44年获授港大荣誉院士
记者回访地震中可乐男孩:将受邀赴美国参观
冯德伦徐若�隔空传情 默认其是女友
传郭晶晶欲落户香港战伦敦奥运 装修别墅当婚房
《赤壁OL》攻城战诸侯战硝烟又起
“手机钱包”亮相科博会
上海2010上半年四六级考试报名4月8日前完成
李永波称李宗伟难阻林丹取胜 透露谢杏芳有望出战
3岁女童下体红肿 自称被幼儿园老师用尺子捅伤
金证顾问:过山车行情意味着什么
谁料地王如此虚
《光环5》Logo泄露 Kinect版几无悬念
海淀区领秀新硅谷宽景大宅预计10月底开盘
柴志坤:土地供应量不断从紧 地价难现07水平(图)
伊达传说EDDA Online
三联书店建起书香巷
宇航员尿液堵塞国际空间站水循环系统
研究发现开车技术差或与基因相关
皇马输球替补席闹丑闻 队副女球迷公然调情(视频)
北京建工与市政府再度合作推出郭庄子限价房
组图:李欣汝素颜出镜拍低碳环保大片
2008中文网志年会演讲人:庄秀丽
3000点之下是买入好时机
赵本山要追究法律责任:居然诽谤我打小沈阳
总有一款适合你 潮人必备多用途电视导购
万科退赛 恒大16.6亿抢下深圳建设集团
俄企业赴港上市热情不减 资源类企业积极性最高
《非诚勿扰》单亲妈妈邂逅沧桑型男 推出微直播
朱之文亮的都是绝活《GIGA SLAVE》
《非诚勿扰》“冯女郎”车晓带妈妈闯世界(图)
美弗吉尼亚大学访华太设计签实习基地协议(组图)
华中科技大学2010年考研成绩查询开通
陈小艺“激吻照”疑似炒作
90岁老太半世纪撮合200多对新人(图)
袁立挑选钻戒被疑婚期将近 男伴酷似梁朝伟(图)
国务院:严打拐卖操控未成年人违法犯罪
郎平不惧土耳其劲旅窘境:我就喜欢接这种烂摊子
午评沪指涨0.78%逼近2800 汽车家电农业领涨
章子怡无名指戴鸽子蛋示婚 林志玲松口要嫁(图)
总经理妻子吞行贿花名册被侦查员从口中抠出
组图:时尚体育模特赵雅欣全面进军娱乐圈
Verizon第三财季利润低于上年
青年驾跑车和公交车对峙引发交通堵塞
查韦斯称愿为俄罗斯提供空军基地
《黑豹如龙新章》序盘故事&人物公布
海淀西四环玲珑天地60-90平米1-2居享95折优惠
收盘:主要股指涨跌不一 盘面胶着
房山天恒乐活城多种类型房源在售特惠房直降8万
网瘾训练营暑假狂赚数百万:利润在70%以上
钢材期货首日:两大品种成交165亿元
女子寻夫14年方知丈夫已另组家庭
多家网站关闭车票转让信息
许慧欣热带小岛拍喜剧 与郭品超变同居密友(图)
俄罗斯通过黑海舰队驻乌克兰基地延期协议
少女被投票赶走后身亡续没有人理解她想什么
班花半夜命丧学校男厕所 高考理科冠军遭调查
桑德下周四以介绍形式上市
RIM股价跌至7年来新低 分析师称其陷入极度困境
猪贩给生猪注水催肥2分钟可增15公斤
男子因工作起争执撞毁同事汽车
切尔西难留希丁克 未雨绸缪穆帅众望所归阿布独钟安帅
《幻想-全面战争》劲爆大礼免费送
统计报告称埃及人口达7522万家庭总数1790万
快船vs火箭首发:休城旨在练兵 小德帕特森进先发
英超4强工资榜:切尔西惊人 曼联比曼城仅少百万
期指低见22539后反弹 现报22623
容祖儿曝猛料:阿Sa离婚后心情忧郁(图)
各银行信用卡挂失费迥异 北京银行收费最高
莫泰酒店流拍 大摩叫价或降至6亿美元
乌兹别克斯坦议会立法院主席获连任
德媒披露鲁能引援关键人物 是他力荐德甲亚洲强人
辉立证券给予广汽集团持有评级
《小姨多鹤》捞仔做音乐 孙俪闫学晶欲开唱(图)
图文-业余希望赛海南站第二轮 球场的菠萝蜜
陆毅鲍蕾:近乎完美的爱情(组图)(2)
7000亿美元救市方案将成期市毒药
保诚启动210亿美元配股交易以融资收购AIG部门
《兄弟》江湖哲学走偏锋 甘婷婷占档年末岁初
北京南城老故事新讲法 《龙须沟》BTV即将开播
4倍光学变焦镜头 索尼W350最新价1730元
红十字基金会:明星捐款并非只在红十字会
化危为机 推动我国期市创新发展
大地艺术大师克里斯托夫妇
移动王晓云:3G需更新网络 无线才能真正互联
海淀专家国际公馆60平米公寓均价24000元(图)
浙江玻璃取得1亿元人民币合同
初二女生意外坠楼身亡 遗物发现老师暖昧短信
加拿大男子在长途汽车上割下邻座头颅(图)
调查-您如何评价火箭队签约发展联盟扣篮冠军?
王在荣:5月10日实盘操作指导
揭秘富豪身边女保镖伪装成老板秘书或亲戚(图)
赵本山御用编剧:我会继续为他写(图)
小猫遭两青年从尾部点火焚烧惹众怒
千余自考生参加应用技术教育最后一考
京东网上商城成中超主赞助商
美国副总统拜登母亲去世 奥巴马可能出席葬礼
2月北美主机销量 Xbox360超越Wii
上海12580将提供免费高考查分服务
男子为求职街头挂牌 称公开出卖自己价格面议
乐嘉出书自曝恋爱屈辱史
湖北2010上半年自考网上申办毕业须知
《哈利-波特与死亡圣器下》公布最新电视预告片
三安光电澄清公告三大悬疑待解
《食客》广州宣传 权五重元基俊比拼厨艺(图)
校长忏悔称赌博是其受贿犯罪开始
首破3000元 索尼32CX520液晶爆新低
香港遭劫持货轮获释后离开索马里
2011投资轻大盘重个股:兔年100只精选股
美国高考北京考生增两成 考生不都是“尖子生”
法国允许调查别国领导人在法资产
解析潜水艇困局决策失误=战绩跳楼 最佳变革近在眼前
中兴今夏将开始在巴西生产平板电脑
民政部长称明年将提高特殊群体供养水平
通用汽车计划向美国工厂投资20亿美元
交银国际:本周恒指将继续平静
中兴通讯:3G发牌带来大商机 回升可期
现货清淡 郑棉失守三万关口
融景城2010年中期将推2居80-90平16000起(图)
洛克比空难制造者迈格拉希陷入昏迷濒临死亡
Google多项功能前晚集中“瘫痪”
百度文库泄密上千业主个人信息 源头为售楼小姐
亿钻珠宝料半年溢利或按年显著增长
开盘:二季度GDP下降1% 美股低开
教育部冬季长跑网站被指山寨 学生担心信息泄露
国投瑞银基金朱红裕:过渡期中未雨绸缪
德法首脑今议终极救赎 索罗斯警告德国快行动
2009年硕士研究生考试历史试题(海天)
意大利专设关押变性囚犯监狱
G联赛星际2项目代打事件的处罚公告
燕京航城形象代言人正式签约李小璐
林丹:竞技体育不能太追求完美 把苏杯留住最重要
TVB主动举报案件 率先报道陈志云被捕
业主代表因更换电表与物业争论 遭保安打爆眼球
李玮峰捍卫亚洲顶级后卫头衔 韩国经历让硬汉显柔情
沪上名校开始09高考招生宣传西部行
前情报官指责萨科齐利用职权公报私仇
杜琪峰自称是贾樟柯影迷 惺惺相惜互戴高帽(图)
倒卖虚拟财产网游大盗获刑3年
小调查:2010最吸睛港台娱乐事件 最关注哪个?
一镜走天下 尼康D300S套机带票14899元
委员:现在取消高考将是另外一个灾难
6月房价持续走高 8城市一手房价格涨幅5%至8%
高速摄影展示子弹穿物瞬间草莓击中后粉碎
温州一家民间网站屡曝贪腐猛料 官方用包容原则
人民网研究院正式成立
调查显示65%美国人因经济形势拟推迟退休
育碧:杰克逊体感游戏去世前就在开发
患癌硕士张鸣千篇网络日记笑对人生(图)
男子管教亲生女儿将其抽打致死(图)
徐静蕾:我成不了杜拉拉 不在意被叫商人
成交活跃运作规范 钢材期货上市一周运行平稳
印度电信业第一季度收入82.4亿美元
华电国际电力第三季亏损减少至亏0.91亿元
大学生过年带上简历烧香拜神祈工作
3DS首发游戏评分:《任天狗+猫》最高
千万像素5倍光变 佳能IXUS990仅2521元
分拆上市概念 孕育结构性机遇
31家公司调低市场预期 外资保险进入中国不易
陈伟霆与李菲儿“旧爱”结缘 直言不会尴尬
提前还贷潮今年未现
海淀西山壹号院二期3-4居户型图曝光(图)
炮制浙大女生骂教授贴文者身份曝光
莫斯科一处夜总会发生火灾致1人死亡
乌克兰前女总理季莫申科被判处7年监禁
城管因拆广告牌与银行员工互殴引围观
入室劫杀2名女白领歹徒获死刑 两家各获赔40万
钦奇利亚宣布赢得哥斯达黎加大选(图)
广东证监局:将依法处理宜华地产有关问题
大奖赛首轮综述丁俊晖大胜甩包袱 火箭约战傅家俊
波兰斯基要求撤销诱奸案 拍纪录片披露真相(图)
[国储拍卖]9点50分各大库点竞卖报价一览
乐视网进军网页游戏与盛大等联合运营
投资经理频换背后隐忧 券商集合理财谋求新突破

这个自己构造了一个简单数据集,后续读者有兴趣可自己构建类似这种以换行为分隔的格式的数据集就可以了。

2. 构建停用词

呀
的
啊
吗
呢
able
about
above
according
accordingly
across
actually
after
afterwards
again
against
ain't
all
allow
allows
almost
alone
along
already
also
although
always
am
among
amongst
an
and
another
any
anybody
anyhow
anyone
anything
anyway
anyways
anywhere
apart
appear
appreciate
appropriate
are
aren't
around
as
a's
aside
ask
asking
associated
at
available
away
awfully
be
became
because
become
becomes
becoming
been
before
beforehand
behind
being
believe
below
beside
besides
best
better
between
beyond
both
brief
but
by
came
can
cannot
cant
can't
cause
causes
certain
certainly
changes
clearly
c'mon
co
com
come
comes
concerning
consequently
consider
considering
contain
containing
contains
corresponding
could
couldn't
course
c's
currently
definitely
described
despite
did
didn't
different
do
does
doesn't
doing
done
don't
down
downwards
during
each
edu
eg
eight
either
else
elsewhere
enough
entirely
especially
et
etc
even
ever
every
everybody
everyone
everything
everywhere
ex
exactly
example
except
far
few
fifth
first
five
followed
following
follows
for
former
formerly
forth
four
from
further
furthermore
get
gets
getting
given
gives
go
goes
going
gone
got
gotten
greetings
had
hadn't
happens
hardly
has
hasn't
have
haven't
having
he
hello
help
hence
her
here
hereafter
hereby
herein
here's
hereupon
hers
herself
he's
hi
him
himself
his
hither
hopefully
how
howbeit
however
i'd
ie
if
ignored
i'll
i'm
immediate
in
inasmuch
inc
indeed
indicate
indicated
indicates
inner
insofar
instead
into
inward
is
isn't
it
it'd
it'll
its
it's
itself
i've
just
keep
keeps
kept
know
known
knows
last
lately
later
latter
latterly
least
less
lest
let
let's
like
liked
likely
little
look
looking
looks
ltd
mainly
many
may
maybe
me
mean
meanwhile
merely
might
more
moreover
most
mostly
much
must
my
myself
name
namely
nd
near
nearly
necessary
need
needs
neither
never
nevertheless
new
next
nine
no
nobody
non
none
noone
nor
normally
not
nothing
novel
now
nowhere
obviously
of
off
often
oh
ok
okay
old
on
once
one
ones
only
onto
or
other
others
otherwise
ought
our
ours
ourselves
out
outside
over
overall
own
particular
particularly
per
perhaps
placed
please
plus
possible
presumably
probably
provides
que
quite
qv
rather
rd
re
really
reasonably
regarding
regardless
regards
relatively
respectively
right
said
same
saw
say
saying
says
second
secondly
see
seeing
seem
seemed
seeming
seems
seen
self
selves
sensible
sent
serious
seriously
seven
several
shall
she
should
shouldn't
since
six
so
some
somebody
somehow
someone
something
sometime
sometimes
somewhat
somewhere
soon
sorry
specified
specify
specifying
still
sub
such
sup
sure
take
taken
tell
tends
th
than
thank
thanks
thanx
that
thats
that's
the
their
theirs
them
themselves
then
thence
there
thereafter
thereby
therefore
therein
theres
there's
thereupon
these
they
they'd
they'll
they're
they've
think
third
this
thorough
thoroughly
those
though
three
through
throughout
thru
thus
to
together
too
took
toward
towards
tried
tries
truly
try
trying
t's
twice
two
un
under
unfortunately
unless
unlikely
until
unto
up
upon
us
use
used
useful
uses
using
usually
value
various
very
via
viz
vs
want
wants
was
wasn't
way
we
we'd
welcome
well
we'll
went
were
we're
weren't
we've
what
whatever
what's
when
whence
whenever
where
whereafter
whereas
whereby
wherein
where's
whereupon
wherever
whether
which
while
whither
who
whoever
whole
whom
who's
whose
why
will
willing
wish
with
within
without
wonder
won't
would
wouldn't
yes
yet
you
you'd
you'll
your
you're
yours
yourself
yourselves
you've
zero
zt
ZT
zz
ZZ
一
一下
一些
一切
一则
一天
一定
一方面
一旦
一时
一来
一样
一次
一片
一直
一致
一般
一起
一边
一面
万一
上下
上升
上去
上来
上述
上面
下列
下去
下来
下面
不一
不久
不仅
不会
不但
不光
不单
不变
不只
不可
不同
不够
不如
不得
不怕
不惟
不成
不拘
不敢
不断
不是
不比
不然
不特
不独
不管
不能
不要
不论
不足
不过
不问
与
与其
与否
与此同时
专门
且
两者
严格
严重
个
个人
个别
中小
中间
丰富
临
为
为主
为了
为什么
为什麽
为何
为着
主张
主要
举行
乃
乃至
么
之
之一
之前
之后
之後
之所以
之类
乌乎
乎
乘
也
也好
也是
也罢
了
了解
争取
于
于是
于是乎
云云
互相
产生
人们
人家
什么
什么样
什麽
今后
今天
今年
今後
仍然
从
从事
从而
他
他人
他们
他的
代替
以
以上
以下
以为
以便
以免
以前
以及
以后
以外
以後
以来
以至
以至于
以致
们
任
任何
任凭
任务
企图
伟大
似乎
似的
但
但是
何
何况
何处
何时
作为
你
你们
你的
使得
使用
例如
依
依照
依靠
促进
保持
俺
俺们
倘
倘使
倘或
倘然
倘若
假使
假如
假若
做到
像
允许
充分
先后
先後
先生
全部
全面
兮
共同
关于
其
其一
其中
其二
其他
其余
其它
其实
其次
具体
具体地说
具体说来
具有
再者
再说
冒
冲
决定
况且
准备
几
几乎
几时
凭
凭借
出去
出来
出现
分别
则
别
别的
别说
到
前后
前者
前进
前面
加之
加以
加入
加强
十分
即
即令
即使
即便
即或
即若
却不
原来
又
及
及其
及时
及至
双方
反之
反应
反映
反过来
反过来说
取得
受到
变成
另
另一方面
另外
只是
只有
只要
只限
叫
叫做
召开
叮咚
可
可以
可是
可能
可见
各
各个
各人
各位
各地
各种
各级
各自
合理
同
同一
同时
同样
后来
后面
向
向着
吓
吗
否则
吧
吧哒
吱
呀
呃
呕
呗
呜
呜呼
呢
周围
呵
呸
呼哧
咋
和
咚
咦
咱
咱们
咳
哇
哈
哈哈
哉
哎
哎呀
哎哟
哗
哟
哦
哩
哪
哪个
哪些
哪儿
哪天
哪年
哪怕
哪样
哪边
哪里
哼
哼唷
唉
啊
啐
啥
啦
啪达
喂
喏
喔唷
嗡嗡
嗬
嗯
嗳
嘎
嘎登
嘘
嘛
嘻
嘿
因
因为
因此
因而
固然
在
在下
地
坚决
坚持
基本
处理
复杂
多
多少
多数
多次
大力
大多数
大大
大家
大批
大约
大量
失去
她
她们
她的
好的
好象
如
如上所述
如下
如何
如其
如果
如此
如若
存在
宁
宁可
宁愿
宁肯
它
它们
它们的
它的
安全
完全
完成
实现
实际
宣布
容易
密切
对
对于
对应
将
少数
尔后
尚且
尤其
就
就是
就是说
尽
尽管
属于
岂但
左右
巨大
巩固
己
已经
帮助
常常
并
并不
并不是
并且
并没有
广大
广泛
应当
应用
应该
开外
开始
开展
引起
强烈
强调
归
当
当前
当时
当然
当着
形成
彻底
彼
彼此
往
往往
待
後来
後面
得
得出
得到
心里
必然
必要
必须
怎
怎么
怎么办
怎么样
怎样
怎麽
总之
总是
总的来看
总的来说
总的说来
总结
总而言之
恰恰相反
您
意思
愿意
慢说
成为
我
我们
我的
或
或是
或者
战斗
所
所以
所有
所谓
打
扩大
把
抑或
拿
按
按照
换句话说
换言之
据
掌握
接着
接著
故
故此
整个
方便
方面
旁人
无宁
无法
无论
既
既是
既然
时候
明显
明确
是
是否
是的
显然
显著
普通
普遍
更加
曾经
替
最后
最大
最好
最後
最近
最高
有
有些
有关
有利
有力
有所
有效
有时
有点
有的
有着
有著
望
朝
朝着
本
本着
来
来着
极了
构成
果然
果真
某
某个
某些
根据
根本
欢迎
正在
正如
正常
此
此外
此时
此间
毋宁
每
每个
每天
每年
每当
比
比如
比方
比较
毫不
没有
沿
沿着
注意
深入
清楚
满足
漫说
焉
然则
然后
然後
然而
照
照着
特别是
特殊
特点
现代
现在
甚么
甚而
甚至
用
由
由于
由此可见
的
的话
目前
直到
直接
相似
相信
相反
相同
相对
相对而言
相应
相当
相等
省得
看出
看到
看来
看看
看见
真是
真正
着
着呢
矣
知道
确定
离
积极
移动
突出
突然
立即
第
等
等等
管
紧接着
纵
纵令
纵使
纵然
练习
组成
经
经常
经过
结合
结果
给
绝对
继续
继而
维持
综上所述
罢了
考虑
者
而
而且
而况
而外
而已
而是
而言
联系
能
能否
能够
腾
自
自个儿
自从
自各儿
自家
自己
自身
至
至于
良好
若
若是
若非
范围
莫若
获得
虽
虽则
虽然
虽说
行为
行动
表明
表示
被
要
要不
要不是
要不然
要么
要是
要求
规定
觉得
认为
认真
认识
让
许多
论
设使
设若
该
说明
诸位
谁
谁知
赶
起
起来
起见
趁
趁着
越是
跟
转动
转变
转贴
较
较之
边
达到
迅速
过
过去
过来
运用
还是
还有
这
这个
这么
这么些
这么样
这么点儿
这些
这会儿
这儿
这就是说
这时
这样
这点
这种
这边
这里
这麽
进入
进步
进而
进行
连
连同
适应
适当
适用
逐步
逐渐
通常
通过
造成
遇到
遭到
避免
那
那个
那么
那么些
那么样
那些
那会儿
那儿
那时
那样
那边
那里
那麽
部分
鄙人
采取
里面
重大
重新
重要
鉴于
问题
防止
阿
附近
限制
除
除了
除此之外
除非
随
随着
随著
集中
需要
非但
非常
非徒
靠
顺
顺着
首先
高兴
是不是
说说
,
.
?
<
>
@
#
$
%
^
*
(
)
{
}
[
]
~
`
`
\
/
=
-
_
+
!
,
。
/
?
;
:
"
"
""
''
》
《
/
、
|
·
~
!
@
#
¥
%
……
&
*
(
)
——
+
-
=
「
」
【
】
;
''
�

本实验由于需要分词,所以需要构建一个停用词列表,去掉那些意义不大的词语

3. 构建用户词典

用户词典的意思是不想被分开的词语,比如Java,Confluence,Jira等等,本次实验省略此步骤。读者可自行添加。

4. 构建一个配置文件

# 窗口大小
WINDOW = 3
# 正样本对应负样本的数量
NEG_NUM = 20
# 自定义词典路径
user_word_path = r'/Applications/En/code/python/TextCnn/word2vec/data/user_words'
# 停用词
stop_word_path = r'/Applications/En/code/python/TextCnn/word2vec/data/stop_words.txt'
# 训练数据
data_path = r'/Applications/En/code/python/TextCnn/torch_w2v/data/train.txt'
#word2index.json path
w2i_save_path = r'/Applications/En/code/python/pythonProject/final_word2vec_cnn_http/model/json/word2index.json'
# 一个单词表示为100维的向量
EMBED_DIM = 100
NUM_EPOCH = 5
LEARNING_RATE = 0.1
BATCH_SIZE = 8

5. 构建数据集

import jieba
import torch
import torch.utils.data as tudimport config.word2vec_config as wcdef cut_word(data_path, stop_word_path, user_dict_path):res = []stop_words = load_stop_words(stop_word_path)with open(data_path, encoding='utf-8') as f:data = f.readlines()jieba.load_userdict(user_dict_path)for words in data:words = words.strip('\n')c_words = jieba.lcut(words, cut_all=False, HMM=True)res.append([word for word in c_words if word not in stop_words])return resdef load_stop_words(stop_word_path):with open(stop_word_path, encoding="utf-8") as f:return f.read().split('\n')def build_reflect(data):temp = ['<PAD>', '<UNK>']for d in data:temp.extend(d)temp_set = list(set(temp))# 保持原来的顺序temp_set.sort(key=temp.index)word2index = {}index2word = {}for i, item in enumerate(temp_set):word2index[item] = iindex2word[i] = itemreturn word2index, index2word, temp_setclass w2v_data(tud.Dataset):def __init__(self, text_data, vocab_dict, word_freqs, word_freq_ids):# 输入:# text_data: 语料集# vocab_dict: word --> id# word_freqs: word的频率# word_freq_ids: word_freqs对应的word的idself.text_ids = torch.LongTensor([vocab_dict[x] for x in text_data])self.word_freqs = torch.Tensor(word_freqs)self.word_freq_ids = torch.LongTensor(word_freq_ids)self.vocab_dict = vocab_dictdef __len__(self):return len(self.text_ids) - wc.WINDOW - 1def __getitem__(self, indx):center_id = self.text_ids[indx]# print("center_word:", index2word[int(center_id)], sep=' ')pos_indxs = list(range(indx - wc.WINDOW, indx)) + list(range(indx + 1, indx + wc.WINDOW + 1))pos_ids = self.text_ids[pos_indxs]# print("pos_word:", list(map(lambda x: index2word[int(x)], pos_ids)), sep=" ")neg_freqids = torch.multinomial(self.word_freqs, wc.NEG_NUM * wc.WINDOW * 2, replacement=True)neg_ids = self.word_freq_ids[neg_freqids]# print("neg_word:", list(map(lambda x: index2word[int(x)], neg_ids)), sep=" ")return center_id, pos_ids, neg_ids

分词主要是用jieba库来完成,这一段代码主要做的是:分词,构建词语->id的字典,id->词语的字典,所有词语的列表以及一个数据集返回器。

6. 构建模型

import torch
import torch.nn as nn
import torch.nn.functional as F# 制作一个word2vec模型
class word2vec_model(nn.Module):def __init__(self, vocab_size, emb_dim):super(word2vec_model, self).__init__()self.vocab_size = vocab_sizeself.emb_dim = emb_dimself.in_emb = nn.Embedding(vocab_size, emb_dim, sparse=False)  # 根据输入的vocab大小和embed维度实例化一个embbedding层init_weight = 1self.in_emb.weight.data.uniform_(-init_weight, init_weight)self.out_emb = nn.Embedding(vocab_size, emb_dim)self.out_emb.weight.data.uniform_(-init_weight, init_weight)def forward(self, center_id, pos_ids, neg_ids):center_embed = self.in_emb(center_id).unsqueeze(2)  # [batch_size, emb_dim, 1] 最后加一维pos_embed = self.out_emb(pos_ids)  # [batch_size, window*2, emb_dim]neg_embed = self.out_emb(neg_ids)  # [batch_size, neg_num*window*2, emb_dim]pos_score = torch.bmm(pos_embed, center_embed).squeeze()  # [batch_size, window*2]neg_score = torch.bmm(neg_embed, -center_embed).squeeze()  # [batch_size, neg_num_window*2]log_pos = F.logsigmoid(pos_score).sum(1)  # 在维度1上加和  # [batch_size]log_neg = F.logsigmoid(neg_score).sum(1)  # [batch_size]# 使用logsigmoid(x*w)计算x和w的点乘结果,sigmoid值在0-1之间,log(0-1)即负无穷到0。loss = log_pos + log_negloss = loss.mean(0)return -lossdef get_inEmbed_weight(self):# 取出嵌入矩阵的权重return self.in_emb.weight.data.cpu().numpy()if __name__ == '__main__':pass

这一块没什么好解释的。

7. 训练模型

from collections import Counter
import json
import numpy as np
import word2vec_model as w_model
from dataset.word2vec_dataset import *res = cut_word(wc.data_path, wc.stop_word_path, wc.user_word_path)
word2index, index2word, temp_set = build_reflect(res)
with open(wc.w2i_save_path, 'w') as f:json.dump(word2index, f)count_dic = dict(Counter(temp_set))
word_counts = np.array([count for count in count_dic.values()], dtype=np.float32)
word_freq_rate = word_counts / np.sum(word_counts)  # 计算每个word的概率
word_freq = word_freq_rate ** (3. / 4.)
word_freq = word_freq / np.sum(word_freq)  # 计算每个word的负采样概率,频次越高的负采样率约高word_key = count_dic.keys()
word_keyids = [word2index[k] for k in count_dic.keys()]  # 该数组保存着word_freq中每一元素对应的wordId
valwordkey = word_keyids[:10]word_owe_sample = (np.sqrt(word_freq_rate / 0.001) + 1) * (0.001 / word_freq_rate)twf = torch.Tensor(word_freq)
neg_ids = torch.multinomial(twf, 20)  # ,replacement=True)   # 从in_rate中挑选20个概率最高的位置下标
twfk = torch.LongTensor(word_keyids)val_wk = twfk[neg_ids].tolist()
print(list(map(lambda x: index2word[x], val_wk)))WINDOW = 3
NEG_NUM = 20  # 一个正样本对应负样本数量
VOCAB_SIZE = len(word2index.keys())  # 词典大小,也是embedding层的大小
EMBED_DIM = wc.EMBED_DIM
USE_CUDA = True
NUM_EPOCH = 5
LEARNING_RATE = 0.1
BATCH_SIZE = wc.BATCH_SIZE
device = 'cuda' if torch.cuda.is_available() else 'cpu'train_dataset = w2v_data(temp_set, word2index, word_freq, word_keyids)
train_dataloader = tud.DataLoader(dataset=train_dataset, batch_size=BATCH_SIZE, shuffle=True)w2v_model = w_model.word2vec_model(vocab_size=VOCAB_SIZE, emb_dim=EMBED_DIM)w2v_model.to(device)optimizer = torch.optim.SGD(params=w2v_model.parameters(), lr=LEARNING_RATE)for e in range(NUM_EPOCH):for i, (center_id, pos_ids, neg_ids) in enumerate(train_dataloader):center_id = center_id.to(device)pos_ids = pos_ids.to(device)neg_ids = neg_ids.to(device)print(f'ci:{center_id.shape}, pi:{pos_ids.shape}, ni:{neg_ids.shape}')optimizer.zero_grad()loss = w2v_model(center_id, pos_ids, neg_ids)loss.backward()optimizer.step()emb_weights = w2v_model.get_inEmbed_weight()
np.save(r'../model/word2vec/word2vec_embed_weight_%d' % EMBED_DIM, emb_weights)
torch.save(w2v_model.state_dict(), '../model/word2vec/word2vec_model_weight_%d' % EMBED_DIM)# 查找相似词
def look_simi(word, n):wid = word2index[word]wemb = emb_weights[wid]wxd = np.dot(emb_weights, wemb)# 找出最大的n个值的下标res = [(0, 0)] * nfor i, m in enumerate(wxd):for j, (val, ids) in enumerate(res):if m >= val:res.insert(j, (m, i))res.pop()breakreturn resdef simi_word(word, n):res = look_simi(word, n)simi_w = []for _, ids in res:simi_w.append(index2word[ids])return simi_w

以上是主训练函数,训练结束会保存一个.npy文件和一个无后缀文件(注意保存路径)

8. 如何调用

import json
import torch
import os, os.path as osp
import numpy as np
import jiebadef load_stop_words(stop_word_path):with open(stop_word_path, encoding="utf-8") as f:return f.read().split('\n')def cut_word(question, stop_word_path):res = []stop_words = load_stop_words(stop_word_path)c_words = jieba.lcut(question, cut_all=False, HMM=True)res.extend([word for word in c_words if word not in stop_words])return resdef get_vec(question):with open(r'model/json/word2index.json', 'r') as f:word2index_dict = json.load(f)stop_word_path = r'data/jieba/stop_words.txt'user_dict_path = r'data/jieba/user_words.txt'c_words = cut_word(question, stop_word_path, user_dict_path)model = np.load(r'model/word2vec/word2vec_embed_weight_100.npy')question_size = len(c_words)temp = np.zeros(shape=(1, 100))for i, item in enumerate(c_words):index = word2index_dict.get(item, 1)# print(model[index][:])temp += model[index][:]# 平均词向量temp = temp / question_size# 返回字符串,服务端解析为列表res = str(temp[0][:])return resif __name__ == '__main__':question = '中华女子'r = get_vec(question)

注意以上路径都需要改为你自己对应的路径。

完结

参考文献

占位,后续再补

Word2Vec模型训练简洁步骤相关推荐

  1. [书蕴笔记-1]word2vec模型训练

    word2vec模型训练 前言 整体索引在此 书蕴--基于书评的人工智能推荐系统 上次把文本进行了预处理,主要是使用正则去除标签以及对文本去除停用词以及结巴分词. 后续还会加入tf-idf来动态选取停 ...

  2. Spark下的word2vec模型训练

    一.引言 前边一节介绍了Word2Vec模型训练同义词,那么在大数据量的情况下,我们自然想到了用spark来进行训练.下面就介绍我们是如何实现spark上的模型训练. 二.分词 模型训练的输入是分好词 ...

  3. word2vec模型训练保存加载及简单使用

    目录 word2vec模型训练保存加载及简单使用 一 word2vec简介 二.模型训练和保存及加载 模型训练 模型保存和加载 模型的增量训练 三.模型常用API 四.文本相似度计算--文档级别 wo ...

  4. python实现glove,gensim.word2vec模型训练实例

    20210331 https://blog.csdn.net/sinat_26917383/article/details/83029140 glove实例 https://dumps.wikimed ...

  5. (1)简单易学—— 人脸检测 Tensorflow_MTCNN模型训练详细步骤(纯干货,适用于windows和ubuntu系统)

    (配置项目环境前,电脑环境需要安装好Anaconda3) 1. 下载项目地址: git clone https://github.com/wangbm/MTCNN-Tensorflow.git 先使用 ...

  6. 利用Gensim训练关于英文维基百科的Word2Vec模型(Training Word2Vec Model on English Wikipedia by Gensim)

    Training Word2Vec Model on English Wikipedia by Gensim 更新:发现另一篇译文:中英文维基百科语料上的Word2Vec实验,该译文还提供了中文维基百 ...

  7. NLP-词向量(Word Embedding)-2013:Word2vec模型(CBOW、Skip-Gram)【对NNLM的简化】【层次Softmax、负采样、重采样】【静态表示;无法解决一词多义】

    一.文本的表示方法 (Representation) 文本是一种非结构化的数据信息,是不可以直接被计算的.因为文本不能够直接被模型计算,所以需要将其转化为向量. 文本表示的作用就是将这些非结构化的信息 ...

  8. wiki中文语料的word2vec模型构建

    一.利用wiki中文语料进行word2vec模型构建 1)数据获取 到wiki官网下载中文语料,下载完成后会得到命名为zhwiki-latest-pages-articles.xml.bz2的文件,里 ...

  9. Word2Vec 增量训练

    一. 问题由来 word2vec的本质是一个神经网络语言模型,基于语言模型进行分布式词向量的训练.它需要大量的语料进行训练,从而找到词与词之间的关系,但是当我们已经训练好了一个word2vec模型之后 ...

  10. word2vec模型评估_「译」 用 Word2vec 表示音乐?

    [译] 用 Word2vec 表示音乐? 原文地址:Representing music with Word2vec? 原文作者:Dorien Herremans 译文出自:翻译计划 本文永久链接:g ...

最新文章

  1. 解决cocos2dx 3.x 导入cocostudio的ui界面出现错位问题
  2. 用verilog实现检测1的个数_入门指南:用Python实现实时目标检测(内附代码)
  3. WPF实现环(圆)形菜单
  4. Netbeans、Eclipse中查看JDK源码
  5. 标量、向量、矩阵、张量
  6. 使用Win2D在UWP程序中2D绘图(二)
  7. python123词频统计之哈姆雷特_基于Yarn的Spark环境,统计哈姆雷特词频(1)-阿里云开发者社区...
  8. Python项目开发基础 -- 函数参数与数据库连接参数
  9. paip.php 与js 的相似性以及为什么它们这么烂还很流行。。
  10. 36.伪造目标不可达的ICMP数据包
  11. c语言中数组int*,C语言数组
  12. 京东API接口调用关键字搜索商品展示
  13. WaitHandles 的数目必须少于或等于 64 个
  14. Maven:你还在手动导包吗?带你了解Maven的前世今生(尚硅谷详细笔记)
  15. 请问mysql数据类型是否区分大小写?
  16. excel斜线表头的制作
  17. 汇编指令-MOV与ldr区别
  18. 如何解释阀门定位器的单作用和双作用?
  19. Statistical Analysis of Network Data with R(第二版) 上机实操 3
  20. web前端面试基本知识重点(下)

热门文章

  1. PLSQL Developer 没有64位版本 + 找不到 msvcr71.dll
  2. html浅绿色配色效果图大全,纯CSS3渐变色板配色代码
  3. Python-OpenCV——Image inverting
  4. Backbone - Involution: Inverting the Inherence of Convolution for Visual Recognition
  5. 网页保存到mysql数据库_把网页数据保存到数据库
  6. 【Ignite】使用数据库软件DBeaver管理Apache Ignite
  7. 极米旗舰级新品极米H5强势来袭:画质性能在线,硬核配置拉满
  8. mysql 三角函数_三角函数公式
  9. 如何设置条形码的尺寸
  10. android webview file,Android WebView实现文件下载功能