本文是关于本人研究生期间自然语言处理课程的学习笔记,仅仅是为了方便自己整理和记忆知识点,不能保证所提到知识点全部正确,并且文章结构可能会比较零碎和杂乱,尽量在一段时间后定期整理笔记。
语义理解:(1) 语义相似 (2) 语义关系 (3) 语篇关系 (4) 知识图谱
NLP 任务:文本分类/聚类/摘要、信息检索、检索式对话生成系统
噪声信道模型
熵 Entropy
$$
H(x)=-\sum_{x\in X}p(x)\log_2p(x)
$$
联合熵 Joint Entropy
$$
H(X,Y)=-\sum_{x\in X}\sum_{y\in Y}p(x,y)\log p(x,y)
$$
条件熵 Conditional Entropy
$$
H(Y|X)=\sum_{x\in X}p(x)H(Y|X=x)
$$
$$
H(X|X)=0
$$
$$
H(X_1,X_2,…,X_n)=H(X_1)+H(X_2|X_1)+…+H(X_n|X_1,X_2,…,X_n)
$$
相对熵 Relative Entropy
$$
D(P||Q)=\sum_{x\in X}p(x)\log\frac{p(x)}{q(x)}
$$
它表示对同一随机变量的两个概率分布之间的不同,又称 KL 散度。相对熵是非对称的。$D(P||Q)\geq0$
互信息
$$
I(X,Y)=D(p(x,y)||p(x)p(y))
$$
它表示联合分布与独立分布之间的不同
交叉熵 Cross Entropy
$$
H(X,Q)=-\sum_{x}P(x)\log Q(x)
$$
P(x) 是真实分布,Q(x) 是预测分布
$$
H(X,Q)=H(X)+D(p||Q)
$$
熵率
$$
\frac{1}{n}H(X_1^n)\quad\quad x_i,i=1,2,…,n
$$
混乱度
以下是一个NLP网课的笔记。
一、语言模型
NLP 的一个基本问题是:给定一串字幕,确定下一个最大可能性出现的字母是什么?
语言模型就是用于评估文本符合语言使用习惯程度的模型。
如果每个单词 $w_i$ 都要依赖于从第一个单词 $w_1$ 到它之前一个单词 $w_{i-1}$ 的影响,则:
$$
p(w_1w_2…w_n)=p(w_1)p(w_2|w_1)p(w_3|w_2w_1)…p(w_n|w_{n-1}…w_2w_1)
$$
则参数空间过大,不容易计算,并且数据稀疏严重,单词同时出现的概率可能为0,这会导致最终的结果为0.
n-gram(n 元文法)语言模型是一种基于统计语言的模型,是一个基于概率的判别模型,它的输入是一句话(单词的顺序序列),输出是这句话的概率,即这些单词的联合概率。常用的有 Bi-gram(n=2)和 Tri-gram(n=3)。
n-gram 就是把每 n 个单词看作一个字节片段,该模型基于马尔科夫假设:假设在一段文本中,第 n 个词的出现只于它前面 n-1 个词相关。这个假设大大简化了计算过程。
n-gram 语言模型的评价方法:困惑度/混乱度(perplexity),其基本思想是给测试集赋予较高概率值的语言模型较好
二、语料库和语言知识库
语料库:存放在计算机中的原始语料文本或经过加过后带有语言学信息标注的语料文本。
三、词法分析
词法分析任务:将句子转换为词序列并标记句子中的词的词性。
英文词法分析(曲折语):1. 英文单词识别、词形还原 2. 未登录词处理 3. 英文词性标注
中文词法分析(孤立语):1. 分词 2. 未登录词识别 3. 词性标注
分词涉及到的问题有:1. 分词标准 2. 切分歧义问题(分词阶段最困难的问题) 3. 未登录词处理
切分歧义可分为交集型歧义和组合型歧义,前者是指字串 abc 既可以分为 ab/c,又可以分为 a/bc。组合型歧义是指 ab 为词,而 a 和 b 在句子中又可以分别单独成词。而以上两种的混合为混合型歧义。
自动分词算法有基于(语言学)规则的方法和基于统计的方法。基于规则的方法需要事先建立好分词词典,经典的算法有最大匹配法(Maximum Matching, MM)。最大匹配算法可分为正向/逆向/双向最大匹配算法。正向最大匹配算法是从左到右将待分词文本中国你的几个连续字符在字典中找其最大匹配的词,并据此进行划分。其优点是程序简单,缺点是会受词典大小的影响。基于统计的方法利用字与字之间、词与词之间的同时出现的频率作为分词的依据。这种方法需要大量标注的语料库。
英文的自动分词工具有 NLTK,中文的自动分词工具有 jieba 和 pkuseg(效果更好)等。
TF-IDF 算法
可用该算法提取关键字
$$
词频(TF)=\frac{某个词在文章中出现的次数}{文章的总词数}
$$
但是当多个词在同一篇文章中出现的次数一样时,它们的重要性可能是不一样的,当不常见的词出现的次数较多时,则该词就很重要了,所以又引入了以下概念:
$$
逆文档频率(IDF)=\log\frac{语料库的文档总数}{包含该词的文档数+1}
$$
$$
TF-IDF=词频(TF)\times 逆文档频率(IDF)
$$
PageRank 算法
把互联网看作一个有向图,每个网页看作一个节点,而如果网页 A 中有指向网页 B 的超链接,则在有向图中有一个从节点 A 指向节点 B 的有向边。
网页重要性的计算公式为:
$$
S(V_i)=(1-d)+d\times \sum_{j\in In(V_i)}\frac{1}{|Out(V_j)|}S(V_j)
$$
其中 d 是阻尼系数,一般设置为 0.85。$In(V_i)$ 是存在指向网页 i 的链接的网页集合。$Out(V_j)$ 是网页 j 中的链接指向的网页的集合。在初始时,每个网页的重要性 $S(V_i)$ 可以设为 1,利用以上公式经过多次迭代便可以得到最终结果。
该公式表示一个网页的重要性由指向该网页的超链接所在的网页的重要性所决定。
TextRank 自动摘要
在 TextRank 所构建的图中,节点就是句子,权重 w 就是两个句子 $S_i$ 和 $S_j$ 的相似程度,两个句子的相似度用以下公式来计算:
$$
Similarity(S_i,S_j)=\frac{(w_k|w_k\in S_i\quad&\quad w_k\in S_j)}{\log(|S_i|)+\log(|S_j|)}
$$
TextRank 公式在 PageRank 公式的基础上,为图中的边引入了权值的概念:
$$
WS(V_i)=(1-d)+d\times \sum_{j\in In(V_i)}\frac{w_{ji}}{\sum_{V_k\in Out(V_j)}w_{jk}}WS(V_j)
$$
其中 $w_{ij}$ 是从节点 $V_i$ 到 $V_j$ 的边的权值。
算法流程为:将文本进行分词和词性标注处理,去除停用词或词性筛选等之后,设定窗口长度为 K,即最多只能出现 K 个词,进行窗口滑动,在窗口中共同出现的词之间即可建立起无向边。初始化边的权重, 根据公式进行迭代权重,直到收敛。则词的重要性最大的几个词就为提取到的关键词。
四、句法分析
句法分析的任务就是确定句子的句法结构或句子中词汇之间的依存关系。
句法分析的分类如下图所示:
完全句法分析是确定句子包含的全部句法信息,并确定句子中各成分之间的关系。局部句法分析只要求识别句子中某些结构相对简单的独立成分。依存句法分析需要分析出词与词之间的依存关系。
依存句法通过分析语言单位内成分之间的依存关系来解释其句法结构,主张句子中核心动词是支配其他成分的中心成分,而它本身却不受其他任何成分的支配,所有受支配成分都以某种关系从属于支配者。需满足 5 个条件:
(1)一个句子中只有一个成分是独立的
(2)句子的其他成分都从属于某一成分
(3)任何一个成分都不能依存于两个或两个以上的成分
(4)如果成分A直接从属成分B,而成分C在句子中位于A和B之间,那么,成分C或者从属于A,或者从属于B,或者从属于A和B之间的某一成分
(5)中心成分左右两边的其他成分相互不发生关系
词与词之间直接发生依存关系,构成一个依存对,其中一个是核心词,也称为支配词,另一个叫修饰词,也称为从属词。依存关系用一个有向弧表示,叫做依存弧,其方向可自己定义。
可以使用 spacy 来进行句法分析,其安装语句为 pip install spacy,下载英文数据及其对应模型: python -m spacy download en
五、语义分析
语义分析可以分为词语语义分析和句子语义分析。
词语语义分析
词语相似度就是两个词语在不同的上下文中可以相互替代使用而不改变文本的句法语义结构的程度。其取值范围一般为 [0,1]。
当直接计算词语相似度比较困难时,可以先计算词语距离,再转换为词语相似度。词语相似度 $Sim(W_1,W_2)$ 与词语距离 $Dis(W_1,W_2)$ 的关系为:
$$
Sim(W_1,W_2)=\frac{\alpha}{Dis(W_1,W_2)+\alpha}
$$
其中 $\alpha$ 是一个可调节的参数,其含义为:当相似度为 0.5 时的词语距离值。
词语相关性是指两个词语相互关联的程度,可以用两个词语在同一语境中共同出现的可能性来衡量。其取值范围一般为 [0,1]。
词语相似度的计算方法:在由一棵或多棵树形成的同义词词典中,两个概念的语义距离可以表示为对应节点之间的路径长度。除此之外还可以考虑概念层次树的深度(如果两对概念之间的路径长度相等,则处于语义树较低层的语义距离更小)以及概念层次树的区域密度(如果两对概念之间的路径长度相等,则处于较高密度区域的语义距离更大)。
句子语义分析
知网(hownet)不同于查论文的中国知网,是一个主要面向中文的大型的语言知识库。
句子(语义)相似度的计算可以分为两种方法:基于向量空间模型的方法和对语句进行完全的句法与语义分析。前者将句子看作词的线性序列,用组成句子的词的词频和词性等信息来衡量语句相似度;后者在两个句子进行深层的句法、语义分析的基础上进行相似度的计算。
基于语义依存的汉语句子相似度计算:对句子进行依存分析,然后再依存结构的基础上计算句子相似度。
有效搭配对:全句核心词和直接依存于其有效词组成的搭配对,这里有效词定义为动词、名次和形容词。
(1)基于关键词匹配的方法
相似度计算公式:
$$
Sim(Sen1,Sen2)=\frac{\sum_{i=1}^nW_i}{Max(PairCount1,PairCount2)}
$$
其中 $\sum_{i=1}^nW_i$ 是句子1和句子2有效搭配对匹配的总权重,PairCount1 是句子1的有效搭配对数。如果两个搭配对 a=b c=d,则匹配权重为1;如果 a=b c!=d 或 a!=b c=d,则匹配权重为 0.5;如果 a!=b c!=d,则匹配权重为 0。
(2)基于语义匹配的方法
利用知网对词做义元分析,即对经过分词和词性标注后的句子进行语义消歧,并在每个词后标注上相应的语义号。匹配权重的计算方法与上述相同。
(3)关键词与语义融合的方法
$$
S(Sen1,Sen2)=\lambda Sim_{关键词}(Sen1,Sen2)+(1-\lambda)Sim_{语义}(Sen1,Sen2)
$$
六、词向量
词向量就是用向量的形式来表示自然语言中词的方法,常用的方式有以下几种:
- One-hot(独热)向量:如果有 n 个词,则把每个词编码为 n 维的 one-hot 向量。但是这种方式存在词汇鸿沟(无法表示词与词之间的相关性)以及维度灾难等问题。
- Distributed Representation(Word Embeding):通过训练将词表示成固定长度的短向量,相似的词向量之间距离相近。
NNLM(神经网络语言)模型
所用到的神经网络主要可分为输入层、投影层、隐藏层和输出层。假设语料库有 10w 个词,投影层有 300 个神经元,滑动窗口为 3 时,滑动窗口会遍历整个语料库,每次向神经网络输入 3 个词。输入的词向量和投影矩阵 C 相乘就把 10w 维的向量转化为了 300 维的向量。投影层再采用全连接的方式与隐藏层连接,并经过 tanh 激活函数激活后进行输出。隐藏层和输出层也是全连接的方式,经过 softmax 函数处理后得到最终的结果。经过多次反向传播更新参数后,投影矩阵 C 的每一列就是对应的每个词的词向量表示。
word2vec
word2vec 是用于生成词向量的计算模型,不仅高效,而且还可以获得不同词之间的相似性。
CBOW 模型
输入是某个特征词的上下文相关的词对应的向量,输出是这个特定词的词向量。
无隐藏层,使用双向上下文窗口(由当前词的上下文确定该词),输入层直接使用低维稠密表示,投影层简化为加和取平均。
目标函数:$J=\sum_{i\in corpus,context(i)}\log(\frac{exp(w_i^T\bar{w}j)}{\sum{k=1}^Vexp(w_i^T\bar{w}_k)})$
负例采样:词典中的每一个词对应一条线段,所有词组成了 [0,1] 之间的剖分
$$
len(w)=\frac{counter(w)}{\sum_{u\in D}counter(u)}
$$
Skip-gram 模型:输入是特定词的词向量,而输出是该特定词的上下文词向量。无隐藏层,投影层也可以省略,每个词向量作为 log-linear 模型的输入
word2vec 有两种改进方式,一种是基于层次 softmax 的,另一种是基于负例采样(Negative Sampling)的。
negative sampling 本质是预测总体类别的一个子集
层次 softmax
在 CBOW 模型或 Skip-gram 模型的输出层会用 softmax 计算所有词向量的概率,这无疑是很浪费时间的。可以用霍夫曼树来代替隐藏层和输出层的神经元,霍夫曼树的叶子节点相当于输出层的神经元,第 i 个叶子节点对应着语料库中的第 i 个词,每个词在语料库中出现的次数作为叶子节点的权重。 而内部节点则起到隐藏层神经元的作用。在霍夫曼树中,隐藏层到输出层的 softmax 映射不是一下子完成的,而是沿着霍夫曼树一步步完成的,因此这种 softmax 取名为”Hierarchical Softmax”。
哈夫曼树的每一次分支可以看作是一次二分类。对于词典 D 中的任意词 w,在哈夫曼树中必然只存在一条从根节点到对应的叶子节点的路径,这条路径上的每一个分支看作是一次二分类,每一次二分类就产生一个概率,将这些概率乘起来就是要求的 $p(w|Context(w))$。
下面以 CBOW 模型为例,说一下神经网络的损失函数、输入、输出及计算流程,尽量不涉及复杂的公式推导。
由于我们要用某个词的上下文信息推导出该词,也就是让条件概率 $p(w|Context(w))$ 最大。其中 w 是所求词,Context(w) 是该词的上下文(也就是前后各 k 个词)。那么损失函数可以设为:
$$
Loss=\log p(w|Context(w))
$$
模型的输入是所求词前后各 k 个词对应的词向量,输出是所求词的词向量。与原始的 CBOW 模型不同的是,从输入层到投影层不再是做全连接和激活函数,而是将输入的这 2k 个词向量求和(对应的元素相加)。求和后的词向量直接作为哈夫曼树(输出层)的输入,计算所经过的路径后相应叶子节点的概率值。
使用霍夫曼树有什么好处呢?首先,由于是二叉树,之前计算量为V,现在变成了log2V。第二,由于使用霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合我们的贪心优化思想。
七、文本分类
文本分类系统主要包括预处理、文本表示和分类器等过程。
文本分类步骤:文本表示、文本特征、分类器设计、文本分类性能评测
文本表示就是用计算机可处理的方式表示文本,常见的有向量空间模型(VSM),也称为词袋模型(BOW)
评测指标:准确率和召回率
$$
准确率\quad P=\frac{分类正确的文本数}{总的文本数}\times100%
$$
$$
召回率\quad R=\frac{分类正确的文本数}{应有的文本数}\times100%
$$
- 本文作者: 俎志昂
- 本文链接: zuzhiang.cn/2019/09/24/NLP/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!