在搜狗實(shí)驗室里下載相關(guān)語料稠歉,我下載的是全網(wǎng)新聞: http://www.sogou.com/labs/resource/ca.php
下下來的語料蛮拔,看到有1.54G的大信プ贰:
其中里面內(nèi)容的格式為:
剛下下來的語料是用gbk編碼的,在mac或linux上都會呈亂碼形式娩鹉,需要將之轉(zhuǎn)換為utf-8編碼攻谁。而且我們只需要<content>里面的內(nèi)容。因此先轉(zhuǎn)換編碼和獲取content內(nèi)容弯予。這里簡單的方法可以通過shell的命令來完成:
cat news_tensite_xml.dat | iconv -f gbk -t utf-8 -c | grep "<content>" > corpus.txt
轉(zhuǎn)換完后的數(shù)據(jù)如下:
這時候全是content中的內(nèi)容了戚宦,雖然還有<content>標(biāo)簽在,不過這個可以在程序中去掉锈嫩。
下面一個操作就是進(jìn)行分詞受楼,因為是用Python來進(jìn)行的,使用jieba分詞來進(jìn)行分詞操作祠挫,生成分詞文件corpus_seg.txt:
python word_segment.py corpus.txt corpus_seg.txt
# -*- coding: utf-8 -*-
# word_segment.py用于語料分詞
import logging
import os.path
import sys
import re
import jieba
reload(sys)
sys.setdefaultencoding( "utf-8" )
# 先用正則將<content>和</content>去掉
def reTest(content):
reContent = re.sub('<content>|</content>','',content)
return reContent
if __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
finput = open(inp)
foutput = open(outp,'w')
for line in finput:
line_seg = jieba.cut(reTest(line))
output.write(space.join(line_seg))
i = i + 1
if (i % 1000 == 0):
logger.info("Saved " + str(i) + " articles_seg")
finput.close()
foutput.close()
logger.info("Finished Saved " + str(i) + " articles")
跑起來如下:
分完詞的樣子:
接著我們可以用gensim中的word2vec工具訓(xùn)練:
python train_word2vec_model.py corpus_seg.txt corpus.model corpus.vector
# -*- coding: utf-8 -*-
# train_word2vec_model.py用于訓(xùn)練模型
import logging
import os.path
import sys
import multiprocessing
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
if __name__=='__main__':
program = os.path.basename(sys.argv[0])
logger = logging.getLogger(program)
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
logging.root.setLavel(level=logging.INFO)
logging.info("running %s" % ' '.join(sys.argv))
if len(sys.argv) < 4:
print global()['__doc__'] % locals()
sys.exit(1)
inp,outp,outp2 = sys.argv[1:4]
model = Word2Vec(LineSentence(inp),size=400,window=5,min_count=5,workers=multiprocessing.cup_count())
model.save(outp)
model.save_word2vec_format(outp2,binary=false)
運(yùn)行信息如下:
完畢后,即訓(xùn)練出了模型等舔,這是可以測試測試模型的效果了,進(jìn)入ipython:
In [1]: import gensim
In [2]: model = gensim.models.Word2Vec.load('corpus.model')
In [3]: result = model.most_similar(u'警察')
In [4]: for word in result:
...: print word[0],word[1]
...:
警員 0.668260276318
民警 0.566563367844
軍警 0.560631096363
便衣警察 0.560409486294
保安 0.559458613396
交警 0.553144752979
協(xié)警 0.55225610733
公安人員 0.536189615726
警方 0.535990476608
警務(wù)人員 0.5125041008
In [5]: result = model.most_similar(u'妹紙')
In [6]: for word in result:
...: print word[0],word[1]
...:
妹子 0.588376522064
噢 0.559590697289
帥哥 0.550627946854
美眉 0.549147129059
蘿莉 0.534497618675
尤物 0.525674104691
小蘿莉 0.517127275467
小女生 0.508114397526
妖嬈 0.506700277328
美女 0.503593623638
In [7]: result = model.most_similar(u'御姐')
In [8]: for word in result:
...: print word[0],word[1]
...:
冷艷 0.705523848534
蘿莉 0.701750993729
俠女 0.645917892456
玉女 0.643954575062
百變 0.634887218475
小蘿莉 0.62935769558
丑女 0.613193750381
妖嬈 0.61169230938
清純 0.608936905861
風(fēng)騷 0.602776527405
In [9]: result = model.most_similar(u'馬云')
In [10]: for word in result:
...: print word[0],word[1]
...:
阿里巴巴 0.557115197182
馬化騰 0.551600694656
雷軍 0.495278447866
李彥宏 0.476020514965
柳傳志 0.475475847721
郭臺銘 0.462114006281
宋衛(wèi)平 0.453877806664
閻焱 0.452617198229
周鴻祎 0.44635617733
俞敏洪 0.43476909399
In [11]: model.similarity(u'男人',u'女人')
Out[11]: 0.90834058044551369
In [12]: print model.doesnt_match(u"早餐 晚餐 午餐 計算機(jī)".split())
計算機(jī)
In [13]: model.n_similarity([u'御姐',u'蘿莉'],[u'計算機(jī)',u'編程'])
Out[13]: -0.054454374940044653
通過測試糟趾,看起來效果還蠻不錯的慌植。