由于想要一个较小的词向量语言模型来做简单的文本分类(BERT模型太大),找了很多也没找到合适的,所以使用gensim训练一个100维度的 word2vec 模型,如果涉及词向量的简单使用时,而不参与模型训练,可以使用gensim库来提供计算比使用embedding层更加快捷,因为模型内部有查询优化,所以速度很快
预训练模型(100维的)地址: 链接: https://pan.baidu.com/s/1bvosxJJwyAh72YGdGEWJVQ 密码: loce
一、选取训练语料库
https://github.com/brightmart/nlp_chinese_corpus,有维基、新闻、百科各种语料,我使用的是维基百科
二、解压数据
直接在当前文件夹下解压:(我是在wiki_zh
下)
unzip xxx.zip
三、训练模型
import gensim
import re
import os
from pathlib import Path
import json
import jieba
here = Path().cwd()
files = here / 'model' / 'wiki_zh'
n = 0
for i, filename in enumerate(files.rglob('wi*')):
# print(filename.name)
with open(filename, 'r', encoding='utf-8') as f,\
open(os.path.join('./model/train_data/', str(i) + '.txt'), 'w', encoding='utf-8') as fw:
for line in f:
# print(line)
j = json.loads(line.strip())
# print(j['text'])
j = re.split(r'\n',j['text'])
for l in j[1:]:
# 这里转换成小写,扩大后续英文词典匹配范围
lower_cut = [i.lower() for i in jieba.cut(l)]
cut_str = ' '.join(lower_cut)
if cut_str.strip():
fw.write(cut_str + '\n')
n += 1
因为文件太大,使用一个行读取的迭代器
class MySentences(object):
def __init__(self, dirname):
self.dirname = dirname
def __iter__(self):
for fname in os.listdir(self.dirname):
print(fname)
for line in open(os.path.join(self.dirname, fname)):
yield line.split()
sentences = MySentences('./model/train_data/')
# 训练代码很简单:
model = gensim.models.Word2Vec(sentences,min_count=50,size=100, workers=4) # 使用模型次想来那个大小为100维
# 保存模型
model.save('./model/mymodel_100nd_new')
# 加载模型:
# model2 = gensim.models.Word2Vec.load('./model/mymodel_100nd_new')
查看模型基本信息
print(model) # vocab大小:149767, 词向量 size=100
4、查看词向量
4.1 查词组词向量
model['你好']
4.2 求相似词组
# 求相似词组
model.most_similar(positive=['女人', '国王'], negative=['男人'], topn=1)
4.3 打印字典
# 打印 vocab 字典
print(model.wv.index2word)
4.4 测试耗时
import time
for i in range(10):
a = time.time()
model['人民']
print(time.time() - a)
部分详细也可以参考:https://zhuanlan.zhihu.com/p/40016964