一、N-gram语言模型
语言模型的训练,其实就是在训练
的概率。
下面是自己以前的手推N-gram语言模型:
二、典型的问答系统全流程技术一览
英文问答系统很多方法,中文都可以用到;但是中文的很多方法,英文就不适用了。
- 对问题进行分词segmentation,然后预处理。
- 预处理:
拼写纠错 spell correction
stemg/lemnazation——go to/ goes /gone 变成原型go
stopwords
words filter过滤掉一些错误的词
同义词
等等 - 将文本表示成向量:
bool vector——0 1 0 1的向量
count vector——0 1 2 3 4 这种的向量
tf-idf——(0.7, 0.3,。。。,0)这种向量
word2vec
seq2seq
等等 - 计算相似度:
(这是比较老套的方法了,现在有端到端的神经网络等等更好的方法)
欧氏距离
余弦相似度
等等 - 对相似度进行排序、过滤最后返回结果!
- 计算相似度时,如果数据量比较大,可以采用倒排索引(倒排表)。
注意:
中文的分词比英语难。
英文中存在标准化方法,中文没有此步骤——比如把goes go to 等等都装换为go。
倒排索引 Inverted index
创建倒排索引,分为以下几步:
1)创建文档列表:
首先对原始文档数据进行编号(DocID),形成列表,就是一个文档列表。
2)创建倒排索引列表:
然后对文档中数据进行分词,得到词条。对词条进行编号,以词条创建索引。然后记录下包含该词条的所有文档编号(及其它信息)。
(谷歌之父–> 谷歌、之父)
倒排索引创建索引的流程:
- 首先把所有的原始数据进行编号,形成文档列表
- 把文档数据进行分词,得到很多的词条,以词条为索引。保存包含这些词条的文档的编号信息。搜索的过程:当用户输入任意的词条时,首先对用户输入的数据进行分词,得到用户要搜索的所有词条,然后拿着这些词条去倒排索引列表中进行匹配。找到这些词条就能找到包含这些词条的所有文档的编号。然后根据这些编号去文档列表中找到文档。
三、分词算法
1. 最大匹配
最大匹配属于贪心算法,无法保证全局最优;与之相对的还有动态规划DP算法。
前者看局部,后者看全局。
1.1 前向最大匹配算法
先设定一个阈值max_len=5,则每次取5个,然后看5个里面与词典是否有匹配。
假设5个直接匹配到了,那么就直接分出来,如果都没匹配的,那么max_len依次递减,以此类推分出第一个词;分第二个词的时候max_len又从5开始分,同之前的步骤,以此类推实现分词结果。见图中具体过程即可:(注意1、2、3、4步骤顺序)
1.2 后向最大匹配算法
1.3 最大匹配 缺点
此外,nlp要有一种直觉,即:从字/词 —> 句子 —> 语义。
所以接下来我们使用语义来分词。
2. 考虑语义
我们使用一种"工具",将分词后的结果输入进去,输出该情况的概率大小,如:
我们再继续具体描述,我们对"工具"输入一句话,该工具生成该句话所有的分词结果,从中输出概率最大的一个分词结果,如:
这个"工具"中的一个,叫做语言模型LM。
首先我们得到
两个分词结果,我们使用语言模型对这两个分词结果进行评估,假设我们使用Uni-gram语言模型,那么
和
的概率我们可以计算出来,比如对于
的概率,我们可以算出其在文章中的计数占比作为其概率值。最终算出
和
的概率,从而判定哪个分词结果更好。
一般这种概率连乘为了防止underflow、无穷小等问题,都会加上log,连乘变连加。
缺点 为复杂度高。
3. 维特比算法
最大匹配是考虑所有组合,LM是考虑最大概率。
维特比算法将两者均考虑进来了。
首先我们要知道
为什么要这样写的原因,log可以让累乘变累加,但是累加后的结果是负数,所以要加上负号,可以看下图具体的示例:
对于词典中没有出现过的词,我们可以假设其概率很小,如
,那么
。
根据词典中的词的-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(字/词)
- Boolean representation(句子)
- Count-based representation(句子)
- Tf-idf representation(句子)
- 从One-hot到分布式词向量
1. One-hot
One-hot表示(太简单,不多说)- 字/词表示
2. Boolean representation
与One-hot对应的 句表示 方法为boolean representation
one hot 和 boolean representation 方法以及后面的 count-based representation 均为词典大小的维数
3. Count-based representation
还有一种 句表示 方法使用 count-based representation方法
刚刚的Boolean representation对于重复出现的元素不作考虑,
但是count-based representation方法会考虑一个词的出现次数
4. Tf-idf representation
基于count的表示维数是词典大小,这里tf-idf最终维度其实也是词典大小的维数。
5. 从One-hot到分布式词向量
动机:
通过one hot和欧氏距离、余弦相似度,是无法计算两个词之间的相似度的。
One hot不能够表达语义相似度,而且带来sparsity稀疏性问题。
所以采用分布式词向量!
如何得到分布式词向量?
七、句子间的相似度计算
余弦相似度里的分母是两个模即范数相乘,可以被看做分母整体是normalization,
否则 分子内积的结果可能很大,也可能很小,除以分母后,便可以被控制在一个区间内。
八、Noisy channel model (LM由来)
九、POS Tagging
POS Tagging仍不是很全,以后会单独写一篇专门说相关的方法。
转载:https://blog.csdn.net/qq_22795223/article/details/105758132