wiki中文語料+word2vec (python3.5 windows win7)

環境: win7+python3.5

1. 下載wiki中文分詞語料   使用迅雷下載會快很多,大小爲1個多Gnode

2. 安裝opencc用於中文的簡繁替換
    安裝exe的版本
opencc-1.0.1-win64.7z

並解壓放置到自定義的目錄下python


   也可安裝 python版本的:
    pip install opencc-python
    安裝時會報錯:
  報錯一:  ImportError: No module named distribute_setup
   解決方法,到  http://www.minitw.com/download/distribute_setup.zip 下載ZIP,解壓後將.py文件放置到 電腦的分盤:\你安裝Python的目錄\Lib(例如:C:\Python35\Lib)
   報錯二:chown() missing 1 required positional argument: 'numeric_owner'
   到distribute_setup.py中,找到self.chown(tarinfo, dirpath),改成 chown(tarinfo, dirpath, ''); 
  報錯三: import opencc時,報錯 no module named 'version'
  將opencc的__init__.py 中的 from version import __version__改成 from .version import __version__
  
3. 將wiki的資料轉爲文本txt
    python  process_wiki.py zhwiki-latest-pages-articles.xml.bz2 wiki.zh.text
    解壓後獲得925M的文件,因爲wiki中的東西是會按期更新的,因此不一樣時間下載獲得的大小不同
   
     process_wiki.py 源碼以下:
    注: 網上的版本大可能是針對python2的,使用python3進行解壓會在 output.write(space.join(text) + "\n")這一句 出現提示關於byte或str的錯誤,因此須要有以下修改:
  1. space = b' '#原來是space = ' '
  2. ...
  3. for text in wiki.get_texts():
    s=space.join(text)
    s=s.decode('utf8') + "\n"
    output.write(s)
     
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # 修改後的代碼以下:
  4. import logging
  5. import os.path
  6. import sys
  7. from gensim.corpora importWikiCorpus
  8. if __name__ =='__main__':
  9. program = os.path.basename(sys.argv[0])
  10. logger = logging.getLogger(program)
  11. logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
  12. logging.root.setLevel(level=logging.INFO)
  13. logger.info("running %s"%' '.join(sys.argv))
  14. # check and process input arguments
  15. if len(sys.argv)<3:
  16. print(globals()['__doc__']% locals())
  17. sys.exit(1)
  18. inp, outp = sys.argv[1:3]
  19. space = b' '
  20. i =0
  21. output = open(outp,'w',encoding='utf-8')
  22. wiki =WikiCorpus(inp, lemmatize=False, dictionary={})
  23. for text in wiki.get_texts():
  24. s=space.join(text)
  25. s=s.decode('utf8')+"\n"
  26. output.write(s)
  27. i = i +1
  28. if(i %10000==0):
  29. logger.info("Saved "+ str(i)+" articles")
  30. output.close()
  31. logger.info("Finished Saved "+ str(i)+" articles")
 
 4. 繁簡轉化
進入解壓後的opencc的目錄,打開dos窗口,輸入
opencc -i wiki.zh.text -o wiki.zh.jian.text -c t2s.json
則會獲得 wiki.zh.jian.text,裏面是簡體的中文
 
此時,你們會比較好奇,裏邊裝着的究竟是什麼東西~
因爲解壓後的txt有900多M大,用txt打開比較困難,因此咱們採用python自帶的IO進行讀取
  1. import codecs,sys
  2. import opencc
  3. f=codecs.open('zh.wiki.txt','r',encoding="utf8")
  4. line=f.readline()
  5. print(line)
打印的結果以下,能夠看出文檔中包含多幹行文字,每一行文字爲一篇文章,每個空格表示此處原爲一個標點符號
 簡體的打印結果 以下:

5. 分詞
 由第四步獲得語料僅由標點隔開,還需將其分割成詞
 此處使用結巴分詞 pip install jieba 便可安裝
 結巴的具體介紹見: https://github.com/fxsjy/jieba  
 因爲編碼的緣由,此處使用了codecs
 
  1. import jieba
  2. import jieba.analyse
  3. import jieba.posseg as pseg
  4. import codecs,sys
  5. def cut_words(sentence):
  6. #print sentence
  7. return" ".join(jieba.cut(sentence)).encode('utf-8')
  8. f=codecs.open('zh.jian.wiki.txt','r',encoding="utf8")
  9. target = codecs.open("zh.jian.wiki.seg.txt",'w',encoding="utf8")
  10. print('open files')
  11. line_num=1
  12. line = f.readline()
  13. while line:
  14. print('---- processing ', line_num,' article----------------')
  15. line_seg =" ".join(jieba.cut(line))
  16. target.writelines(line_seg)
  17. line_num = line_num +1
  18. line = f.readline()
  19. f.close()
  20. target.close()
  21. exit()
  22. while line:
  23. curr =[]
  24. for oneline in line:
  25. #print(oneline)
  26. curr.append(oneline)
  27. after_cut = map(cut_words, curr)
  28. target.writelines(after_cut)
  29. print('saved ',line_num,' articles')
  30. exit()
  31. line = f.readline1()
  32. f.close()
  33. target.close()
分詞後的文檔長這個樣子:
6. 訓練word2vec模型
  1. python train_word2vec_model.py zh.jian.wiki.seg.txt wiki.zh.text.model wiki.zh.text.vector
train_word2vec_model . py源碼以下:
  1. import logging
  2. import os.path
  3. import sys
  4. import multiprocessing
  5. from gensim.corpora importWikiCorpus
  6. from gensim.models importWord2Vec
  7. from gensim.models.word2vec importLineSentence
  8. if __name__ =='__main__':
  9. program = os.path.basename(sys.argv[0])
  10. logger = logging.getLogger(program)
  11. logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
  12. logging.root.setLevel(level=logging.INFO)
  13. logger.info("running %s"%' '.join(sys.argv))
  14. # check and process input arguments
  15. if len(sys.argv)<4:
  16. print(globals()['__doc__']% locals())
  17. sys.exit(1)
  18. inp, outp1, outp2 = sys.argv[1:4]
  19. model =Word2Vec(LineSentence(inp), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count())
  20. model.save(outp1)
  21. model.save_word2vec_format(outp2, binary=False)
訓練時長,看我的的機子配置,我訓了一天。。。(吐槽一下換不了的破機子)
最終獲得
 
7. 測試訓練好的模型
結果以下:
可是呀,這個語句改爲這樣:
獲得的結果倒是:  難道這個模型宮鬥劇看多了,發現皇上和太后是一家人,低階的後宮女人是一團,只有皇后是個另類?
剩下的,各位本身去調戲吧,應該樂趣很多~
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
    
 



相關文章
相關標籤/搜索