NLP(一)word2Vec实验

来源:互联网 发布:sql server 2008 费用 编辑:程序博客网 时间:2024/05/27 08:13

最近试了一下Word2Vec,以及对应的python版本 gensim word2vec ,就有心在一个更大规模的语料上测试一下,自然而然维基百科的语料与SogouCA中文语料库就进入了视线。以下将重点讲解如何实现过程。
1.语料库的获取
这里主要包括了三个语料库,一个英文,两个中文语料库。
(1)英文语料库
维基百科英文语料库
下载的是xml压缩后的最新数据,大概11G左右,是个不错的语料库呦!
(2)中文语料库
维基百科中文语料库
中文维基百科的数据比较小,整个xml的压缩文件大约才1G,相对英文数据小了很多。
SogouCA全网新闻数据
压缩1.2G左右。

2.英文实验
处理包括两个阶段,首先将xml的wiki数据转换为text格式,通过下面这个脚本(process_wiki.py)实现:

#!/usr/bin/env python# -*- coding: utf-8 -*-import loggingimport os.pathimport sysfrom gensim.corpora import WikiCorpusif __name__ == '__main__':    program = os.path.basename(sys.argv[0])    logger = logging.getLogger(program)    logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')    logging.root.setLevel(level=logging.INFO)    logger.info("running %s" % ' '.join(sys.argv))    # check and process input arguments    if len(sys.argv) < 3:        print globals()['__doc__'] % locals()        sys.exit(1)    inp, outp = sys.argv[1:3]    space = " "    i = 0    output = open(outp, 'w')    wiki = WikiCorpus(inp, lemmatize=False, dictionary={})    for text in wiki.get_texts():        output.write(space.join(text) + "\n")        i = i + 1        if (i % 10000 == 0):            logger.info("Saved " + str(i) + " articles")    output.close()    logger.info("Finished Saved " + str(i) + " articles")

在控制台执行命令:
python process_wiki.py enwiki-latest-pages-articles.xml.bz2 wiki.en.text
执行过程比较慢,大概要好几个小时。
训练阶段:
有以下脚本:
train_word2vec_model.py

#!/usr/bin/env python# -*- coding: utf-8 -*-import loggingimport os.pathimport sysimport multiprocessingfrom gensim.corpora import WikiCorpusfrom gensim.models import Word2Vecfrom gensim.models.word2vec import LineSentenceif __name__ == '__main__':    program = os.path.basename(sys.argv[0])    logger = logging.getLogger(program)    logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')    logging.root.setLevel(level=logging.INFO)    logger.info("running %s" % ' '.join(sys.argv))    # check and process input arguments    if len(sys.argv) < 4:        print globals()['__doc__'] % locals()        sys.exit(1)    inp, outp1, outp2 = sys.argv[1:4]    model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5,            workers=multiprocessing.cpu_count())    # trim unneeded model memory = use(much) less RAM    #model.init_sims(replace=True)    model.save(outp1)    model.save_word2vec_format(outp2, binary=False)

执行命令:执行 “python train_word2vec_model.py wiki.en.text wiki.en.text.model wiki.en.text.vector”,大概得好几十个小时,因计算机性能而异。我们得到了一个gensim中默认格式的word2vec model和一个原始c版本word2vec的vector格式的模型: wiki.en.text.vector
以下,调试结果:

