中英文維基百科語料上的Word2Vec實驗

這篇作爲完整的詞向量模型訓練過程記錄~~~

一、數據獲取

wiki中文:wiki中文

wiki英文:wiki英文

中文文件大小約1.3G,英文文件大小約13.8G。

二、將xml文件轉換爲text格式使用gensim.corpora中的WikiCorpus函數來處理維基百科的數據,具體方法是get_texts().

#!/usr/bin/env python
# -*- coding: utf-8  -*-
# 將xml的wiki數據轉換爲text格式

import logging
import os.path
import sys
import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')  # 忽略警告
from gensim.corpora import WikiCorpus

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))

    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', encoding='utf-8')
    wiki =WikiCorpus(inp, lemmatize=False, dictionary=[])  # gensim裏的維基百科處理類WikiCorpus
    for text in wiki.get_texts():  # 通過get_texts將維基裏的每篇文章轉換位1行text文本,並且去掉了標點符號等內容
        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.")

英文數據處理大約2個小時,中文大約30分鐘。



三、中文繁體轉簡體

1)安裝OpenCC

到以下鏈接地址下載對應版本的OpenCC,本人下載的版本是opencc-1.0.1-win64。https://bintray.com/package/files/byvoid/opencc/OpenCC 另外,資料顯示還有python版本的,使用pip install opencc-python進行安裝,未實踐不做贅述。

2)使用OpenCC進行繁簡轉換

進入解壓後的opencc的目錄(opencc-1.0.1-win32),雙擊opencc.exe文件。在txt文件所在目錄下打開dos窗口(Shift+鼠標右鍵->在此處打開命令窗口),輸入如下命令行:

 opencc -i wiki.zh.txt -o wiki.zh.simp.txt -c t2s.json

則會得到文件wiki.zh.simp.txt,即轉成了簡體的中文。

      

四、中文分詞

採用結巴分詞對簡體中文文件進行分詞。由於此語料已經去除了標點符號,因此在分詞程序中無需進行清洗操作,可直接分詞。若是自己採集的數據還需進行標點符號去除和去除停用詞的操作。

#!/usr/bin/env python
# -*- coding: utf-8  -*-
# 逐行讀取文件數據進行jieba分詞

import jieba
import jieba.analyse
import jieba.posseg as pseg #引入詞性標註接口 
import codecs, sys


if __name__ == '__main__':
    f = codecs.open('wiki.zh.simp.txt', 'r', encoding='utf-8')
    target = codecs.open('wiki.zh.simp.seg.txt', 'w', encoding='utf-8')
    print('open files.')

    lineNum = 1
    line = f.readline()
    while line:
        print('---processing ', lineNum, ' article---')
        seg_list = jieba.cut(line, cut_all=False)
        line_seg = ' '.join(seg_list)
        target.writelines(line_seg)
        lineNum = lineNum + 1
        line = f.readline()

    print('well done.')
    f.close()
    target.close()

五、訓練Word2Vec模型

接下來中文分完詞的文檔或英文文檔可進行Word2Vec模型的訓練。

#!/usr/bin/env python
# -*- coding: utf-8  -*-
# 使用gensim word2vec訓練腳本獲取詞向量

import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')  # 忽略警告
import logging
import os.path
import sys
import multiprocessing
from gensim.corpora import WikiCorpus
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence


if __name__ == '__main__':

    # print(open('/Users/sy/Desktop/pyRoot/wiki_zh_vec/cmd.txt').readlines())
    # sys.exit()
    
    program = os.path.basename(sys.argv[0])
    logger = logging.getLogger(program)

    logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s', level=logging.INFO)
    logger.info("running %s" % ' '.join(sys.argv))

    # inp爲輸入語料, outp1 爲輸出模型, outp2爲原始c版本word2vec的vector格式的模型
    fdir = 'D:/file_download/BaiduNetdiskDownload/PyCharm_File/wiki_zh_word2vec-master/'
    inp = fdir + 'wiki.zh.simp.seg.txt'
    outp1 = fdir + 'wiki.zh.text.model'
    outp2 = fdir + 'wiki.zh.text.vector'

    # 訓練skip-gram模型 sg=1
    model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5,
                     workers=multiprocessing.cpu_count())

    # 保存模型
    model.save(outp1)
    model.wv.save_word2vec_format(outp2, binary=False)

過程:


結果:(英文數據建模時間較長)

     

六、模型測試

#!/usr/bin/env python
# -*- coding: utf-8  -*-
# 測試訓練好的模型

import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')# 忽略警告
import sys
# reload(sys)
# sys.setdefaultencoding('utf-8')
import gensim


if __name__ == '__main__':
    fdir = 'D:/file_download/BaiduNetdiskDownload/PyCharm_File/wiki_zh_word2vec-master/'
    model = gensim.models.Word2Vec.load(fdir + 'wiki.zh.text.model')

    word = model.most_similar(u"籃球")
    for t in word:
        print(t[0], t[1])


參考:

【1】https://github.com/AimeeLee77/wiki_zh_word2vec

【2】

http://www.52nlp.cn/%E4%B8%AD%E8%8B%B1%E6%96%87%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91%E8%AF%AD%E6%96%99%E4%B8%8A%E7%9A%84word2vec%E5%AE%9E%E9%AA%8C

發佈了32 篇原創文章 · 獲贊 25 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章