​本篇主要介绍如何通过中文维基百科语料库来训练一个word2vec模型。

相关资料下载:

中文维基百科下载地址:https://dumps.wikimedia.org/zhwiki/

WikiExtractor项目git地址:https://github.com/attardi/wikiextractor

OpenCC项目git地址:https://github.com/BYVoid/OpenCC

中文分词jieba项目git地址:https://github.com/fxsjy/jieba

gensim官网地址:https://radimrehurek.com/gensim/install.html

一、语料库的下载

我下载是20190401文件,1.5G左右是一个压缩包,下载的时候需要注意文件的名称。

二、语料库文章的提取

下载完成之后,解压缩得到的是一个xml文件,里面包含了许多的文章,也有许多的日志信息。所以,我们只需要提取xml文件里面的文章就可以了。我们通过WikiExtractor来提取xml文件中的文章,它是一个意大利人写的一个Python脚本专门用来提取维基百科语料库中的文章,将每个文件分割的大小为500M,它是一个通过cmd命令来设置一些参数提取文章,提取步骤如下:

a、WikiExtractor的安装

将整个WikiExtractor项目clone或者下载到本地,打开cmd窗口,

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

使用WikiExtractor提取文章,会在指定目录下产生一个AA的文件夹,里面会包含很多的文件。

c、中文简体和繁体的转换

因为维基百科语料库中的文章内容里面的简体和繁体是混乱的,所以我们需要将所有的繁体字转换成为简体。这里我们利用OpenCC来进行转换。

OpenCC的使用教程请参考下篇:OpenCC中文简体和繁体互转

d、正则表达式提取文章内容并进行分词

使用WikiExtractor提取的文章,会包含许多的<doc></doc>,所以我们需要将这些不相关的内容通过正则表达式来去除。然后再通过jieba对文章进行分词,在分词的时候还需要将一些没有实际意义的词进行去除,所以在分词的之后加了一个停用词的去除。将分割之后的文章保存到文件中,每一行表示一篇文章,每个词之间使用空格进行分隔。