In [2]: import gensimIn [3]: model = gensim.models.Word2Vec.load_word2vec_format("wiki.en.text.vector", binary=False)In [4]: model.most_similar("queen")Out[4]: [(u'princess', 0.5760838389396667), (u'hyoui', 0.5671186447143555), (u'janggyung', 0.5598698854446411), (u'king', 0.5556215047836304), (u'dollallolla', 0.5540223121643066), (u'loranella', 0.5522741079330444), (u'ramphaiphanni', 0.5310937166213989), (u'jeheon', 0.5298476219177246), (u'soheon', 0.5243583917617798), (u'coronation', 0.5217245221138)]In [5]: model.most_similar("man")Out[5]: [(u'woman', 0.7120707035064697), (u'girl', 0.58659827709198), (u'handsome', 0.5637181997299194), (u'boy', 0.5425317287445068), (u'villager', 0.5084836483001709), (u'mustachioed', 0.49287813901901245), (u'mcgucket', 0.48355430364608765), (u'spider', 0.4804879426956177), (u'policeman', 0.4780033826828003), (u'stranger', 0.4750771224498749)]In [6]: model.most_similar("woman")Out[6]: [(u'man', 0.7120705842971802), (u'girl', 0.6736541986465454), (u'prostitute', 0.5765659809112549), (u'divorcee', 0.5429972410202026), (u'person', 0.5276163816452026), (u'schoolgirl', 0.5102938413619995), (u'housewife', 0.48748138546943665), (u'lover', 0.4858251214027405), (u'handsome', 0.4773051142692566), (u'boy', 0.47445783019065857)]In [8]: model.similarity("woman", "man")Out[8]: 0.71207063453821218In [10]: model.doesnt_match("breakfast cereal dinner lunch".split())Out[10]: 'cereal'In [11]: model.similarity("woman", "girl")Out[11]: 0.67365416785207421In [13]: model.most_similar("frog")Out[13]: [(u'toad', 0.6868536472320557), (u'barycragus', 0.6607867479324341), (u'grylio', 0.626731276512146), (u'heckscheri', 0.6208407878875732), (u'clamitans', 0.6150864362716675), (u'coplandi', 0.612680196762085), (u'pseudacris', 0.6108512878417969), (u'litoria', 0.6084023714065552), (u'raniformis', 0.6044802665710449), (u'watjulumensis', 0.6043726205825806)]

3.中文数据
执行相同命令解压:python process_wiki.py enwiki-latest-pages-articles.xml.bz2 wiki.en.text
然后最痛苦的事情来了,如何进行繁简转换?(因为除了加杂一些英文词汇外,还有很多繁体字混迹其中)
在网上下载开源项目opencc(opencc-0.4.3.tar.gz即可,太高版本的无法运行。),解压,进入到目录下,进入dos界面。执行命令:
opencc -i wiki.zh.text -o wiki.zh.text.jian -c zht2zhs.ini
(注:不清楚的话,可以在评论区发言,也可通过邮箱:m18852867035@163.com询问)
然后进行分词处理,先下载MeCab(日文分词系统),然后下载mecab-chinesedic-binary,放在MeCab bin目录下,cmd运行命令:mecab -d mecab-chinesedic-binary wakati wiki.zh.text.jian -o wiki.zh.text.jian.seg -b 10000000
详细详细可参考《用MeCab打造一套实用的中文分词系统》,也可在评论区和邮箱处询问。

接下来是utf-8转码,个人感觉在windows下作用不大,但也可试试,反正我是偏向于不用转。
iconv -c -t UTF-8 < wiki.zh.text.jian.seg > wiki.zh.text.jian.seg.utf-8(你还得下载 iconv包,还不如不转)

