资讯专栏INFORMATION COLUMN

基于gensim的Wiki百科中文word2vec训练

stdying / 3311人阅读

摘要:而腾讯和宝马保时捷,网易和宝马保时捷将会离得较远一些。关于的使用方法,可以参考基于的实践。下面我们分别查看同宝马和腾讯最相近的前个词语。可以发现和宝马相近的词大都属于汽车行业,而且是汽车品牌和腾讯相近的词大都属于互联网行业。

Word2Vec简介

Word2Vec是词(Word)的一种表示方式。不同于one-hot vector,word2vec可以通过计算各个词之间的距离,来表示词与词之间的相似度。word2vec提取了更多的特征,它使得具有相同上下文语义的词尽可能离得近一些,而不太相关的词尽可能离得较远一些。例如,【腾讯】和【网易】两个词向量将会离得很近,同理【宝马】和【保时捷】两个词向量将会离得很近。而【腾讯】和【宝马】/【保时捷】,【网易】和【宝马】/【保时捷】将会离得较远一些。因为【腾讯】和【网易】都同属于互联网类目,而【宝马】和【保时捷】都同属于汽车类目。人以类聚,物以群分嘛!互联网圈子中谈的毕竟都是互联网相关的话题,而汽车圈子中谈论的都是和汽车相关的话题。

我们怎么得到一个词的word2vec呢?下面我们将介绍如何使用python gensim得到我们想要的词向量。总的来说,包括以下几个步骤:

wiki中文数据预处理

文本数据分词

gensim word2vec训练

wiki中文数据预处理

首先,下载wiki中文数据:zhwiki-latest-pages-articles.xml.bz2。因为zhwiki数据中包含很多繁体字,所以我们想获得简体语料库,接下来需要做以下两件事:

使用gensim模块中的WikiCorpus从bz2中获取原始文本数据

使用OpenCC将繁体字转换为简体字

WikiCorpus获取原始文本数据

数据处理的python代码如下:

