通過搜狗新聞?wù)Z料用word2Vec訓(xùn)練中文模型

在搜狗實驗室里下載相關(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ù)如下:

數(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")

跑起來如下:

運行結(jié)果

分完詞的樣子:

分詞完畢,<content></content>也去掉了

接著我們可以用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)

運行信息如下:

正在進(jì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"早餐 晚餐 午餐 計算機".split())
計算機

In [13]: model.n_similarity([u'御姐',u'蘿莉'],[u'計算機',u'編程'])
Out[13]: -0.054454374940044653

通過測試,看起來效果還蠻不錯的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容