实战主要分为两个部分语言模型和Wordvec,具体参见我的github代码。
语言模型
这个部分主要实现的是NNLM2003的论文,代码中分别给出了英文和中文的数据,数据集很小,这里主要说下代码思路。
1.那中文语料举例,这里使用的是一份已经分好词的中文语料,如下:
总共6800多行,并不是很大。
2.创建语料库,根据分好词的语料建立一个word2id的词典,记录所有的词和词的编号,注意这里加上<START>,<UNK>,<END>,如下:
3.创建训练数据,在这里我们会设置一个上下文的长度win_size,这也就是我们输入的一个范围大小的设置,应为序列如果太长模型会吃不消,最后的输入和对应的标签的如下:
输入数据 输入标签4.模型部分如下,也很简单:
这里我主要实现了hidden和output的这两个函数,完全是对照上篇文章中的图实现的,output的结果就是对词典中的每个词都有一个概率值。NNLM得代码就介绍到这里,比较简单,如果有一定的DP和tensorflow基础一定能看得懂。
Word2vec实践
github上关于Word2vec的实践特别多,这里我主要利用gensim在Python3的环境下进行词向量的训练做一些说明(代码),后续我们会利用相同的中文语料进行bert的训练。在这里推荐一个比较好的开源项目,上面是一些训练好的开源模型
第一步:语料准备
这里我准备了两份语料,一份是维基百科的中文语料,另一份是搜狗的新闻语料,这些网上都可以找到。这里说一下对这两份语料的处理进行说明:
1.对于维基百科的中文,抽取文本文件,可以使用wiki官方的工具WikipediaExtractor,或者运行tool目录下的process_wiki.py
执行命令:
python process_wiki.pyzhwiki-latest-pages-articles.xml.bz2 output.txt
繁体字转换成简体,利用目录下的tradition2simpy.py工具进行转化,用到了两个库用到了两个库,分别是zh_wiki.py和langconv.py ,目录下都有,得到simpleword.txt
2.对于搜狗语料,转换命令如下:
dat文件解析命令:
cat news_tensite_xml.dat | iconv -f gbk -t utf-8 -c | grep "<content>" > corpus.txt
vim下去掉content标签:
:%s/<content>//g
:%s/<\/content>//g
第二步:分词
代码中用的是结巴分词,关于分词我们会单独做一个介绍,后续我还会介绍海量分词的使用。
第三步:模型训练
模型训练的代码主要注意gensim.models.Word2Vec函数,参数如下:
这里说明几个比较重要的参数,min_count指词典中频率低于min_count的词会被忽略,window指上下文大小,workers指进程数。
第四步:模型解析,代码里有,这里不详细介绍
实验效果(见test.py):
网友评论