接下来到了训练阶段:
执行命令:
python train_word2vec_model.py wiki.zh.text.jian.seg(.utf-8) wiki.zh.text.model wiki.zh.text.vector
大概两小时左右。
测试命令同英文
如:`In [1]: import gensim

In [2]: model = gensim.models.Word2Vec.load(“wiki.zh.text.model”)

In [3]: model.most_similar(u”足球”)
Out[3]:
[(u’\u8054\u8d5b’, 0.6553816199302673),
(u’\u7532\u7ea7’, 0.6530429720878601),
(u’\u7bee\u7403’, 0.5967546701431274),
(u’\u4ff1\u4e50\u90e8’, 0.5872289538383484),
(u’\u4e59\u7ea7’, 0.5840631723403931),
(u’\u8db3\u7403\u961f’, 0.5560152530670166),
(u’\u4e9a\u8db3\u8054’, 0.5308005809783936),
(u’allsvenskan’, 0.5249762535095215),
(u’\u4ee3\u8868\u961f’, 0.5214947462081909),
(u’\u7532\u7ec4’, 0.5177896022796631)]

In [4]: result = model.most_similar(u”足球”)

In [5]: for e in result:
print e[0], e[1]
….:
联赛 0.65538161993
甲级 0.653042972088
篮球 0.596754670143
俱乐部 0.587228953838
乙级 0.58406317234
足球队 0.556015253067
亚足联 0.530800580978
allsvenskan 0.52497625351
代表队 0.521494746208
甲组 0.51778960228

In [6]: result = model.most_similar(u”男人”)

In [7]: for e in result:
print e[0], e[1]
….:
女人 0.77537125349
家伙 0.617369174957
妈妈 0.567102909088
漂亮 0.560832381248
잘했어 0.540875017643
谎言 0.538448691368
爸爸 0.53660941124
傻瓜 0.535608053207
예쁘다 0.535151124001
mc刘 0.529670000076

In [8]: result = model.most_similar(u”女人”)

In [9]: for e in result:
print e[0], e[1]
….:
男人 0.77537125349
我的某 0.589010596275
妈妈 0.576344847679
잘했어 0.562340974808
美丽 0.555426716805
爸爸 0.543958246708
新娘 0.543640494347
谎言 0.540272831917
妞儿 0.531066179276
老婆 0.528521537781

In [10]: result = model.most_similar(u”青蛙”)

In [11]: for e in result:
print e[0], e[1]
….:
老鼠 0.559612870216
乌龟 0.489831030369
蜥蜴 0.478990525007
猫 0.46728849411
鳄鱼 0.461885392666
蟾蜍 0.448014199734
猴子 0.436584025621
白雪公主 0.434905380011
蚯蚓 0.433413207531
螃蟹 0.4314712286

In [12]: result = model.most_similar(u”姨夫”)

In [13]: for e in result:
print e[0], e[1]
….:
堂伯 0.583935439587
祖父 0.574735701084
妃所生 0.569327116013
内弟 0.562012672424
早卒 0.558042645454
曕 0.553856015205
胤祯 0.553288519382
陈潜 0.550716996193
愔之 0.550510883331
叔父 0.550032019615

In [14]: result = model.most_similar(u”衣服”)

In [15]: for e in result:
print e[0], e[1]
….:
鞋子 0.686688780785
穿着 0.672499775887
衣物 0.67173999548
大衣 0.667605519295
裤子 0.662670075893
内裤 0.662210345268
裙子 0.659705817699
西装 0.648508131504
洋装 0.647238850594
围裙 0.642895817757

In [16]: result = model.most_similar(u”公安局”)

In [17]: for e in result:
print e[0], e[1]
….:
司法局 0.730189085007
公安厅 0.634275555611
公安 0.612798035145
房管局 0.597343325615
商业局 0.597183346748
军管会 0.59476184845
体育局 0.59283208847
财政局 0.588721752167
戒毒所 0.575558543205
新闻办 0.573395550251

In [18]: result = model.most_similar(u”铁道部”)

In [19]: for e in result:
print e[0], e[1]
….:
盛光祖 0.565509021282
交通部 0.548688530922
批复 0.546967327595
刘志军 0.541010737419
立项 0.517836689949
报送 0.510296344757
计委 0.508456230164
水利部 0.503531932831
国务院 0.503227233887
经贸委 0.50156635046

In [20]: result = model.most_similar(u”清华大学”)

In [21]: for e in result:
print e[0], e[1]
….:
北京大学 0.763922810555
化学系 0.724210739136
物理系 0.694550514221
数学系 0.684280991554
中山大学 0.677202701569
复旦 0.657914161682
师范大学 0.656435549259
哲学系 0.654701948166
生物系 0.654403865337
中文系 0.653147578239

In [22]: result = model.most_similar(u”卫视”)

In [23]: for e in result:
print e[0], e[1]
….:
湖南 0.676812887192
中文台 0.626506924629
収蔵 0.621356606483
黄金档 0.582251906395
cctv 0.536769032478
安徽 0.536752820015
非同凡响 0.534517168999
唱响 0.533438682556
最强音 0.532605051994
金鹰 0.531676828861

In [24]: result = model.most_similar(u”习近平”)

In [25]: for e in result:
print e[0], e[1]
….:
胡锦涛 0.809472680092
江泽民 0.754633367062
李克强 0.739740967751
贾庆林 0.737033963203
曾庆红 0.732847094536
吴邦国 0.726941585541
总书记 0.719057679176
李瑞环 0.716384887695
温家宝 0.711952567101
王岐山 0.703570842743

In [26]: result = model.most_similar(u”林丹”)

In [27]: for e in result:
print e[0], e[1]
….:
黄综翰 0.538035452366
蒋燕皎 0.52646958828
刘鑫 0.522252976894
韩晶娜 0.516120731831
王晓理 0.512289524078
王适 0.508560419083
杨影 0.508159279823
陈跃 0.507353425026
龚智超 0.503159761429
李敬元 0.50262516737

In [28]: result = model.most_similar(u”语言学”)

In [29]: for e in result:
print e[0], e[1]
….:
社会学 0.632598280907
人类学 0.623406708241
历史学 0.618442356586
比较文学 0.604823827744
心理学 0.600066184998
人文科学 0.577783346176
社会心理学 0.575571238995
政治学 0.574541330338
地理学 0.573896467686
哲学 0.573873817921

In [30]: result = model.most_similar(u”计算机”)

In [31]: for e in result:
print e[0], e[1]
….:
自动化 0.674171924591
应用 0.614087462425
自动化系 0.611132860184
材料科学 0.607891201973
集成电路 0.600370049477
技术 0.597518980503
电子学 0.591316461563
建模 0.577238917351
工程学 0.572855889797
微电子 0.570086717606

In [32]: model.similarity(u”计算机”, u”自动化”)
Out[32]: 0.67417196002404789

In [33]: model.similarity(u”女人”, u”男人”)
Out[33]: 0.77537125129824813

In [34]: model.doesnt_match(u”早餐 晚餐 午餐 中心”.split())
Out[34]: u’\u4e2d\u5fc3’

In [35]: print model.doesnt_match(u”早餐 晚餐 午餐 中心”.split())
中心`

