使用中文维基百科训练word2vec模型

一、下载原始数据

数据下载地址:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2
,或者在这里找 https://dumps.wikimedia.org/zhwiki/ 。这个文件只包含了标题和正文,不包含词条之间的链接信息,大小约为1.3G,解压后的xml文件为7.18G。

二、抽取正文

WikiExtractor:是意大利人用Python写的一个维基百科抽取器,使用非常方便。用于从原始的xml文件中提取出标题和正文。地址https://github.com/attardi/wikiextractor/blob/master/WikiExtractor.py。因为这个文件不依赖其他文件和库,就直接在本地新建一个脚本,再把WikiExtractor.py中的源码复制过来就行了。

python WikiExtractor.py -b 500M -o zhwiki zhwiki-20180720-pages-articles.xml.bz2

参数-b 500M表示以500M为单位切分文件,默认是1M。

这里,我们得到了3个文本文件:wiki_00, wiki_01,wiki_02。大小分别为:499M,499M, 270M。

三、繁简转换

维基百科的中文数据是繁简混杂的,里面包含大陆简体、台湾繁体、港澳繁体等多种不同的数据。有时候在一篇文章的不同段落间也会使用不同的繁简字。

为了处理方便起见,我们直接使用了开源项目繁体简体转换工具opencc。Linux下可以直接wget后在终端中使用,windows版本只能手动下载了,地址https://bintray.com/package/files/byvoid/opencc/OpenCC。下完直接解压就可以了。
我的环境是64位Windows,下载了opencc-1.0.4-win32.7z 版本,解压后将bin路径加入环境变量。
然后将需要转换的三个文件加入到bin目录中,在bin目录下打开cmd,运行

.\opencc -i wiki_00 -o zh_wiki_00 -c C:\Users\ASUS\Desktop\opencc-1.0.4\share
\opencc\t2s.json
.\opencc -i wiki_01 -o zh_wiki_01 -c C:\Users\ASUS\Desktop\opencc-1.0.4\share
\opencc\t2s.json
.\opencc -i wiki_02 -o zh_wiki_02 -c C:\Users\ASUS\Desktop\opencc-1.0.4\share
\opencc\t2s.json

然后再把转换后的简体文件拷回去。。。

四、符号处理

由于Wikipedia Extractor抽取正文时,会将有特殊标记的外文直接剔除。我们需要将「」『』这些符号替换成引号,顺便删除空括号。代码如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
import sys
import codecs
def myfun(input_file):
    p1 = re.compile(ur'-\{.*?(zh-hans|zh-cn):([^;]*?)(;.*?)?\}-')
    p2 = re.compile(ur'[(\(][,;。?!\s]*[)\)]')
    p3 = re.compile(ur'[「『]')
    p4 = re.compile(ur'[」』]')
    outfile = codecs.open('std_zh_wiki', 'a+', 'utf-8')
    with codecs.open(input_file, 'r', 'utf-8') as myfile:
        for line in myfile:
            line = p1.sub(ur'\2', line)
            line = p2.sub(ur'', line)
            line = p3.sub(ur'“', line)
            line = p4.sub(ur'”', line)
            outfile.write(line)
    outfile.close()
if __name__ == '__main__':
    if len(sys.argv) != 2:
        print "Usage: python script.py inputfile"
        sys.exit()
    reload(sys)
    sys.setdefaultencoding('utf-8')
    input_file = sys.argv[1]
    myfun(input_file)

注意

这是将三个文件处理后追加到一个文件里,因此使用a+,需要运行三遍。

 python .\exec_sum.py zh_wiki_00
 python .\exec_sum.py zh_wiki_01
 python .\exec_sum.py zh_wiki_02

得到格式化文件:std_zh_wiki,1.25G。

五、中文分词

中文分词工具有很多种, 这里我们使用python版本的结巴分词:https://github.com/fxsjy/jieba

安装很简单:$ pip install jieba

安装好后执行命令进行分词:

python -m jieba -d " " ./std_zh_wiki > ./cut_std_zh_wiki

命令中的-d ” “选项,双引号中是一个空格,指的是以空格分割词汇。
这里,我们又得到1个分词文件:cut_std_zh_wiki。大小为:1.58G。比之前的文件要大,因为文件中加入了很多空格符。

注意

  • 这里如果用python3会报编码错误,python2不会。
  • 分词分得非常慢,如果分成三个文件会快很多,但是我不知道怎样在训练w2v的时候加载三个语料库。