</>复制代码

  1. from __future__ import print_function
  2. from gensim.corpora import WikiCorpus
  3. import jieba
  4. import codecs
  5. import os
  6. import six
  7. from gensim.models import Word2Vec
  8. from gensim.models.word2vec import LineSentence
  9. import multiprocessing
  10. class Config:
  11. data_path = "xxx/zhwiki"
  12. zhwiki_bz2 = "zhwiki-latest-pages-articles.xml.bz2"
  13. zhwiki_raw = "zhwiki_raw.txt"
  14. zhwiki_raw_t2s = "zhwiki_raw_t2s.txt"
  15. zhwiki_seg_t2s = "zhwiki_seg.txt"
  16. embedded_model_t2s = "embedding_model_t2s/zhwiki_embedding_t2s.model"
  17. embedded_vector_t2s = "embedding_model_t2s/vector_t2s"
  18. def dataprocess(_config):
  19. i = 0
  20. if six.PY3:
  21. output = open(os.path.join(_config.data_path, _config.zhwiki_raw), "w")
  22. output = codecs.open(os.path.join(_config.data_path, _config.zhwiki_raw), "w")
  23. wiki = WikiCorpus(os.path.join(_config.data_path, _config.zhwiki_bz2), lemmatize=False, dictionary={})
  24. for text in wiki.get_texts():
  25. if six.PY3:
  26. output.write(b" ".join(text).decode("utf-8", "ignore") + "
  27. ")
  28. else:
  29. output.write(" ".join(text) + "
  30. ")
  31. i += 1
  32. if i % 10000 == 0:
  33. print("Saved " + str(i) + " articles")
  34. output.close()
  35. print("Finished Saved " + str(i) + " articles")
  36. config = Config()
  37. dataprocess(config)
使用OpenCC将繁体字转换为简体字

这里,需要预先安装OpenCC,关于OpenCC在linux环境中的安装方法,请参考这篇文章。仅仅需要两行linux命令就可以完成繁体字转换为简体字的任务,而且速度很快。

</>复制代码

  1. $ cd /xxx/zhwiki/
  2. $ opencc -i zhwiki_raw.txt -o zhwiki_t2s.txt -c t2s.json
文本数据分词

对于分词这个任务,我们直接使用了python的jieba分词模块。你也可以使用哈工大的ltp或者斯坦福的nltk python接口进行分词,准确率及权威度挺高的。不过这两个安装的时候会花费很长时间,尤其是斯坦福的。关于jieba的分词处理代码,参考如下:

</>复制代码

  1. def is_alpha(tok):
  2. try:
  3. return tok.encode("ascii").isalpha()
  4. except UnicodeEncodeError:
  5. return False
  6. def zhwiki_segment(_config, remove_alpha=True):
  7. i = 0
  8. if six.PY3:
  9. output = open(os.path.join(_config.data_path, _config.zhwiki_seg_t2s), "w", encoding="utf-8")
  10. output = codecs.open(os.path.join(_config.data_path, _config.zhwiki_seg_t2s), "w", encoding="utf-8")
  11. print("Start...")
  12. with codecs.open(os.path.join(_config.data_path, _config.zhwiki_raw_t2s), "r", encoding="utf-8") as raw_input:
  13. for line in raw_input.readlines():
  14. line = line.strip()
  15. i += 1
  16. print("line " + str(i))
  17. text = line.split()
  18. if True:
  19. text = [w for w in text if not is_alpha(w)]
  20. word_cut_seed = [jieba.cut(t) for t in text]
  21. tmp = ""
  22. for sent in word_cut_seed:
  23. for tok in sent:
  24. tmp += tok + " "
  25. tmp = tmp.strip()
  26. if tmp:
  27. output.write(tmp + "
  28. ")
  29. output.close()
  30. zhwiki_segment(config)
gensim word2vec训练

python的gensim模块提供了word2vec训练,为我们模型的训练提供了很大的方便。关于gensim的使用方法,可以参考基于Gensim的Word2Vec实践。
本次训练的词向量大小size为50,训练窗口为5,最小词频为5,并使用了多线程,具体代码如下:

</>复制代码

  1. def word2vec(_config, saved=False):
  2. print("Start...")
  3. model = Word2Vec(LineSentence(os.path.join(_config.data_path, _config.zhwiki_seg_t2s)),
  4. size=50, window=5, min_count=5, workers=multiprocessing.cpu_count())
  5. if saved:
  6. model.save(os.path.join(_config.data_path, _config.embedded_model_t2s))
  7. model.save_word2vec_format(os.path.join(_config.data_path, _config.embedded_vector_t2s), binary=False)
  8. print("Finished!")
  9. return model
  10. def wordsimilarity(word, model):
  11. semi = ""
  12. try:
  13. semi = model.most_similar(word, topn=10)
  14. except KeyError:
  15. print("The word not in vocabulary!")
  16. for term in semi:
  17. print("%s,%s" % (term[0],term[1]))
  18. model = word2vec(config, saved=True)

word2vec训练已经完成,我们得到了想要的模型以及词向量,并保存到本地。下面我们分别查看同【宝马】和【腾讯】最相近的前10个词语。可以发现:和【宝马】相近的词大都属于汽车行业,而且是汽车品牌;和【腾讯】相近的词大都属于互联网行业。

</>复制代码

  1. >>> wordsimilarity(word=u"宝马", model=model)
  2. 保时捷,0.92567974329
  3. 固特异,0.888278841972
  4. 劳斯莱斯,0.884045600891
  5. 奥迪,0.881808757782
  6. 马自达,0.881799697876
  7. 亚菲特,0.880708634853
  8. 欧宝,0.877104878426
  9. 雪铁龙,0.876984715462
  10. 玛莎拉蒂,0.868475496769
  11. 桑塔纳,0.865387916565
  12. >>> wordsimilarity(word=u"腾讯", model=model)
  13. 网易,0.880213916302
  14. 优酷,0.873666107655
  15. 腾讯网,0.87026232481
  16. 广州日报,0.859486758709
  17. 微信,0.835543811321
  18. 天涯社区,0.834927380085
  19. 李彦宏,0.832848489285
  20. 土豆网,0.831390202045
  21. 团购,0.829696238041
  22. 搜狐网,0.825544642448

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38691.html

相关文章

  • word2vec

    Word2Vec是一种流行的自然语言处理技术,它可以将单词转换为向量,使得计算机能够更好地理解和处理语言。在本文中,我们将讨论如何使用Python编写Word2Vec模型。 首先,我们需要安装Gensim库,它是一个Python库,用于实现Word2Vec模型。您可以使用以下命令在终端中安装Gensim: pip install gensim 接下来,我们需要准备我们的语料库。语料库是我...

    Leck1e 评论0 收藏1162
  • 中文维基百科文本数据获取与预处理

    摘要:下载数据方法使用官方的数据最新打包的中文文档下载地址是。中文维基数据繁简混杂大家都说存在这个问题,但的网站是将繁体中文和简体中文分开处理的,所以一直觉得从数据库到结构都应有方法将两者区分开,暂罢,待有空研究其数据时再议。 照例,先讲下环境,Mac OSX 10.11.2 ,Python 3.4.3。 下载数据 方法1:使用官方dump的xml数据 最新打包的中文文档下载地址是:http...

    loostudy 评论0 收藏0
  • 自然语言处理真实项目实战

    摘要:在自然语言处理中,一个很重要的技术手段就是将文档转换为一个矢量,这个过程一般是使用这个库进行处理的。自然语言处理中,一般来说,代表词。自然语言预处理中,一个很重要的步骤就是将你收集的句子进行分词,将一个句子分解成词的列表。 前言 本文根据实际项目撰写,由于项目保密要求,源代码将进行一定程度的删减。本文撰写的目的是进行公司培训,请勿以任何形式进行转载。由于是日语项目,用到的分词软件等,在...

    王岩威 评论0 收藏0

发表评论

0条评论

stdying

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<