如何利用深度学习技术训练聊天机器人语言模型
数据预处理模型能聊的内容也取决于选取的语料。如果已经具备了原始聊天数据,可以用SQL通过关键字查询一些对话,也就是从大库里选取出一个小库来训练。
从一些论文上,很多算法都是在数据预处理层面的,比如Mechanism-AwareNeuralMachineforDialogueResponseGeneration就介绍了,从大库中抽取小库,然后再进行融合,训练出有特色的对话来。
对于英语,需要了解NLTK,NLTK提供了加载语料,语料标准化,语料分类,PoS词性标注,语意抽取等功能。
另一个功能强大的工具库是CoreNLP,作为Stanford开源出来的工具,特色是实体标注,语意抽取,支持多种语言。
下面主要介绍两个内容:中文分词现在有很多中文分词的SDK,分词的算法也比较多,也有很多文章对不同SDK的性能做比较。做中文分词的示例代码如下。
#coding:utf8''' SegmenterwithChinese '''importjieba importlangiddefsegment_chinese_sentence(sentence):'''Returnsegmentedsentence.'''seg_list=(sentence,cut_all=False)seg_sentence=u"".join(seg_list)returnseg_sentence.strip().encode('utf8')defprocess_sentence(sentence):'''OnlyprocessChineseSentence.'''iflangid.classify(sentence)[0]=='zh':returnsegment_chinese_sentence(sentence)returnsentenceif__name__=="__main__":print(process_sentence('飞雪连天射白鹿'))print(process_sentence('Ihaveapen.'))以上使用了langid先判断语句是否是中文,然后使用jieba进行分词。
在功能上,jieba分词支持全切分模式,精确模式和搜索引擎模式。全切分:输出所有分词。精确:概率上的最佳分词。所有引擎模式:对精确切分后的长句再进行分词。
jieba分词的实现主要是分成下面三步:1、加载字典,在内存中建立字典空间。字典的构造是每行一个词,空格,词频,空格,词性。
上诉书3n上诉人3n上诉期3b上诉状4n上课650v建立字典空间的是使用python的dict,采用前缀数组的方式。
使用前缀数组的原因是树结构只有一层- word:freq,效率高,节省空间。
比如单词"dog",字典中将这样存储:{"d":0,"do":0,"dog":1#value为词频}字典空间的主要用途是对输入句子建立有向无环图,然后根据算法进行切分。
算法的取舍主要是根据模式 -全切,精确还是搜索。2、对输入的语句分词,首先是建立一个有向无环图。 有向无环图, Directedacyclicgraph (音/ˈdæɡ/)。
【图3-2】DAGDAG对于后面计算最大概率路径和使用HNN模型识别新词有直接关系。
3、按照模式,对有向无环图进行遍历,比如,在精确模式下,便利就是求最大权重和的路径,权重来自于在字典中定义的词频。对于没有出现在词典中的词,连续的单个字符也许会构成新词。
然后用HMM模型和Viterbi算法识别新词。精确模型切词:使用动态规划对最大概率路径进行求解。
最大概率路径:求route=(w1,w2,w3,..,wn),使得Σweight(wi)最大。Wi为该词的词频。更多的细节还需要读一下jieba的源码。
自定义字典jieba分词默认的字典是:1998人民日报的切分语料还有一个msr的切分语料和一些txt小说。开发者可以自行添加字典,只要符合字典构建的格式就行。jieba分词同时提供接口添加词汇。
Wordembedding使用机器学习训练的语言模型,网络算法是使用数字进行计算,在输入进行编码,在输出进行解码。wordembedding就是编解码的手段。
【图3-3】wordembedding,Ref.#7wordembedding是文本的数值化表示方法。
表示法包括one-hot,bagofwords,N-gram,分布式表示,共现矩阵等。Word2vec近年来,word2vec被广泛采用。
Word2vec输入文章或者其他语料,输出语料中词汇建设的词向量空间。详细可参考word2vec数学原理解析。使用word2vec安装完成后,得到word2vec命令行工具。
word2vec-train""\-output"data/review.model"\-cbow1\-size100\-window8\-negative25\-hs0\-sample1e-4\-threads20\-binary1\-iter15-train""表示在指定的语料库上训练模型-cbow1表示用cbow模型,设成0表示用skip-gram模型-size100词向量的维度为100-window8训练窗口的大小为8即考虑一个单词的前八个和后八个单词-negative25-hs0是使用negativesample还是HS算法-sample1e-4采用阈值-threads20线程数-binary1输出model保存成2进制-iter15迭代次数在训练完成后,就得到一个model,用该model可以查询每个词的词向量,在词和词之间求距离,将不同词放在数学公式中计算输出相关性的词。
比如:vector("法国")-vector("巴黎)+vector("英国