六、训练word2vec模型

训练模型我们使用python的gensim库提供的方法,gensim官网。

安装非常简单:$ pip install gensim

接下来,我们用cut_std_zh_wiki进行训练,训练代码也很简单:

from gensim.models import word2vec
import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.LineSentence(u'./cut_std_zh_wiki_00')
model = word2vec.Word2Vec(sentences,size=200,window=5,min_count=5,workers=4)
model.save('./word2vecModel/WikiCHModel')

训练的过程进度会打印在控制台。训练结束后我们就得到了一个word2vec模型。
注意
如果用python3这里会报编码错误UnicodeDecodeError: 'utf-8' codec can't decode byte 0xad in position 6
解决办法为用notepad++打开文件,在“编码”中选择“转为utf-8编码”。(如果用记事本打不开,文件太大会导致未响应)

七、调用并测试word2vec模型

调用模型也很简单,同样使用gensim库。

from gensim.models import word2vec

model = word2vec.Word2Vec.load('./word2vecModel/WikiCHModel')

print(model.wv.similarity('奥运会','金牌')) #两个词的相关性

print(model.wv.most_similar(['伦敦','中国'],['北京'])) # 北京is to中国 as 伦敦is to?

参考网址:
windows使用opencc中文简体和繁体互转
使用中文维基百科语料库训练一个word2vec模型
word2vec实战:获取和预处理中文维基百科(Wikipedia)语料库,并训练成word2vec模型

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
训练一个语料库,我们需要首先准备好语料库数据。在这里,我们将使用中文维基百科作为我们的语料库。以下是训练word2vec模型的步骤: 1. 下载维基百科语料中文维基百科提供了一个XML格式的数据库备份,可以从这里下载:https://dumps.wikimedia.org/zhwiki/latest/。请注意,这个文件很大,大约有5GB左右。下载后,您需要解压缩并将XML文件存储在本地文件夹中。 2. 清理维基百科语料库 由于维基百科包含大量的HTML标记,我们需要对其进行清理。我们可以使用Python中的BeautifulSoup库来进行清理。以下是一些示例代码: ```python from bs4 import BeautifulSoup import codecs # 读取维基百科XML文件 wiki_file = codecs.open("zhwiki-latest-pages-articles.xml", 'r', 'utf-8') # 创建BeautifulSoup对象并查找所有的text标签 soup = BeautifulSoup(wiki_file, 'html.parser') docs = soup.find_all('text') # 清理标点符号和数字 import re def clean_text(text): # 去除标点符号和数字 text = re.sub(r'[^\u4e00-\u9fa5]', '', text) return text # 将所有文档添加到列表中 cleaned_docs = [] for doc in docs: cleaned_doc = clean_text(doc.get_text()) cleaned_docs.append(cleaned_doc) ``` 3. 分词 接下来,我们将对每个文档进行分词。我们可以使用jieba库来进行中文分词。以下是一个示例代码: ```python import jieba # 分词函数 def tokenize(text): words = jieba.cut(text) return [word for word in words] # 将每个文档分词并添加到列表中 tokenized_docs = [] for doc in cleaned_docs: tokenized_doc = tokenize(doc) tokenized_docs.append(tokenized_doc) ``` 4. 训练Word2Vec模型 我们现在已经准备好训练word2vec模型了。我们可以使用gensim库来进行训练。以下是一个示例代码: ```python from gensim.models import Word2Vec # 训练Word2Vec模型 model = Word2Vec(tokenized_docs, size=300, window=5, min_count=5, workers=4) # 保存模型 model.save("zhwiki_word2vec.model") ``` 在上面的代码中,我们指定了一些参数来训练模型。例如,我们将词向量的维度设置为300,窗口大小设置为5,最小计数设置为5等等。您可以根据您的需要进行设置。 5. 使用Word2Vec模型 现在我们已经训练好了Word2Vec模型,我们可以使用它来查找相似的词语或计算词语之间的距离。以下是一个示例代码: ```python # 加载模型 model = Word2Vec.load("zhwiki_word2vec.model") # 查找相似的词语 similar_words = model.wv.most_similar("中国") print(similar_words) # 计算词语之间的距离 distance = model.wv.distance("北京", "上海") print(distance) ``` 在上面的代码中,我们加载了训练模型,并使用它来查找与“中国”最相似的词语,以及计算“北京”和“上海”之间的距离。 希望这个实践指南对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值