首先感謝無私分享的各位大神,文中很多內容多有借鑒之處。本次將自己的實驗過程記錄,希望能幫助有需要的同學。
一、從下載數據開始
現在的中文語料庫不是特別豐富,我在之前的文章中略有整理,有興趣的可以看看。本次實驗使用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")
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)
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
**********************************
* 吃飽了踏實,努力了充實 *
**********************************
