语言模型的训练,其实就是在训练 p ( H e ) 、 p ( i s ∣ H e ) 、 p ( A I ∣ i s s t u d y i n g ) p(He)、p(is|He)、p(AI|is studying) p(He)、p(is∣He)、p(AI∣isstudying)的概率。
下面是自己以前的手推N-gram语言模型:
英文问答系统很多方法,中文都可以用到;但是中文的很多方法,英文就不适用了。
注意:
中文的分词比英语难。
英文中存在标准化方法,中文没有此步骤——比如把goes go to 等等都装换为go。
创建倒排索引,分为以下几步:
1)创建文档列表:
首先对原始文档数据进行编号(DocID),形成列表,就是一个文档列表。
2)创建倒排索引列表:
然后对文档中数据进行分词,得到词条。对词条进行编号,以词条创建索引。然后记录下包含该词条的所有文档编号(及其它信息)。
(谷歌之父–> 谷歌、之父)
倒排索引创建索引的流程:
最大匹配属于贪心算法,无法保证全局最优;与之相对的还有动态规划DP算法。
前者看局部,后者看全局。
先设定一个阈值max_len=5,则每次取5个,然后看5个里面与词典是否有匹配。
假设5个直接匹配到了,那么就直接分出来,如果都没匹配的,那么max_len依次递减,以此类推分出第一个词;分第二个词的时候max_len又从5开始分,同之前的步骤,以此类推实现分词结果。见图中具体过程即可:(注意1、2、3、4步骤顺序)
此外,nlp要有一种直觉,即:从字/词 —> 句子 —> 语义。
所以接下来我们使用语义来分词。
我们使用一种"工具",将分词后的结果输入进去,输出该情况的概率大小,如:
我们再继续具体描述,我们对"工具"输入一句话,该工具生成该句话所有的分词结果,从中输出概率最大的一个分词结果,如:
这个"工具"中的一个,叫做语言模型LM。
首先我们得到 S 1 、 S 2 S_1、S_2 S1、S2两个分词结果,我们使用语言模型对这两个分词结果进行评估,假设我们使用Uni-gram语言模型,那么 P ( S 1 ) P(S_1) P(S1)和 P ( S 2 ) P(S_2) P(S2)的概率我们可以计算出来,比如对于 P ( 经 常 ) P(经常) P(经常)的概率,我们可以算出其在文章中的计数占比作为其概率值。最终算出 P ( S 1 ) P(S_1) P(S1)和 P ( S 2 ) P(S_2) P(S2)的概率,从而判定哪个分词结果更好。
一般这种概率连乘为了防止underflow、无穷小等问题,都会加上log,连乘变连加。
缺点 为复杂度高。
最大匹配是考虑所有组合,LM是考虑最大概率。
维特比算法将两者均考虑进来了。
首先我们要知道 − l o g ( P ( x ) ) -log(P(x)) −log(P(x))为什么要这样写的原因,log可以让累乘变累加,但是累加后的结果是负数,所以要加上负号,可以看下图具体的示例:
对于词典中没有出现过的词,我们可以假设其概率很小,如 P ( 其 他 ) = 1 0 − 8 P(其他)=10^{-8} P(其他)=10−8,那么 − l o g ( P ) = 20 -log(P)=20 −log(P)=20。
根据词典中的词的-logx给下图的路径上写上数据。
我们来寻找最短路径,根据DP算法的思想。
首先考虑到达位置8,有哪几种可能,找到其中最短路径,以此类推。
如下图所示:
上述是思路,我们来看具体计算过程和代码怎么写:
主要有两种场景:
第一个是错别字的场景,
第二个场景是 不是错别字 但是不适合的情况。(触发这种纠正,其实可以通过一个LM,其概率很低,那么进行纠正。这里主要是讲解如何进行纠正,而不是什么时候触发纠正)
最简单的方法就是基于编辑距离
也就是有三种操作 1 insert 2 delete 3 replace
那么这三种操作需要走多少步才能达到目标,步数的多少即成本的多少。
成本一样的比如这里的there和their都为1,则需要根据词频或者上下文等来进行判断哪个最合适。
编辑距离是最经典的DP算法!!!面试常考!!!
候选词假定都是从词典里来的,那么我们for word in 词典,然后把每个word和therr计算编辑距离。
然后找出成本最低的,但是这样的时间复杂度会非常的高!
并且编辑距离DP算法,必须把三种操作都考虑一遍,因为你并不知道哪种操作成本是最低的。
生成编辑距离为1的字符串后,在此基础之上再生成编辑距离为1的字符串,即得到了编辑距离为1、2的字符串。
One-hot表示(太简单,不多说)- 字/词表示
与One-hot对应的 句表示 方法为boolean representation
one hot 和 boolean representation 方法以及后面的 count-based representation 均为词典大小的维数
还有一种 句表示 方法使用 count-based representation方法
刚刚的Boolean representation对于重复出现的元素不作考虑,
但是count-based representation方法会考虑一个词的出现次数
基于count的表示维数是词典大小,这里tf-idf最终维度其实也是词典大小的维数。
动机:
通过one hot和欧氏距离、余弦相似度,是无法计算两个词之间的相似度的。
One hot不能够表达语义相似度,而且带来sparsity稀疏性问题。
所以采用分布式词向量!
余弦相似度里的分母是两个模即范数相乘,可以被看做分母整体是normalization,
否则 分子内积的结果可能很大,也可能很小,除以分母后,便可以被控制在一个区间内。
语言模型就是判断一句话是不是人话的模型,或者说,通过上下文来预测下一个词的模型。
本文开头所说的N-gram就是语言模型。
首先出现的是统计语言模型,如N-gram,HMM。
然后出现了神经网络语言模型NNLM,如CBOW,上下文预测中间词。
而NLP里很多都是语言模型,但也有很多用不到语言模型,如序列标注任务、文本分类、聚类等很多都不是非要语言模型。
预训练模型大家都清楚,而最近几年bert语言模型火了,预训练语言模型性能优秀,所以现在nlp里的大部分预训练模型其实都是预训练语言模型。
语言模型常用评价指标:困惑度perplexity
物理意义是序列下一个候选词的可选范围的大小。
具体含义是序列概率越大,困惑度越好,说明语言模型越好。