word2Vec

来源:互联网 发布:c语言 最长单词 编辑:程序博客网 时间:2024/06/17 02:29

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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

在控制台执行命令: 
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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

执行命令:执行 “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)]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

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 
接下来,繁简转换,分词等操作同上。 
测试也同上,只是换了模型而已。

原创粉丝点击