word2vec词向量的训练--实战篇(语言模型词向量的生成)
本文目录:
新闻预料预处理(全角转换成半角,xml格式提取内容,分词)
word2vec训练词向量(gensim生成并保存模型)
新闻语料预处理
本文使用的是搜狗新闻语料库,原始语料是类似下图中xml格式,首先需要提取中语料中正真的新闻内容,就是中对应的文本。还需要过滤一些特殊字符,以及半角和全角的转换问题。

语料的下载,官方地址:https://www.sogou.com/labs/resource/cs.php ,需要填一些信息。
百度云盘的备份,链接:https://pan.baidu.com/s/1n1IQxsb2Kbi2IHz9Cst7mg 提取码:r1n2
下面看一下详细的处理过程。首先是一个全角转半角的辅助程序,全角和半角转换的详细情况请参考:
Python实现全角与半角相互转换:https://blog.csdn.net/huanghaocs/article/details/90384163
def is_Qnumber(uchar):"""判断一个unicode是否是全角数字"""if uchar >= u'\uff10' and uchar <= u'\uff19':return Trueelse:return Falsedef is_Qalphabet(uchar):"""判断一个unicode是否是全角英文字母"""if (uchar >= u'\uff21' and uchar <= u'\uff3a') or (uchar >= u'\uff41' and uchar <= u'\uff5a'):return Trueelse:return Falsedef Q2B(uchar):"""单个字符 全角转半角"""inside_code = ord(uchar)if inside_code == 0x3000:inside_code = 0x0020else:inside_code -= 0xfee0if inside_code < 0x0020 or inside_code > 0x7e: #转完之后不是半角字符返回原来的字符return ucharreturn chr(inside_code)def stringQ2B(ustring):"""把字符串全角转半角"""return "".join([Q2B(uchar) for uchar in ustring])def stringpartQ2B(ustring):"""把字符串中数字和字母全角转半角"""return "".join([Q2B(uchar) if is_Qnumber(uchar) or is_Qalphabet(uchar) else uchar for uchar in ustring])
具体处理过程,首先读取xml格式语料,然后提取content部分内容,去除符号标记,最后保存语料为文本格式,也可以选择分词后在保存,分词后保存可以直接用于word2vec模型训练词向量。
import codecs
import re
import jieba
from tqdm import tqdmfile_path = r'/path/news_tensite_xml.dat' # 原始语料
save_path = r'/path/SougouNews_Dataset.txt' # 处理后只有文章内容的语料
seg_save_path = r'/path/SougouNews_Dataset_Seg.txt' # 文章内容分词后的语料# read file
print("read news dataset:", file_path)
with codecs.open(file_path, encoding='GB2312', errors="ignore") as fr:news_data = fr.read()# extract the text between and
print("extract news content ...")
news_content = re.findall('.* ', news_data)# write to text file without segment
print("write content to text file ...")
with codecs.open(save_path, 'w', encoding='utf8') as fw:# 注意tqdm只是一个进度条 也可以不需要for item in tqdm(news_content):item = re.sub(r'| |\s', '', item)# item = stringQ2B(item) # 全部全角转半角item = stringpartQ2B(item) # 只有数字字母全角转半角if item != "":fw.write(item + '\n')
下面是对语料分词后写入文件,这里使用的是jieba分词工具,也可以选择其它分词工具。
# segment and write to text file
with codecs.open(seg_save_path, 'w', encoding='utf8') as fw:for content in tqdm(news_content):content = re.sub(r'| |\s', '', content)# content = stringQ2B(content) # 全部全角转半角item = stringpartQ2B(item) # 只有数字字母全角转半角if content != "":# 这里分词调用的是jieba 也可以使用其它分词工具content_seg = jieba.cut(content.strip()) fw.write(" ".join(content_seg) + "\n")
对语料预处理完后,可以使用已经分词的语料训练word2vec,这里分词后的语料是可以加上自己整理的其它语料,这样可以更加丰富我们的语料库。
word2vec训练词向量
word2vec模型的原理这里不再讲解,另一篇博客已经详细介绍,这里是给个实例,基于上面处理好的语料训练词向量,使用的工具是gensim中自带的word2vec模型。
import logging
import gensim.models as word2vec
from gensim.models.word2vec import LineSentencedef train_word2vec(dataset_path, model_path, size=100, window=5, binary=True):logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)# 把语料变成句子集合sentences = LineSentence(dataset_path)# 训练word2vec模型model = word2vec.Word2Vec(sentences, size=size, window=window, min_count=5, workers=4, iter=10)# 保存word2vec模型if binary:model.wv.save_word2vec_format(model_path, binary=True)else:model.wv.save_word2vec_format(model_path, binary=False)def load_word2vec_model(w2v_path):# load word2vecmodel = word2vec.KeyedVectors.load_word2vec_format(w2v_path, binary=True)return modeldef calculate_most_similar(model, word):similar_words = model.most_similar(word)print(word)for term in similar_words:print(term[0], term[1])dataset_path = "/path/SougouNews_Dataset_Seg.txt"
save_model_path = "word2vec_model.bin" # save_binary=True
# save_model_path = "word2vec_model.txt" # save_binary=Falsetrain_word2vec(dataset_path, save_model_path, size=100, window=5, binary=True)
word2vec模型训练完后,可以计算词语之间的相似度,以及与每次词最相似的词。也可以做为其它NLP相关任务的词向量预训练输入。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
