境: 

Win10 +Anaconda(自带Python3.6) 

IDE: 

Pycharm (其Interperter使用的是Anaconda自带的Python3.6)

 

安装Gensim库:

在Anaconda Prompt中输入:

pip install gensim 

等待其显示安装完毕即可

 

1.首先获取维基百科语料库资源

https://dumps.wikimedia.org/zhwiki/20171220/

我是在其中下载的当时最新的压缩文件

注:文件名在网站中的结尾为xml.bz2

 

2.将wiki的xml文件处理成正常的txt文件

需要用特殊的脚本处理而不能直接压缩(与维基百科保存格式有关)

github中有更为全面的WikiExtractor

有兴趣可以去研究一下

此处直接使用普通压缩文件to txt处理脚本即可

代码如下:

 
  1. import logging

  2. import os.path

  3. import sys

  4. from gensim.corpora import WikiCorpus

  5. if __name__ == '__main__':

  6.  
  7. program = os.path.basename(sys.argv[0])

  8. logger = logging.getLogger(program)

  9. logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')

  10. logging.root.setLevel(level=logging.INFO)

  11. logger.info("running %s" % ' '.join(sys.argv))

  12. # check and process input arguments

  13. if len(sys.argv) < 3:

  14. print(globals()['__doc__'] % locals())

  15. sys.exit(1)

  16. inp, outp = sys.argv[1:3]

  17. space = b' '

  18. i = 0

  19. output = open(outp, 'w',encoding='utf-8')

  20. wiki = WikiCorpus(inp, lemmatize=False, dictionary={})

  21. for text in wiki.get_texts():

  22. s = space.join(text)

  23. s = s.decode('utf8') + "\n"

  24. output.write(s)

  25. i = i + 1

  26. if (i % 10000 == 0):

  27. logger.info("Saved " + str(i) + " articles")

  28. output.close()

  29. logger.info("Finished Saved " + str(i) + " articles")

使用process.py脚本(即以上代码) 将维基百科的下载文件转化成text文件

在命令行中输入

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

 

基于Gensim的维基百科语料库中文词向量训练

 

就可以看到正在解压的过程了,过程还是需要不少时间的

部分生成结果:

基于Gensim的维基百科语料库中文词向量训练

需要注意

文件可能过大而无法打开

 

3.使用opencc将繁体txt转换为简体txt

下载地址:

https://bintray.com/package/files/byvoid/opencc/OpenCC

无需安装,解压即可使用

将我们前面生成的wiki.zh.text拖动至opencc-1.0.1-win64文件夹中,打开cmd并在当前文件夹中输入如下指令:

opencc -i wiki.zh.text -o wiki.zh.jian.text -c t2s.json

这一步骤非常快,我只用了1分钟不到

然后可以看到目录中生成了wiki.zh.jian.text文件

打开后可以查看其中内容

基于Gensim的维基百科语料库中文词向量训练

 

可以看到已经成功全部转化为了简体字

但是做词向量训练之前仍缺少最后一步,就是分词

 

4.分词

英文中空格就已经将其句子分词完毕

而中文就相对复杂,但我们可以借助jieba库来分词

在Testjieba.py中分词

打开wiki.zh.jian.text,从该文件中一行行读取简体字并进行分词,分词结果放在zh.jian.wiki.seg.txt中

代码如下:

 

 
  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.  
  9.  
  10. f = codecs.open('wiki.zh.jian.text', 'r', encoding="utf8")

  11. target = codecs.open("zh.jian.wiki.seg.txt", 'w', encoding="utf8")

  12. print('open files')

  13. line_num = 1

  14. line = f.readline()

  15. while line:

  16. print('---- processing ', line_num, ' article----------------')

  17. line_seg = " ".join(jieba.cut(line))

  18. target.writelines(line_seg)

  19. line_num = line_num + 1

  20. line = f.readline()

  21. f.close()

  22. target.close()

  23. exit()

  24. while line:

  25. curr = []

  26. for oneline in line:

  27. #print(oneline)

  28. curr.append(oneline)

  29. after_cut = map(cut_words, curr)

  30. target.writelines(after_cut)

  31. print('saved', line_num, 'articles')

  32. exit()

  33. line = f.readline1()

  34. f.close()

  35. target.close()

 

每一行读入后进行每一行的分词

直接运行该py文件即可(注意将 在opencc文件夹中生成的wiki.zh.jian.text放入Testjieba.py所在文件夹)

查看分词结果如下:

基于Gensim的维基百科语料库中文词向量训练

 

5.进行词向量训练

创建词向量结果模型代码如下:

 

 
  1. from __future__ import print_function

  2.  
  3. import logging

  4. import os

  5. import sys

  6. import multiprocessing

  7.  
  8. from gensim.models import Word2Vec

  9. from gensim.models.word2vec import LineSentence

  10.  
  11. if __name__ == '__main__':

  12. program = os.path.basename(sys.argv[0])

  13. logger = logging.getLogger(program)

  14.  
  15. logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')

  16. logging.root.setLevel(level=logging.INFO)

  17. logger.info("running %s" % ' '.join(sys.argv))

  18.  
  19. # check and process input arguments

  20. if len(sys.argv) < 4:

  21. print("Useing: python train_word2vec_model.py input_text "

  22. "output_gensim_model output_word_vector")

  23. sys.exit(1)

  24. inp, outp1, outp2 = sys.argv[1:4]

  25.  
  26. model = Word2Vec(LineSentence(inp), size=200, window=5, min_count=5,

  27. workers=multiprocessing.cpu_count())

  28.  
  29. model.save(outp1)

  30. model.wv.save_word2vec_format(outp2, binary=False)

其中

model = Word2Vec(LineSentence(inp), size=200, window=5, min_count=5,

    workers=multiprocessing.cpu_count())

代码是训练词向量的关键,定义了滑动窗口大小与最小有效词数量

并在下方保存word2vec格式的模型

 

在命令行中输入

python word2vec_model.py zh.jian.wiki.seg.txt wiki.zh.model wiki.zh.text.vector

源文件为zh.jian.wiki.seg.txt

目标文件为wiki.zh.model

基于Gensim的维基百科语料库中文词向量训练

训练时间大致为25分钟(1080Ti训练结果下)

 

6.测试训练模块成果

代码如下

 

 
  1. from gensim.models import Word2Vec

  2.  
  3. en_wiki_word2vec_model = Word2Vec.load('wiki.zh.model')

  4.  
  5. testwords = ['孩子', '数学', '学术', '白痴', '篮球']

  6. for i in range(5):

  7. res = en_wiki_word2vec_model.most_similar(testwords[i])

  8. print(testwords[i])

  9. print(res)

首先导入gensim.models中的Word2Vec模块

然后使用Word2Vec模块中方法加载模块,之后便可以使用其中的most_similar方法进行词向量寻找并打印结果

测试结果展示:

基于Gensim的维基百科语料库中文词向量训练

 

总结:

可以看到还是大部分make sense的

但是也有一些词不太相近或者更相近的答案而并非首选。

很大一部分原因是因为语料库的不足,因为语料库中资料仅有1.3G,对于中文训练来说是大大不足的。

相关文章:

  • 2021-08-20
  • 2022-12-23
  • 2021-07-27
  • 2021-05-31
  • 2021-11-25
  • 2021-08-31
猜你喜欢
  • 2021-12-14
  • 2021-05-13
  • 2022-02-14
  • 2021-11-16
  • 2021-09-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案