詞向量之word2vec實踐


 

首先感謝無私分享的各位大神,文中很多內容多有借鑒之處。本次將自己的實驗過程記錄,希望能幫助有需要的同學。

一、從下載數據開始

    現在的中文語料庫不是特別豐富,我在之前的文章中略有整理,有興趣的可以看看。本次實驗使用wiki公開數據,下載地址如下:

        wiki英文數據下載:https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles.xml.bz2

        wiki中文數據下載:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2

二、英文數據處理

    1.抽取文本        wiki數據內容比較復雜,所以在處理之前需要做一些預處理。通過 process_wiki.py 將wiki數據中的每一篇文章轉為1行文本。

     執行下行命令:

'''
process_wiki.py    處理程序
enwiki-latest-pages-articles.xml.bz2    英文wiki數據
wiki.en.text    輸出的文本文件
'''
python process_wiki.py enwiki-latest-pages-articles.xml.bz2 wiki.en.text

process_wiki.py

 1 #--*-- coding:utf-8 --*--
 2 
 3 from __future__ import print_function
 4 
 5 import logging
 6 import os.path
 7 import six
 8 import sys
 9 
10 from gensim.corpora import WikiCorpus
11 #import WikiCorpus
12 
13 if __name__ == '__main__':
14     program = os.path.basename(sys.argv[0])
15     logger = logging.getLogger(program)
16 
17     logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
18     logging.root.setLevel(level=logging.INFO)
19     logger.info("running %s" % ' '.join(sys.argv))
20 
21     # check and process input arguments
22     if len(sys.argv) != 3:
23         print("Using: python process_wiki.py enwiki.xxx.xml.bz2 wiki.en.text")
24         sys.exit(1)
25     inp, outp = sys.argv[1:3]
26     space = " "
27     i = 0
28 
29     output = open(outp, 'w')
30     wiki = WikiCorpus(inp, lemmatize=False, dictionary={})
31     for text in wiki.get_texts():
32         if six.PY3:
33             output.write(bytes(' '.join(text), 'utf-8').decode('utf-8') + '\n')
34         #   ###another method###
35         #    output.write(
36         #            space.join(map(lambda x:x.decode("utf-8"), text)) + '\n')
37         else:
38             output.write(space.join(text) + "\n")
39         i = i + 1
40         if (i % 10000 == 0):
41             logger.info("Saved " + str(i) + " articles")
42 
43     output.close()
44 logger.info("Finished Saved " + str(i) + " articles")
View Code

    2.訓練詞向量

    訓練word2vec的開源代碼非常多,使用的語言種類也很豐富,本實驗使用gensim包訓練詞向量,其特點使用簡便,訓練速度快。

    執行下行命令:

'''
train_word2vec_model.py    訓練程序
wiki.en.text    wiki文本數據
wiki.en.text.model    訓練模型參數
wiki.en.text.vector    輸出的詞向量文件
'''
python train_word2vec_model.py wiki.en.text wiki.en.text.model wiki.en.text.vector

train_word2vec_model.py

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 
 4 from __future__ import print_function
 5 
 6 import logging
 7 import os
 8 import sys
 9 import multiprocessing
10 
11 from gensim.models import Word2Vec
12 from gensim.models.word2vec import LineSentence
13 
14 if __name__ == '__main__':
15     program = os.path.basename(sys.argv[0])
16     logger = logging.getLogger(program)
17 
18     logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
19     logging.root.setLevel(level=logging.INFO)
20     logger.info("running %s" % ' '.join(sys.argv))
21 
22     # check and process input arguments
23     if len(sys.argv) < 4:
24         print("Useing: python train_word2vec_model.py input_text "
25               "output_gensim_model output_word_vector")
26         sys.exit(1)
27     inp, outp1, outp2 = sys.argv[1:4]
28 
29     model = Word2Vec(LineSentence(inp), size=128, window=5, min_count=5,
30                      workers=multiprocessing.cpu_count())
31 
32     model.save(outp1)
33     model.wv.save_word2vec_format(outp2, binary=False)
View Code

    3.測試詞向量

import gensim    #導入包
model = gensim.models.KeyedVectors.load_word2vec_format("wiki.en.text.vector", binary=False)
model.most_similar('queen')    #測試相關詞
model.similarity("woman", "man")    #測試次間距

三、中文數據處理

    1.抽取文本

    同英文處理類似,執行如下命令:

python process_wiki.py zhwiki-latest-pages-articles.xml.bz2 wiki.zh.text

    2.繁體字轉簡體字         

    wiki中文數據中存在很多繁體中文,因此首先需要將繁體字轉為簡體中文。

    本文使用開源工具 opencc,首先安裝:

     (1) linux安裝及執行

 yum install opencc-tools     #安裝

#執行命令
'''
wiki.zh.text    輸入的為轉化文本
wiki.zh.text.jian    輸出的簡體中文文本
-c    hk2s.json
       s2hk.json
       zhs2zht.json
       s2tw.json
       s2twp.json
       zht2zhs.json
       tw2s.json
       tw2sp.json
'''
opencc -i wiki.zh.text -o wiki.zh.text.jian -c zht2zhs.json

     (2)python安裝及執行

pip install OpenCC      #安裝
#執行
import opencc
opencc.convert(string, config='t2s.json')

    3.分詞       

    本文使用結巴分詞,使用方法比較簡單,在這里不加贅述。

    4.編碼處理

    將文本全部轉為UTF-8編碼

iconv -c -t UTF-8 < wiki.zh.text.jian.seg > wiki.zh.text.jian.seg.utf-8

    5.訓練詞向量      

    執行下行命令(訓練代碼同英文訓練):

'''
train_word2vec_model.py    訓練程序
wiki.zh.text    wiki文本數據
wiki.zh.text.model    訓練模型參數
wiki.zh.text.vector    詞向量文件
'''
python train_word2vec_model.py wiki.zh.text wiki.zh.text.model wiki.zh.text.vector

    6.測試詞向量(同英文詞向量測試)

import gensim
model = gensim.models.KeyedVectors.load_word2vec_format("wiki.zh.text.vector", binary=False)
model.most_similar('女人')
model.similarity("女人", "男人")

四、其他

    除了使用上文中的process_wiki.py,還可以使用 Wikipedia Extractor,命令如下:

'''
參數 -b 1000M 表示以 1000M 為單位切分文件,
默認是 500K。由於最后生成的正文文本不到 600M,
把參數設置的大一些可以保證最后的抽取結果全部存在
一個文件里
'''
bzcat zhwiki-latest-pages-articles.xml.bz2 | python WikiExtractor.py -b 1000M -o extracted >output.txt

 **********************************

*         吃飽了踏實,努力了充實          *

 **********************************

   

   

 

   

 

 

 

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM