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


    环境: win7+python3.5

    1. 下载wiki中文分词语料   使用迅雷下载会快不少,大小为1个多G

    2. 安装opencc用于中文的简繁替换
       安装exe的版本
    opencc-1.0.1-win64.7z

    并解压放置到自定义的目录下


       也可安装 python版本的:
        pip install opencc-python
        安装时会报错:
      报错一: ImportError: No module named distribute_setup
       解决方法,到 http://www.minitw.com/download/distribute_setup.zip 下载ZIP,解压后将.py文件放置到 电脑的分盘:你安裝Python的目录Lib(例如:C:Python35Lib)
       报错二: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) + " ")这一句出现提示关于byte或str的错误,所以需要有如下修改:
    1. space = b' '#原来是space = ' '
    2. ...
    3. for text in wiki.get_texts():
      s=space.join(text)
      s=s.decode('utf8') + " "
      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')+" "
    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. 测试训练好的模型
    结果如下:
    但是呀,这个语句改成这样:
    得到的结果却是: 难道这个模型宫斗剧看多了,发现皇上和太后是一家人,低阶的后宫女人是一团,只有皇后是个另类?
    剩下的,各位自己去调戏吧,应该乐趣不少~
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
        
     





  • 相关阅读:
    SpringBoot配置文件加载位置及顺序
    linux之开通FTP服务(喂饭级)
    linux之chmod授权
    mysql动态查询上周的数据
    hibernate解读之session--基于最新稳定版5.2.12
    阿里java开发手册中命名规约解读之DO/BO/DTO/VO/AO
    JSP最常用的五种内置对象(out,request,response,session,application)
    JSP执行过程分析
    web.xml解析
    MVC脚手架(一)之javabean+jsp+servlet+jdbc
  • 原文地址:https://www.cnblogs.com/combfish/p/6413553.html
Copyright © 2020-2023  润新知