SogouCA数据的测试:
解压后:合并各个.txt:
copy *.txt SogouCA.txt
接下来,比较蛋疼,在Linux下运行了一行命令(windows不知道如何弄。)
cat SogouCA.txt | iconv -f gbk -t utf-8 -c | grep “” > corpus.txt
可参考利用中文数据跑Google开源项目word2vec
接下来,繁简转换,分词等操作同上。
测试也同上,只是换了模型而已。

本人刚接触这一领域,有什么不足的地方欢迎各位指正!

2 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 飞机去程取消分开买的返程怎么办 订完学生票发现使用次数过了怎么办 坐火车买学生票没带学生证怎么办 买了学生票学生证磁条没了怎么办 买了动车学生票没带学生证怎么办 身份证没磁了怎么办能买火车票 格力空调保修单丢了怎么办 格力空调保修期内坏了怎么办 国际联程航班第一程延误怎么办 大麦网演唱会的票售罄了怎么办 国内转机航班第一班延误了怎么办 联程机票下一程航班被取消怎么办 联程机票第一班航班取消怎么办 联程机票第二段航班被取消怎么办 联程航班第一程延误行李怎么办 联程航班未赶上第二程行李怎么办 高铁晚点赶不上下一趟动车怎么办? 动车晚点赶不上下一趟车怎么办 动车晚点导致没赶上下一趟怎么办 浙大三位一体选考分数报错了怎么办 报到证上时间到期了还没报到怎么办 不停的打嗝已经超过24小时怎么办 面对不给下属做主的领导怎么办 法院说退款受伤人去不了证明怎么办 e栈快递柜没收到短信怎么办 京东快递放门卫丢了怎么办 丰巢快递柜收不到取件码怎么办 丰巢快递柜手机号码填错了怎么办 e栈手机号换了取不出来怎么办 买高铁票起点一样终点不一样怎么办 定火车票把名字写错一个字怎么办 火车票坐完车票丢了报销怎么办 客户交给我的钱被骗了怎么办 要证明网络来源的可靠性该怎么办 魅族手机高德地图信号弱怎么办 t恤的印花粘粘的怎么办 从包图网下载的模板素材丢失怎么办 大屏导航的语音功能怎么办用 手机导航不走地图上面走时怎么办 行车撞到步行人死亡师机逃离怎么办 小天才平板电脑不显示了怎么办