import logging,jieba,os,redef get_stopwords():logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s',level=logging.INFO)#加载停用词表stopword_set = set()with open("../stop_words/stopwords.txt",'r',encoding="utf-8") as stopwords:for stopword in stopwords:stopword_set.add(stopword.strip("n"))return stopword_set'''
使用正则表达式解析文本
'''
def parse_zhwiki(read_file_path,save_file_path):#过滤掉<doc>regex_str = "[^<doc.*>$]|[^</doc>$]"file = open(read_file_path,"r",encoding="utf-8")#写文件output = open(save_file_path,"w+",encoding="utf-8")content_line = file.readline()#获取停用词表stopwords = get_stopwords()#定义一个字符串变量,表示一篇文章的分词结果article_contents = ""while content_line:match_obj = re.match(regex_str,content_line)content_line = content_line.strip("n")if len(content_line) > 0:if match_obj:#使用jieba进行分词words = jieba.cut(content_line,cut_all=False)for word in words:if word not in stopwords:article_contents += word+" "else:if len(article_contents) > 0:output.write(article_contents+"n")article_contents = ""content_line = file.readline()output.close()

e、将分词后的文件合并为一个

将分词后的多个文件合并为一个文件,便于word2vec模型的训练

'''
合并分词后的文件
'''
def merge_corpus():output = open("../dataset/zhwiki/BB/wiki_corpus","w",encoding="utf-8")input = "../dataset/zhwiki/BB"for i in range(3):file_path = os.path.join(input,str("wiki_corpus0%s"%str(i)))file = open(file_path,"r",encoding="utf-8")line = file.readline()while line:output.writelines(line)line = file.readline()file.close()output.close()

三、word2vec模型的训练

训练word2vec模型的时候,需要使用到gensim库,安装教程请参考官网,通过pip命令就可以进行安装。训练过程需要30分钟到1个小时,具体训练时间与电脑的配置相关。

import logging
from gensim.models import word2vecdef main():logging.basicConfig(format="%(asctime)s:%(levelname)s:%(message)s",level=logging.INFO)sentences = word2vec.LineSentence("../dataset/zhwiki/BB/wiki_corpus")# size:单词向量的维度。model = word2vec.Word2Vec(sentences,size=250)#保存模型model.save("../model/wiki_corpus.bin")# model.save("../model/wiki_corpus.model")# model.wv.save_word2vec_format("./sogou_word2vec/min_count-1/sogou.wor2vec.txt")if __name__ == "__main__":main()

各种信息资料已上传百度云盘

链接:https://pan.baidu.com/s/1sxwpnGXj4SREcyBMP8HppQ 密码:9avd

四、word2vec模型的使用

 logging.basicConfig(format="%(asctime)s:%(levelname)s:%(message)s",level=logging.INFO)model = models.Word2Vec.load("../wiki_chinese/model/wiki_corpus.bin")#输入一个词找出相似的前10个词one_corpus = ["人工智能"]# ''' 词库中与one_corpus最相似的10个词'''result = model.most_similar(one_corpus[0],topn=10)print(result)

[('人工智慧', 0.8270298838615417),

('AI', 0.7743903994560242),

('专家系统', 0.6860651969909668),

('智能', 0.6649989485740662),

('虚拟现实', 0.6449255347251892),

('计算机', 0.6375125646591187),

('模式识别', 0.6328349113464355),

('人工神经网络', 0.6263511776924133),

('计算能力', 0.6243234276771545),

('认知科学', 0.6234999299049377)]

2、计算两个词的相似度

  # 两个词的相似度# #输入两个词计算相似度two_corpus = ["腾讯","阿里巴巴"]res = model.similarity(two_corpus[0],two_corpus[1])print("similarity:%.4f"%res)

similarity:0.7268

# KeyError: "word '报了' not in vocabulary"
# 错误:“单词'报了'不在词汇中”

3、新数据与已知数据类比,分类

例如:

已知数据(原数据)

[{"intent":"天气", "words":"杭州天气怎么样"},
{"intent": "年龄", "words": "你今年几岁了"}]新数据:北京天气怎么样
和天气句子最相似,最后会分类问为:天气

001、用word2vec+平均词向量的方式生成句子向量

from jieba_tokenizer.tokenizer import JiebaTokenizer
from gensim import modelslogger = logging.getLogger(__name__)sys.path.append("./")class AvgWord2vec(object):"""用word2vec+平均词向量的方式生成句子向量"""def __init__(self,w2v_model_path="../wiki_chinese/model/wiki_corpus.bin"):# self._load_w2v_model(w2v_model_path)self.w2v_model = models.Word2Vec.load(w2v_model_path)self.tokenizer = JiebaTokenizer()def _load_w2v_model(self, path):"""加载w2v模型"""w2v_path = glob.glob("**{}".format(path), recursive=True)if len(w2v_path) == 0:logger.error("can not find w2v model")else:logger.info("Loading word2vec model file at {}".format(w2v_path[0]))self.w2v_model = models.Word2Vec.load(w2v_path[0], binary=True)returndef transfrom_sentence_to_vec(self, sentence):"""把句子转换成句子向量"""cutted_sentence = self.tokenizer.cut_sentence(sentence)# words_list = cutted_sentence.split(" ")# print(cutted_sentence)vec = self.seg_text_to_vector(cutted_sentence)# sentencereturn vecdef seg_text_to_vector(self, sentence):splited_text = sentence.split(" ")# size:单词向量的维度。与训练时保持一致vector = np.zeros(250)num_of_word = 0for word in splited_text:try:a = self.w2v_model[word]for q in a:if np.isnan(q):continueexcept:# print(j+"is not in vocabulary")continue# 不分词语的权重# vector += a# 词语带权重words_weight_dict = self.word_weight_dict(sentence)weight = words_weight_dict.get(word)if weight is None:weight = 1.0vector += (a * weight)num_of_word += 1if (num_of_word == 0) is True:return np.zeros(250)else:vector = vector / num_of_wordreturn vectordef word_weight_dict(self, sentence):"""根据输入sentence返回一个词权重查询词典"""tf_idf_list = jieba.analyse.extract_tags(sentence, topK=None, withWeight=True)weight_dict = {}for word_weight in tf_idf_list:weight_dict[word_weight[0]] = word_weight[1]return weight_dictif __name__ == '__main__':sentence = "这是一句测试用的句子,通过这个文件,可以把一句话转换成一个句子向量"s2v = AvgWord2vec()vec = s2v.transfrom_sentence_to_vec(sentence)print(vec)exit(0)

注意:单词向量的维度。与训练时保持一致(我用的是250维的)

句子对比使用

from example.avg_w2v import AvgWord2vec
from scipy.spatial.distance import cosine as cos# 夹角越小越好
best_score = 0.3def words_base(words_list):'''原数据的训练保存'''words_infos = []for words_info in words_list:sentence = words_info.get("words")s2v = AvgWord2vec()words_vec = s2v.transfrom_sentence_to_vec(sentence)words_dict = {"intent": words_info.get("intent"), "words_vec": words_vec}words_infos.append(words_dict)return words_infosdef words_score(sentence, words_infos):'''新数据与老数据对比,分类'''s2v = AvgWord2vec()words_vec = s2v.transfrom_sentence_to_vec(sentence)for words_info in words_infos:score = cos(words_vec, words_info.get("words_vec"))print(score)# 夹角越小越相似if score < best_score:return words_info.get("intent")else:return "匹配失败"if __name__ == '__main__':words_list = [{"intent":"天气", "words":"杭州天气怎么样"},{"intent": "年龄", "words": "你今年几岁了"}]words_infos = words_base(words_list)# print(words_infos)sentence = "北京天气怎么样"result = words_score(sentence, words_infos)print(result)

相似度夹角:0.1741155833744904

分类:天气

Git代码:公众号后台回复 chinese_w2v_compare

把一个dataset的表放在另一个dataset里面_使用中文维基百科语料库训练一个word2vec模型并使用说明...相关推荐

  1. 使用中文维基百科语料库训练一个word2vec模型

    本篇文章主要介绍如何通过中文维基百科语料库来训练一个word2vec模型. 相关资料下载: 中文维基百科下载地址:https://dumps.wikimedia.org/zhwiki/20180720 ...

  2. 使用中文维基百科语料库训练一个word2vec模型 12.1

    转自:https://blog.csdn.net/sinat_29957455/article/details/81432846 本篇文章主要介绍如何通过中文维基百科语料库来训练一个word2vec模 ...

  3. 把一个dataset的表放在另一个dataset里面_现在开始:用你的Mac训练和部署一个图像分类模型...

    可能有些同学学习机器学习的时候比较迷茫,不知道该怎么上手,看了很多经典书籍介绍的各种算法,但还是不知道怎么用它来解决问题,就算知道了,又发现需要准备环境.准备训练和部署的机器,啊,好麻烦. 今天,我来 ...

  4. 把一个dataset的表放在另一个dataset里面_视频自监督一. STCR: 一个基于数据增强的简单有效正则项 (降低静态信息的影响)...

    视频自监督一. STCR: 一个基于数据增强的简单有效正则项 (降低静态信息的影响) 今天介绍一个我们近期做的关于视频自监督的简单工作: Self-supervised learning using ...

  5. mysql获取一个表的数据作为值插入_请问如何在mysql中得到一个即将插入数据表中的那条数据的id值(id自增长)?...

    我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数, 一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的. 但在多线程情况下,就不行了. 下面 ...

  6. python输入一个三位整数、输出三位数之和_编写程序,从键盘输入一个3位的正整数,输出它的百位数,十位数和个位数,并且计算它的和...

    展开全部 void main(){int a;int b,c,d;//各个位数上的数字printf("请输入一个三位数:"): scanf("%d",& ...

  7. C++从0到1手写一个哈希表

    C++从0到1手写一个哈希表 简易版哈希表 优化哈希表 目的:手写实现一个哈希表,采用拉链法构建,每个hash(key)对应的是一个红黑树. 看起来很简单,但可以学到很多东西.实现语言:C++. 简易 ...

  8. 复制一个维基百科!—— 维基技术梳理

    复制一个维基百科!-- 维基技术梳理 了解 WikiMedia 说到维基百科 不得谈到一个组织 - 维基媒体wikimedia. 企业家吉米·威尔士和软件设计师拉里·桑格创立了维基百科(wikiped ...

  9. pytorch:如何从头开始训练一个CNN网络?

    文章目录 前言 一.CNN? 二.用单批量测试模型 1.引入库 2.读入数据集 3. 建造Module实例 4. 训练 总结 前言 在刚开始学习Deep Learning时,一件几乎不可能的事情就是知 ...

最新文章

  1. [译文]Domain Driven Design Reference(四)—— 柔性设计
  2. 【数据挖掘】数据挖掘总结 ( K-Means 聚类算法 | 二维数据的 K-Means 聚类 ) ★
  3. 切割机插件_这些激光切割机的故障,看看你都遇到过吗?
  4. mysql常用命令,mysql语法,mysql登陆、创建数据库、创建用户、更改密码、为用户授权...
  5. lnmp一键包502 Bad Gateway解决方法
  6. java怎么复制别人的数据库_java-如何在不使用Apache DDLUtils的情况下使用JDBC将模式从一个数据库复制到另一个数据库?...
  7. Mybatis(14)多表查询
  8. ReedShepp与Dubins path的matlab实现
  9. G-Sensor 8452驱动及相关
  10. 编写一个程序,将 d:\java 目录下的所有.java 文件复制到 d:\jad 目录下,并将原来文件的扩展名从.java 改为.jad。...
  11. AJAX基础知识点——思维导图
  12. slice_input_producer在2.0版本里怎么用_EPrime2.0安装避坑指南
  13. 关于Iphone 4 如何用itunes备份短信等设置
  14. 天行健,君子以自强不息;地势坤,君子以厚德载物 释意
  15. 新手做头条号短视频,这三大点要牢记,让你少走弯路,抓紧收藏
  16. 惊恐,还真有大神把地府后台管理系统做出来了,“阎王爷”疯狂点
  17. 5G QoS控制原理专题详解-基础概念(3)
  18. Learning to Rank(LTR)(转)
  19. 区块链知识系列 - 系统学习EVM(二)-存储与安全
  20. 交互设计课程1.0课程介绍

热门文章

  1. Java 服务端推送消息有那么难吗?
  2. Nacos配置中心原理
  3. TCP之三次握手四次挥手 1
  4. java类功能说明注释添加,IDEA添加Java类注释模版的方法
  5. torch 归一化,momentum用法详解
  6. opencv 连通域笔记
  7. Windows下VS2015 MPI编译64位Boost1.64
  8. OSError: exception: access violation writing and reading
  9. std::map只修改不用加锁
  10. 流媒体服务器 客户端播放器方案推荐