Commit a0852880 by xiaotong

updates of section 2

parent 98068d40
......@@ -87,7 +87,7 @@
\parinterval 随后,更多的翻译工作是在文化和知识传播中开展。其中一个典型代表是宗教文献的翻译。在人类的历史长河中,宗教是人类意识形态的一个重要载体。为了宣传教义,产生了大量的宗教文献。在西方,一项最早被记录的翻译活动是将旧约圣经(希伯来文及埃兰文)翻译为希腊文版本。并且迄今为止人类历史上翻译版本最多的书就是圣经。在中国唐代,一个著名的人物是玄奘,他不仅是佛学家、旅行家,还是翻译家。玄奘西行求法归来后把全部的心血和智慧奉献给了译经事业,在助手们的帮助下,共翻译佛教经论74部,1335卷,每卷万字左右,合计1335万字,占去整个唐代译经总数的一半以上,是翻译史上的杰出典范。
\parinterval 翻译在人类历史长河中起到了重要的作用。一方面,语言文字、文化和地理位置的差异性,使得翻译成为一个重要的需求;另一方面,翻译也加速了不同文明的融会贯通,促进了世界的发展。今天,翻译已经成为重要的行业之一,包括各个高校也都设立了翻译及相关专业,相关人才不断涌现。据《2019年中国语言服务行业发展报告》统计:全球语言服务产值预计将首次接近500亿美元;中国涉及语言服务的在营企业360,000余家,语言服务为主营业务的在营企业近万家,总产值超过300亿元,年增长3\%以上;全国开设外语类专业的高校数量多达上千所,其中设立有翻译硕士(MTI)和翻译本科(BTI)专业的院校分别有250余所和280余所,MTI累计招生数达6万余人。当然,面对着巨大的需求,如何使用技术手段提高人工翻译效率,比如:机器辅助翻译,也是人工翻译和机器翻译领域需要共同探索的方向。
\parinterval 翻译在人类历史长河中起到了重要的作用。一方面,语言文字、文化和地理位置的差异性,使得翻译成为一个重要的需求;另一方面,翻译也加速了不同文明的融会贯通,促进了世界的发展。今天,翻译已经成为重要的行业之一,包括各个高校也都设立了翻译及相关专业,相关人才不断涌现。据《2019年中国语言服务行业发展报告》统计:全球语言服务产值预计将首次接近500亿美元;中国涉及语言服务的在营企业360,000余家,语言服务为主营业务的在营企业近万家,总产值超过300亿元,年增长3\%以上;全国开设外语类专业的高校数量多达上千所,其中设立有翻译硕士(MTI)和翻译本科(BTI)专业的院校分别有250余所和280余所,MTI累计招生数达6万余人{\color{red} 参考文献!我记得是不是译协发布过报告}。当然,面对着巨大的需求,如何使用技术手段提高人工翻译效率,比如:机器辅助翻译,也是人工翻译和机器翻译领域需要共同探索的方向。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{机器翻译的萌芽}
......
......@@ -6,24 +6,24 @@
xlabel={{$\textrm{P}(x)$}},
ylabel={{$\textrm{I}(x)$}},
ylabel style={yshift=-1.5em,font=\footnotesize},
xlabel style={yshift=0.3em,font=\footnotesize},
xlabel style={yshift=0.3em,font=\footnotesize},
xtick={0,0.2,...,1.0},
ytick={0,1,2},
y tick style={opacity=0},
x tick style={opacity=0},
domain=0:1,
ytick={0,8},
y tick style={opacity=0},
x tick style={opacity=0},
domain=0.01:1,
enlarge x limits=true,
enlarge y limits={upper},
legend style={draw=none},
xmin=0,
xmax=1,
ymin=0,
ymax=2,
ymax=8,
xticklabel style={font=\small}, %坐标轴字体大小
yticklabel style={font=\small}
]
\addplot[draw=blue!40,thick] {170*exp(-x-4)-1};
\legend{\footnotesize{$\textrm{I}(x) \cdot \textrm{P}(x)$}}
\addplot[draw=ublue,samples=100,thick] {-log2(x)};
\legend{\footnotesize{$\textrm{I}(x) = -\log \textrm{P}(x)$}}
\end{axis}
\end{tikzpicture}
......
......@@ -103,7 +103,7 @@
\node [anchor=north west] (data42) at (data32.south west) {$\textrm{P}(\textrm{“确实”}) \cdot \textrm{P}(\textrm{“现在”}) \cdot \textrm{P}(\textrm{“数据”}) \cdot $};
}
{
\node [anchor=north west] (data43) at ([yshift=-0.2em]data33.south west) {\color{red}{\textbf{输出}}};
\node [anchor=north west] (data43) at ([yshift=-0.2em,xshift=3em]data33.south west) {\color{red}{\textbf{输出}}};
\draw [->,red,thick] (data43.west)--([xshift=-1em]data43.west);
}
{
......
......@@ -255,8 +255,8 @@ F(X)=\int_{-\infty}^x f(x)dx
\noindent 其中,等式右端的分母部分使用了全概率公式。由上式,我们也可以得到贝叶斯公式的另外两种写法:
\begin{eqnarray}
\textrm{P}(A \mid B) & = & \frac { \textrm{P}(A \mid B)\textrm{P}(B) } {\textrm{P}(A)} \\
\textrm{P}(A \mid B) & = & \frac { \textrm{P}(A \mid B)\textrm{P}(B) } {\textrm{P}(A \mid B)\textrm{P}(B)+\textrm{P}(A \mid \bar{B}) \textrm{P}(\bar{B})}
\textrm{P}(A \mid B) & = & \frac { \textrm{P}(A \mid B)\textrm{P}(B) } {\textrm{P}(A)} \nonumber \\
& = & \frac { \textrm{P}(A \mid B)\textrm{P}(B) } {\textrm{P}(A \mid B)\textrm{P}(B)+\textrm{P}(A \mid \bar{B}) \textrm{P}(\bar{B})}
\label{eq:2.2-16}
\end{eqnarray}
%--------------------------------------------
......@@ -266,9 +266,9 @@ F(X)=\int_{-\infty}^x f(x)dx
\subsection{KL距离和熵}\index{Chapter2.2.5}
\subsubsection{(一)信息熵}\index{Chapter2.2.5.1}
\subsubsection{信息熵}\index{Chapter2.2.5.1}
\parinterval {\small\sffamily\bfseries{}}entropy)是热力学中的一个概念,同时也是对系统无序性的一种度量标准,在自然语言处理领域也会使用到信息熵这一概念,比如描述文字的信息量大小。一条信息的信息量大小与它的不确定性有着直接的关系,如果我们需要确认一件非常不确定甚至于一无所知的事情,那么需要理解大量的相关信息才能确认清楚;同样的,如果我们对某件事已经非常确定,那么就不需要太多的信息就可以把它搞清楚。
\parinterval {\small\sffamily\bfseries{}}Entropy)是热力学中的一个概念,同时也是对系统无序性的一种度量标准。在自然语言处理领域也会使用到信息熵这一概念,比如描述文字的信息量大小。一条信息的信息量可以被看作是这条信息的不确定性。如果我们需要确认一件非常不确定甚至于一无所知的事情,那么需要理解大量的相关信息才能进行确认;同样的,如果我们对某件事已经非常确定,那么就不需要太多的信息就可以把它搞清楚。如下就是两个例子,
\begin{example}
确定性和不确定性的事件
......@@ -279,66 +279,66 @@ F(X)=\int_{-\infty}^x f(x)dx
\label{e.g:2.2-1}
\end{example}
\parinterval 在这两句话中,``太阳从东方升起''是一件确定性事件,几乎不需要查阅更多信息就可以确认,因此这件事的信息熵相对较低;而``明天天气多云''这件事,我们需要询问气象局的相关研究人员,或者关注天气预报,才能大概率确定的一件事,它的不确定性很高,因而它的信息熵也就相对较高。因此,信息熵也是对事件不确定性的度量。
\parinterval 一个事件X的自信息(self-information)的表达式为:
\parinterval 在这两句话中,``太阳从东方升起''是一件确定性事件(在地球上),几乎不需要查阅更多信息就可以确认,因此这件事的信息熵相对较低;而``明天天气多云''这件事,我们需要关注天气预报,才能大概率确定这件事,它的不确定性很高,因而它的信息熵也就相对较高。因此,信息熵也是对事件不确定性的度量。进一步,我们定义{\small\bfnew{自信息}}(Self-information):一个事件$X$的自信息的表达式为:
\begin{eqnarray}
\textrm{I}(x)=-\log\textrm{P}(x)
\label{eq:2.2-17}
\end{eqnarray}
\parinterval 其中,$\textrm{P}(x)$表示概率,自信息用来衡量单一事件发生时所包含的信息多少,当底数为e时,单位为$nats$,其中1$nats$是通过观察概率为$\frac{1}{e}$的事件而获得的信息量;当底数为2时,单位为$bits$$shannons$,我们通常使用前者。$\textrm{I}(x)$$\textrm{P}(x)$的函数关系如图\ref{fig:2.2-4} 所示:
\noindent 其中,$\textrm{P}(x)$表示$x$发生的概率。自信息用来衡量单一事件发生时所包含的信息多少,当底数为e时,单位为nats,其中1nats是通过观察概率为$\frac{1}{e}$的事件而获得的信息量;当底数为2 时,单位为bits或shannons。$\textrm{I}(x)$$\textrm{P}(x)$的函数关系如图\ref{fig:2.2-4} 所示。
%----------------------------------------------
% 图2.6
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-Self-information-function}
\caption{自信息函数图像}
\caption{自信息函数$\textrm{I}(x)$关于$\textrm{P}(x)$的曲线}
\label{fig:2.2-4}
\end{figure}
%-------------------------------------------
\parinterval 自信息只处理单一的结果。若量化整个概率分布中的不确定性或者说信息量,我们可以用信息熵,其公式如下:
\parinterval 自信息处理的是变量单一取值的情况。若量化整个概率分布中的不确定性或信息量,可以用信息熵,记为$\textrm{H}(x)$。其公式如下:
\begin{eqnarray}
\textrm{H}(x)=\sum_{x \in \textrm{X}}[ \textrm{P}(x) \textrm{I}(x)] =- \sum_{x \in \textrm{X} } [\textrm{P}(x)\log(\textrm{P}(x)) ]
\textrm{H}(x) & = & \sum_{x \in \textrm{X}}[ \textrm{P}(x) \textrm{I}(x)] \nonumber \\
& = & - \sum_{x \in \textrm{X} } [\textrm{P}(x)\log(\textrm{P}(x)) ]
\label{eq:2.2-18}
\end{eqnarray}
\parinterval 一个分布的信息熵也就是从该分布中得到的一个事件的期望信息量。比如,$a$$b$$c$$d$三支球队,三支队伍夺冠的概率分别是$P_1$$P_2$$P_3$$P_4$,某个人对比赛不感兴趣但是又想知道哪只球队夺冠,通过使用二分法2次就确定哪支球队夺冠了。但其实,我们知道这四只球队中c的实力比较强劲,那么猜1次就可以确定。所以对于前者,哪只球队夺冠的信息量较高,信息熵也相对较高,对于后者信息量和信息熵也就相对较低。因此我们可以得知:较为尖锐的分布具有较低的熵;分布越接近均匀熵越大
\parinterval 一个分布的信息熵也就是从该分布中得到的一个事件的期望信息量。比如,$a$$b$$c$$d$四支球队,四支队伍夺冠的概率分别是$P_1$$P_2$$P_3$$P_4$,某个人对比赛不感兴趣但是又想知道哪只球队夺冠,通过使用二分法2次就确定哪支球队夺冠了。但其实,我们知道这四只球队中$c$的实力可以碾压其它球队,那么猜1次就可以确定。所以对于前面这种情况,哪只球队夺冠的信息量较高,信息熵也相对较高;对于后面这种情况,因为结果是容易猜到的,信息量和信息熵也就相对较低。因此可以得知:分布越尖锐熵越低;分布越均匀熵越高
\subsubsection{(二)KL距离}\index{Chapter2.2.5.2}
\subsubsection{KL距离}\index{Chapter2.2.5.2}
\parinterval 如果在相同的随机变量$X$上有两个独立的概率分布P$(x)$和Q$(x)$,那么我们可以使用KL距离("Kullback-Leibler" 散度)来衡量这两个分布的不同,也就是大家所说的相对熵,其公式如下:
\parinterval 如果同一个随机变量$X$上有两个独立的概率分布P$(x)$和Q$(x)$,那么可以使用KL距离("Kullback-Leibler" 散度)来衡量这两个分布的不同,这种度量就是{\small\bfnew{相对熵}}(Relative Entropy)。其公式如下:
\begin{eqnarray}
\textrm{D}_{\textrm{KL}}(\textrm{P}\parallel \textrm{Q}) & = & \sum_{x \in \textrm{X}} [ \textrm{P}(x)\log \frac{\textrm{P}(x) }{ \textrm{Q}(x) } ] \nonumber \\
& = & \sum_{x \in \textrm{X} }[ \textrm{P}(x)(\log\textrm{P}(x)-\log \textrm{Q}(x))]
\label{eq:2.2-19}
\end{eqnarray}
\parinterval 这一概念的意义在于:在相同事件空间里,概率分布$\textrm{P}(x)$对应的每个事件,若用概率分布Q$(x)$编码时,平均每个基本事件的信息量增加了多少。它衡量的是相同事件空间里的两个概率分布的差异情况。KL距离有两条重要的性质:
\parinterval 相对熵的意义在于:在一个事件空间里,概率分布$\textrm{P}(x)$对应的每个事件的可能性。若用概率分布Q$(x)$编码$\textrm{P}(x)$,平均每个事件的信息量增加了多少。它衡量的是同一个事件空间里两个概率分布的差异。KL距离有两条重要的性质:
\vspace{0.5em}
\begin{itemize}
\item 非负性,即$\textrm{D}_{\textrm{KL}} (\textrm{P} \parallel \textrm{Q}) \geqslant 0$,等号成立条件是$P$$Q$在离散情况下具有相同的概率分布,在连续条件下处处相等。可简单理解为$P$$Q$等价
\item 非负性,即$\textrm{D}_{\textrm{KL}} (\textrm{P} \parallel \textrm{Q}) \ge 0$,等号成立条件是$\textrm{P}$$\textrm{Q}$相等
\vspace{0.5em}
\item 不对称性,即$\textrm{D}_{\textrm{KL}} (\textrm{P} \parallel \textrm{Q}) \neq \textrm{D}_{\textrm{KL}} (\textrm{Q} \parallel \textrm{P})$,所以$KL$距离并不代表我们日常生活中的那个距离。这种不对称性意味着在选择使用$\textrm{D}_{\textrm{KL}} (\textrm{P} \parallel \textrm{Q})$或者$\textrm{D}_{\textrm{KL}} (\textrm{Q} \parallel \textrm{P})$,将会产生重要的影响
\item 不对称性,即$\textrm{D}_{\textrm{KL}} (\textrm{P} \parallel \textrm{Q}) \neq \textrm{D}_{\textrm{KL}} (\textrm{Q} \parallel \textrm{P})$,所以$\textrm{KL}$距离并不是我们常用的欧式空间中的距离。为了消除这种不确定性,有时也会使用$\textrm{D}_{\textrm{KL}} (\textrm{P} \parallel \textrm{Q})+\textrm{D}_{\textrm{KL}} (\textrm{Q} \parallel \textrm{P})$作为度量两个分布差异性的函数
\end{itemize}
\vspace{0.5em}
\subsubsection{(三)交叉熵}\index{Chapter2.2.5.3}
\subsubsection{交叉熵}\index{Chapter2.2.5.3}
\parinterval 交叉熵是一个与KL距离密切相关的概念,它的公式是:
\parinterval {\small\bfnew{交叉熵}}(Cross-entropy)是一个与KL距离密切相关的概念,它的公式是:
\begin{eqnarray}
\textrm{H}(\textrm{P},\textrm{Q})=-\sum_{x \in \textrm{X}} [\textrm{P}(x) \log \textrm{Q}(x) ]
\label{eq:2.2-20}
\end{eqnarray}
\parinterval 结合相对熵公式可知,交叉熵是KL距离公式中的右半部分。因此,求关于Q的交叉熵的最小值等价于求KL距离的最小值。交叉熵与KL距离的意义相同:都是用来描述两个分布的差异,由于交叉熵计算上更加直观方便,因此在机器翻译中被广泛应用。
\parinterval 结合相对熵公式可知,交叉熵是KL距离公式中的右半部分。因此,求关于Q的交叉熵的最小值等价于求KL距离的最小值。从实践的角度来说,交叉熵与KL距离的目的相同:都是用来描述两个分布的差异,由于交叉熵计算上更加直观方便,因此在机器翻译中被广泛应用。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{中文分词}\index{Chapter2.3}
\parinterval 对于机器翻译系统而言,输入的是已经切分好的单词序列,而不是原始的字符串。比如,对于一个中文句子,单词之间是没有间隔的,因此我们需要把一个个的单词切分出来,这样机器翻译系统可以区分不同单元。甚至,我们可以对语言学上的单词进行进一步切分,得到词片段序列(比如:中国人$\Rightarrow$中国 人)。我们可以把上述过程看作是一种{\small\sffamily\bfseries{分词}}(segmentation)过程,即:将一个输入的自然语言字符串切割成单元序列(token序列),每个单元都对应可以处理的最小单位。
\parinterval 对于机器翻译系统而言,输入的是已经切分好的单词序列,而不是原始的字符串(图\ref{fig:2.3-1})。比如,对于一个中文句子,单词之间是没有间隔的,因此我们需要把一个个的单词切分出来,这样机器翻译系统可以区分不同的翻译单元。甚至,我们可以对语言学上的单词进行进一步切分,得到词片段序列(比如:中国人$\to$中国/人)。我们可以把上述过程看作是一种{\small\sffamily\bfseries{分词}}(Segmentation)过程,即:将一个输入的自然语言字符串切割成单元序列(token序列),每个单元都对应可以处理的最小单位。
%----------------------------------------------
% 图2.7
......@@ -350,9 +350,9 @@ F(X)=\int_{-\infty}^x f(x)dx
\end{figure}
%-------------------------------------------
%\vspace{-0.5em}
\parinterval 分词得到的单元序列可以是语言学上的词序列,也可以是根据其它定义的单元。在本章中,我们把分词得到的一个个单元称为单词,尽管这些单元可以不是语言学上的完整单词。而这个过程也被称作词法分析。除了汉语,词法分析在日语、泰语等单词之间无明确分割符的语言中有着广泛的应用,芬兰语、维吾尔语等一些形态学十分丰富的语言,也需要使用词法分析来解决复杂的词尾、词缀变化等形态学变化。
\parinterval 分词得到的单元序列可以是语言学上的词序列,也可以是根据其它方式定义的基本处理单元。在本章中,我们把分词得到的一个个单元称为{\small\bfnew{单词}}(Word),或{\small\bfnew{}},尽管这些单元可以不是语言学上的完整单词。而这个过程也被称作{\small\bfnew{词法分析}}(Lexical Analysis)。除了汉语,词法分析在日语、泰语等单词之间无明确分割符的语言中有着广泛的应用,芬兰语、维吾尔语等一些形态学十分丰富的语言,也需要使用词法分析来解决复杂的词尾、词缀变化等形态学变化。
\parinterval 在机器翻译中,分词系统的好坏往往会决定机器翻译的质量。分词的目的是定义系统处理的基本单元,那么什么叫做``词''呢?关于词的定义有很多,比如:\\
\parinterval 在机器翻译中,分词系统的好坏往往会决定译文的质量。分词的目的是定义系统处理的基本单元,那么什么叫做``词''呢?关于词的定义有很多,比如:\\
%-------------------------------------------
\begin{definition}
......@@ -374,7 +374,7 @@ F(X)=\int_{-\infty}^x f(x)dx
\parinterval 从语言学的角度,普遍认为词是可以单独运用的、包含意义的基本单位。我们使用有限的词可以组合出无限的句子,这也正体现出自然语言的奇妙之处。
\parinterval 不过,机器翻译并不仅仅局限在语言学定义的单词,因此机器翻译系统所使用的分词也不仅仅把句子按照词切开,比如,神经机器翻译中广泛使用的BPE子词切分方法,可以被理解为将词的一部分也进行切开,也就是得到词片段送给机器翻译系统使用。比如,对如下英文字符串,可以得到如下切分结果
\parinterval 不过,机器翻译并不仅仅局限在语言学定义的单词。比如,神经机器翻译中广泛使用的BPE子词切分方法(第七章),可以被理解为将词的一部分也进行切开,也就是得到词片段送给机器翻译系统使用。比如,对如下英文字符串,可以得到如下切分结果
\vspace{0.5em}
\parinterval Interesting \; $\to$ \; Interest/ing selection \hspace{0.08em} $\to$ \;se/lect/ion procession \hspace{0.43em} $\to$ \; pro/cess/ion
......@@ -389,7 +389,7 @@ F(X)=\int_{-\infty}^x f(x)dx
\subsection{基于词典的分词方法}\index{Chapter2.3.1}
\parinterval 然而,计算机并不能像人类一样在概念上理解``词'',因此需要使用其他的方式让计算机可以进行分词。一个最简单的方法就是给定一个词典,在这个词典中出现的汉字组合就是我们定义的``词''。也就是,我们通过一个词典定义一个标准,符合这个标准定义的字符串都是合法的``词''。
\parinterval 然而,计算机并不能像人类一样在概念上理解``词'',因此需要使用其方式让计算机可以进行分词。一个最简单的方法就是给定一个词典,在这个词典中出现的汉字组合就是我们定义的``词''。也就是,我们通过一个词典定义一个标准,符合这个标准定义的字符串都是合法的``词''。
\parinterval 在使用基于词典的分词方法时,只需预先加载词典到计算机中,扫描输入句子,查询每个词串是否出现在词典中。如图\ref{fig:2.3-2} 所示,比如,我们有一个包含六个词的词典,给定输入句子``确实现在物价很高''后,我们自左至右遍历输入句子的每个字,发现词串``确实''在词典中出现,说明``确实''是一个``词'',进行分词操作并在切分该``词''之后重复这个过程。
%----------------------------------------------
......@@ -397,7 +397,7 @@ F(X)=\int_{-\infty}^x f(x)dx
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-Example-of-word-segmentation-based-on-dictionary}
\caption{基于词典进行分词实例}
\caption{基于词典进行分词实例}
\label{fig:2.3-2}
\end{figure}
%-------------------------------------------
......@@ -414,23 +414,23 @@ F(X)=\int_{-\infty}^x f(x)dx
\end{figure}
%-------------------------------------------
\parinterval 类似的例子在生活中也很常见。再比如``答辩结束的和尚未答辩的同学都请留在教室''一句中,正常的分词结果是``答辩 结束 的 和 尚未 答辩 的 同学 都 请 留在 教室'',但是由于``尚未''、``和尚''都是常见词汇,使用基于词典的分词方法在这时很容易出现切分错误。
\parinterval 类似的例子在生活中也很常见。再比如``答辩结束的和尚未答辩的同学都请留在教室''一句中,正常的分词结果是``答辩/结束/的/和/尚未/答辩/的/同学/都/请/留在/教室'',但是由于``尚未''、`` 和尚''都是常见词汇,使用基于词典的分词方法在这时很容易出现切分错误。
\parinterval 基于词典的分词方法是典型的基于规则的方法,完全依赖于人工给定的词典。在遇到歧义时,需要人工定义消除歧义的规则,比如,可以自左向右扫描每次匹配最长的单词,这是一种简单的启发式的消歧策略。图2.4中的例子实际上就是这种使用这种策略得到的分词结果。但是,启发式的消岐方法对人工的依赖程度很高,而且启发式规则也不能处理所有的情况。所以说简单的基于词典的方法还不能很好的解决分词问题。
\parinterval 基于词典的分词方法是典型的基于规则的方法,完全依赖于人工给定的词典。在遇到歧义时,需要人工定义消除歧义的规则,比如,可以自左向右扫描每次匹配最长的单词,这是一种简单的启发式的消歧策略。图\ref{fig:2.3-2}中的例子实际上就是这种使用这种策略得到的分词结果。但是,启发式的消岐方法对人工的依赖程度很高,而且启发式规则也不能处理所有的情况。所以说简单的基于词典的方法还不能很好的解决分词问题。
\subsection{基于统计的分词方法}\index{Chapter2.3.2}
\subsection{基于统计的分词方法}\label{sec2:statistical-seg}\index{Chapter2.3.2}
\parinterval 既然基于词典的方法有很多问题,我们就需要一种更为有效的方法。在上文中提到,想要搭建一个分词系统,需要让计算机知道什么是``词'',那么我们可不可以给定已经切分好的分词数据,让计算机在这些数据中学习到规律呢?答案是肯定的 - 利用``数据''来让计算机明白``词''的定义,让计算机直接在数据中学到知识,这就是我们常说的数据驱动的方法。这个过程也是一个典型的基于统计建模的学习
\parinterval 既然基于词典的方法有很多问题,我们就需要一种更为有效的方法。在上文中提到,想要搭建一个分词系统,需要让计算机知道什么是``词'',那么我们可不可以给出已经切分好的分词数据,让计算机在这些数据中学习到规律呢?答案是肯定的 - 利用``数据''来让计算机明白``词''的定义,让计算机直接在数据中学到知识,这就是我们常说的数据驱动的方法。这个过程也是一个典型的基于统计建模的学习过程
\subsubsection{统计模型的学习与推断}\index{Chapter2.3.2.1}
\parinterval 在分词任务中,数据驱动主要指用已经分词切分好的数据``喂''给系统,这个数据也被称作标注数据。在获得标注训练数据后,自动学习一个统计模型来描述分词的过程,而这个模型会把分词的``知识''作为参数保存在模型中。当送入一个新的需要分词的句子时,可以利用学习到的模型对所有可能的分词结果进行预测,并进行概率化的描述,最终选择概率最大的结果作为输出。这个方法就是基于统计的分词方法。具体来说,可以分为两个步骤:
\parinterval 在分词任务中,数据驱动主要指用已经分词切分好的数据``喂''给系统,这个数据也被称作{\small\bfnew{标注数据}}(Annotated Data)。在获得标注数据后,系统自动学习一个统计模型来描述分词的过程,而这个模型会把分词的`` 知识''作为参数保存在模型中。当送入一个新的需要分词的句子时,可以利用学习到的模型对所有可能的分词结果进行预测,并进行概率化的描述,最终选择概率最大的结果作为输出。这个方法就是基于统计的分词方法。具体来说,可以分为两个步骤:
\vspace{0.5em}
\begin{itemize}
\item 学习。利用标注数据,对统计模型的参数进行学习。
\item {\small\bfnew{训练}}(Training)。利用标注数据,对统计模型的参数进行学习。
\vspace{0.5em}
\item 推断。利用学习到的模型和参数,对新的句子进行切分。
\item {\small\bfnew{推断}}(Inference)。利用学习到的模型和参数,对新的句子进行切分。
\end{itemize}
\vspace{0.5em}
......@@ -441,16 +441,16 @@ F(X)=\int_{-\infty}^x f(x)dx
\centering
\input{./Chapter2/Figures/figure-word-segmentation-based-on-statistics}
%\setlength{\belowcaptionskip}{-0.5cm}
\caption{基于统计的分词流程}
\caption{基于统计的自动分词流程}
\label{fig:2.3-4}
\end{figure}
%-------------------------------------------
\parinterval\ref{fig:2.3-4} 给出了一个基于统计建模的汉语分词实例。左侧是标注数据,其中的每个句子已经经过人工标注分词结果(单词用斜杠分开)。之后,建立一个统计模型,记为$\textrm{P}(\cdot)$。模型通过在标注数据上的学习达到能够很好描述问题的状态。最后,对于新的未分词的句子,使用模型$\textrm{P}(\cdot)$对每个可能的分切进行概率估计,之后选择概率最高的切分结果输出。
\parinterval\ref{fig:2.3-4} 给出了一个基于统计建模的汉语分词实例。左侧是标注数据,其中的每个句子已经经过人工标注分词结果(单词用斜杠分开)。之后,建立一个统计模型,记为$\textrm{P}(\cdot)$。模型通过在标注数据上的学习来对问题进行描述,即学习$\textrm{P}(\cdot)$。最后,对于新的未分词的句子,使用模型$\textrm{P}(\cdot)$对每个可能的分切进行概率估计,之后选择概率最高的切分结果输出。
\vspace{-0.5em}
\subsubsection{掷骰子游戏}\index{Chapter2.3.2.2}
\parinterval 上述过程的核心在于从数据中学习一种对分词现象的统计描述,即学习函数$\textrm{P}(\cdot)$。如何让计算机利用分词好的数据学习到分词结果呢?可以先看一个有趣的实例,用我们生活中比较常见的掷骰子来说,掷一个骰子,玩家猜一个数字,猜中就算赢,按照一般的常识,随便选一个数字,获胜的概率是一样的,即我们所有选择的获胜概率仅是1/6。因此这个游戏玩家很难获胜,除非运气很好。假如,我们进行一次游戏,玩家随便选了一个数字,比如是1,投掷30骰子,得到命中7/30 > 1/6,还不错。
\parinterval 上述过程的核心在于从数据中学习一种对分词现象的统计描述,即学习函数$\textrm{P}(\cdot)$。如何让计算机利用分词好的数据学习到分词的知识呢?可以先看一个有趣的实例,用我们生活中比较常见的掷骰子来说,掷一个骰子,玩家猜一个数字,猜中就算赢,按照一般的常识,随便选一个数字,获胜的概率是一样的,即我们所有选择的获胜概率仅是$1/6$。因此这个游戏玩家很难获胜,除非运气很好。假如,我们进行一次游戏,玩家随便选了一个数字,比如是1,投掷30骰子,得到命中$7/30 > 1/6$,还不错。
\vspace{-0.5em}
%----------------------------------------------
% 图2.11
......@@ -464,14 +464,15 @@ F(X)=\int_{-\infty}^x f(x)dx
%-------------------------------------------
\vspace{-0.5em}
\parinterval 似乎玩家的胜利只能来源于运气。不过,请注意,这里的假设``随便选一个数字''本身就是一个概率模型,它对骰子的六个面的出现做了均匀分布假设。
\parinterval 似乎玩家的胜利只能来源于运气。不过,请注意,这里的假设``随便选一个数字''本身就是一个概率模型,它对骰子的六个面的出现做了均匀分布假设。
\begin{eqnarray}
\textrm{P(``1'')}=\textrm{P(``2'')}=...=\textrm{P(``5'')}=\textrm{P(``6'')}=1/6
\label{eq:2.3-1}
\end{eqnarray}
\vspace{-0.5em}
\parinterval 但是这个游戏没有人规定骰子是均匀的(有些被坑了的感觉)。但是如果骰子的六个面不均匀呢?我们可以用一种更加``聪明''的方式定义一个新模型,即定义骰子的每一个面都以一定的概率出现,而不是相同的概率。这里,为了保证概率的归一性,我们只需定义$\theta_1 \sim \theta_5$,最后一个面的概率用1减去前几个面的概率之和进行表示,即
\parinterval 但是这个游戏没有人规定骰子是均匀的(有些被坑了的感觉)。但是如果骰子的六个面不均匀呢?我们可以用一种更加``聪明''的方式定义一种新的模型,即定义骰子的每一个面都以一定的概率出现,而不是相同的概率。描述如下:
\vspace{-1.0em}
\begin{eqnarray}
\textrm{P(``1'')} &=&\theta_1 \nonumber \\
......@@ -483,39 +484,37 @@ F(X)=\int_{-\infty}^x f(x)dx
\label{eq:2.3-2}
\end{eqnarray}
\parinterval 这里$\theta_1 \sim \theta_5$可以被看作是模型的参数。对于这样的模型,参数确定了,模型也就确定了。但是,新的问题来了,在定义骰子每个面的概率后,如何求出具体的值呢?一种常用的方法是,从大量实例中学习模型参数,这个方法也是常说的参数估计。我们可以将这个不均匀的骰子先实验性的掷很多次,这可以被看作是独立同分布的若干次采样,比如$X$次,发现``1''出现$X_1$次,``2''出现$X_2$次,以此类推,得到了各个面出现的次数。假设掷骰子中每个面出现的概率符合多项式分布,通过简单的概率论知识可以知道每个面出现概率的极大似然估计为:
\noindent 这里,$\theta_1 \sim \theta_5$可以被看作是模型的参数,因此这个模型的自由度是5。对于这样的模型,参数确定了,模型也就确定了。但是,新的问题来了,在定义骰子每个面的概率后,如何求出具体的值呢?一种常用的方法是,从大量实例中学习模型参数,这个方法也是常说的{\small\bfnew{参数估计}}(Parameter Estimation)。我们可以将这个不均匀的骰子先实验性的掷很多次,这可以被看作是独立同分布的若干次采样,比如$X$ 次,发现``1'' 出现$X_1$ 次,``2'' 出现$X_2$ 次,以此类推,得到了各个面出现的次数。假设掷骰子中每个面出现的概率符合多项式分布,通过简单的概率论知识可以知道每个面出现概率的极大似然估计为:
\begin{eqnarray}
\textrm{P(``i'')}=\frac {X_i}{X}
\label{eq:2.3-3}
\end{eqnarray}
\parinterval$X$足够大的$\frac{X_i}{X}$可以无限逼近P(``$i$'')的真实值,因此可以通过大量的实验推算出掷骰子各个面的概率的准确估计值。回归到我们的问题中,如果我们在正式开始游戏前,预先掷骰子30次,得到如图\ref{fig:2.3-6}的结果。
\parinterval$X$足够大的$\frac{X_i}{X}$可以无限逼近P(``$i$'')的真实值,因此可以通过大量的实验推算出掷骰子各个面的概率的准确估计值。回归到我们的问题中,如果我们在正式开始游戏前,预先掷骰子30次,得到如图\ref{fig:2.3-6}的结果。
%----------------------------------------------
% 图2.12
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-the-dice-game2}
\caption{预投骰子结果}
\caption{实验性投掷骰子的结果}
\label{fig:2.3-6}
\end{figure}
%-------------------------------------------
\parinterval 于是,我们看到了一个有倾向性的模型(图 \ref{fig:2.3-7}):
\parinterval 于是,我们看到了一个有倾向性的模型(图 \ref{fig:2.3-7}):在这样的预先实验基础上,我们知道如果再次玩掷骰子游戏的话,选则数字``4''获胜的可能性是最大的。
%----------------------------------------------
% 图2.13
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-the-dice-game-model}
\caption{预设的骰子模型}
\caption{骰子模型}
\label{fig:2.3-7}
\end{figure}
%-------------------------------------------
在这样的预先实验基础上,我们知道如果再次玩掷骰子游戏的话,选则数字``4''获胜的可能性是最大的。
\parinterval 通过上面这个掷骰子的游戏,可以得到一个道理:{\small\sffamily\bfseries{上帝是不公平的}}。因为在``公平''的世界中,没有任何一个模型可以学到有价值的事情。从机器学习的角度来看,所谓的``不公平''实际上这是客观事物中蕴含的一种{\small\sffamily\bfseries{偏置}}(bias),也就是很多事情天然就有对某些情况有倾向。而图像处理、自然语言处理等问题绝大多数都存在着偏置。比如,我们翻译一个英文单词的时候,它最可能的翻译结果往往就是那几个词。我们设计统计模型的目的正是要学习这种偏置,之后利用这种偏置对新的问题做出足够好的决策。
\parinterval 通过上面这个掷骰子的游戏,可以得到一个道理:{\small\sffamily\bfseries{上帝是不公平的}}。因为在``公平''的世界中,没有任何一个模型可以学到有价值的事情。从机器学习的角度来看,所谓的``不公平''实际上这是客观事物中蕴含的一种{\small\sffamily\bfseries{偏置}}(Bias),也就是很多事情天然就有对某些情况有倾向。而图像处理、自然语言处理等问题中绝大多数都存在着偏置。比如,我们翻译一个英文单词的时候,它最可能的翻译结果往往就是那几个词。我们设计统计模型的目的正是要学习这种偏置,之后利用这种偏置对新的问题做出足够好的决策。
\subsubsection{全概率分词方法}\index{Chapter2.3.2.3}
......@@ -529,7 +528,7 @@ F(X)=\int_{-\infty}^x f(x)dx
\end{itemize}
\vspace{0.5em}
\parinterval 如果投掷这个新的骰子,可能会得到图\ref{fig:2.3-8}这样的结果,
\parinterval 如果投掷这个新的骰子,可能会得到图\ref{fig:2.3-8}这样的结果,
%----------------------------------------------
% 图2.14
......@@ -543,15 +542,15 @@ F(X)=\int_{-\infty}^x f(x)dx
\parinterval 如果,我们把这些数字换成汉语中的词,比如
\parinterval 88\; \;
\parinterval 88\; = \;
\parinterval 87\; \;
\parinterval 87\; = \;
\parinterval 45\; \;
\parinterval 45\; = \;
\parinterval
\parinterval ...
\parinterval 之后可以得到
\parinterval 之后可以得到\ref{fig:2.3-9}所示的结果。
%----------------------------------------------
% 图2.15
......@@ -559,34 +558,34 @@ F(X)=\int_{-\infty}^x f(x)dx
\centering
\input{./Chapter2/Figures/figure-full-probability-word-segmentation-2}
\setlength{\belowcaptionskip}{-0.2cm}
\caption{把数字换成汉字后的结果}
\caption{掷骰子游戏中把数字换成汉字后的结果}
\label{fig:2.3-9}
\end{figure}
%-------------------------------------------
\parinterval 这样,在中文分词问题中,可以假设我们拥有一个不均匀的多面骰子,每个面都是一个词,我们获取人工分词标注数据后,可以统计每个单词出现的次数,进而利用极大似然估计推算出每个单词出现的概率的估计值。
\parinterval 于是,在中文分词问题中,可以假设我们拥有一个不均匀的多面骰子,每个面都对应一个单词。我们获取人工分词标注数据后,可以统计每个单词出现的次数,进而利用极大似然估计推算出每个单词出现的概率的估计值。图\ref{fig:2.3-10}给出了一个实例。
%----------------------------------------------
% 图2.16
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-full-probability-word-segmentation-3}
\caption{每个单词概率估计值}
\caption{单词概率的估计结果}
\label{fig:2.3-10}
\end{figure}
%-------------------------------------------
\parinterval 通过这个学习过程,我们得到了每个词出现的概率,即模型的参数。而我们原始的问题是如何计算这个整句分词结果的概率,比如
\begin{equation}
\textrm{P}\textrm{(``确实/现在/数据/很/多'')}=?
\label{eq:2.3-4}
\end{equation}
\parinterval 这里可以使用``大题小做''的技巧:原始的问题很复杂,我们将其切分为小问题。这样,将复杂的分词问题简单化,基于独立性假设解决分词问题:假定所有词出现都是相互独立的。设$w_1 w_2 w_3…w_m$表示一个由单词$w_1,w_2,w_3,…,w_m$组成的切分结果,于是有:
\parinterval 通过这个学习过程,我们得到了每个词出现的概率,即模型的参数。而我们原始的问题是如何计算这个整句分词结果的概率,比如,$\textrm{P}\textrm{(``确实/现在/数据//多'')}=?$这里可以使用``大题小做''的技巧:原始的问题很复杂,我们将其切分为小问题。这样,将复杂的分词问题简单化,基于独立性假设解决分词问题:假定所有词出现都是相互独立的。设$w_1 w_2 w_3…w_m$表示一个由单词$w_1,w_2,w_3,…,w_m$组成的切分结果,于是有:
{\setlength{\belowdisplayskip}{-9pt}
\begin{eqnarray}
\textrm{P}(w_1 w_2 w_3…w_m)=\textrm{P}(w_1) \cdot \textrm{P}(w_2) \cdot ... \cdot \textrm{P}(w_m)
\label{eq:2.3-5}
\end{eqnarray}
}
\parinterval 以``确实现在数据很多''这个实例来说,如果把这句话按照``确实/现在/数据/很/多''这样的方式进行切分,这个句子切分的概率P(``确实/现在/数据/很/多'')可以通过每个词出现概率相乘的方式进行计算。
\begin{eqnarray}
&\textrm{P}&\textrm{(``确实/现在/数据/很/多'')} \nonumber \\
& = &\textrm{P}\textrm{(``确实'')} \cdot \textrm{P}\textrm{(``现在'')} \cdot \textrm{P}\textrm{(``数据'')} \cdot \textrm{P}\textrm{(``很'')} \cdot \textrm{P}\textrm{(``多'')} \nonumber \\
......@@ -595,7 +594,7 @@ F(X)=\int_{-\infty}^x f(x)dx
\label{eq:2.3-6}
\end{eqnarray}
\parinterval 以``确实现在数据很多''这个实例来说,如果把这句话按照``确实/现在/数据/很/多''这样的方式进行切分,这句切分的概率P(``确实/现在/数据/很/多'')可以通过每个词出现概率相乘的方式进行计算。这个假设也是自然语言处理中1-gram语言模型假设,即当前词的生成与任何历史都无关。当然,独立性假设并不能完美描述客观世界的问题,但是它大大化简了问题的复杂度。
这个假设也是自然语言处理中1-gram语言模型假设,即当前词的生成与任何历史都无关。当然,独立性假设并不能完美描述客观世界的问题,但是它大大化简了问题的复杂度。
%----------------------------------------------
% 图2.17
......@@ -607,23 +606,23 @@ F(X)=\int_{-\infty}^x f(x)dx
\end{figure}
%-------------------------------------------
\parinterval 最后让我们再整体看一下分词系统的学习和使用过程。如图\ref {fig:2.3-8}所示,我们利用大量人工标注好的分词数据,通过统计学习方法获得一个统计模型$\textrm{P}(\cdot)$,给定任意分词结果$W=w_1 w_2…w_m$,都能通过$\textrm{P}(W)=\textrm{P}(w_1) \times \textrm{P}(w_2 ) \times\textrm{P}(w_m)$计算这种切分的概率值。
\parinterval 最后再整体看一下分词系统的学习和使用过程。如图\ref {fig:2.3-8}所示,我们利用大量人工标注好的分词数据,通过统计学习方法获得一个统计模型$\textrm{P}(\cdot)$,给定任意分词结果$W=w_1 w_2...w_m$,都能通过$\textrm{P}(W)=\textrm{P}(w_1) \cdot \textrm{P}(w_2 ) \cdot ... \cdot \textrm{P}(w_m)$计算这种切分的概率值。
\parinterval 经过充分训练的统计模型$\textrm{P}(\cdot)$就是我们得到分词模型。对于任意输入的新句子S,通过这个模型找到最佳的分词结果$W^*$输出。假设输入句子S是``确实现在数据很多'',可以通过列举获得不同切分方式的概率,其中概率最高的切分方式,就是我们的目标输出。
\parinterval 经过充分训练的统计模型$\textrm{P}(\cdot)$就是我们得到分词模型。对于输入的新句子$S$,通过这个模型找到最佳的分词结果$W^*$输出。假设输入句子$S$是``确实现在数据很多'',可以通过列举获得不同切分方式的概率,其中概率最高的切分方式,就是我们的目标输出。
\parinterval 这种分词方法也被称作基于1-gram语言模型的分词,或全概率分词,使用标注好的分词数据进行学习,获得分词模型。这种方法最大的优点是整个学习过程(模型训练过程)和推导过程(处理新句子进行切分的过程)都是全自动进行的。虽然这种方法十分简单,但是其效率很高,因此被广泛使用在工业界系统里。
\parinterval 当然,真正的分词系统还需要解决很多其它问题,比如使用动态规划等方法高效搜索最优解以及如何处理未见过的词等等,由于本节的重点是介绍中文分词的基础方法和统计建模思想,因此无法覆盖所有中文分词的技术内容,有兴趣的读者可以参考2.6节的相关文献做进一步深入研究。
\parinterval 当然,真正的分词系统还需要解决很多其它问题,比如使用动态规划等方法高效搜索最优解以及如何处理未见过的词等等,由于本节的重点是介绍中文分词的基础方法和统计建模思想,因此无法覆盖所有中文分词的技术内容,有兴趣的读者可以参考\ref{sec2:summary}节的相关文献做进一步深入研究。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{$n$-gram语言模型 }\index{Chapter2.4}
\parinterval 在基于统计的汉语分词模型中,我们通过``大题小做''的技巧,利用独立性假设把整个句子的单词切分概率转化为每个单个词出现概率的乘积。这里,每个单词也被称作1-gram(或uni-gram),而1-gram概率的乘积实际上也是在度量词序列出现的可能性(记为$\textrm{P}(w_1 w_2...w_m)$)。这种计算整个单词序列概率$\textrm{P}(w_1 w_2...w_m)$的方法被称为统计语言模型。1-gram语言模型是最简单的一种语言模型,它没有考虑任何的上下文。很自然的一个问题是:能否考虑上下文信息构建更强大的语言模型,进而得到准确的分词结果。下面我们将进一步介绍更加通用的$n$-gram语言模型,它在机器翻译及其它自然语言处理任务中有更加广泛的应用。
\parinterval 在基于统计的汉语分词模型中,我们通过``大题小做''的技巧,利用独立性假设把整个句子的单词切分概率转化为每个单个词出现概率的乘积。这里,每个单词也被称作1-gram(或uni-gram),而1-gram概率的乘积实际上也是在度量词序列出现的可能性(记为$\textrm{P}(w_1 w_2...w_m)$)。这种计算整个单词序列概率$\textrm{P}(w_1 w_2...w_m)$的方法被称为统计语言模型。1-gram语言模型是最简单的一种语言模型,它没有考虑任何的上下文。很自然的一个问题是:能否考虑上下文信息构建更强大的语言模型,进而得到准确的分词结果。下面我们将进一步介绍更加通用的$n$-gram语言模型,它在机器翻译及其它自然语言处理任务中有更加广泛的应用。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{建模}\index{Chapter2.4.1}
\parinterval {\small\sffamily\bfseries{语言模型}}language model)的目的是描述文字序列出现的规律。这个对问题建模的过程被称作{\small\sffamily\bfseries{语言建模}}(language modeling)。如果使用统计建模的方式,语言模型可以被定义为计算$\textrm{P}(w_1 w_2...w_m)$,也就是计算整个词序列$w_1 w_2...w_m$出现的可能性大小。具体定义如下,
\parinterval {\small\sffamily\bfseries{语言模型}}Language Model)的目的是描述文字序列出现的规律。这个对问题建模的过程被称作{\small\sffamily\bfseries{语言建模}}(Language Modeling)。如果使用统计建模的方式,语言模型可以被定义为计算$\textrm{P}(w_1 w_2...w_m)$的问题,也就是计算整个词序列$w_1 w_2...w_m$出现的可能性大小。具体定义如下,
%----------------------------------------------
% 定义3.1
......@@ -633,28 +632,25 @@ F(X)=\int_{-\infty}^x f(x)dx
\end{definition}
%-------------------------------------------
\parinterval 直接求$\textrm{P}(w_1 w_2...w_m)$并不简单,因为如果把$w_1 w_2...w_m$整个作为一个变量,模型的参数量会非常大。$w_1 w_2...w_m$$|V|^m$种可能性,这里$|V|$表示词汇表大小。显然,当$m$增大的时候会使模型复杂度会急剧增加,甚至都无法进行存储和计算。既然把$w_1 w_2...w_m$整个作为一个变量不好处理,就可以考虑对这个序列的生成进行分解。使用链式法则,很容易得到
\parinterval 直接求$\textrm{P}(w_1 w_2...w_m)$并不简单,因为如果把整个词串$w_1 w_2...w_m$作为一个变量,模型的参数量会非常大。$w_1 w_2...w_m$$|V|^m$种可能性,这里$|V|$表示词汇表大小。显然,当$m$ 增大的时候会使模型复杂度会急剧增加,甚至都无法进行存储和计算。既然把$w_1 w_2...w_m$作为一个变量不好处理,就可以考虑对这个序列的生成过程进行分解。使用链式法则,很容易得到
\begin{eqnarray}
\textrm{P}(w_1 w_2...w_m)=\textrm{P}(w_1)\textrm{P}(w_2|w_1)\textrm{P}(w_3|w_1 w_2)...\textrm{P}(w_m|w_1 w_2...w_{m-1})
\label{eq:2.4-1}
\end{eqnarray}
这样,$w_1 w_2...w_m$的生成可以被看作是逐个生成每个单词的过程,即首先生成$w_1$,然后根据$w_1$再生成$w_2$,然后根据$w_1 w_2$再生成$w_3$,以此类推,直到根据所有前$m$-1个词生成序列的最后一个单词$w_m$。这个模型把联合概率$\textrm{P}(w_1 w_2...w_m)$分解为多个条件概率的乘积,虽然可以对生成序列的过程进行分解,但是模型的复杂度和以前是一样的,比如,$\textrm{P}(w_m|w_1 w_2...w_{m-1})$仍然不好计算。
这样,$w_1 w_2...w_m$的生成可以被看作是逐个生成每个单词的过程,即首先生成$w_1$,然后根据$w_1$再生成$w_2$,然后根据$w_1 w_2$再生成$w_3$,以此类推,直到根据所有前$m-1$个词生成序列的最后一个单词$w_m$。这个模型把联合概率$\textrm{P}(w_1 w_2...w_m)$分解为多个条件概率的乘积,虽然对生成序列的过程进行了分解,但是模型的复杂度和以前是一样的,比如,$\textrm{P}(w_m|w_1 w_2...w_{m-1})$ 仍然不好计算。
\parinterval 换一个角度看,$\textrm{P}(w_m|w_1 w_2...w_{m-1})$体现了一种基于``历史''的单词生成模型,也就是把前面生成的所有单词作为``历史'',并参考这个``历史''生成当前单词。但是这个``历史''的长度和整个序列长度是相关的,也是一种长度变化的历史序列。为了化简问题,一种自然的想法是使用定长历史,比如,每次只考虑前面$n$-1个历史单词来生成当前单词,这就是$n$-gram语言模型。这个模型的数学描述如下:
\parinterval 换一个角度看,$\textrm{P}(w_m|w_1 w_2...w_{m-1})$体现了一种基于``历史''的单词生成模型,也就是把前面生成的所有单词作为``历史'',并参考这个``历史''生成当前单词。但是这个``历史''的长度和整个序列长度是相关的,也是一种长度变化的历史序列。为了化简问题,一种简单的想法是使用定长历史,比如,每次只考虑前面$n-1$个历史单词来生成当前单词,这就是$n$-gram语言模型。这个模型的数学描述如下:
\begin{eqnarray}
\textrm{P}(w_m|w_{m-n+1}...w_{m-1})=\textrm{P}(w_m|w_1 w_2...w_{m-1})
\label{eq:2.4-2}
\end{eqnarray}
\parinterval 这样,整个序列$w_1 w_2...w_m$的生成概率可以被重新定义为:
%------------------------------------------------------
% 表1.2
\begin{table}[htp]
\centering
\caption{$n$-gram语言模型取不同$n$值的模型描述}
\label{tab::2.4-1}
{\scriptsize
\begin{center}
{\footnotesize
\begin{tabular}{l|l|l l|l}
链式法则 & 1-gram & 2-gram & $...$ & $n$-gram\\
\hline
......@@ -667,38 +663,45 @@ F(X)=\int_{-\infty}^x f(x)dx
\rule{0pt}{10pt} $\textrm{P}(w_m|w_1 ... w_{m-1})$ & $\textrm{P}(w_m)$ & $\textrm{P}(w_m|w_{m-1})$ & $...$ & $\textrm{P}(w_m|w_{m-n+1} ... w_{m-1})$
\end{tabular}
}
\end{table}
%------------------------------------------------------
\end{center}
\parinterval 可以看到,1-gram语言模型只是$n$-gram语言模型的一种特殊形式。$n$-gram的优点在于,它所使用的历史信息是有限的,即$n$-1个单词。这种性质也反映了经典的马尔可夫链的思想\cite{liuke-markov-2004}\cite{resnick1992adventures}有时也被称作马尔可夫假设或者马尔可夫属性。因此$n$-gram也可以被看作是变长序列上的一种马尔可夫模型,比如,2-gram语言模型对应着1阶马尔可夫模型,3-gram语言模型对应着2阶马尔可夫模型,以此类推。
\parinterval 那么,如何计算$\textrm{P}(w_m|w_{m-n+1} ... w_{m-1})$?有很多种选择,比如:
\parinterval 可以看到,1-gram语言模型只是$n$-gram语言模型的一种特殊形式。$n$-gram的优点在于,它所使用的历史信息是有限的,即$n-1$个单词。这种性质也反映了经典的马尔可夫链的思想\cite{liuke-markov-2004}\cite{resnick1992adventures}有时也被称作马尔可夫假设或者马尔可夫属性。因此$n$-gram也可以被看作是变长序列上的一种马尔可夫模型,比如,2-gram语言模型对应着1阶马尔可夫模型,3-gram语言模型对应着2阶马尔可夫模型,以此类推。
\parinterval 那么,如何计算$\textrm{P}(w_m|w_{m-n+1} ... w_{m-1})$呢?有很多种选择,比如:
\vspace{0.3em}
\begin{itemize}
\item 极大似然估计。直接利用不同词序列在训练数据中出现的频度计算出$\textrm{P}(w_m$\\$|w_{m-n+1} ... w_{m-1})$
\item {\small\bfnew{极大似然估计}}。直接利用词序列在训练数据中出现的频度计算出$\textrm{P}(w_m$\\$|w_{m-n+1} ... w_{m-1})$
\begin{eqnarray}
\textrm{P}(w_m|w_{m-n+1}...w_{m-1})=\frac{\textrm{count}(w_{m-n+1}...w_m)}{\textrm{count}(w_{m-n+1}...w_{m-1})}
\label{eq:2.4-3}
\end{eqnarray}
\item 人工神经网络方法。构建一个人工神经网络估计$\textrm{P}(w_m|w_{m-n+1} ... w_{m-1})$的值,比如,可以构建一个前馈神经网络来对$n$-gram进行建模。
其中,$\textrm{count}(\cdot)$是在训练数据中统计频次的函数。
\vspace{0.3em}
\item {\small\bfnew{人工神经网络方法}}。构建一个人工神经网络估计$\textrm{P}(w_m|w_{m-n+1} ... w_{m-1})$的值,比如,可以构建一个前馈神经网络来对$n$-gram进行建模。
\end{itemize}
\vspace{0.3em}
\parinterval 极大似然估计方法和前面介绍的统计分词中的方法是一致的,它的核心是使用$n$-gram出现的频度进行参数估计,因此是也自然语言处理中一类经典的$n$-gram方法。基于人工神经网络的方法在近些年也非常受关注,它直接利用多层神经网络对问题的输入$(w_{m-n+1}...w_{m-1})$和输出$(\textrm{P}(w_m|w_{m-n+1} ... w_{m-1}))$进行建模,而模型的参数通过网络中神经元之间连接的权重进行体现。严格意义上了来说,基于人工神经网络的方法并不算基于$n$-gram的方法,或者说它并显性记录$n$-gram的生成概率,也不不依赖$n$-gram的频度进行参数估计。为了保证内容的连贯性,本章将仍以传统$n$-gram语言模型为基础进行讨论,基于人工神经网络的方法将会在第五章和第六章进行详细介绍。
\parinterval 极大似然估计方法和前面介绍的统计分词中的方法是一致的,它的核心是使用$n$-gram出现的频度进行参数估计,因此是也自然语言处理中一类经典的$n$-gram方法。基于人工神经网络的方法在近些年也非常受关注,它直接利用多层神经网络对问题的输入$(w_{m-n+1}...w_{m-1})$和输出$\textrm{P}(w_m|w_{m-n+1} ... w_{m-1})$进行建模,而模型的参数通过网络中神经元之间连接的权重进行体现。严格意义上了来说,基于人工神经网络的方法并不算基于$n$-gram的方法,或者说它并没有显性记录$n$-gram的生成概率,也不依赖$n$-gram的频度进行参数估计。为了保证内容的连贯性,本章将仍以传统$n$-gram语言模型为基础进行讨论,基于人工神经网络的方法将会在第五章和第六章进行详细介绍。
\parinterval $n$-gram语言模型的使用非常简单。我们可以像\ref{sec2:statistical-seg}节中一样,直接用它来对词序列出现的概率进行计算。比如,可以使用一个2-gram语言模型计算一个分词序列的概率:
\parinterval 使用$n$-gram语言模型非常简单。我们可以像2.3.2节中一样,直接用它来对词序列出现的概率进行计算。比如,可以使用一个2-gram语言模型计算一个分词序列的概率
\begin{eqnarray}
& &\textrm{P}_{2-gram}{(\textrm{``确实}/\textrm{现在}/\textrm{数据}/\textrm{}/\textrm{多''})} \nonumber \\
&= & \textrm{P}(\textrm{``确实''}) \times\textrm{P}(\textrm{``现在''}|\textrm{``确实''})\times\textrm{P}(\textrm{``数据''}|\textrm{``现在''}) \nonumber \\
& \times & \textrm{P}(\textrm{``很''}|\textrm{``数据''})\times\textrm{P}(\textrm{``多''}|\textrm{``很''})
&= & \textrm{P}(\textrm{``确实''}) \times\textrm{P}(\textrm{``现在''}|\textrm{``确实''})\times\textrm{P}(\textrm{``数据''}|\textrm{``现在''}) \times \nonumber \\
& & \textrm{P}(\textrm{``很''}|\textrm{``数据''})\times\textrm{P}(\textrm{``多''}|\textrm{``很''})
\label{eq:2.4-4}
\end{eqnarray}
\parinterval$n$-gram语言模型为代表的统计语言模型的应用非常广泛。除了分词,在文本生成、信息检索、摘要等等自然语言处理任务中,语言模型都有举足轻重的地位。包括近些年非常受关注的预训练模型,本质上也是统计语言模型。这些技术都会在后续章节进行介绍。值得注意的是,统计语言模型给我们解决自然语言处理问题提供了一个非常好的建模思路,即:把整个序列生成的问题转化为逐个生成单词的问题。很快我们就会看到,这种建模方式会被广泛的用于机器翻译建模中,在统计机器翻译和神经机器翻译中都会有明显的体现。
\parinterval$n$-gram语言模型为代表的统计语言模型的应用非常广泛。除了分词,在文本生成、信息检索、摘要等自然语言处理任务中,语言模型都有举足轻重的地位。包括近些年非常受关注的预训练模型,本质上也是统计语言模型。这些技术都会在后续章节进行介绍。值得注意的是,统计语言模型给我们解决自然语言处理问题提供了一个非常好的建模思路,即:把整个序列生成的问题转化为逐个生成单词的问题。很快我们就会看到,这种建模方式会被广泛的用于机器翻译建模,在统计机器翻译和神经机器翻译中都会有明显的体现。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{未登录词和平滑算法}\index{Chapter2.4.2}
\parinterval 在式\ref{eq:2.4-4}的例子中,如果语料中从没有``确实''和``现在''两个词连续出现的情况,那么使用2-gram计算``确实/现在/数据/很/多''的切分方式的概率时,会出现如下情况
\parinterval 在式\ref{eq:2.4-4}所示的例子中,如果语料中从没有``确实''和``现在''两个词连续出现的情况,那么使用2-gram计算切分``确实/现在/数据/很/多''的概率时,会出现如下情况
\begin{eqnarray}
\textrm{P}(\textrm{``现在''}|\textrm{``确实''}) & = & \frac{\textrm{count}(\textrm{``确实}\,\textrm{现在''})}{\textrm{count}(\textrm{``确实''})} \nonumber \\
& = & \frac{0}{\textrm{count}(\textrm{``确实''})} \nonumber \\
......@@ -706,52 +709,45 @@ F(X)=\int_{-\infty}^x f(x)dx
\label{eq:2.4-5}
\end{eqnarray}
\parinterval 显然,这个结果是不能接受的。因为即使语料中没有 ``确实''和``现在''两个词连续出现,但是这种搭配也是客观存在的。这时简单的用极大似然估计得到概率却是0,导致整个切分结果的概率为0。更常见的问题是那些根本没有出现在词表中的词,称为{\small\sffamily\bfseries{未登录词}}(Out-of-Vocabulary, OOV),比如一些生僻词,可能模型训练阶段从来没有看到过,这时模型仍然会给出0概率。图\ref{fig:2.4-1}展示了词语出现频度的分布,可以看到绝大多数词都是低频词。
\parinterval 显然,这个结果是不能接受的。因为即使语料中没有 ``确实''和``现在''两个词连续出现,但是这种搭配也是客观存在的。这时简单的用极大似然估计得到概率却是0,导致整个切分结果的概率为0。 更常见的问题是那些根本没有出现在词表中的词,称为{\small\sffamily\bfseries{未登录词}}(Out-of-Vocabulary Word,OOV Word),比如一些生僻词,可能模型训练阶段从来没有看到过,这时模型仍然会给出0 概率。图\ref{fig:2.4-1}展示了一个真实语料库中词语出现频度的分布,可以看到绝大多数词都是低频词。
%----------------------------------------------
% 图2.18
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-word-frequency-distribution}
\caption{词语频度分布}
\caption{词语频度分布}
\label{fig:2.4-1}
\end{figure}
%---------------------------
\parinterval 为了解决未登录词引起的零概率问题,常用的做法是对模型进行平滑处理,也就是给可能出现的情况一个非零的概率,使得模型不会对整个序列给出零概率。平滑可以用``劫富济贫''这一思想理解,在保证所有情况的概率和为1的前提下,使极低概率的部分可以从高概率的部分分配一部分概率,从而达到平滑的目的。
\parinterval 为了解决未登录词引起的零概率问题,常用的做法是对模型进行平滑处理,也就是给可能出现的情况一个非零的概率,使得模型不会对整个序列给出零概率。平滑可以用``劫富济贫''这一思想理解,在保证所有情况的概率和为1的前提下,使极低概率的部分可以从高概率的部分分配一部分概率,从而达到平滑的目的。
\parinterval 语言模型使用的平滑算法有很多,比如:加法平滑方法、古德-图灵估计法、Katz平滑法等。在本节中,主要介绍三种平滑方法:加法平滑法、古德-图灵估计法和Kneser-Ney平滑。这些方法也可以被使用到机器翻译中其它模型的概率平滑任务中。
\parinterval 语言模型使用的平滑算法有很多。在本节中,主要介绍三种平滑方法:加法平滑法、古德-图灵估计法和Kneser-Ney平滑。这些方法也可以被应用到其它任务的概率平滑操作中。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{加法平滑方法}\index{Chapter2.4.2.1}
\parinterval 加法平滑方法可以说是简单的平滑技术,我们首先介绍这一方法,希望通过它了解平滑算法的思想
\parinterval {\small\bfnew{加法平滑}}(Additive Smoothing)一种简单的平滑技术。我们首先介绍这一方法,希望通过它了解平滑算法的思想。通常情况下,我们会利用采集到的语料库来模拟真实的全部语料库。当然,没有一个语料库能覆盖所有的语言现象。常见的一个问题是,使用的语料无法涵盖所有的词汇。因此,直接依据这样语料所获得的统计信息来获取语言模型就会产生偏差。假设依据某语料$C$ (从未出现`` 确实 现在''二元语法),评估一个已经分好词的句子$S$ =``确实/现在/物价/很/高''的概率。当计算``确实/现在''的概率时,$\textrm{P}(S) = 0$。显然这个结果是不合理的
\parinterval 通常情况下,我们会利用采集到的语料库来模拟现实生活中真实全部的语料库。但是采集总是不充分的,比如无法涵盖所有的词汇,直接依据这样语料所获得的统计信息计算现实中的语言概率就会产生偏差。假设依据某语料$C$(从未出现``确实 现在''二元语法),评估一个已经分好词的句子$S$ =``确实 现在 物价 很 高''的概率,当计算``确实 现在''的概率时使得评估$\textrm{P}(S) = 0$。显然这个结果是不够准确的,根据我们的常识,句子$S$是有出现的可能性的,这样句子的概率值不应该是0。
\begin{eqnarray}
\textrm{P}(\textrm{现在}|\textrm{确实}) & = & \frac{\textrm{count}(\textrm{确实}\,\textrm{现在})}{\textrm{count}(\textrm{确实})} \nonumber \\
& = & \frac{0}{\textrm{count}(\textrm{确实})} \nonumber \\
& = & 0
\label{eq:2.4-6}
\end{eqnarray}
\parinterval 加法平滑方法假设每个$n$-gram出现的次数比实际统计次数多$\theta$次,$0 \le \theta\le 1$。这样,计算概率的时候分子部分不会为0。重新计算$\textrm{P}(\textrm{现在}|\textrm{确实})$,可以得到:
\parinterval 加法平滑方法(additive smoothing)假设每个$n$-gram出现的次数比实际统计次数多$\theta$次,$0 \leqslant\theta\leqslant 1$,使得分子部分不为0,那么计算前文例子``确实 现在''的概率时,可以使用如下方法计算。
\begin{eqnarray}
\textrm{P}(\textrm{现在}|\textrm{确实}) & = & \frac{\theta + \textrm{count}(\textrm{确实}\,\textrm{现在})}{\sum_{w}^{|V|}(\theta + \textrm{count}(\textrm{确实}w))} \nonumber \\
& = & \frac{\theta + \textrm{count}(\textrm{确实}\,\textrm{现在})}{\theta{|V|} + \textrm{count}(\textrm{确实})}
\textrm{P}(\textrm{现在}|\textrm{确实}) & = & \frac{\theta + \textrm{count}(\textrm{确实/现在})}{\sum_{w}^{|V|}(\theta + \textrm{count}(\textrm{确实/}w))} \nonumber \\
& = & \frac{\theta + \textrm{count}(\textrm{确实/现在})}{\theta{|V|} + \textrm{count}(\textrm{确实})}
\label{eq:2.4-7}
\end{eqnarray}
\parinterval 这里面$V$表示所有词汇的词表,$|V|$为词表中单词的个数,$w$为词典中的词。常见的加法平滑方法会将$\theta$取1,这时我们又称为加一平滑或是拉普拉斯平滑。这种方法比较容易理解,也比较简单,但是一些人认为这种方法的表现较差,因此,其实际的使用效果还要视具体情况而定
\noindent 其中,$V$表示所有词汇的词表,$|V|$为词表中单词的个数,$w$为词典中的一个词。有时候,加法平滑方法会将$\theta$取1,这时我们称之为加一平滑或是拉普拉斯平滑。这种方法比较容易理解,也比较简单,因此也往往被用于对系统的快速原型中
\parinterval 举一个例子来形象的描述加法平滑方法。假设在一个英文文档中随机抽取词汇,已经抽到的词包括12个,词典大小$|V|$=20,已抽到的词汇统计结果为:4 look,3 people,2 am,1 what,1 want,1 do。为了更形象的描述在平滑之前和平滑之后的概率分布的区别,可以参考下图\ref{fig:2.4-2}的示例:
\parinterval 举一个例子。假设在一个英文文档中随机一些单词(词表大小$|V|=20$),各个单词出现的次数为:``look'': 4,``people'': 3,``am'': 2,``what'': 1,``want'': 1,``do'': 1。图\ref{fig:2.4-2} 给出了在平滑之前和平滑之后的概率分布。
%----------------------------------------------
% 图2.19
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-no-smoothing&smoothed-probability-distributions}
\caption{无平滑和有平滑的概率分布}
\caption{无平滑和有平滑的概率分布}
\label{fig:2.4-2}
\end{figure}
%-------------------------------------------
......@@ -759,21 +755,28 @@ F(X)=\int_{-\infty}^x f(x)dx
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{古德-图灵估计法}\index{Chapter2.4.2.2}
\parinterval 古德-图灵估计法是图灵(Alan Turing)和他的助手古德(I.J.Good)开发的,作为他们在二战期间破解德国密码机Enigma所使用的方法的一部分,在1953年古德将其发表,这一方法也是很多平滑算法的核心,其基本思路是:是把非零的$n$元语法的概率降低匀给一些低概率$n$元语法,以修改最大似然估计与真实概率之间的偏离\cite{good1953population}\cite{gale1995good}
\parinterval {\small\bfnew{古德-图灵估计法}}(Good-Turing Estimate)是图灵(Alan Turing)和他的助手古德(I.J.Good)开发的,作为他们在二战期间破解德国密码机Enigma所使用的方法的一部分,在1953 年古德将其发表,这一方法也是很多平滑算法的核心,其基本思路是:是把非零的$n$元语法单元的概率降低匀给一些低概率$n$元语法单元,以减小最大似然估计与真实概率之间的偏离\cite{good1953population}\cite{gale1995good}
\parinterval 假定在语料库中出现r次的$n$元语法有$n_r$个,特别的,出现0次的$n$元语法(即未登录词)出现的次数为$n_0$个。语料库中全部词语的个数为$N$,显然
\parinterval 假定在语料库中出现$r$次的$n$-gram有$n_r$个,特别的,出现0次的$n$-gram(即未登录词及词串)出现的次数为$n_0$个。语料库中全部词语的个数为$N$,显然
\begin{eqnarray}
N = \sum_{r=1}^{\infty}{r\,n_r}
\label{eq:2.4-8}
\end{eqnarray}
\parinterval 这时,出现$r$次的$n$元语法在词典中的相对频率为$r/N$,这也是不做平滑处理时这些词的概率估计。为了解决零概率问题,Good-Turing方法对于任何一个出现$r$次的$n$元语法,利用出现$r$+1次的$n$元语法统计量重新假设它出现$r^*$次,这里
\parinterval 这时,出现$r$次的$n$-gram的相对频率为$r/N$,也就是不做平滑处理时的概率估计。为了解决零概率问题,对于任何一个出现$r$次的$n$-gram,古德-图灵估计法利用出现$r+1$次的$n$-gram统计量重新假设它出现$r^*$次,这里
\begin{eqnarray}
r^* = (r + 1)\frac{n_{r + 1}}{n_r}
\label{eq:2.4-9}
\end{eqnarray}
\parinterval 基于这个公式,就可以估计所有0次$n$元语法的频次$n_0 r_0^*=(r_0+1)n_1=n_1$。要把这个重新估计的统计数转化为概率,只需要进行归一化处理:对于每个统计数为$r$的事件,其概率为$\textrm{P}_r=r^*/N$,其中
\parinterval 基于这个公式,就可以估计所有0次$n$-gram的频次$n_0 r^*=(r+1)n_1=n_1$。要把这个重新估计的统计数转化为概率,需要进行归一化处理:对于每个统计数为$r$的事件,其概率为
\begin{eqnarray}
\textrm{P}_r=r^*/N
\end{eqnarray}
其中
\begin{eqnarray}
N & = & \sum_{r=0}^{\infty}{r^{*}n_r} \nonumber \\
& = & \sum_{r=0}^{\infty}{(r + 1)n_{r + 1}} \nonumber \\
......@@ -781,27 +784,27 @@ N & = & \sum_{r=0}^{\infty}{r^{*}n_r} \nonumber \\
\label{eq:2.4-10}
\end{eqnarray}
也就是说,N仍然为这个整个样本分布最初的计数。这样样本中所有事件的概率之和为:
也就是说,$N$仍然为这个整个样本分布最初的计数。这样样本中所有事件的概率之和为:
\begin{eqnarray}
N & = & \sum_{r>0}{p_r n_r} \nonumber \\
\textrm{P}(r>0) & = & \sum_{r>0}{\textrm{P}_r} \nonumber \\
& = & 1 - \frac{n_1}{N} < 1
\label{eq:2.4-11}
\end{eqnarray}
其中$n_1/N$的概率余量就是分配给所有统计为0的事件
\noindent 其中$n_1/N$就是分配给所有出现为0次事件的概率。古德-图灵方法最终通过出现1次的$n$-gram估计了出现为0次的事件概率,达到了平滑的效果
\parinterval Good-Turing方法最终通过出现1次的$n$元语法估计了统计为0的事件概率,达到了平滑的效果
\parinterval 我们使用一个例子来说明这个方法是如何对事件出现的可能性进行平滑的。仍然考虑在加法平滑法中统计单词的例子,根据古德-图灵方法进行修正如表\ref{tab::2.4-2}所示
\parinterval 我们使用一个例子来说明这个方法是如何通过已知事物的数量来预测未来事物的数量。仍然考虑在加法平滑法的英文词汇抽取的例子,根据Good-Turing方法进行修正如下表:
%------------------------------------------------------
% 表1.3
\begin{table}[htp]{
\begin{center}
\caption{英文词汇抽取统计结果}
\caption{单词出现频次及古德-图灵平滑结果}
\label{tab::2.4-2}
{
\begin{tabular}{l|lll}
\rule{0pt}{10pt} $r$ & $n_r$ & $n^*$ & $p_r$\\ \hline
\rule{0pt}{10pt} $r$ & $n_r$ & $n^*$ & $\textrm{P}_r$\\ \hline
\rule{0pt}{10pt} 0 & 14 & 0.21 & 0.018 \\
\rule{0pt}{10pt} 1 & 3 & 0.67 & 0.056 \\
\rule{0pt}{10pt} 2 & 1 & 3 & 0.25 \\
......@@ -814,12 +817,12 @@ N & = & \sum_{r>0}{p_r n_r} \nonumber \\
%------------------------------------------------------
\vspace{-1.5em}
\parinterval 很多时候会出现$n_{r+1}=0$的情况,这是对于当$r$很大的时候很常见的情况,而且通常情况下当$r$很大时,$n_r$也会有噪音的存在。这种简单的Good-Turing方法无法应对这些复杂的情况,随着更多的研究和发展,成为了一些其他平滑方法的基础。
\parinterval $r$很大的时候经常会出现$n_{r+1}=0$的情况,而且这时$n_r$也会有噪音存在。通常,简单的古德-图灵方法可能无法很好的处理这种复杂的情况,不过古德-图灵方法仍然是其它一些平滑方法的基础。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{Kneser-Ney平滑方法}\index{Chapter2.4.2.3}
\parinterval Kneser-Ney平滑方法由R.Kneser和H.Ney于1995年提出的用于计算$n$元语法概率分布的方法\cite{kneser1995improved}\cite{chen1999empirical}。基于absolute discounting,并被广泛认为是最有效的平滑方法。这种平滑方法改进了absolute discounting中与高阶分布相结合的低阶分布的计算方法,使不同阶分布得到充分的利用。这种算法综合利用了其他多种平滑算法的思想,是一种先进而且标准的平滑算法
\parinterval Kneser-Ney平滑方法由R.Kneser和H.Ney于1995年提出的用于计算$n$元语法概率分布的方法\cite{kneser1995improved}\cite{chen1999empirical},并被广泛认为是最有效的平滑方法。这种平滑方法改进了absolute discounting中与高阶分布相结合的低阶分布的计算方法,使不同阶分布得到充分的利用。这种算法也综合利用了其他多种平滑算法的思想
\parinterval 首先介绍一下absolute discounting平滑算法,公式如下所示:
\begin{eqnarray}
......@@ -827,11 +830,19 @@ N & = & \sum_{r>0}{p_r n_r} \nonumber \\
\label{eq:2.4-12}
\end{eqnarray}
其中$d$是固定的被裁剪的值,$\lambda$是一个正则化常数。可以看到第一项是经过减值调整过的2-gram的概率值,第二项则相当于一个带权重$\lambda$的1-gram的插值项。然而这种插值模型极易受到原始1-gram模型的干扰。
\noindent 其中$d$表示被裁剪的值,$\lambda$是一个正则化常数。可以看到第一项是经过减值调整过的2-gram的概率值,第二项则相当于一个带权重$\lambda$的1-gram的插值项。然而这种插值模型极易受到原始1-gram 模型的干扰。
\parinterval 假设我们使用2-gram和1-gram的插值模型预测下面句子中下划线处的词
\vspace{0.0em}
\begin{center}
I cannot see without my reading \underline{\ \ \ \ \ \ \ \ }
\end{center}
\vspace{0.0em}
\parinterval 假设我们使用2-gram和1-gram的插值模型预测下面句子中``[BLANK]''处的词:``I can’t see without my reading [BLANK]'',直觉上我们会猜测这个地方的词应该是glasses,但是在训练语料库中Francisco出现的频率非常高。如果在预测时仍然使用的是标准的1-gram模型,那么计算机会由于高概率选择Francisco填入句子的空白处,这结果明显是不合理的。当使用的是混合的插值模型时,如果reading Francisco这种二元语法并没有出现在语料中,就会导致1-gram对结果的影响变大,使得仍然会做出与标准1-gram模型相同的结果,犯下相同的错误。
\noindent 直觉上我们会猜测这个地方的词应该是glasses,但是在训练语料库中Francisco 出现的频率非常高。如果在预测时仍然使用的是标准的1-gram模型,那么系统会高概率选择Francisco填入下划线出,这个结果明显是不合理的。当使用的是混合的插值模型时,如果reading Francisco这种二元语法并没有出现在语料中,就会导致1-gram对结果的影响变大,使得仍然会做出与标准1-gram模型相同的结果,犯下相同的错误。
\parinterval 观察语料的二元语法发现,Francisco的前一个词仅是San,不会出现reading。这个分析提醒了我们,考虑前一个词的影响是有帮助的,比如仅在前一个词时San时,我们才给Francisco赋予一个较高的概率值。基于这种想法,改进原有的1-gram模型,创造一个新的1-gram模型$\textrm{P}_{\textrm{continuation}}$,使这个模型可以通过考虑前一个词的影响评估了当前词作为第二个词出现的可能性。
\parinterval 观察语料中的2-gram发现,Francisco的前一个词仅可能是San,不会出现reading。这个分析提醒了我们,考虑前一个词的影响是有帮助的,比如仅在前一个词时San时,我们才给Francisco赋予一个较高的概率值。基于这种想法,改进原有的1-gram模型,创造一个新的1-gram模型$\textrm{P}_{\textrm{continuation}}$,简写为$\textrm{P}_{\textrm{cont}}$。这个模型可以通过考虑前一个词的影响评估当前词作为第二个词出现的可能性。
\parinterval 为了评估$\textrm{P}_{\textrm{cont}}$,统计使用当前词作为第二个词所出现二元语法的种类,二元语法种类越多,这个词作为第二个词出现的可能性越高,呈正比:
\begin{eqnarray}
......@@ -841,13 +852,13 @@ N & = & \sum_{r>0}{p_r n_r} \nonumber \\
通过全部的二元语法的种类做归一化可得到评估的公式
\begin{eqnarray}
\textrm{P}_{\textrm{cont}}(w_i) = \frac{|\{ w_{i-1}:c(w_{i-1} w_i )>0 \}|}{|\{ (w_{j-1}, w_j):c(w_{j-1},w_j )>0 \}|}
\textrm{P}_{\textrm{cont}}(w_i) = \frac{|\{ w_{i-1}:c(w_{i-1} w_i )>0 \}|}{|\{ (w_{j-1}, w_j):c(w_{j-1}w_j )>0 \}|}
\label{eq:2.4-14}
\end{eqnarray}
\parinterval 基于分母的变化还有另一种形式
\begin{eqnarray}
\textrm{P}_{\textrm{cont}}(w_i) = \frac{|\{ w_{i-1}:c(w_{i-1} w_i )>0 \}|}{\sum_{w^{\prime}}|\{ w_{i-1}^{\prime}:c(w_{i-1}^{\prime},w_i^{\prime} )>0 \}|}
\textrm{P}_{\textrm{cont}}(w_i) = \frac{|\{ w_{i-1}:c(w_{i-1} w_i )>0 \}|}{\sum_{w^{\prime}}|\{ w_{i-1}^{\prime}:c(w_{i-1}^{\prime} w_i^{\prime} )>0 \}|}
\label{eq:2.4-15}
\end{eqnarray}
......@@ -865,7 +876,7 @@ N & = & \sum_{r>0}{p_r n_r} \nonumber \\
\noindent 这里$\max(\cdot)$保证了分子部分为不小0的数,原始1-gram更新成$\textrm{P}_{\textrm{cont}}$概率分布,$\lambda$是正则化项。
\parinterval 为了更具普适性,不仅局限为2-gram和1-gram的插值模型,利用递归的方式得到更通用的公式
\parinterval 为了更具普适性,不仅局限为2-gram和1-gram的插值模型,利用递归的方式可以得到更通用的Kneser-Ney平滑公式
\begin{eqnarray}
\textrm{P}_{\textrm{KN}}(w_i|w_{i-n+1} ...w_{i-1}) & = & \frac{\max(c_{\textrm{KN}}(w_{i-n+1}...w_{i-1})-d,0)}{c_{\textrm{KN}}(w_{i-n+1}...w_{i-1})} + \nonumber \\
& & \lambda(w_{i-n+1}...w_{i-1})\textrm{P}_{\textrm{KN}}(w_i|w_{i-n+2}...w_{i-1})
......@@ -876,7 +887,7 @@ c_{\textrm{KN}}(\cdot) & = & \begin{cases} \textrm{count}(\cdot)\quad \textrm{fo
\end{eqnarray}
\noindent 其中catcount$(\cdot)$表示的是基于某个单个词作为第$n$个词的$n$-gram的种类数目。
\parinterval 我们前面提到Kneser-Ney Smoothing 是当前一个标准的、广泛采用的、先进的平滑算法。还有很多基于此为基础衍生出来的算法,有兴趣的读者可以查找更多资料了解。\cite{parsing2009speech}\cite{ney1994structuring}\cite{chen1999empirical}
\parinterval Kneser-Ney平滑是很多语言模型工具的基础({\color{red} 引用参考文献!NiuTrans、KenLM、Berkeley LM、SRILM})。还有很多基于此为基础衍生出来的算法,有兴趣的读者可以通过参考文献自行了解\cite{parsing2009speech}\cite{ney1994structuring}\cite{chen1999empirical}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{句法分析(短语结构分析)}\index{Chapter2.5}
......@@ -1173,7 +1184,7 @@ r_6: & & \textrm{VP} \to \textrm{VV} \textrm{NN} \nonumber
\end{figure}
%-------------------------------------------
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{小结及深入阅读}\index{Chapter2.6}
\section{小结及深入阅读} \label{sec2:summary}\index{Chapter2.6}
\parinterval 在本章中,我们重点介绍了如何对自然语言处理问题进行统计建模,并从数据中自动学习统计模型的参数,最终使用学习到的模型对新输入的问题进行处理。之后,我们将这种思想应用到三个自然语言处理任务,包括:中文分词、语言建模、句法分析,这三个任务也和机器翻译有着紧密的联系。从中可以看出,经过适当的假设和化简,统计模型可以很好的描述复杂的自然语言处理问题。相关概念和方法都会在后续章节的机器翻译内容中被频繁使用。
......
......@@ -23,5 +23,5 @@
\indexentry{Chapter2.5|hyperpage}{30}
\indexentry{Chapter2.5.1|hyperpage}{30}
\indexentry{Chapter2.5.2|hyperpage}{32}
\indexentry{Chapter2.5.3|hyperpage}{36}
\indexentry{Chapter2.6|hyperpage}{38}
\indexentry{Chapter2.5.3|hyperpage}{35}
\indexentry{Chapter2.6|hyperpage}{39}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论