最开始需要新建一个conda环境
conda create -n word2vec python=3.8 conda activate word2vec
|
然后安装一下所需要的库
pip install numpy pip install scipy pip install gensim pip install jieba
|
首先下载一下数据集zhwiki-20230701-pages-articles.xml.bz2,为了方便后续操作,这里需要把他转成txt
格式的
以下是转化的文件transform_to_txt.py
import logging import os.path import sys
from gensim.corpora import WikiCorpus
if __name__ == '__main__':
program = os.path.basename(sys.argv[0]) logger = logging.getLogger(program) logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s') logging.root.setLevel(level=logging.INFO) logger.info("running %s" % ' '.join(sys.argv)) if len(sys.argv) < 3: print(globals()['__doc__'] % locals()) sys.exit(1) inp, outp = sys.argv[1:3] space = "" i = 0 output = open(outp, 'w', encoding='utf-8') wiki = WikiCorpus(inp, dictionary={}) for text in wiki.get_texts(): s = space.join(text) s = s.encode('utf8').decode('utf8') + "\n" output.write(s) i = i + 1 if (i % 10000 == 0): logger.info("Saved " + str(i) + " articles") output.close() logger.info("Finished Saved " + str(i) + " articles")
|
然后将刚刚下载的数据集和此Python
文件放在同一个目录下,并且用命令行跳转到这个目录,然后执行
python transform_to_txt.py zhwiki-20230701-pages-articles.xml.bz2 wiki.zh.text
|
其中,第一个参数是Python
的文件名,第二个是要处理的数据文件名,第三个是要输出的文件名
转换完之后就生成了一个txt文件
直接浏览,可以看出这里面全是繁体字,所以下面需要把繁体转换成简体
首先需要下载这个转换工具,记住要下载预编译的。
然后解压后放在一个能记住的位置,例如我是
G:\Lab\DeepLearning\OpenCC\share\opencc
|
然后把文件夹中的bin
目录配置到系统环境path
里
最后验证一下是否配置成功
然后就可以转换啦,用cmd
跳转到wiki.zh.text
文件所在的目录,在命令行输入
opencc -i wiki.zh.text -o test_zh.txt -c G:\Lab\DeepLearning\OpenCC\share\opencc\t2s.json
|
wiki.zh.text
是待转换的繁体文本,test_zh.txt
是输出的简体文本,t2s.json
表示繁体转简体,其中这个需要换成自己的地址(地址不要有空格)
等一会就好了
然后就全部成了简体了,使用word2vec工具需要做的最后一步是分词
分词使用jieba
这个库来解决,以下是分词的文件participle.py
import codecs
import jieba import jieba.analyse
def cut_words(sentence): return " ".join(jieba.cut(sentence)).encode('utf-8')
f = codecs.open('test_zh.txt', 'r', encoding="utf8") target = codecs.open("zh.jian.wiki.seg_1.5G.txt", 'w', encoding="utf8") print('open files') line_num = 1 line = f.readline() while line: print('---- processing ', line_num, ' article----------------') line_seg = " ".join(jieba.cut(line)) target.writelines(line_seg) line_num = line_num + 1 line = f.readline() f.close() target.close() exit() while line: curr = [] for oneline in line: curr.append(oneline) after_cut = map(cut_words, curr) target.writelines(after_cut) print('saved', line_num, 'articles') exit() line = f.readline1() f.close() target.close()
|
其中,这一句是配置需要分词的文件test_zh.txt
f = codecs.open('test_zh.txt', 'r', encoding="utf8")
|
这一句是配置需要输出的文件zh.jian.wiki.seg_1.5G.txt
target = codecs.open("zh.jian.wiki.seg_1.5G.txt", 'w', encoding="utf8")
|
将participle.py
文件和上面输出的简体文本test_zh.txt
放在同一个目录,用cmd
(跳转到对应目录后输入python Testjieba.py
)或者Pycharm
直接运行participle.py
文件
PS:无论是cmd
还是Pycharm
,记得切换到word2vec
环境
经过将近一个多小时的时间,终于跑完了
接下来就是正式使用word2vec的时候了,以下是使用word2vec的文件word2vec_model.py
import logging import multiprocessing import os.path import sys
from gensim.models import Word2Vec from gensim.models.word2vec import LineSentence
if __name__ == '__main__':
program = os.path.basename(sys.argv[0]) logger = logging.getLogger(program) logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s') logging.root.setLevel(level=logging.INFO) logger.info("running %s" % ' '.join(sys.argv)) if len(sys.argv) < 4: print(globals()['__doc__'] % locals()) sys.exit(1) inp, outp1, outp2 = sys.argv[1:4] model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count()) model.save(outp1) model.wv.save_word2vec_format(outp2, binary=False)
|
将上文分好词的文件zh.jian.wiki.seg_1.5G.txt
与word2vec_model.py
文件也是放到同一个目录下,然后在cmd
中执行
python word2vec_model.py zh.jian.wiki.seg_1.5G.txt wiki.zh.text.model wiki.zh.text.vector
|
其中,wiki.zh.text.model
是生成的模型(同样记得切换环境)
可能会报这个错,原因可能是gensim
的版本的差异。
这样把下面这句的size
改成vector_size
即可
源代码:
model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count())
|
新代码:
model = Word2Vec(LineSentence(inp), vector_size=400, window=5, min_count=5, workers=multiprocessing.cpu_count())
|
然后就可以漫长的等待了!
经过一段时间后,模型保存成功了!
最后测试一下模型
测试文件testModel.py
如下
from gensim.models import Word2Vec
en_wiki_word2vec_model = Word2Vec.load('wiki.zh.text.model')
testwords = ['苹果', '数学', '学术', '白痴', '篮球'] for i in range(5): res = en_wiki_word2vec_model.wv.most_similar(testwords[i]) print(testwords[i]) print(res)
|
继续在同一个目录执行testModel.py
文件,得到如下结果
最后附上项目完整地址