Commit efe053c9 by 曹润柘

update: figures modification and problem solving

parent be087cd2
......@@ -13,8 +13,6 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parinterval广义上来讲,``翻译''是指把一个事物转化为另一个事物的过程。这个概念多使用在对可序列化符号串的转化上,比如计算机程序的编译、文字翻译和蛋白质生物合成等。在程序编译中,高级语言编写的程序经过一系列的处理后转化为可执行目标程序,这是一种从高级程序语言到低级程序语言的``翻译''。在人类语言的翻译中,一种语言的文字通过某种方式转化为另一种语言的表达,这是一种自然语言的``翻译''。在蛋白质生成合成的第一步,RNA分子序列转化到特定氨基酸序列,这是一种生物学遗传信息的``翻译''。甚至说,给上联对出下联、给一幅图片写出图片的主题等都可以被看作是``翻译''的过程。
\parinterval当然,这里我们更加关注人类语言之间的翻译问题,即自然语言的翻译。如图\ref{fig:zh_en-example}所示,通过计算机可以将一段中文文字自动转化为英文文字,其中中文被称为源语言,英文被称为目标语言,系统的输入是一个源语言(即中文)的文字序列,系统的输出是一个目标语言(即英文)的文字序列。
%----------------------------------------------
% 图1.1
\begin{figure}[htp]
......@@ -25,20 +23,12 @@
\end{figure}
%-------------------------------------------
\parinterval当然,这里我们更加关注人类语言之间的翻译问题,即自然语言的翻译。如图\ref{fig:zh_en-example}所示,通过计算机可以将一段中文文字自动转化为英文文字,其中中文被称为源语言,英文被称为目标语言,系统的输入是一个源语言(即中文)的文字序列,系统的输出是一个目标语言(即英文)的文字序列。
\parinterval一直以来,自然语言文字的翻译往往是由人工完成。让计算机像人一样进行翻译似乎还是电影中的桥段,因为很难想象人类语言的多样性和复杂性可以用计算机语言进行描述。但是时至今日,人工智能技术的发展已经大大超越了人类传统的认知,用计算机进行自动翻译也不在是一种想象,它已经深入到人们生活的很多方面,发挥着重要作用。而这个过程也被称作机器翻译,类似的,自动翻译、智能翻译、多语言自动转换等概念也是指同样的事情。如果将今天的机器翻译和人工翻译进行对比,可以发现机器翻译系统所生成的译文还并不完美,有时翻译质量甚至非常差,但是其优点在于速度快并且成本低,更为重要的是机器翻译系统可以从大量数据中不断学习和进化,翻译质量不断得到提升。人工翻译尽管翻译的精度很高,但是费时费力。当需要翻译大量的文本且精度要求不那么高时,比如海量数据的浏览型任务,机器翻译的优势就体现了出来。对于人工作业无法完成的事情,使用机器翻译可能只需花几个小时甚至几分钟就能完成。这就类似于拿着锄头耕地种庄稼和使用现代化机器作业。
\parinterval实现机器翻译往往需要多个学科知识的融合,如数学、语言学、计算机科学、心理学等等。而最终呈现给我们的是一套软件系统– 即机器翻译系统。通俗来讲,机器翻译系统就是一个可以在计算机上运行的软件工具,与我们使用的其它软件一样。只不过机器翻译系统是由``不可见的程序''组成,虽然这个系统非常复杂,但是呈现出来的展示形式却很简单,比如输入是待翻译的句子或文本,输出是译文句子或文本。
\parinterval虽然机器翻译的想法可以追溯到电子计算机产生之前,发展过程中也经历了多个范式的变迁,现代机器翻译系统大多是使用的是基于数据驱动的方法– 即从数据中自动学些翻译知识,并运用这些知识对新的文本进行翻译。如图\ref{fig:Required-parts-of-MT}所示,这类系统通常由两部分组成:
\vspace{0.5em}
\begin{itemize}
\item 资源:如果把机器翻译系统比作一辆汽车,资源好比是可以使汽车运行的``汽油'',它包括很多内容,如翻译规则、双(单)语数据、知识库等等翻译知识,且这些``知识''都是计算机可读的。值得一提的是:如果没有翻译资源的支持,任何的机器翻译系统都无法运行起来。
\vspace{0.5em}
\item 系统:机器翻译算法的程序实现被称作系统,也就是开发的软件。无论是翻译规则、翻译模板,还是统计模型中的参数都需要通过机器翻译系统进行读取和使用。
\end{itemize}
\vspace{0.5em}
%----------------------------------------------
% 图1.2
\begin{figure}[htp]
......@@ -49,6 +39,16 @@
\end{figure}
%-------------------------------------------
\parinterval虽然机器翻译的想法可以追溯到电子计算机产生之前,发展过程中也经历了多个范式的变迁,现代机器翻译系统大多是使用的是基于数据驱动的方法– 即从数据中自动学些翻译知识,并运用这些知识对新的文本进行翻译。如图\ref{fig:Required-parts-of-MT}所示,这类系统通常由两部分组成:
\vspace{0.5em}
\begin{itemize}
\item 资源:如果把机器翻译系统比作一辆汽车,资源好比是可以使汽车运行的``汽油'',它包括很多内容,如翻译规则、双(单)语数据、知识库等等翻译知识,且这些``知识''都是计算机可读的。值得一提的是:如果没有翻译资源的支持,任何的机器翻译系统都无法运行起来。
\vspace{0.5em}
\item 系统:机器翻译算法的程序实现被称作系统,也就是开发的软件。无论是翻译规则、翻译模板,还是统计模型中的参数都需要通过机器翻译系统进行读取和使用。
\end{itemize}
\vspace{0.5em}
\parinterval构建一个强大的机器翻译系统需要``资源''和``系统''两方面共同作用。在资源方面,随着语料库语言学的发展,已经有大量高质量的双语和单语数据(称为语料)被整理并且电子化,研发机器翻译系统所需要语料基础已经具备。特别是像英语、汉语等世界主流语种,相关语料资源已经非常丰富,这也大大加速了相关研究的进展。当然,对于一些稀缺资源语种或者特殊的领域,语料库仍然非常缺乏,但是这些并不影响机器翻译领域整体的发展速度。在语料库条件已经具备的基础上,很多研究者可以把精力集中在``系统''上。但是,机器翻译并非易事,有几方面挑战:
\vspace{0.5em}
......@@ -79,7 +79,7 @@
\caption{罗塞塔石碑}
\label{fig:rosetta-stone}
\end{figure}
%-------------------------------------------
%------------------------------------------
\parinterval但是翻译本身并不是来源于罗塞塔石碑。后来的翻译工作更多的是在文献传播中被大家接受。其中一个典型代表是宗教文献的翻译。在人类的历史长河中,宗教是人类意识形态的一个重要载体。为了宣传教义,产生了大量的宗教文献。在西方,一项最早被记录的翻译活动是将旧约圣经(希伯来文及埃兰文)翻译为希腊文版本。并且迄今为止人类历史上翻译版本最多的书就是圣经。在中国唐代,一个著名的人物是玄奘,他不仅是佛学家、旅行家,还是翻译家。玄奘西行求法归来后把全部的心血和智慧奉献给了译经事业,在助手们的帮助下,共翻译佛教经论74部,1335卷,每卷万字左右,合计1335万字,占去整个唐代译经总数的一半以上,是翻译史上的杰出典范。
......@@ -132,42 +132,53 @@
\parinterval今天,神经机器翻译已经成为新的范式,大有全面替代统计机器翻译之势。比如,从世界上著名的机器翻译比赛WMT和CCMT中就可以看出这个趋势。如图\ref{fig:wmt}所示,其中左图是WMT19全球机器翻译比赛的参赛队伍的截图,图中的队伍基本全是使用深度学习完成机器翻译的建模的。而在WMT19各个项目夺冠系统中(\ref{fig:wmt}右图),神经机器翻译也几乎一统天下。
\parinterval值得一提的是近些年神经机器翻译的快速发展也得益于产业界的关注。各大互联网企业和机器翻译技术研发机构都对神经机器翻译的模型和实践方法给予了很大贡献。比如,除了谷歌,微软、百度、搜狗、腾讯、阿里、有道、小牛翻译等企业凭借自身人才和基础设施方面的优势,先后推出了以神经机器翻译为内核的产品及服务,相关技术方法已经在大规模应用中得到验证,大大推动了机器翻译的产业化进程,而且这种趋势在不断加强,机器翻译的前景也更加宽广。
%----------------------------------------------
% 图1.6
\begin{figure}[htp]
\centering
\includegraphics[scale=0.3]{./Chapter1/Figures/figure-wmt-participation.jpg}
\includegraphics[scale=0.3]{./Chapter1/Figures/figure-wmt-bestresults.jpg}
\setlength{\belowcaptionskip}{-1.5em}
\caption{左图是WMT19参赛队伍,右图是WMT19最终个项目最好分数结果}
\label{fig:wmt}
\end{figure}
%-------------------------------------------
\section{机器翻译现状}\index{Chapter1.3}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parinterval机器翻译技术发展到今天已经经过无数次迭代,技术范式也经过若干次更替,近些年机器翻译的应用也如雨后春笋。但是大家都很好奇今天的机器翻译的质量究竟如何呢?乐观地说,在受限条件下,机器翻译的译文结果还是非常不错的,甚至可以接近人工翻译的结果。然而在开放式翻译任务中,机器翻译的结果却并不理想。更严格来说,机器翻译的质量实则远没有达到人们所期望的完美的程度。对于有些人提到的``机器翻译代替人工翻译''也并不是事实。比如,在高精度同声传译任务中,机器翻译仍需要更多打磨;再比如,针对于小说的翻译,机器翻译还无法做到与人工翻译媲美;甚至有人尝试用机器翻译系统翻译中国古代诗词,这里更多的是娱乐的味道。但是毫无疑问的是,机器翻译可以帮助人,甚至有朝一日可以代替一些低端的翻译工作。
\parinterval\ref{fig:results-zh-to-en news-field-translation}展示了机器翻译和人工翻译质量的一个对比结果。在汉语到英语的新闻翻译任务中,如果对译文进行人工评价,五分制机器翻译的译文得3.9分,人的译文得4.7分(人的翻译也不是完美的)。可见在这个任务中,机器翻译表现不错,但是与人还有一定差距。如果换一种方式评价,把人的译文作为参考答案,用机器翻译的译文与其进行自动比对,会发现机器翻译的得分只有47分。当然,这个结果并不是说机器翻译的译文质量很差,它更多的表明机器翻译系统可以生成一些与人工翻译不同的译文,机器翻译也具有一定的创造性。这也类似于,很多围棋选手都向AlphaGo学习一下,因为智能围棋系统也可以走出一些人类从未走过的妙招。\\
\parinterval\ref{fig:results-zh-to-en news-field-translation}展示了机器翻译和人工翻译质量的一个对比结果。在汉语到英语的新闻翻译任务中,如果对译文进行人工评价,五分制机器翻译的译文得3.9分,人的译文得4.7分(人的翻译也不是完美的)。可见在这个任务中,机器翻译表现不错,但是与人还有一定差距。如果换一种方式评价,把人的译文作为参考答案,用机器翻译的译文与其进行自动比对,会发现机器翻译的得分只有47分。当然,这个结果并不是说机器翻译的译文质量很差,它更多的表明机器翻译系统可以生成一些与人工翻译不同的译文,机器翻译也具有一定的创造性。这也类似于,很多围棋选手都向AlphaGo学习一下,因为智能围棋系统也可以走出一些人类从未走过的妙招。
%----------------------------------------------
% 图1.7
\begin{figure}[htp]
\centering
\input{./Chapter1/Figures/figure-results-zh-to-en-news-field-translation}
\setlength{\belowcaptionskip}{-0.5em}
\caption{真实的结果-汉英新闻领域翻译}
\label{fig:results-zh-to-en news-field-translation}
\end{figure}
%-------------------------------------------
\vspace{-0.5em}
\parinterval\ref{fig:comparison-mt-ht}展示了一个真实的汉语到英语翻译实例。对比发现,机器翻译与人工翻译还是存在差距的,特别是在翻译一些具有感情色彩的词语时,机器翻译的译文缺一些味道。那么,机器翻译一点用都没有吗 -显然不是。实际上,如果考虑翻译速度与翻译代价,机器翻译的价值是无可比拟的。还是同一个例子,如果人工翻译需要30分钟甚至更长时间,而机器翻译仅仅需要两秒,换种情况思考,如果有100万篇这样的文档,其人工翻译的成本根本无法想象,消耗的时间更是难以计算,而计算机集群仅仅需要一天,而且只有电力的消耗。
%\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
%----------------------------------------------
% 图1.9
\begin{figure}[htp]
\centering
\input{./Chapter1/Figures/figure-Example-RBMT}
\setlength{\belowcaptionskip}{-1.5em}
\caption{基于规则的机器翻译的示例图\\1. 左侧是规则库2.右侧是匹配结构}
\label{fig:Example-RBMT}
\end{figure}
%-------------------------------------------
%----------------------------------------------
% 图1.8
\begin{figure}[htp]
\centering
\input{./Chapter1/Figures/figure-comparison-mt-ht}
\setlength{\belowcaptionskip}{7.0em}
\caption{机器翻译与人工翻译实例结果对比}
\label{fig:comparison-mt-ht}
\end{figure}
......@@ -184,17 +195,6 @@
\parinterval\ref{fig:Example-RBMT}展示了一个使用规则进行翻译的实例。这里,利用一个简单的汉译英规则库完成对句子``我对你感到满意''进行翻译。当翻译``我''时,从规则库中找到规则1,该规则表示遇到单词``我''就翻译为``I'';类似的,也可以从规则库中找到规则4,该规则表示翻译调序,即将单词``you''放到``be satisfied with''后面。可以看到,这些规则的使用和我们进行翻译时所使用的思想非常类似,可以说基于规则方法实际上在试图描述人类进行翻译的思维过程。
\parinterval但是,基于规则的机器翻译也存在问题。首先,书写规则需要消耗大量人力,规则库的维护代价极高;其次,规则很难涵盖所有的语言现象;再有,自然语言存在大量的歧义现象,规则之间也会存在冲突,这也导致规则数量不可能无限制增长。
%----------------------------------------------
% 图1.9
\begin{figure}[htp]
\centering
\input{./Chapter1/Figures/figure-Example-RBMT}
\caption{基于规则的机器翻译的示例图\\1. 左侧是规则库2.右侧是匹配结构}
\label{fig:Example-RBMT}
\end{figure}
%-------------------------------------------
\subsection{基于实例的机器翻译}\index{Chapter1.4.2}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parinterval基于规则的方法更多的被使用在受限翻译场景的中,比如受限词汇集的翻译。针对基于规则的方法的问题,基于实例的机器翻译于上世纪80年代中期被提出\cite{nagao1984framework}该方法的基本思想是在双语句库中找到与待翻译句子相似的实例,之后对实例的译文进行必要修改,如替换、增加、删除等一系列操作,从而得到最终译文。这个过程可以类比人类学习并运用语言的过程:人会先学习一些翻译实例或者模板,当遇到新的句子时,会用以前的实例和模板作对比,之后得到新的句子的翻译结果。这也是一种举一反三的思想。
......@@ -203,6 +203,7 @@
\parinterval当然,基于实例的机器翻译也并不完美。首先,这种方法对翻译实例的精确度要求非常高,一个实例的错误可能会导致一个句型都无法翻译正确;其次,实例维护较为困难,实例库的构建通常需要单词一级对齐的标注,而保证词对齐的质量是非常困难的工作,这也大大增加了实例库维护的难度;再有,尽管可以通过实例或者模板进行翻译,但是其覆盖度仍然有限。在实际应用中,很多句子无法找到可以匹配的实例或者模板。
%----------------------------------------------
% 图1.10
\begin{figure}[htp]
......@@ -217,9 +218,6 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parinterval统计机器翻译兴起于上世纪90年代\cite{brown1990statistical}\cite{koehn2003statistical}它利用统计模型从单/双语语料中自动学习翻译知识。具体来说,可以使用单语语料学习语言模型,使用双语平行语料学习翻译模型,并使用这些统计模型完成对翻译过程的建模。整个过程不需要人工编写规则,也不需要从实例中构建翻译模板。无论是词、短语,甚至句法结构,统计机器翻译系统都可以自动学习,人更多的是参与定义翻译所需的特征和基本翻译单元的形式。而翻译知识都保存在模型的参数中。
\parinterval\ref{fig:Example-SMT}展示了一个统计机器翻译系统运行的简单实例。整个系统需要两个模型:翻译模型和语言模型。其中,翻译模型从双语平行语料中学习翻译知识,得到短语表,其中包含各种词汇的翻译及其概率,这样可以度量源语言和目标语言片段之间互为翻译的可能性大小;语言模型从单语语料中学习目标语的词序列生成规律,来衡量目标语言译文的流畅性。最后,将这两种模型联合使用,翻译引擎来搜索尽可能多的翻译结果,并计算不同翻译结果的可能性大小,最后将概率最大的译文作为最终结果输出。这个过程并没有显性使用人工翻译规则和模板,译文的生成仅仅依赖翻译模型和语言模型中的统计参数。
\parinterval由于没有对翻译过程进行过多的限制,统计机器翻译有更加灵活的译文生成方式,因此系统可以处理更加多样的句子。但是这种方法也带来了一些问题:首先,虽然并不需要人工定义翻译规则或模板,统计机器翻译系统仍然需要人工定义翻译特征。提升翻译品质往往需要大量的特征工程,导致人工特征设计的好坏对系统往往产生决定性影响;其次,统计机器翻译的模块较多,系统研发比较复杂;还有,随着训练数据增多,统计机器翻译的模型(比如短语翻译表)会明显增加,这也在一定程度上妨碍了系统在存储资源受限情况下使用。
%----------------------------------------------
% 图1.11
......@@ -231,14 +229,14 @@
\end{figure}
%-------------------------------------------
\parinterval\ref{fig:Example-SMT}展示了一个统计机器翻译系统运行的简单实例。整个系统需要两个模型:翻译模型和语言模型。其中,翻译模型从双语平行语料中学习翻译知识,得到短语表,其中包含各种词汇的翻译及其概率,这样可以度量源语言和目标语言片段之间互为翻译的可能性大小;语言模型从单语语料中学习目标语的词序列生成规律,来衡量目标语言译文的流畅性。最后,将这两种模型联合使用,翻译引擎来搜索尽可能多的翻译结果,并计算不同翻译结果的可能性大小,最后将概率最大的译文作为最终结果输出。这个过程并没有显性使用人工翻译规则和模板,译文的生成仅仅依赖翻译模型和语言模型中的统计参数。
\parinterval由于没有对翻译过程进行过多的限制,统计机器翻译有更加灵活的译文生成方式,因此系统可以处理更加多样的句子。但是这种方法也带来了一些问题:首先,虽然并不需要人工定义翻译规则或模板,统计机器翻译系统仍然需要人工定义翻译特征。提升翻译品质往往需要大量的特征工程,导致人工特征设计的好坏对系统往往产生决定性影响;其次,统计机器翻译的模块较多,系统研发比较复杂;还有,随着训练数据增多,统计机器翻译的模型(比如短语翻译表)会明显增加,这也在一定程度上妨碍了系统在存储资源受限情况下使用。
\subsection{神经机器翻译}\index{Chapter1.4.4}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parinterval随着机器学习技术的发展,基于深度学习的神经机器翻译逐渐开始兴起。自2014年开始,它在短短几年内已经在大部分任务上取得了明显的优势\cite{sutskever2014sequence}\cite{bahdanau2014neural}神经机器翻译中,词串被表示成实数向量,即分布式向量表示。这样,翻译过程并不是在离散化的单词和短语上进行,而是在实数向量空间上计算,因此它对词序列表示的方式产生了本质的改变。通常,机器翻译可以被看作一个序列到另一个序列的转化。在神经机器翻译中,序列到序列的转化过程可以由编码器-解码器(encoder-decoder)框架实现。其中,编码器把源语言序列进行编码,并提取源语言中信息并进行分布式表示,之后解码器再把这种信息转换到另一种语言的表达。
\parinterval\ref{fig:Example-NMT}展示了一个神经机器翻译的实例。首先,通过编码器,源语言序列``我对你感到满意''经过多层神经网络编码生成一个向量表示,即图中的向量(0.2,-1,6,5,0.7,-2)。再将该向量作为输入到解码器中,解码器把这个向量解码成目标语言序列。注意,目标语言序列的生成是逐词进行的(虽然图中展示的是解码器生成整个序列,但是在具体实现时是逐个单词生成目标语译文),产生某个词的时候依赖之前生成的目标语言的历史信息,直到产生句子结束符为止。
\parinterval相比统计机器翻译,神经机器翻译的优势体现在其不需要特征工程,所有信息由神经网络自动从原始输入中提取。而且,相比离散化的表示,词和句子的分布式连续空间表示可以建模提供更为丰富的信息,同时可以使用相对成熟的基于梯度的方法优化模型。此外,神经网络的存储需求较小,天然适合小设备上的应用。但是,神经机器翻译也存在问题。首先,虽然脱离了特征工程,神经网络的结构需要人工设计,即使设计好结构,系统的调优、超参数的设置等等仍然依赖大量的实验;其次,神经机器翻译现在缺乏可解释性,其过程和人的认知差异很大,通过人的先验知识干预的程度差;再有,神经机器翻译对数据的依赖很大,数据规模、质量对性能都有很大影响,特别是在数据稀缺的情况下,充分训练神经网络具有挑战。
%----------------------------------------------
% 图1.12
\begin{figure}[htp]
......@@ -249,6 +247,10 @@
\end{figure}
%-------------------------------------------
\parinterval\ref{fig:Example-NMT}展示了一个神经机器翻译的实例。首先,通过编码器,源语言序列``我对你感到满意''经过多层神经网络编码生成一个向量表示,即图中的向量(0.2,-1,6,5,0.7,-2)。再将该向量作为输入到解码器中,解码器把这个向量解码成目标语言序列。注意,目标语言序列的生成是逐词进行的(虽然图中展示的是解码器生成整个序列,但是在具体实现时是逐个单词生成目标语译文),产生某个词的时候依赖之前生成的目标语言的历史信息,直到产生句子结束符为止。
\parinterval相比统计机器翻译,神经机器翻译的优势体现在其不需要特征工程,所有信息由神经网络自动从原始输入中提取。而且,相比离散化的表示,词和句子的分布式连续空间表示可以建模提供更为丰富的信息,同时可以使用相对成熟的基于梯度的方法优化模型。此外,神经网络的存储需求较小,天然适合小设备上的应用。但是,神经机器翻译也存在问题。首先,虽然脱离了特征工程,神经网络的结构需要人工设计,即使设计好结构,系统的调优、超参数的设置等等仍然依赖大量的实验;其次,神经机器翻译现在缺乏可解释性,其过程和人的认知差异很大,通过人的先验知识干预的程度差;再有,神经机器翻译对数据的依赖很大,数据规模、质量对性能都有很大影响,特别是在数据稀缺的情况下,充分训练神经网络具有挑战。
\subsection{对比}\index{Chapter1.4.5}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
......@@ -332,7 +334,6 @@
\parinterval目前使用最广泛的自动评价指标是BLEU。BLEU是Bilingual Evaluation understudy的缩写,最早由IBM在2002年提出\cite{papineni2002bleu}。通过采用$n$-gram匹配的方式评定机器翻译结果和参考译文之间的相似度,即机器翻译的结果越接近人工参考译文就认定它的质量越高。$n$-gram是指$n$个连续单词组成的单元,称为$n$元语法单元。$n$越大表示考虑评价时考虑的片段匹配越大。
\parinterval BLEU的计算首先考虑待评价译文中$n$-gram在参考答案中的匹配率,称为准确率。其计算方法如下:
\begin{eqnarray}
\textrm{P}_n=\frac{\textrm{Count}_\textrm{hit}}{\textrm{Count}_{\textrm{output}}}
\label{eq:matching-rate}
......@@ -349,14 +350,12 @@ Candidate:the the the the
\parinterval在引入截断方式之前,该译文的1-gram准确率为4/4=1,这显然是不合理的。在引入截断的方式之后,the在译文中出现4次,在参考译文中出现2次,截断操作则是取二者的最小值,即$\textrm{Count}_{\textrm{hit}}= 2$$\textrm{Count}_{\textrm{output}}= 4$,该译文的1-gram准确率为2/4。
\parinterval译文整体的准确率等于各$n$-gram的加权平均:
\begin{eqnarray}
P_{\textrm{avg}}=\exp(\sum_{n=1}^Nw_n\cdot \log{P_n})
\label{eq:weighted-average}
\end{eqnarray}
\parinterval但是,该方法更倾向于对短句子打出更高的分数,一个极端的例子译文只有很少的几个词,但是都命中答案,准确率很好可显然不是好的译文。因此,BLEU引入惩罚因子(Brevity Penalty, BP)的概念,对短句进行惩罚,
\begin{eqnarray}
\textrm{BP}=
\begin{cases}
......@@ -367,7 +366,6 @@ e^{(1-\frac{r}{c})}& c<r
\end{eqnarray}
\noindent 其中$c$ : 译文的句子长度,$r$ : 参考译文的句子长度,所以最终BLEU的计算公式为:
\begin{eqnarray}
\textrm{BLEU}=\textrm{BP} \cdot \exp(\sum_{i=1}^{N}w_n \cdot \log{\textrm{P}_n})
\label{eq:BLUE}
......@@ -378,7 +376,6 @@ e^{(1-\frac{r}{c})}& c<r
\subsubsection{TER评价}\index{Chapter1.5.2.2}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parinterval TER是Translation Edit Rate的缩写,是一种基于距离的评价方法,用来评定机器翻译结果的译后编辑的工作量\cite{snover2006study}。这里,距离被定义为两个序列之间其中一个转换成另一个序列所需要的最少编辑操作次数。操作次数越多,距离越大,序列之间的相似性越低,相反距离越小,表示一个句子越容易改写成另一个句子,序列之间的相似性越高。TER使用的编辑操作包括:增加,删除,替换和移位,其中增加,删除,替换操作计算得到的距离被称为编辑距离,并根据错误率的形式给出评分:
\begin{eqnarray}
\textrm{score}=\frac{\textrm{edit}(c,r)}{l}
\label{eq:score-based-on-error-rate}
......
......@@ -22,7 +22,7 @@
%--问题概述-----------------------------------------
\section{问题概述 }\index{Chapter2.1}
\parinterval 很多时候机器翻译系统被看作是孤立的“黑盒”系统(图 \ref {figureC2.1} (a))。我们将一段文本作为输入送入机器翻译系统,之后得到翻译好的译文输出。但是真实的机器翻译系统要复杂的多。因为系统看到的输入和输出的实际上只是一些符号串,这些符号并没有任何其它意义,因此需要进一步对这些符号串进行处理才能使机器翻译系统更好的使用它们,比如,需要定义翻译中最基本的单元是什么?符号串是否还有结构信息?如何用数学工具刻画这些基本单元和结构?
\parinterval 很多时候机器翻译系统被看作是孤立的``黑盒''系统(图 \ref {fig:MT-construction-comparison} (a))。我们将一段文本作为输入送入机器翻译系统,之后得到翻译好的译文输出。但是真实的机器翻译系统要复杂的多。因为系统看到的输入和输出的实际上只是一些符号串,这些符号并没有任何其它意义,因此需要进一步对这些符号串进行处理才能使机器翻译系统更好的使用它们,比如,需要定义翻译中最基本的单元是什么?符号串是否还有结构信息?如何用数学工具刻画这些基本单元和结构?
%----------------------------------------------
% 图2.1
......@@ -31,22 +31,22 @@
\subfigure[机器翻译系统被看作一个黑盒] {\input{./Chapter2/Figures/figure-MT-system-as-a-black-box} }
\subfigure[机器翻系统 = 语言分析 + 翻译引擎] {\input{./Chapter2/Figures/figure-MT=language-analysis+translation-engine}}
\caption{机器翻译系统的结构对比}
\label{figureC2.1}
\label{fig:MT-construction-comparison}
\end{figure}
%-------------------------------------------
\parinterval\ref{figureC2.1} (b)展示了一个机器翻译系统处理输入输出的例子。可以看到,输入的中文字串“猫喜欢吃鱼”被加工成一个新的结构。
\parinterval\ref{fig:MT-construction-comparison} (b)展示了一个机器翻译系统处理输入输出的例子。可以看到,输入的中文字串``猫喜欢吃鱼''被加工成一个新的结构。
%----------------------------------------------
% 图2.2
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-analysis-of-sentence-participle&syntactic}
\caption{中文句子“猫喜欢吃鱼”的分析结果(分词和句法分析)}
\label{figureC2.2}
\caption{中文句子``猫喜欢吃鱼''的分析结果(分词和句法分析)}
\label{fig:analysis-of-sentence-participle&syntactic}
\end{figure}
%-------------------------------------------
\parinterval 直觉上,这个结构有些奇怪,因为上面多了很多新的符号,而且还有一些线将不同符号进行连接。实际上这就是语言分析中对句子常用的结构表示 – 短语结构树。从原始的词串转化为图\ref {figureC2.2} 的样子,有两个步骤:
\parinterval 直觉上,这个结构有些奇怪,因为上面多了很多新的符号,而且还有一些线将不同符号进行连接。实际上这就是语言分析中对句子常用的结构表示 – 短语结构树。从原始的词串转化为图\ref {fig:analysis-of-sentence-participle&syntactic} 的样子,有两个步骤:
\vspace{0.5em}
\begin{itemize}
......@@ -60,7 +60,7 @@
\parinterval 一般来说,在送入机器翻译系统前需要对文字序列进行处理和加工的过程被称为\textbf{预处理}。同理,在机器翻译模型输出译文后的处理作被称作\textbf{后处理}。这两个过程对机器翻译性能影响很大,比如,在神经机器翻译里,预处理使用不同策略的切分可能会造成翻译性能的天差地别。
\parinterval 值得注意的是,不论是分词还是句法分析,对于机器翻译来说并不是必须要求符合人的认知和语言学约束。换句话说,机器翻译所使用的“单词”和“结构”本身并不是为了符合人类的解释,它直接目的是更好的进行翻译。从系统的角度,有时候即使一些处理和我们的语言习惯有差别的“单词”和“结构”,仍然会带来性能的提升,比如在神经机器翻译中,在传统分词的基础上进一步使用双字节编码(Byte Pair Encoding,BPE)子词切分会使得机器翻译性能大幅提高。当然,自然语言处理中语言学信息的使用一直是学界关注的焦点。甚至关于语言学结构对机器翻译是否有作用这个问题也有争论。但是不能否认的是,无论是语言学的知识,还是计算机自己学习到的知识,对机器翻译都是有价值的。在后续章节会看到,这两种类型的知识对机器翻译帮助很大 \footnote[1]{笔者并不认同语言学结构对机器翻译的帮助有限,相反机器翻译需要更多的人类先验知识的指导。当然,这个问题不是这里讨论的重点。}
\parinterval 值得注意的是,不论是分词还是句法分析,对于机器翻译来说并不是必须要求符合人的认知和语言学约束。换句话说,机器翻译所使用的``单词''和``结构''本身并不是为了符合人类的解释,它直接目的是更好的进行翻译。从系统的角度,有时候即使一些处理和我们的语言习惯有差别的``单词''和``结构'',仍然会带来性能的提升,比如在神经机器翻译中,在传统分词的基础上进一步使用双字节编码(Byte Pair Encoding,BPE)子词切分会使得机器翻译性能大幅提高。当然,自然语言处理中语言学信息的使用一直是学界关注的焦点。甚至关于语言学结构对机器翻译是否有作用这个问题也有争论。但是不能否认的是,无论是语言学的知识,还是计算机自己学习到的知识,对机器翻译都是有价值的。在后续章节会看到,这两种类型的知识对机器翻译帮助很大 \footnote[1]{笔者并不认同语言学结构对机器翻译的帮助有限,相反机器翻译需要更多的人类先验知识的指导。当然,这个问题不是这里讨论的重点。}
\parinterval 剩下的问题是如何进行句子的切分和结构的分析。思路有很多,一种常用的方法是对问题进行概率化,用统计模型来描述问题并求解。比如,一个句子切分的好坏,并不是非零即一的判断,而是要估计出这种切分的可能性大小,最终选择可能性最大的结果进行输出。这也是一种典型的用统计建模的方式来描述自然语言处理问题。
......@@ -80,7 +80,7 @@
\parinterval 连续变量是在其取值区间内连续取值,无法被一一列举,具有无限个取值的变量。例如,图书馆的开馆时间是8:30-22:00,用$X$代表某人进入图书馆的时间,时间的取值范围是[8:30,22:00]这个时间区间,$X$是一个连续变量。
\parinterval 概率是度量随机事件呈现其每个可能状态的可能性的数值,本质上它是一个测度函数\cite{mao-prob-book-2011}\cite{kolmogorov2018foundations}。概率的大小表征了随机事件在一次试验中发生的可能性大小。用$\textrm{P}(\cdot )$表示一个随机事件的可能性,即事件发生的概率。比如$\textrm{P}(\textrm{太阳从东方升起})$表示“太阳从东方升起的可能性”,同理,$\textrm{P}(A=B)$表示的就是“$A=B$ 这件事的可能性。
\parinterval 概率是度量随机事件呈现其每个可能状态的可能性的数值,本质上它是一个测度函数\cite{mao-prob-book-2011}\cite{kolmogorov2018foundations}。概率的大小表征了随机事件在一次试验中发生的可能性大小。用$\textrm{P}(\cdot )$表示一个随机事件的可能性,即事件发生的概率。比如$\textrm{P}(\textrm{太阳从东方升起})$表示``太阳从东方升起的可能性'',同理,$\textrm{P}(A=B)$表示的就是``$A=B$'' 这件事的可能性。
\parinterval 在实际问题中,我们往往需要得到某些概率值。但是,真实的概率值往往是无法准确知道的,这时就需要对概率进行\textbf{估计},得到的结果是概率的\textbf{估计值(estimate)}。在概率论中,一个很简单的获取概率的方式是利用相对频度作为概率的估计值。如果$\{x_1,x_2,\dots,x_n \}$是一个试验的样本空间,在相同情况下重复试验N次,观察到样本$x_i (1\leq{i}\leq{n})$的次数为$n_N (x_i )$,那么$x_i$在这N次试验中的相对频率是$\frac{n_N (x_i )}{N}$。当N越来越大时,相对概率也就越来越接近真实概率$\textrm{P}(x_i)$,即$\lim_{N \to \infty}\frac{n_N (x_i )}{N}=\textrm{P}(x_i)$。 实际上,很多概率模型都等同于相对频度估计,比如,对于一个多项式分布变量的概率的极大似然估计就可以用相对频度估计实现。
......@@ -112,7 +112,7 @@
\centering
\input{./Chapter2/Figures/figure-Probability-density-function&Distribution-function}
\caption{一个概率密度函数(左)与其对应的分布函数(右)}
\label{figureC2.3}
\label{fig:Probability-density-function&Distribution-function}
\end{figure}
%-------------------------------------------
\subsection{联合概率、条件概率和边缘概率}\index{Chapter2.2.2}
......@@ -126,31 +126,27 @@
%----------------------------------------------
\begin{eqnarray}
\textrm{P}{(B|A)} = \frac{\textrm{P}(A\cap{B})}{\textrm{P}(A)} = \frac{\textrm{P}(A)\textrm{P}(B|A)}{\textrm{P}(A)} = \frac{\textrm{P}(B)\textrm{P}(A|B)}{\textrm{P}(A)}
\label{eqC2.1}
\label{eqC2.1-new}
\end{eqnarray}
%----------------------------------------------
\parinterval \textbf{边缘概率(marginal probability)}是和联合概率对应的,它指的是$\textrm{P}(X=a)$$\textrm{P}(Y=b)$,即仅与单个随机变量有关的概率称为边缘概率。
\parinterval 对于离散随机变量$X$$Y$,我们知道$\textrm{P}(X,Y)$,则边缘概率$\textrm{P}(X)$可以通过求和的方式得到,如下式所示
%----------------------------------------------
\begin{eqnarray}
\forall x \in X ,\textrm{P}(X=x)=\sum_{y} \textrm{P}(X=x,Y=y)
\label{eqC2.2}
\label{eqC2.2-new}
\end{eqnarray}
%----------------------------------------------
\parinterval 对于连续变量,边缘概率$\textrm{P}(X)$需要通过积分得到,如下式所示
%----------------------------------------------
\begin{eqnarray}
\textrm{P}(X)=\int \textrm{P}(x,y)dy
\label{eqC2.3}
\label{eqC2.3-new}
\end{eqnarray}
%----------------------------------------------
\parinterval 为了更好的区分条件概率、边缘概率和联合概率,我们将通过图\ref{figureC2.4}所示的面积来举例说明。
\parinterval 为了更好的区分条件概率、边缘概率和联合概率,我们将通过图\ref{fig:schematic-edge-probability&joint-probability}所示的面积来举例说明。
%----------------------------------------------
% 图2.4
......@@ -158,11 +154,11 @@
\centering
\input{./Chapter2/Figures/figure-schematic-edge-probability&joint-probability}
\caption{一个概率密度函数与其对应的分布函数}
\label{figureC2.4}
\label{fig:schematic-edge-probability&joint-probability}
\end{figure}
%-------------------------------------------
\parinterval 如图\ref{figureC2.4}所示,矩形A代表事件X发生所对应的所有可能状态,矩形B代表事件Y发生所对应的所有可能状态,矩形C代表A和B的交集,则
\parinterval 如图\ref{fig:schematic-edge-probability&joint-probability}所示,矩形A代表事件X发生所对应的所有可能状态,矩形B代表事件Y发生所对应的所有可能状态,矩形C代表A和B的交集,则
\parinterval 边缘概率:矩形A或者矩形B的面积;
......@@ -173,22 +169,18 @@
\subsection{链式法则}\index{Chapter2.2.3}
\parinterval 由条件概率公式$\textrm{P}(a \mid b)=\textrm{P}(ab)/\textrm{P}(b)$反应了事件b发生的条件下事件a发生的概率。如果我们将其推广到三个事件$a$$b$$c$,为了计算$\textrm{P}(a,b,c)$我们可以运用两次$\textrm{P}(a \mid b)=\textrm{P}(ab)/\textrm{P}(b)$,计算过程如下:
%----------------------------------------------
\begin{eqnarray}
\textrm{P}(a,b,c) & = & \textrm{P}(a \mid b ,c)\textrm{P}(b,c) \nonumber \\
\textrm{P}(b,c) & = & \textrm{P}(b \mid c)\textrm{P}(c)\nonumber \\
\textrm{P}(a,b,c) & = & \textrm{P}(a \mid b,c)\textrm{P}(b \mid c)\textrm{P}(c)
\label{eqC2.4}
\label{eqC2.4-new}
\end{eqnarray}
%----------------------------------------------
\parinterval 推广到$n$个事件,我们得到了链式法则的公式
%----------------------------------------------
\begin{eqnarray}
\textrm{P}(x_1,x_2,...,x_n)=\textrm{P}(x_1) \prod_{i=2}^n \textrm{P}(x_i \mid x_1,x_2,...,x_{(i-1)})
\label{eqC2.5}
\label{eqC2.5-new}
\end{eqnarray}
%----------------------------------------------
......@@ -201,7 +193,7 @@
\input{./Chapter2/Figures/figure-schematic-chain-rule}
\setlength{\belowcaptionskip}{-1cm}
\caption{A,B,C,D,E关系图}
\label{figureC2.5}
\label{fig:schematic-chain-rule}
\end{figure}
%-------------------------------------------
\begin{eqnarray}
......@@ -209,14 +201,14 @@
&=&\textrm{P}(E \mid A,B,C,D) \cdot \textrm{P}(D \mid A,B,C) \cdot \textrm{P}(A,B,C) \nonumber \\
&=&\textrm{P}(E \mid A,B,C,D) \cdot \textrm{P}(D \mid A,B,C) \cdot \textrm{P}(C \mid A,B) \cdot \textrm{P}(A,B) \nonumber \\
&=&\textrm{P}(E \mid A,B,C,D) \cdot \textrm{P}(D \mid A,B,C) \cdot \textrm{P}(C \mid A,B) \cdot \textrm{P}(B \mid A) \cdot \textrm{P}(A)\nonumber \\
\label{eqC2.6}
\label{eqC2.6-new}
\end{eqnarray}
\parinterval 根据图\ref {figureC2.5} 易知$E$只和$C$有关,所以$\textrm{P}(E \mid A,B,C,D)=\textrm{P}(E \mid C)$$D$不依赖于其他事件,所以$\textrm{P}(D \mid A,B,C)=\textrm{P}(D)$$C$只和$BD$有关,所以$\textrm{P}(C \mid A,B)=\textrm{P}(C \mid B)$$B$不依赖于其他事件,所以$\textrm{P}(B \mid A)=\textrm{P}(B)$。最终化简可得:
\parinterval 根据图\ref {fig:schematic-chain-rule} 易知$E$只和$C$有关,所以$\textrm{P}(E \mid A,B,C,D)=\textrm{P}(E \mid C)$$D$不依赖于其他事件,所以$\textrm{P}(D \mid A,B,C)=\textrm{P}(D)$$C$只和$BD$有关,所以$\textrm{P}(C \mid A,B)=\textrm{P}(C \mid B)$$B$不依赖于其他事件,所以$\textrm{P}(B \mid A)=\textrm{P}(B)$。最终化简可得:
%---------------------------------------------
\begin{eqnarray}
\textrm{P}(A,B,C,D,E)=\textrm{P}(E \mid C) \cdot \textrm{P}(D) \cdot \textrm{P}(C \mid B) \cdot \textrm{P}(B)
\label{eqC2.7}
\label{eqC2.7-new}
\end{eqnarray}
%---------------------------------------------
......@@ -231,13 +223,13 @@
%---------------------------------------------
\begin{eqnarray}
\bigcup_{i=1}^n B_i=S \textrm{}B_iB_j=\varnothing , i,j=1,...,n,i\neq j
\label{eqC2.8}
\label{eqC2.8-new}
\end{eqnarray}
\parinterval$B_1,…,B_n$是S的一个划分,A为事件,则
\begin{eqnarray}
\textrm{P}(A)=\sum_{k=1}^n \textrm{P}(A \mid B_k)\textrm{P}(B_k)
\label{eqC2.9}
\label{eqC2.9-new}
\end{eqnarray}
%---------------------------------------------
\parinterval 这就是全概率公式。
......@@ -257,49 +249,47 @@
\end{eqnarray}
%--------------------------------------------
%$\textrm{P}(L)=\textrm{P}( L| S_a )\textrm{P}(S_a )+\textrm{P}( L| S_b )\textrm{P}(S_b )+\textrm{P}( L| S_c )\textrm{P}(S_c )=\textrm{P}({S_{a}^{'}})\textrm{P}(S_a)+\textrm{P}({S_{b}^{'}})\textrm{P}(S_b)+\textrm{P}({S_{c}^{'}})\textrm{P}(S_c)=0.36$
\parinterval \textbf{贝叶斯法则(Bayes’ rule)}是概率论中的一个定理,通常用于知$\textrm{P}(A \mid B)$$\textrm{P}(B \mid A)$。其内容如下:
%--------------------------------------------
\parinterval$B_1,…,B_n$是S的一个划分,A为事件,则对于$i=1,…,n$,有如下公式
\begin{eqnarray}
\textrm{P}(B_i \mid A)=\frac {\textrm{P}(A \mid B_i)\textrm{P}(B_i) } { \sum_{k=1}^n\textrm{P}(A \mid B_k)\textrm{P}(B_k) }
\label{eqC2.10}
\label{eqC2.10-new}
\end{eqnarray}
\parinterval 来看一下贝叶斯公式的推导。由前面的知识,我们知道条件概率的公式为
\begin{eqnarray}
\textrm{P}(B \mid A)= \frac {\textrm{P}(AB)} {\textrm{P}(A)}
\label{eqC2.11}
\label{eqC2.11-new}
\end{eqnarray}
\parinterval 由乘法定理我们可以得到
\begin{eqnarray}
\textrm{P}(AB)=\textrm{P}(B)\textrm{P}(A \mid B)
\label{eqC2.12}
\label{eqC2.12-new}
\end{eqnarray}
\parinterval$B_1,…,B_n$是S的一个划分,A为事件,由全概率公式我们可以得到
\begin{eqnarray}
\textrm{P}(A)=\textrm{P}(A \mid B_1)\textrm{P}(B_1)+\textrm{P}(A \mid B_2)\textrm{P}(B_2)+\ldots +\textrm{P}(A \mid B_n)\textrm{P}(B_n)
\label{eqC2.13}
\label{eqC2.13-new}
\end{eqnarray}
\parinterval 将乘法定理带入条件概率的分子,将全概率公式带入条件概率的分母,我们就可以得到贝叶斯定理
\begin{eqnarray}
\textrm{P}(B_i \mid A)=\frac {\textrm{P}(A \mid B_i)\textrm{P}(B_i) } {\sum_{k=1}^n \textrm{P}(A\mid B_k)\textrm{P}(B_k)}
\label{eqC2.14}
\label{eqC2.14-new}
\end{eqnarray}
\parinterval 由上式,我们也可以得到贝叶斯公式的另外两种写法
\begin{eqnarray}
\textrm{P}(A \mid B)=\frac { \textrm{P}(A \mid B)\textrm{P}(B) } {\textrm{P}(A)}
\label{eqC2.15}
\label{eqC2.15-new}
\end{eqnarray}
\begin{eqnarray}
\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})}
\label{eqC2.16}
\label{eqC2.16-new}
\end{eqnarray}
%--------------------------------------------
\parinterval 贝叶斯公式常用于根据已知的结果来推断使之发生的各因素的可能性。
......@@ -314,21 +304,21 @@
\begin{example}
确定性和不确定性的事件
\qquad\qquad\quad“太阳从东方升起”
\qquad\qquad\quad``太阳从东方升起''
\qquad\qquad\quad“明天天气多云”
\label{example3-1}
\qquad\qquad\quad``明天天气多云''
\label{example2-1}
\end{example}
\parinterval 在这两句话中,“太阳从东方升起”是一件确定性事件,几乎不需要查阅更多信息就可以确认,因此这件事的信息熵相对较低;而“明天天气多云”这件事,我们需要询问气象局的相关研究人员,或者关注天气预报,才能大概率确定的一件事,它的不确定性很高,因而它的信息熵也就相对较高。因此,信息熵也是对事件不确定性的度量。
\parinterval 在这两句话中,``太阳从东方升起''是一件确定性事件,几乎不需要查阅更多信息就可以确认,因此这件事的信息熵相对较低;而``明天天气多云''这件事,我们需要询问气象局的相关研究人员,或者关注天气预报,才能大概率确定的一件事,它的不确定性很高,因而它的信息熵也就相对较高。因此,信息熵也是对事件不确定性的度量。
\parinterval 一个事件X的自信息(self-information)的表达式为:
\begin{eqnarray}
\textrm{I}(x)=-log\textrm{P}(x)
\label{eqC2.17}
\label{eqC2.17-new}
\end{eqnarray}
\parinterval 其中,$\textrm{P}(x)$表示概率,自信息用来衡量单一事件发生时所包含的信息多少,当底数为e时,单位为$nats$,其中1$nats$是通过观察概率为$\frac{1}{e}$的事件而获得的信息量;当底数为2时,单位为$bits$$shannons$,我们通常使用前者。$\textrm{I}(x)$$\textrm{P}(x)$的函数关系如图\ref{figureC2.6} 所示:
\parinterval 其中,$\textrm{P}(x)$表示概率,自信息用来衡量单一事件发生时所包含的信息多少,当底数为e时,单位为$nats$,其中1$nats$是通过观察概率为$\frac{1}{e}$的事件而获得的信息量;当底数为2时,单位为$bits$$shannons$,我们通常使用前者。$\textrm{I}(x)$$\textrm{P}(x)$的函数关系如图\ref{fig:Self-information-function} 所示:
%----------------------------------------------
% 图2.5
......@@ -336,14 +326,14 @@
\centering
\includegraphics[scale=0.5]{./Chapter2/Figures/figure-Self-information-function.pdf}
\caption{自信息函数图像}
\label{figureC2.6}
\label{fig:Self-information-function}
\end{figure}
%-------------------------------------------
\parinterval 自信息只处理单一的结果。若量化整个概率分布中的不确定性或者说信息量,我们可以用信息熵,其公式如下:
\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)) ]
\label{eqC2.18}
\label{eqC2.18-new}
\end{eqnarray}
\parinterval 一个分布的信息熵也就是从该分布中得到的一个事件的期望信息量。比如,$a$$b$$c$$d$三支球队,三支队伍夺冠的概率分别是$P1$$P2$$P3$$P4$,某个人对比赛不感兴趣但是又想知道哪只球队夺冠,通过使用二分法2次就确定哪支球队夺冠了。但其实,我们知道这四只球队中c的实力比较强劲,那么猜1次就可以确定。所以对于前者,哪只球队夺冠的信息量较高,信息熵也相对较高,对于后者信息量和信息熵也就相对较低。因此我们可以得知:较为尖锐的分布具有较低的熵;分布越接近均匀熵越大。
......@@ -353,7 +343,7 @@
\parinterval 如果在相同的随机变量$X$上有两个独立的概率分布P$(x)$和Q$(x)$,那么我们可以使用KL距离("Kullback-Leibler" 散度)来衡量这两个分布的不同,也就是大家所说的相对熵,其公式如下:
\begin{eqnarray}
\textrm{D}_{KL}(P\parallel Q)=\sum_{x \in \textrm{X}} [ \textrm{P}(x)log \frac{\textrm{P}(x) }{ \textrm{Q}(x) } ] =\sum_{x \in \textrm{X} }[ \textrm{P}(x)(log\textrm{P}(x)-log \textrm{Q}(x))]
\label{eqC2.19}
\label{eqC2.19-new}
\end{eqnarray}
\parinterval 这一概念的意义在于:在相同事件空间里,概率分布$\textrm{P}(x)$对应的每个事件,若用概率分布Q$(x)$编码时,平均每个基本事件的信息量增加了多少。它衡量的是相同事件空间里的两个概率分布的差异情况。KL距离有两条重要的性质:
......@@ -371,7 +361,7 @@
\parinterval 交叉熵是一个与KL距离密切相关的概念,它的公式是:
\begin{eqnarray}
\textrm{H}(P,Q)=-\sum_{x \in \textrm{X}} [\textrm{P}(x) log \textrm{Q}(x) ]
\label{eqC2.20}
\label{eqC2.20-new}
\end{eqnarray}
\parinterval 结合相对熵公式可知,交叉熵是KL距离公式中的右半部分。因此,求关于Q的交叉熵的最小值等价于求KL距离的最小值。交叉熵与KL距离的意义相同:都是用来描述两个分布的差异,由于交叉熵计算上更加直观方便,因此在机器翻译中被广泛应用。
......@@ -386,12 +376,12 @@
\centering
\input{./Chapter2/Figures/figure-a-simple-pre-processing-process}
\caption{一个简单的预处理流程}
\label{figureC2.7}
\label{fig:a-simple-pre-processing-process}
\end{figure}
%-------------------------------------------
\parinterval 分词得到的单元序列可以是语言学上的词序列,也可以是根据其它定义的单元。在本章中,我们把分词得到的一个个单元称为单词,尽管这些单元可以不是语言学上的完整单词。而这个过程也被称作词法分析。除了汉语,词法分析在日语、泰语等单词之间无明确分割符的语言中有着广泛的应用,芬兰语、维吾尔语等一些形态学十分丰富的语言,也需要使用词法分析来解决复杂的词尾、词缀变化等形态学变化。
\parinterval 在机器翻译中,分词系统的好坏往往会决定机器翻译的质量。分词的目的是定义系统处理的基本单元,那么什么叫做“词”呢?关于词的定义有很多,比如:\\
\parinterval 在机器翻译中,分词系统的好坏往往会决定机器翻译的质量。分词的目的是定义系统处理的基本单元,那么什么叫做``词''呢?关于词的定义有很多,比如:\\
%-------------------------------------------
\begin{definition}
......@@ -436,14 +426,14 @@
\parinterval Interests \hspace{1.17em} -> \; Interest/s selected \hspace{1.24em} -> \; se/lect/ed processed \hspace{0.42em} -> \; pro/cess/ed \\
\parinterval 词法分析的重要性在自然语言处理领域已经有共识。如果切分的颗粒度很大,获得的单词的歧义也很小,比如“中华人民共和国”整体作为一个单词不存在歧义,而如果单独的一个单词“国”,可能会代表“中国”、“美国”等不同的国家,存在歧义。但是随着切分颗粒度的增大,特定单词出现的频度也随之降低,低频词容易和噪音混淆,系统很难进行学习。因此,处理这些问题并开发适合翻译任务的分词系统是机器翻译的第一步。
\parinterval 词法分析的重要性在自然语言处理领域已经有共识。如果切分的颗粒度很大,获得的单词的歧义也很小,比如``中华人民共和国''整体作为一个单词不存在歧义,而如果单独的一个单词``国'',可能会代表``中国''、``美国''等不同的国家,存在歧义。但是随着切分颗粒度的增大,特定单词出现的频度也随之降低,低频词容易和噪音混淆,系统很难进行学习。因此,处理这些问题并开发适合翻译任务的分词系统是机器翻译的第一步。
\subsection{基于词典的分词方法}\index{Chapter2.3.1}
\parinterval 然而,计算机并不能像人类一样在概念上理解“词”,因此需要使用其他的方式让计算机可以进行分词。一个最简单的方法就是给定一个词典,在这个词典中出现的汉字组合就是我们定义的“词”。也就是,我们通过一个词典定义一个标准,符合这个标准定义的字符串都是合法的“词”
\parinterval 然而,计算机并不能像人类一样在概念上理解``词'',因此需要使用其他的方式让计算机可以进行分词。一个最简单的方法就是给定一个词典,在这个词典中出现的汉字组合就是我们定义的``词''。也就是,我们通过一个词典定义一个标准,符合这个标准定义的字符串都是合法的``词''
\parinterval 在使用基于词典的分词方法时,只需预先加载词典到计算机中,扫描输入句子,查询每个词串是否出现在词典中。如图\ref{figureC2.8} 所示,比如,我们有一个包含六个词的词典,给定输入句子“确实现在物价很高”后,我们自左至右遍历输入句子的每个字,发现词串“确实”在词典中出现,说明“确实”是一个“词”,进行分词操作并在切分该“词”之后重复这个过程。
\parinterval 在使用基于词典的分词方法时,只需预先加载词典到计算机中,扫描输入句子,查询每个词串是否出现在词典中。如图\ref{fig:Example-of-word-segmentation-based-on-dictionary} 所示,比如,我们有一个包含六个词的词典,给定输入句子``确实现在物价很高''后,我们自左至右遍历输入句子的每个字,发现词串``确实''在词典中出现,说明``确实''是一个``词'',进行分词操作并在切分该``词''之后重复这个过程。
%----------------------------------------------
% 图2.8
\begin{figure}[htp]
......@@ -451,34 +441,34 @@
\input{./Chapter2/Figures/figure-Example-of-word-segmentation-based-on-dictionary}
\setlength{\belowcaptionskip}{-0.2cm}
\caption{基于词典进行分词实例}
\label{figureC2.8}
\label{fig:Example-of-word-segmentation-based-on-dictionary}
\end{figure}
%-------------------------------------------
\parinterval 但是,基于词典的分词方法很“硬”。这是因为自然语言非常灵活,经常出现歧义,用词典定义的合法单词之间有重叠的交叉型歧义就很难解决。图\ref{figureC2.9} 就给出了上面例子中的交叉型歧义,从词典中查看,“实现”和“现在”都是合法的单词,但是在句子中二者有重叠,因此词典无法告诉我们哪个结果是正确的。
\parinterval 但是,基于词典的分词方法很``硬''。这是因为自然语言非常灵活,经常出现歧义,用词典定义的合法单词之间有重叠的交叉型歧义就很难解决。图\ref{fig:cross-type-word-segmentation-ambiguity} 就给出了上面例子中的交叉型歧义,从词典中查看,``实现''和``现在''都是合法的单词,但是在句子中二者有重叠,因此词典无法告诉我们哪个结果是正确的。
%----------------------------------------------
% 图2.9
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-cross-type-word-segmentation-ambiguity}
\setlength{\belowcaptionskip}{-0.2cm}
\setlength{\belowcaptionskip}{-0.5em}
\caption{交叉型分词歧义}
\label{figureC2.9}
\label{fig:cross-type-word-segmentation-ambiguity}
\end{figure}
%-------------------------------------------
\parinterval 类似的例子在生活中也很常见。再比如“答辩结束的和尚未答辩的同学都请留在教室”一句中,正常的分词结果是“答辩 结束 的 和 尚未 答辩 的 同学 都 请 留在 教室”,但是由于“尚未”、“和尚”都是常见词汇,使用基于词典的分词方法在这时很容易出现切分错误。
\parinterval 类似的例子在生活中也很常见。再比如``答辩结束的和尚未答辩的同学都请留在教室''一句中,正常的分词结果是``答辩 结束 的 和 尚未 答辩 的 同学 都 请 留在 教室'',但是由于``尚未''、``和尚''都是常见词汇,使用基于词典的分词方法在这时很容易出现切分错误。
\parinterval 基于词典的分词方法是典型的基于规则的方法,完全依赖于人工给定的词典。在遇到歧义时,需要人工定义消除歧义的规则,比如,可以自左向右扫描每次匹配最长的单词,这是一种简单的启发式的消歧策略。图2.4中的例子实际上就是这种使用这种策略得到的分词结果。但是,启发式的消岐方法对人工的依赖程度很高,而且启发式规则也不能处理所有的情况。所以说简单的基于词典的方法还不能很好的解决分词问题。
\subsection{基于统计的分词方法}\index{Chapter2.3.2}
\parinterval 既然基于词典的方法有很多问题,我们就需要一种更为有效的方法。在上文中提到,想要搭建一个分词系统,需要让计算机知道什么是“词”,那么我们可不可以给定已经切分好的分词数据,让计算机在这些数据中学习到规律呢?答案是肯定的 - 利用“数据”来让计算机明白“词”的定义,让计算机直接在数据中学到知识,这就是我们常说的数据驱动的方法。这个过程也是一个典型的基于统计建模的学习。
\parinterval 既然基于词典的方法有很多问题,我们就需要一种更为有效的方法。在上文中提到,想要搭建一个分词系统,需要让计算机知道什么是``词'',那么我们可不可以给定已经切分好的分词数据,让计算机在这些数据中学习到规律呢?答案是肯定的 - 利用``数据''来让计算机明白``词''的定义,让计算机直接在数据中学到知识,这就是我们常说的数据驱动的方法。这个过程也是一个典型的基于统计建模的学习。
\subsubsection{统计模型的学习与推断}\index{Chapter2.3.2.1}
\parinterval 在分词任务中,数据驱动主要指用已经分词切分好的数据“喂”给系统,这个数据也被称作标注数据。在获得标注训练数据后,自动学习一个统计模型来描述分词的过程,而这个模型会把分词的“知识”作为参数保存在模型中。当送入一个新的需要分词的句子时,可以利用学习到的模型对所有可能的分词结果进行预测,并进行概率化的描述,最终选择概率最大的结果作为输出。这个方法就是基于统计的分词方法。具体来说,可以分为两个步骤:
\parinterval 在分词任务中,数据驱动主要指用已经分词切分好的数据``喂''给系统,这个数据也被称作标注数据。在获得标注训练数据后,自动学习一个统计模型来描述分词的过程,而这个模型会把分词的``知识''作为参数保存在模型中。当送入一个新的需要分词的句子时,可以利用学习到的模型对所有可能的分词结果进行预测,并进行概率化的描述,最终选择概率最大的结果作为输出。这个方法就是基于统计的分词方法。具体来说,可以分为两个步骤:
\vspace{0.5em}
\begin{itemize}
......@@ -495,11 +485,11 @@
\centering
\input{./Chapter2/Figures/figure-word-segmentation-based-on-statistics}
\caption{基于统计的分词流程}
\label{figureC2.10}
\label{fig:word-segmentation-based-on-statistics}
\end{figure}
%-------------------------------------------
\parinterval\ref{figureC2.10} 给出了一个基于统计建模的汉语分词实例。左侧是标注数据,其中的每个句子已经经过人工标注分词结果(单词用斜杠分开)。之后,建立一个统计模型,记为P(·)。模型通过在标注数据上的学习达到能够很好描述问题的状态。最后,对于新的未分词的句子,使用模型P(·)对每个可能的分切进行概率估计,之后选择概率最高的切分结果输出。
\parinterval\ref{fig:word-segmentation-based-on-statistics} 给出了一个基于统计建模的汉语分词实例。左侧是标注数据,其中的每个句子已经经过人工标注分词结果(单词用斜杠分开)。之后,建立一个统计模型,记为P(·)。模型通过在标注数据上的学习达到能够很好描述问题的状态。最后,对于新的未分词的句子,使用模型P(·)对每个可能的分切进行概率估计,之后选择概率最高的切分结果输出。
\subsubsection{掷骰子游戏}\index{Chapter2.3.2.2}
......@@ -512,16 +502,16 @@
\input{./Chapter2/Figures/figure-the-dice-game}
\setlength{\belowcaptionskip}{-0.2cm}
\caption{骰子结果}
\label{figureC2.11}
\label{fig:the-dice-game}
\end{figure}
%-------------------------------------------
\parinterval 似乎玩家的胜利只能来源于运气。不过,请注意,这里的假设“随便选一个数字”这本身就是一个概率模型,它对骰子的六个面的出现做了均匀分布假设。
\parinterval 似乎玩家的胜利只能来源于运气。不过,请注意,这里的假设``随便选一个数字''这本身就是一个概率模型,它对骰子的六个面的出现做了均匀分布假设。
\begin{eqnarray}
\textrm{P}("1")=\textrm{P}("2")=...=\textrm{P}("5")=\textrm{P}("6")=1/6
\label{eqC2.21}
\label{eqC2.21-new}
\end{eqnarray}
\parinterval 但是这个游戏没有人规定骰子是均匀的(有些被坑了的感觉)。但是如果骰子的六个面不均匀呢?我们可以用一种更加“聪明”的方式定义一个新模型,即定义骰子的每一个面都以一定的概率出现,而不是相同的概率。这里,为了保证概率的归一性,我们只需定义$\theta_1 \sim \theta_5$,最后一个面的概率用1减去前几个面的概率之和进行表示,即
\parinterval 但是这个游戏没有人规定骰子是均匀的(有些被坑了的感觉)。但是如果骰子的六个面不均匀呢?我们可以用一种更加``聪明''的方式定义一个新模型,即定义骰子的每一个面都以一定的概率出现,而不是相同的概率。这里,为了保证概率的归一性,我们只需定义$\theta_1 \sim \theta_5$,最后一个面的概率用1减去前几个面的概率之和进行表示,即
\begin{eqnarray}
\textrm{P}("1") &=&\theta_1 \nonumber \\
\textrm{P}("2") &=&\theta_2 \nonumber \\
......@@ -529,16 +519,16 @@
\textrm{P}("4") &=&\theta_4 \nonumber \\
\textrm{P}("5") &=&\theta_5 \nonumber \\
\textrm{P}("6") &=&1-\sum_{1 \leq i \leq 5}\theta_i \qquad \lhd \textrm {归一性}
\label{eqC2.22}
\label{eqC2.22-new}
\end{eqnarray}
\parinterval 这里$\theta_1 \sim \theta_5$可以被看作是模型的参数。对于这样的模型,参数确定了,模型也就确定了。但是,新的问题来了,在定义骰子每个面的概率后,如何求出具体的值呢?一种常用的方法是,从大量实例中学习模型参数,这个方法也是常说的参数估计。我们可以将这个不均匀的骰子先实验性的掷很多次,这可以被看作是独立同分布的若干次采样,比如$X$次,发现“1”出现$X_1$次,“2”出现$X_2$次,以此类推,得到了各个面出现的次数。假设掷骰子中每个面出现的概率符合多项式分布,通过简单的概率论知识可以知道每个面出现概率的极大似然估计为:
\parinterval 这里$\theta_1 \sim \theta_5$可以被看作是模型的参数。对于这样的模型,参数确定了,模型也就确定了。但是,新的问题来了,在定义骰子每个面的概率后,如何求出具体的值呢?一种常用的方法是,从大量实例中学习模型参数,这个方法也是常说的参数估计。我们可以将这个不均匀的骰子先实验性的掷很多次,这可以被看作是独立同分布的若干次采样,比如$X$次,发现``1''出现$X_1$次,``2''出现$X_2$次,以此类推,得到了各个面出现的次数。假设掷骰子中每个面出现的概率符合多项式分布,通过简单的概率论知识可以知道每个面出现概率的极大似然估计为:
\begin{eqnarray}
\textrm{P}("i")=\frac {X_i}{X}
\label{eqC2.23}
\label{eqC2.23-new}
\end{eqnarray}
\parinterval 当X足够大的话,$\frac{X_i}{X}$可以无限逼近P(“i”)的真实值,因此可以通过大量的实验推算出掷骰子各个面的概率的准确估计值。回归到我们的问题中,如果我们在正式开始游戏前,预先掷骰子30次,得到如图\ref{figureC2.12}的结果。
\parinterval 当X足够大的话,$\frac{X_i}{X}$可以无限逼近P(``i'')的真实值,因此可以通过大量的实验推算出掷骰子各个面的概率的准确估计值。回归到我们的问题中,如果我们在正式开始游戏前,预先掷骰子30次,得到如图\ref{fig:the-dice-game2}的结果。
%----------------------------------------------
% 图2.12
......@@ -546,11 +536,11 @@
\centering
\input{./Chapter2/Figures/figure-the-dice-game2}
\caption{预投骰子结果}
\label{figureC2.12}
\label{fig:the-dice-game2}
\end{figure}
%-------------------------------------------
\parinterval 于是,我们看到了一个有倾向性的模型(图 \ref{figureC2.13}):
\parinterval 于是,我们看到了一个有倾向性的模型(图 \ref{fig:the-dice-game-model}):
%----------------------------------------------
% 图2.13
......@@ -558,13 +548,13 @@
\centering
\input{./Chapter2/Figures/figure-the-dice-game-model}
\caption{预设的骰子模型}
\label{figureC2.13}
\label{fig:the-dice-game-model}
\end{figure}
%-------------------------------------------
在这样的预先实验基础上,我们知道如果再次玩掷骰子游戏的话,选则数字“4”获胜的可能性是最大的。
在这样的预先实验基础上,我们知道如果再次玩掷骰子游戏的话,选则数字``4''获胜的可能性是最大的。
\parinterval 通过上面这个掷骰子的游戏,可以得到一个道理:\textbf{上帝是不公平的}。因为在“公平”的世界中,没有任何一个模型可以学到有价值的事情。从机器学习的角度来看,所谓的“不公平”实际上这是客观事物中蕴含的一种\textbf{偏置(bias)},也就是很多事情天然就有对某些情况有倾向。而图像处理、自然语言处理等问题绝大多数都存在着偏置。比如,我们翻译一个英文单词的时候,它最可能的翻译结果往往就是那几个词。我们设计统计模型的目的正是要学习这种偏置,之后利用这种偏置对新的问题做出足够好的决策。
\parinterval 通过上面这个掷骰子的游戏,可以得到一个道理:\textbf{上帝是不公平的}。因为在``公平''的世界中,没有任何一个模型可以学到有价值的事情。从机器学习的角度来看,所谓的``不公平''实际上这是客观事物中蕴含的一种\textbf{偏置(bias)},也就是很多事情天然就有对某些情况有倾向。而图像处理、自然语言处理等问题绝大多数都存在着偏置。比如,我们翻译一个英文单词的时候,它最可能的翻译结果往往就是那几个词。我们设计统计模型的目的正是要学习这种偏置,之后利用这种偏置对新的问题做出足够好的决策。
\subsubsection{全概率分词方法}\index{Chapter2.3.2.3}
......@@ -578,7 +568,7 @@
\end{itemize}
\vspace{0.5em}
\parinterval 如果把投掷这个新的骰子,可能会得到图\ref{figureC2.14}这样的结果,
\parinterval 如果把投掷这个新的骰子,可能会得到图\ref{fig:full-probability-word-segmentation-1}这样的结果,
%----------------------------------------------
% 图2.14
......@@ -586,7 +576,7 @@
\centering
\input{./Chapter2/Figures/figure-full-probability-word-segmentation-1}
\caption{新投骰子结果}
\label{figureC2.14}
\label{fig:full-probability-word-segmentation-1}
\end{figure}
%-------------------------------------------
......@@ -609,7 +599,7 @@
\input{./Chapter2/Figures/figure-full-probability-word-segmentation-2}
\setlength{\belowcaptionskip}{-0.2cm}
\caption{换成汉字后结果}
\label{figureC2.15}
\label{fig:full-probability-word-segmentation-2}
\end{figure}
%-------------------------------------------
......@@ -620,32 +610,30 @@
\centering
\input{./Chapter2/Figures/figure-full-probability-word-segmentation-3}
\caption{每个单词概率估计值}
\label{figureC2.16}
\label{fig:full-probability-word-segmentation-3}
\end{figure}
%-------------------------------------------
\parinterval 通过这个学习过程,我们得到了每个词出现的概率,即模型的参数。而我们原始的问题是如何计算这个整句分词结果的概率,比如
\begin{equation}
\textrm{P}\textrm{(‘确实/现在/数据/很/多’)}=?
\label{eqC2.9}
\textrm{P}\textrm{(`确实/现在/数据/很/多')}=?
\label{eqC2.24-new}
\end{equation}
\parinterval 这里可以使用“大题小做”的技巧:原始的问题很复杂,我们将其切分为小问题。这样,将复杂的分词问题简单化,基于独立性假设解决分词问题:假定所有词出现都是相互独立的。设$w_1 w_2 w_3…w_m$表示一个由单词$w_1,w_2,w_3,…,w_m$组成的切分结果,于是有:
%-------------------------------------------
\parinterval 这里可以使用``大题小做''的技巧:原始的问题很复杂,我们将其切分为小问题。这样,将复杂的分词问题简单化,基于独立性假设解决分词问题:假定所有词出现都是相互独立的。设$w_1 w_2 w_3…w_m$表示一个由单词$w_1,w_2,w_3,…,w_m$组成的切分结果,于是有:
\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{eqC2.25 }
\label{eqC2.25-new}
\end{eqnarray}
\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 \\
&\textrm{P}&\textrm{(`确实/现在/数据/很/多')} \nonumber \\
& = &\textrm{P}\textrm{`确实'} \cdot \textrm{P}\textrm{`现在'} \cdot \textrm{P}\textrm{`数据'} \cdot \textrm{P}\textrm{`很'} \cdot \textrm{P}\textrm{`多'} \nonumber \\
& = &0.000001 \times 0.000022 \times 0.000009 \times 0.000010 \times 0.000078 \nonumber \\
& = &1.5444 \times 10^{-25}
\label{eqC2.26}
\label{eqC2.26-new}
\end{eqnarray}
\parinterval“确实现在数据很多”这个实例来说,如果把这句话按照“确实/现在/数据/很/多”这样的方式进行切分,这句切分的概率P(“确实/现在/数据/很/多”)可以通过每个词出现概率相乘的方式进行计算。这个假设也是自然语言处理中1-gram语言模型假设,即当前词的生成与任何历史都无关。当然,独立性假设并不能完美描述客观世界的问题,但是它大大化简了问题的复杂度。
\parinterval``确实现在数据很多''这个实例来说,如果把这句话按照``确实/现在/数据/很/多''这样的方式进行切分,这句切分的概率P(``确实/现在/数据/很/多'')可以通过每个词出现概率相乘的方式进行计算。这个假设也是自然语言处理中1-gram语言模型假设,即当前词的生成与任何历史都无关。当然,独立性假设并不能完美描述客观世界的问题,但是它大大化简了问题的复杂度。
%----------------------------------------------
% 图2.17
......@@ -653,13 +641,13 @@
\centering
\input{./Chapter2/Figures/figure-examples-of-Chinese-word-segmentation-based-on-1-gram-model}
\caption{基于1-gram语言模型的中文分词实例}
\label{figureC2.17}
\label{fig:examples-of-Chinese-word-segmentation-based-on-1-gram-model}
\end{figure}
%-------------------------------------------
\parinterval 最后让我们再整体看一下分词系统的学习和使用过程。如图\ref {figureC2.17}所示,我们利用大量人工标注好的分词数据,通过统计学习方法获得一个统计模型P(·),给定任意分词结果$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:examples-of-Chinese-word-segmentation-based-on-1-gram-model}所示,我们利用大量人工标注好的分词数据,通过统计学习方法获得一个统计模型P(·),给定任意分词结果$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 经过充分训练的统计模型P(·)就是我们得到分词模型。对于任意输入的新句子S,通过这个模型找到最佳的分词结果$W^*$输出。假设输入句子S是“确实现在数据很多”,可以通过列举获得不同切分方式的概率,其中概率最高的切分方式,就是我们的目标输出。
\parinterval 经过充分训练的统计模型P(·)就是我们得到分词模型。对于任意输入的新句子S,通过这个模型找到最佳的分词结果$W^*$输出。假设输入句子S是``确实现在数据很多'',可以通过列举获得不同切分方式的概率,其中概率最高的切分方式,就是我们的目标输出。
\parinterval 这种分词方法也被称作基于1-gram语言模型的分词,或全概率分词,使用标注好的分词数据进行学习,获得分词模型。这种方法最大的优点是整个学习过程(模型训练过程)和推导过程(处理新句子进行切分的过程)都是全自动进行的。虽然这种方法十分简单,但是其效率很高,因此被广泛使用在工业界系统里。
......@@ -668,7 +656,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{语言建模 }\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{$n$-gram语言模型}\index{Chapter2.4.1}
......@@ -683,19 +671,17 @@
%-------------------------------------------
\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.1}
\label{eqC2.27-new}
\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})$仍然不好计算。
\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.1.2}
\label{eqC2.28-new}
\end{eqnarray}
\parinterval 这样,整个序列$w_1 w_2...w_m$的生成概率可以被重新定义为:
......@@ -730,10 +716,9 @@ $\textrm{P}(w_m|w_1 ... w_{m-1})$ & $\textrm{P}(w_m)$ & $\textrm{P}(w_m|w_{m-1})
\begin{adjustwidth}{1em}{}
\begin{itemize}
\item 极大似然估计。直接利用不同词序列在训练数据中出现的频度计算出$\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{count(w_{m-n+1}...w_m)}{count(w_{m-n+1}...w_{m-1})}
\label{eq:2.4.1.3}
\label{eqC2.29-new}
\end{eqnarray}
\item 人工神经网络方法。构建一个人工神经网络估计$\textrm{P}(w_m|w_{m-n+1} ... w_{m-1})$的值,比如,可以构建一个前馈神经网络来对$n$-gram进行建模。
......@@ -743,12 +728,11 @@ $\textrm{P}(w_m|w_1 ... w_{m-1})$ & $\textrm{P}(w_m)$ & $\textrm{P}(w_m|w_{m-1})
\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语言模型非常简单。我们可以像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{}')
\label{eq:2.4.1.4}
& &\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{`很'})
\label{eqC2.30-new}
\end{eqnarray}
\parinterval$n$-gram语言模型为代表的统计语言模型的应用非常广泛。除了分词,在文本生成、信息检索、摘要等等自然语言处理任务中,语言模型都有举足轻重的地位。包括近些年非常受关注的预训练模型,本质上也是统计语言模型。这些技术都会在后续章节进行介绍。值得注意的是,统计语言模型给我们解决自然语言处理问题提供了一个非常好的建模思路,即:把整个序列生成的问题转化为逐个生成单词的问题。很快我们就会看到,这种建模方式会被广泛的用于机器翻译建模中,在统计机器翻译和神经机器翻译中都会有明显的体现。
......@@ -756,27 +740,26 @@ $\textrm{P}(w_m|w_1 ... w_{m-1})$ & $\textrm{P}(w_m)$ & $\textrm{P}(w_m|w_{m-1})
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{未登录词和平滑算法}\index{Chapter2.4.2}
\parinterval 在式\ref{eq:2.4.1.4}的例子中,如果语料中从没有“确实”和“现在”两个词连续出现的情况,那么使用2-gram计算 “确实/现在/数据/很/多”的切分方式的概率时,会出现如下情况
\parinterval 在式\ref{eqC2.30-new}的例子中,如果语料中从没有``确实''和``现在''两个词连续出现的情况,那么使用2-gram计算 ``确实/现在/数据/很/多''的切分方式的概率时,会出现如下情况
\begin{eqnarray}
\textrm{P}('\textrm{现在}'|'\textrm{确实}') = \frac{count('\textrm{确实}\,\textrm{现在}')}{count('\textrm{确实}')} = \frac{0}{count('\textrm{确实}')} = 0
\label{eq:2.4.1.5}
\textrm{P}(\textrm{`现在'}|\textrm{`确实'}) = \frac{count(\textrm{`确实}\,\textrm{现在'})}{count(\textrm{`确实'})} = \frac{0}{count(\textrm{`确实'})} = 0
\label{eqC2.31-new}
\end{eqnarray}
\parinterval 显然,这个结果是不能接受的。因为即使语料中没有 “确实”和“现在”两个词连续出现,但是这种搭配也是客观存在的。这时简单的用极大似然估计得到概率却是0,导致整个切分结果的概率为0。更常见的问题是那些根本没有出现在词表中的词,称为\textbf{未登录词(Out-of-Vocabulary, OOV)},比如一些生僻词,可能模型训练阶段从来没有看到过,这时模型仍然会给出0概率。图\ref{fig:2.4.1.1}展示了词语出现频度的分布,可以看到绝大多数词都是低频词。
\parinterval 显然,这个结果是不能接受的。因为即使语料中没有 ``确实''和``现在''两个词连续出现,但是这种搭配也是客观存在的。这时简单的用极大似然估计得到概率却是0,导致整个切分结果的概率为0。更常见的问题是那些根本没有出现在词表中的词,称为\textbf{未登录词(Out-of-Vocabulary, OOV)},比如一些生僻词,可能模型训练阶段从来没有看到过,这时模型仍然会给出0概率。图\ref{fig:word-frequency-distribution}展示了词语出现频度的分布,可以看到绝大多数词都是低频词。
%----------------------------------------------
% 图2.4.1.1
% 图2.18
\begin{figure}[htp]
\centering
\includegraphics[scale=0.35]{./Chapter2/Figures/figure-word-frequency-distribution.pdf}
\caption{词语频度分布}
\label{fig:2.4.1.1}
\label{fig:word-frequency-distribution}
\end{figure}
%---------------------------
\parinterval 为了解决未登录词引起的零概率问题,常用的做法是对模型进行平滑处理,也就是给可能出现的情况一个非零的概率,使得模型不会对整个序列给出零概率。平滑可以用“劫富济贫”这一思想理解,在保证所有情况的概率和为1的前提下,使极低概率的部分可以从高概率的部分分配一部分概率,从而达到平滑的目的。
\parinterval 为了解决未登录词引起的零概率问题,常用的做法是对模型进行平滑处理,也就是给可能出现的情况一个非零的概率,使得模型不会对整个序列给出零概率。平滑可以用``劫富济贫''这一思想理解,在保证所有情况的概率和为1的前提下,使极低概率的部分可以从高概率的部分分配一部分概率,从而达到平滑的目的。
\parinterval 语言模型使用的平滑算法有很多,比如、加法平滑方法、古德-图灵估计法、Katz平滑法等。在本节中,主要介绍三种平滑方法:加法平滑法、古德-图灵估计法和Kneser-Ney平滑。这些方法也可以被使用到机器翻译中其它模型的概率平滑任务中。
......@@ -785,25 +768,21 @@ $\textrm{P}(w_m|w_1 ... w_{m-1})$ & $\textrm{P}(w_m)$ & $\textrm{P}(w_m|w_{m-1})
\parinterval 加法平滑方法可以说是简单的平滑技术,我们首先介绍这一方法,希望通过它了解平滑算法的思想。
\parinterval 通常情况下,我们会利用采集到的语料库来模拟现实生活中真实全部的语料库。但是采集总是不充分的,比如无法涵盖所有的词汇,直接依据这样语料所获得的统计信息计算现实中的语言概率就会产生偏差。假设依据某语料C(从未出现“确实 现在”二元语法),评估一个已经分好词的句子S =“确实 现在 物价 很 高”的概率,当计算“确实 现在”的概率时使得评估$\textrm{P}(S) = 0$。显然这个结果是不够准确的,根据我们的常识,句子$S$是有出现的可能性的,这样句子的概率值不应该是0。
\parinterval 通常情况下,我们会利用采集到的语料库来模拟现实生活中真实全部的语料库。但是采集总是不充分的,比如无法涵盖所有的词汇,直接依据这样语料所获得的统计信息计算现实中的语言概率就会产生偏差。假设依据某语料C(从未出现``确实 现在''二元语法),评估一个已经分好词的句子S =``确实 现在 物价 很 高''的概率,当计算``确实 现在''的概率时使得评估$\textrm{P}(S) = 0$。显然这个结果是不够准确的,根据我们的常识,句子$S$是有出现的可能性的,这样句子的概率值不应该是0。
\begin{eqnarray}
\textrm{P}(\textrm{现在}|\textrm{确实}) = \frac{count(\textrm{确实}\,\textrm{现在})}{count(\textrm{确实})} = \frac{0}{count(\textrm{确实})} = 0
\label{eq:2.4.1.6}
\label{eqC2.32-new}
\end{eqnarray}
%\parinterval 为了避免这种由于数据所产生的评估预测概率为0的问题,采用“数据平滑”的方式对最大似然估计方法进行调整。通常的平滑方法都是为了提高低概率(如零概率),或者降低高概率,这种做法的思想比较类似于“劫富济贫”。
\parinterval 加法平滑方法(additive smoothing)假设每个$n$-gram出现的次数比实际统计次数多$\theta$次,$0 \leqslant\theta\leqslant 1$,使得分子部分不为0,那么计算前文例子“确实 现在”的概率时,可以使用如下方法计算。
\parinterval 加法平滑方法(additive smoothing)假设每个$n$-gram出现的次数比实际统计次数多$\theta$次,$0 \leqslant\theta\leqslant 1$,使得分子部分不为0,那么计算前文例子``确实 现在''的概率时,可以使用如下方法计算。
\begin{eqnarray}
\textrm{P}(\textrm{现在}|\textrm{确实}) = \frac{\theta + count(\textrm{确实}\,\textrm{现在})}{\sum_{w}^{|V|}(\theta + count(\textrm{确实}w))} = \frac{\theta + count(\textrm{确实}\,\textrm{现在})}{\theta{|V|} + count(\textrm{确实})}
\label{eq:2.4.1.7}
\label{eqC2.33-new}
\end{eqnarray}
\parinterval 这里面$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.1.2}的示例:
\parinterval 举一个例子来形象的描述加法平滑方法。假设在一个英文文档中随机抽取词汇,已经抽到的词包括12个,词典大小$|V|$=20,已抽到的词汇统计结果为:4 look,3 people,2 am,1 what,1 want,1 do。为了更形象的描述在平滑之前和平滑之后的概率分布的区别,可以参考下图\ref{fig:no-smoothing&smoothed-probability-distributions}的示例:
%----------------------------------------------
% 图2.19
......@@ -812,7 +791,7 @@ $\textrm{P}(w_m|w_1 ... w_{m-1})$ & $\textrm{P}(w_m)$ & $\textrm{P}(w_m|w_{m-1})
\subfigure[无平滑的概率分布] {\includegraphics[scale=0.25]{./Chapter2/Figures/figure-no-smoothing&smoothed-probability-distributions-1.pdf} }
\subfigure[加一平滑的概率分布] {\includegraphics[scale=0.25]{./Chapter2/Figures/figure-no-smoothing&smoothed-probability-distributions-2.pdf}}
\caption{无平滑和有平滑后的概率分布}
\label{fig:2.4.1.2}
\label{fig:no-smoothing&smoothed-probability-distributions}
\end{figure}
%-------------------------------------------
......@@ -822,31 +801,27 @@ $\textrm{P}(w_m|w_1 ... w_{m-1})$ & $\textrm{P}(w_m)$ & $\textrm{P}(w_m|w_{m-1})
\parinterval 古德-图灵估计法是图灵(Alan Turing)和他的助手古德(I.J.Good)开发的,作为他们在二战期间破解德国密码机Enigma所使用的方法的一部分,在1953年古德将其发表,这一方法也是很多平滑算法的核心,其基本思路是:是把非零的$n$元语法的概率降低匀给一些低概率$n$元语法,以修改最大似然估计与真实概率之间的偏离\cite{good1953population}\cite{gale1995good}
\parinterval 假定在语料库中出现r次的$n$元语法有$n_r$个,特别的,出现0次的$n$元语法(即未登录词)出现的次数为$n_0$个。语料库中全部词语的个数为$N$,显然
\begin{eqnarray}
N = \sum_{r=1}^{\infty}{r\,n_r}
\label{eq:2.4.1.8}
\label{eqC2.34-new}
\end{eqnarray}
\parinterval 这时,出现$r$次的$n$元语法在词典中的相对频率为$r/N$,这也是不做平滑处理时这些词的概率估计。为了解决零概率问题,Good-Turing方法对于任何一个出现$r$次的$n$元语法,利用出现$r$+1次的$n$元语法统计量重新假设它出现$r^*$次,这里
\begin{eqnarray}
r^* = (r + 1)\frac{n_{r + 1}}{n_r}
\label{eq:2.4.1.9}
\label{eqC2.35-new}
\end{eqnarray}
\parinterval 基于这个公式,就可以估计所有0次$n$元语法的频次$n_0 r_0^*=(r_0+1)n_1=n_1$。要把这个重新估计的统计数转化为概率,只需要进行归一化处理:对于每个统计数为$r$的事件,其概率为$\textrm{p}_r=r^*/N$,其中
\begin{eqnarray}
N = \sum_{r=0}^{\infty}{r^{*}n_r} = \sum_{r=0}^{\infty}{(r + 1)n_{r + 1}} = \sum_{r=1}^{\infty}{r\,n_r}
\label{eq:2.4.1.10}
\label{eqC2.36-new}
\end{eqnarray}
也就是说,N仍然为这个整个样本分布最初的计数。这样样本中所有事件的概率之和为:
\begin{eqnarray}
N = \sum_{r>0}{p_r n_r} = 1 - \frac{n_1}{N} < 1
\label{eq:2.4.1.11}
\label{eqC2.37-new}
\end{eqnarray}
其中$n_1/N$的概率余量就是分配给所有统计为0的事件。
......@@ -880,67 +855,59 @@ N = \sum_{r>0}{p_r n_r} = 1 - \frac{n_1}{N} < 1
\parinterval Kneser-Ney平滑方法由R.Kneser和H.Ney于1995年提出的用于计算$n$元语法概率分布的方法\cite{kneser1995improved}\cite{chen1999empirical}。基于absolute discounting,并被广泛认为是最有效的平滑方法。这种平滑方法改进了absolute discounting中与高阶分布相结合的低阶分布的计算方法,使不同阶分布得到充分的利用。这种算法综合利用了其他多种平滑算法的思想,是一种先进而且标准的平滑算法。
\parinterval 首先介绍一下absolute discounting平滑算法,公式如下所示
\begin{eqnarray}
\textrm{P}_{\textrm{AbsDiscount}}(w_i | w_{i-1}) = \frac{c(w_{i-1},w_i )-d}{c(w_{i-1})} + \lambda(w_{i-1})\textrm{P}(w)
\label{eq:2.4.1.12}
\label{eqC2.38-new}
\end{eqnarray}
其中$d$是固定的被裁剪的值,$\lambda$是一个正则化常数。可以看到第一项是经过减值调整过的2-gram的概率值,第二项则相当于一个带权重$\lambda$的1-gram的插值项。然而这种插值模型极易受到原始1-gram模型的干扰。
\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模型相同的结果,犯下相同的错误。
\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模型相同的结果,犯下相同的错误。
\parinterval 观察语料的二元语法发现,Francisco的前一个词仅是San,不会出现reading。这个分析提醒了我们,考虑前一个词的影响是有帮助的,比如仅在前一个词时San时,我们才给Francisco赋予一个较高的概率值。基于这种想法,改进原有的1-gram模型,创造一个新的1-gram模型$\textrm{P}_{\textrm{continuation}}$,使这个模型可以通过考虑前一个词的影响评估了当前词作为第二个词出现的可能性。
\parinterval 为了评估$\textrm{P}_{cont}$,统计使用当前词作为第二个词所出现二元语法的种类,二元语法种类越多,这个词作为第二个词出现的可能性越高,呈正比:
\begin{eqnarray}
\textrm{P}_{\textrm{cont}}(w_i) \varpropto |w_{i-1}: c(w_{i-1} w_i )>0|
\label{eq:2.4.1.13}
\label{eqC2.39-new}
\end{eqnarray}
通过全部的二元语法的种类做归一化可得到评估的公式
\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 \}|}
\label{eq:2.4.1.14}
\label{eqC2.40-new}
\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 \}|}
\label{eq:2.4.1.15}
\label{eqC2.41-new}
\end{eqnarray}
结合基础的absolute discounting计算公式,从而得到了Kneser-Ney平滑方法的公式
\begin{eqnarray}
\textrm{P}_{\textrm{KN}}(w_i|w_{i-1}) = \frac{\max(c(w_{i-1},w_i )-d,0)}{c(w_{i-1})}+ \lambda(w_{i-1})\textrm{P}_{\textrm{cont}}(w_i)
\label{eq:2.4.1.16}
\label{eqC2.42-new}
\end{eqnarray}
\noindent 其中
\begin{eqnarray}
\lambda(w_{i-1}) = \frac{d}{c(w_{i-1})}|\{w:c(w_{i-1},w)>0\}|
\label{eq:2.4.1.16new}
\label{eqC2.43-new}
\end{eqnarray}
\noindent 这里$\max(\cdot)$保证了分子部分为不小0的数,原始1-gram更新成$\textrm{P}_{\textrm{cont}}$概率分布,$\lambda$是正则化项。
\parinterval 为了更具普适性,不仅局限为2-gram和1-gram的插值模型,利用递归的方式得到更通用的公式
\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}) \nonumber
\label{eq:2.4.1.17}
\end{eqnarray}
\noindent 其中continuationcount$(\cdot)$表示的是基于某个单个词作为第$n$个词的$n$元语法的种类数目。
\begin{eqnarray}
\lambda(w_{i-1}) & = & \frac{d}{c_{\textrm{KN}}(w_{i-n+1}^{i-1})}|\{w:c_{\textrm{KN}}(w_{i-n+1}...w_{i-1}w)>0\}| \label{eq:2.4.1.17new} \\
c_{\textrm{KN}}(\cdot) & = & \begin{cases} \textrm{count}(\cdot)\quad for\ the\ highest\ order \\ \textrm{continuationcount}(\cdot)\quad for\ lower\ order \end{cases} \label{eq:2.4.1.17new2}
\lambda(w_{i-1}) & = & \frac{d}{c_{\textrm{KN}}(w_{i-n+1}^{i-1})}|\{w:c_{\textrm{KN}}(w_{i-n+1}...w_{i-1}w)>0\}| \label{eqC2.44-new} \\
c_{\textrm{KN}}(\cdot) & = & \begin{cases} \textrm{count}(\cdot)\quad for\ the\ highest\ order \\ \textrm{continuationcount}(\cdot)\quad for\ lower\ order \end{cases} \label{eqC2.45-new}
\end{eqnarray}
\parinterval 我们前面提到Kneser-Ney Smoothing 是当前一个标准的、广泛采用的、先进的平滑算法。还有很多基于此为基础衍生出来的算法,有兴趣的读者可以查找更多资料了解。\cite{parsing2009speech}\cite{ney1994structuring}\cite{chen1999empirical}
......@@ -948,14 +915,14 @@ c_{\textrm{KN}}(\cdot) & = & \begin{cases} \textrm{count}(\cdot)\quad for\ the\
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{句法分析(短语结构)}\index{Chapter2.5}
\parinterval 通过前面两节的内容,我们已经了解什么叫做“词”、如何对分词问题进行统计建模。同时也了解了如何对词序列的概率用统计语言模型进行描述。无论是分词还是语言模型都是句子浅层词串信息的一种表示。对于一个自然语言句子来说,它更深层次的结构信息可以通过句法信息来描述,而句法信息也是机器翻译和自然语言处理其它任务中常用的知识源之一。本节将会对相关概念进行介绍。
\parinterval 通过前面两节的内容,我们已经了解什么叫做``词''、如何对分词问题进行统计建模。同时也了解了如何对词序列的概率用统计语言模型进行描述。无论是分词还是语言模型都是句子浅层词串信息的一种表示。对于一个自然语言句子来说,它更深层次的结构信息可以通过句法信息来描述,而句法信息也是机器翻译和自然语言处理其它任务中常用的知识源之一。本节将会对相关概念进行介绍。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{句子的句法树表示}\index{Chapter2.5.1}
\parinterval \textbf{句法(syntax)}是研究句子的每个组成部分和它们之间的组合方式。一般来说,句法和语言是相关的,比如,英文是主谓宾结构,而日语是主宾谓结构。因此不同的语言也会有不同的句法描述方式。这里我们将介绍自然语言处理领域最常用的两种句法分析形式 – \textbf{短语结构分析(phrase structure parsing)}\textbf{依存分析(dependency parsing)}。它们在汉语、英语等多种语言的处理中都有广泛应用。
\parinterval\ref{fig:phrase-structure-tree-and-dependency-tree}展示了这两种的句法表示形式的实例。其中,左侧是短语结构树。它描述的是短语的结构功能,比如“吃”是动词(记为VV),“鱼”是名词(记为NN),“吃鱼”组成动词短语,这个短语再与“喜欢”这一动词组成新的动词短语。每个子树都是一个句法功能单元,比如,VP(VV(吃) NN(鱼))这个子树就表示了“吃鱼”这个动词短语的结构,其中子树根节点VP是句法功能标记。短语结构树利用嵌套和递归的方式描述了语言学的功能。短语结构树中,每个词都有词性(或词类),不同的词或者短语可以组成名动结构、动宾结构等语言学短语结构。短语结构分析一般也被称为成分分析(constituency parsing),也被称作完全分析(full parsing)。
\parinterval\ref{fig:phrase-structure-tree-and-dependency-tree}展示了这两种的句法表示形式的实例。其中,左侧是短语结构树。它描述的是短语的结构功能,比如``吃''是动词(记为VV),``鱼''是名词(记为NN),``吃鱼''组成动词短语,这个短语再与``喜欢''这一动词组成新的动词短语。每个子树都是一个句法功能单元,比如,VP(VV(吃) NN(鱼))这个子树就表示了``吃鱼''这个动词短语的结构,其中子树根节点VP是句法功能标记。短语结构树利用嵌套和递归的方式描述了语言学的功能。短语结构树中,每个词都有词性(或词类),不同的词或者短语可以组成名动结构、动宾结构等语言学短语结构。短语结构分析一般也被称为成分分析(constituency parsing),也被称作完全分析(full parsing)。
%----------------------------------------------
% 图2.5.1.1
......@@ -967,9 +934,9 @@ c_{\textrm{KN}}(\cdot) & = & \begin{cases} \textrm{count}(\cdot)\quad for\ the\
\end{figure}
%---------------------------
\parinterval\ref{fig:phrase-structure-tree-and-dependency-tree}右侧展示的是另一种句法结构,被称作依存句法树。依存句法树表示了句子中单词和单词之间的依存关系。比如,从这个例子可以了解,“猫”依赖“喜欢”,“吃”依赖“喜欢”,“鱼”依赖“吃”
\parinterval\ref{fig:phrase-structure-tree-and-dependency-tree}右侧展示的是另一种句法结构,被称作依存句法树。依存句法树表示了句子中单词和单词之间的依存关系。比如,从这个例子可以了解,``猫''依赖``喜欢'',``吃''依赖``喜欢'',``鱼''依赖``吃''
\parinterval 短语结构树和依存句法树的结构和功能都有所不同。短语结构树的叶子节点是单词,中间节点是词性或者短语句法标记。在短语结构分析中,通常把单词称作终结符(terminal),把词性称为预终结符(pre-terminal),而把其它句法标记称为非终结符(non-terminal)。依存句法树没有预终结符和非终结符,所有的节点都是句子里的单词,通过不同节点间的连线表示句子中各个单词之间的依存关系。每个依存关系实际上都是有方向的,头和尾分别指向“接受”和“发出”依存关系的词。每个依存关系也可以进行分类,如图\ref{fig:phrase-structure-tree-and-dependency-tree}所示,每个依存关系都的类型都进行了标记,这也被称作有标记的依存分析。如果不生成这些标记,这样的句法分析被称作无标记的依存分析。
\parinterval 短语结构树和依存句法树的结构和功能都有所不同。短语结构树的叶子节点是单词,中间节点是词性或者短语句法标记。在短语结构分析中,通常把单词称作终结符(terminal),把词性称为预终结符(pre-terminal),而把其它句法标记称为非终结符(non-terminal)。依存句法树没有预终结符和非终结符,所有的节点都是句子里的单词,通过不同节点间的连线表示句子中各个单词之间的依存关系。每个依存关系实际上都是有方向的,头和尾分别指向``接受''和``发出''依存关系的词。每个依存关系也可以进行分类,如图\ref{fig:phrase-structure-tree-and-dependency-tree}所示,每个依存关系都的类型都进行了标记,这也被称作有标记的依存分析。如果不生成这些标记,这样的句法分析被称作无标记的依存分析。
\parinterval 虽然短语结构树和依存树是两种不同的句法表现形式,但是它们在某种条件下能相互转化。比如,可以使用启发性规则将短语结构树自动转化为依存树。从应用的角度,依存分析由于形式更加简单,而且直接建模词语之间的依赖,因此在最近自然语言处理领域中关注较多。在机器翻译中,不过无论是哪种句法树结构,都已经被证明会对机器翻译系统产生正面效果。特别是短语结构树,在机器翻译中的应用历史更长,研究更加深入,因此本节将会里短语结构分析为例介绍相关概念。
......@@ -1025,21 +992,21 @@ c_{\textrm{KN}}(\cdot) & = & \begin{cases} \textrm{count}(\cdot)\quad for\ the\
%-------------------------------------------
\parinterval 举例说明,假设有上下文无关文法$G=<N,\Sigma,R,S>$,其中把非终结符集合定义为不同的句法标记
\begin{eqnarray}
\textrm{N}=\{\textrm{NN},\textrm{VV},\textrm{NP},\textrm{VP},\textrm{IP}\}
\label{eqC2.46-new}
\end{eqnarray}
这里,\textrm{NN}代表名词,\textrm{VV}代表动词,\textrm{NP}代表名词短语,\textrm{VP}代表动词短语,\textrm{IP}代表单句。进一步,把终结符集合定义为
\begin{eqnarray}
\Sigma = \{\text{猫,喜欢,吃,鱼}\}
\label{eqC2.47-new}
\end{eqnarray}
再定义起始符集合为
\begin{eqnarray}
\textrm{S}=\{\textrm{IP}\}
\label{eqC2.48-new}
\end{eqnarray}
最后,文法的规则集定义如下(其中$r_i$为规则的编号)
......@@ -1049,17 +1016,17 @@ c_{\textrm{KN}}(\cdot) & = & \begin{cases} \textrm{count}(\cdot)\quad for\ the\
\centering
\input{./Chapter2/Figures/figure-rules-of-grammar}
\caption{还没有写}
\label{fig:2.5.2.1}
\label{fig:rules-of-grammar}
\end{figure}
%---------------------------
\parinterval 上面这个文法蕴含了不同“层次”的句法信息。比如,规则$r_1$$r_2$$r_3$$r_4$表达了词性对单词的抽象;规则$r_6$$r_7$$r_8$是表达了短语结构的抽象,其中,规则$r_8$表达了$\textrm{NP}+\textrm{VP}$描述了汉语中名词短语(主语)+动词短语(谓语)的结构。在实际应用中,像$r_8$这样的规则可以覆盖很大的片段(试想一下一个包含50个词的主谓结构的句子,都可以使用进行$r_8$描述)。
\parinterval 上面这个文法蕴含了不同``层次''的句法信息。比如,规则$r_1$$r_2$$r_3$$r_4$表达了词性对单词的抽象;规则$r_6$$r_7$$r_8$是表达了短语结构的抽象,其中,规则$r_8$表达了$\textrm{NP}+\textrm{VP}$描述了汉语中名词短语(主语)+动词短语(谓语)的结构。在实际应用中,像$r_8$这样的规则可以覆盖很大的片段(试想一下一个包含50个词的主谓结构的句子,都可以使用进行$r_8$描述)。
\parinterval 下文无关文法的规则是一种\textbf{产生式规则(production rule)},形如$\alpha \to \beta $,它表示把规则左端的非终结符$\alpha$替换为规则右端的符号序列$\beta$。通常,$\alpha$被称作规则的左部(left-hand side),$\beta$被称作规则的右部(right-hand side)。使用右边$\beta$替换左部$\alpha$的过程也被称作规则的使用,而这个过程的逆过程称为规约。规则的使用可以如下定义:
%-------------------------------------------
\begin{definition}
一个符号序列$u$可以通过使用规则$r$替换其中的某个非终结符,并得到符号序列$v$,我们说$v$是在$u$上使用$r$的结果,如图\ref{fig:2.5.2.2}所示:
一个符号序列$u$可以通过使用规则$r$替换其中的某个非终结符,并得到符号序列$v$,我们说$v$是在$u$上使用$r$的结果,如图\ref{fig:usage-of-regulation}所示:
\end{definition}
%-------------------------------------------
......@@ -1067,7 +1034,7 @@ c_{\textrm{KN}}(\cdot) & = & \begin{cases} \textrm{count}(\cdot)\quad for\ the\
\centering
\input{./Chapter2/Figures/figure-usage-of-regulation}
\caption{规则的使用示意图}
\label{fig:2.5.2.2}
\label{fig:usage-of-regulation}
\end{figure}
\parinterval 给定义起始非终结符,我们可以不断地使用规则,最终生成一个终结符串,这个过程也被称为推导(derivation)。
......@@ -1095,27 +1062,27 @@ s_0 \overset{r_1}{\Rightarrow} s_1 \overset{r_2}{\Rightarrow} s_2 \overset{r_3}{
\end{definition}
%-------------------------------------------
\parinterval 比如,使用前面的示例文法,可以对“猫 喜欢 吃 鱼”进行分析,并形成句法分析树(图\ref{fig:2.5.2.3})。我们从起始非终结符IP开始,利用唯一拥有IP在左部的规则$r_8$推导出NP和VP,之后依次使用规则$r_5$$r_1$$r_7$$r_2$$r_6$$r_3$$r_4$,得到了完整的句法树。
\parinterval 比如,使用前面的示例文法,可以对``猫 喜欢 吃 鱼''进行分析,并形成句法分析树(图\ref{fig:example-of-derivation})。我们从起始非终结符IP开始,利用唯一拥有IP在左部的规则$r_8$推导出NP和VP,之后依次使用规则$r_5$$r_1$$r_7$$r_2$$r_6$$r_3$$r_4$,得到了完整的句法树。
%-------------------------------------------
% 图2.5.2.3
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-example-of-derivation}
\caption{上下文无关文法推导实例}
\label{fig:2.5.2.3}
\label{fig:example-of-derivation}
\end{figure}
%-------------------------------------------
\parinterval 通常,可以把推导简记为$\textrm{d}=r_1 \circ r_2 \circ\circ r_n$,其中$ \circ $表示规则的组合。显然,$\textrm{d}$也对应了树形结构,也就是句法分析结果。从这个角度看,推导就是描述句法分析树的一种方式。此外,规则的推导也把规则的使用和生成的字符串对应起来。一个推导所生成的字符串,也被称作文法的一个句子。而一个文法所能生成的所有句子是这个文法所对应的语言。
\parinterval 但是,句子和规则的推导并不是一一对应的。同一个句子,往往有很多推导与之对应,我们称为歧义。甚至同一棵句法树,也可以对应不同的推导。图\ref{fig:2.5.2.4}给出一个同一棵句法树所对应的两种不同的规则推导。
\parinterval 但是,句子和规则的推导并不是一一对应的。同一个句子,往往有很多推导与之对应,我们称为歧义。甚至同一棵句法树,也可以对应不同的推导。图\ref{fig:two-different-derivation-of-regulation}给出一个同一棵句法树所对应的两种不同的规则推导。
%-------------------------------------------
%图2.5.2.4
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-two-different-derivation-of-regulation}
\caption{同一棵句法树对应的不同规则推导}
\label{fig:2.5.2.4}
\label{fig:two-different-derivation-of-regulation}
\end{figure}
%-------------------------------------------
......@@ -1123,24 +1090,24 @@ s_0 \overset{r_1}{\Rightarrow} s_1 \overset{r_2}{\Rightarrow} s_2 \overset{r_3}{
\parinterval 这样,对于一个上下文无关文法,每一棵句法树都有唯一的最左推导与之对应。这样,句法分析可以被描述为:对于一个句子找到能够生成它的最佳推导,这个推导所对应的句法树就是这个句子的句法分析结果。
\parinterval 不过问题又回来了,怎样才能知道什么样的推导或者句法树是“最佳”的呢?对于句法分析的语言学专来说,可以很确定的分辨出哪些树是正确的哪些树是错误的结果。甚至对于普通人,也通过经验可以得到一些模糊的结果。而计算机如何进行判别呢?沿着前面介绍的统计建模的思想,计算机可以得出不同句法树出现的概率,进而选择概率最高的句法树作为输出,而这正是统计句法分析所做的事情。%-------------------------------------------
\parinterval 不过问题又回来了,怎样才能知道什么样的推导或者句法树是``最佳''的呢?对于句法分析的语言学专来说,可以很确定的分辨出哪些树是正确的哪些树是错误的结果。甚至对于普通人,也通过经验可以得到一些模糊的结果。而计算机如何进行判别呢?沿着前面介绍的统计建模的思想,计算机可以得出不同句法树出现的概率,进而选择概率最高的句法树作为输出,而这正是统计句法分析所做的事情。%-------------------------------------------
%图2.5.2.5
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-perspectives-of-expert-ordinary-and-syntactic-parser}
\caption{如何选择最佳的句法分析结果 - 专家、普通人和句法分析器的视角}
\label{fig:2.5.2.5}
\label{fig:perspectives-of-expert-ordinary-and-syntactic-parser}
\end{figure}
%-------------------------------------------
\parinterval 在统计句法分析中,我们需要对每个推导进行统计建模,于是我们得到一个模型$\textrm{P}( \cdot )$,对于任意的推导$d$,都可以用$\textrm{P}(d)$计算推导$d$的概率。这样,给定一个输入句子,我们可以对所有可能的推导用$\textrm{P}(d)$计算其概率值,并选择概率最大的结果作为句法分析的结果输出(图\ref{fig:2.5.2.6})。
\parinterval 在统计句法分析中,我们需要对每个推导进行统计建模,于是我们得到一个模型$\textrm{P}( \cdot )$,对于任意的推导$d$,都可以用$\textrm{P}(d)$计算推导$d$的概率。这样,给定一个输入句子,我们可以对所有可能的推导用$\textrm{P}(d)$计算其概率值,并选择概率最大的结果作为句法分析的结果输出(图\ref{fig:probability-values-corresponding-to-different-derivations})。
%-------------------------------------------
%图2.5.2.6
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-probability-values-corresponding-to-different-derivations}
\caption{不同推导(句法树)对应的概率值}
\label{fig:2.5.2.6}
\label{fig:probability-values-corresponding-to-different-derivations}
\end{figure}
%-------------------------------------------
......@@ -1164,22 +1131,19 @@ s_0 \overset{r_1}{\Rightarrow} s_1 \overset{r_2}{\Rightarrow} s_2 \overset{r_3}{
%-------------------------------------------
\parinterval 概率上下文无关文法与传统上下文无关文法的区别在于,每条规则都会有一个概率,描述规则生成的可能性。具体来说,规则$\textrm{P}(\alpha \to \beta)$的概率可以被定义为:
\begin{eqnarray}
\textrm{P}(\alpha \to \beta)=\textrm{P}(\beta | \alpha)
\label{eq:2.5.3.1}
\label{eqC2.49-new}
\end{eqnarray}
即,在给定规则左部的情况下生成规则右部的可能性。进一步,在上下文无关文法中,因为上下文无关的属性,每条规则之间的使用都是相互独立的 \footnote[3]{如果是上下文有关文法,规则会形如 $\textrm{a}\alpha \textrm{b}\to \textrm{a}\beta \textrm{b}$,这时$\alpha \to \beta $的过程会依赖前后上下文\textrm{a}\textrm{b}}。因此可以把\textrm{P(d)}分解为规则概率的乘积进行计算:
\begin{eqnarray}
\textrm{P}(d) & = & \textrm{P}(r_1 \cdot r_2 \cdot\cdot r_n) \nonumber \\
& = & \textrm{P}(r_1) \cdot \textrm{P}(r_2) \cdots \textrm{P}(r_n)
\label{eq:2.5.3.1}
\label{eqC2.50-new}
\end{eqnarray}
\parinterval 这样我们就可以得到每个推导d的概率值。这个模型,可以很好的解释词串的生成过程。比如,对于规则集
\begin{eqnarray}
r_3: & VV \to \text{}\nonumber \\
r_4: & NN \to \text{}\nonumber \\
......@@ -1187,23 +1151,21 @@ r_6: & VP \to VV NN \nonumber
\end{eqnarray}
\parinterval 可以得到 $d_1=r_3 \cdot r_4 \cdot r_6$的概率为
\begin{eqnarray}
\textrm{P}(d_1) & = &\textrm{P}(r_3) \cdot \textrm{P}(r_4) \cdot \textrm{P}(r_6)\nonumber \\
& = & \textrm{P}(VV \to \text{}) \cdot \textrm{P}(NN \to \text{}) \cdots \textrm{P}(VP \to VV NN)
\label{eq:2.5.3.2}
\label{eqC2.51-new}
\end{eqnarray}
\parinterval 这也对应了词串“吃 鱼”的生成过程。首先,从起始VP使用规则$r_6$生成两个非终结符VV和NN;进一步,分别使用规则$r_3$$r_4$从VV和NN进一步生成单词“吃”和“鱼”。整个过程的概率等于三条规则概率的乘积。
\parinterval 这也对应了词串``吃 鱼''的生成过程。首先,从起始VP使用规则$r_6$生成两个非终结符VV和NN;进一步,分别使用规则$r_3$$r_4$从VV和NN进一步生成单词``吃''和``鱼''。整个过程的概率等于三条规则概率的乘积。
\parinterval 新的问题又来了,如何得到规则的概率呢?这里仍然可以使用数据驱动的想法,从数据中学习文法规则的概率。假设我们有人工标注的数据,其中包括很多句子的人工标注的句法树,称之为树库。然后,对于规则$\textrm{r}:\alpha \to \beta$可以使用极大似然估计:
\begin{eqnarray}
\textrm{P}(r) = \frac{\text{规则$r$在树库中出现的次数}}{\alpha \text{在树库中出现的次数}}
\label{eq:2.5.3.3}
\label{eqC2.52-new}
\end{eqnarray}
\parinterval 这里通过一个例子来解释规则概率的计算过程(图\ref{fig:2.5.3.1})。
\parinterval 这里通过一个例子来解释规则概率的计算过程(图\ref{fig:evaluation-of-probability-for-grammar})。
%-------------------------------------------
% 图2.5.3.1
......@@ -1211,13 +1173,13 @@ r_6: & VP \to VV NN \nonumber
\centering
\input{./Chapter2/Figures/figure-evaluation-of-probability-for-grammar}
\caption{上下文无关文法规则概率估计}
\label{fig:2.5.3.1}
\label{fig:evaluation-of-probability-for-grammar}
\end{figure}
%-------------------------------------------
\parinterval 与词法分析类似,我们统计树库中规则左部和右部同时出现的次数,除以规则左部出现的全部次数,所得的结果就是所求规则的概率。这种方法也是典型的相对频度估计。但是如果规则左部和右部同时出现的次数为0时是否代表这个规则概率是0呢?遇到这种情况,可以使用平滑方法对概率进行平滑处理,具体思路和2.4.2节基本上是一样的。
\parinterval\ref{fig:2.5.3.2}展示了基于统计句法分析的流程。首先,通过对人工标注数据的统计,获得各个规则的概率,这样我们得到了一个上下文无关句法分析模型$\textrm{P}( \cdot )$,对于任意句法分析结果$\textrm{d}=r_1 \cdot r_2 \cdot\cdot r_n$,都能通过$\textrm{P}(\textrm{d})= \prod_{i=1}^{n}\textrm{p}(r_i)$计算其概率值。
\parinterval\ref{fig:process-of-statistical-syntax-analysis}展示了基于统计句法分析的流程。首先,通过对人工标注数据的统计,获得各个规则的概率,这样我们得到了一个上下文无关句法分析模型$\textrm{P}( \cdot )$,对于任意句法分析结果$\textrm{d}=r_1 \cdot r_2 \cdot\cdot r_n$,都能通过$\textrm{P}(\textrm{d})= \prod_{i=1}^{n}\textrm{p}(r_i)$计算其概率值。
%-------------------------------------------
% 图2.5.3.2
......@@ -1225,11 +1187,11 @@ r_6: & VP \to VV NN \nonumber
\centering
\input{./Chapter2/Figures/figure-process-of-statistical-syntax-analysis}
\caption{统计句法分析的流程}
\label{fig:2.5.3.2}
\label{fig:process-of-statistical-syntax-analysis}
\end{figure}
%-------------------------------------------
\parinterval 在获取统计分析模型后,就可以使用模型对任意句子进行分析,计算每个句法分析树的概率,并输出概率最高的树作为句法分析的结果。图\ref{fig:2.5.3.3}给出了几个真实句法分析器的输入输出实例。
\parinterval 在获取统计分析模型后,就可以使用模型对任意句子进行分析,计算每个句法分析树的概率,并输出概率最高的树作为句法分析的结果。图\ref{fig:example-of-zh-syntactic-analysis}给出了几个真实句法分析器的输入输出实例。
%-------------------------------------------
% 图2.5.3.3
......@@ -1237,7 +1199,7 @@ r_6: & VP \to VV NN \nonumber
\centering
\input{./Chapter2/Figures/figure-example-of-zh-syntactic-analysis}
\caption{中文句法分析实例}
\label{fig:2.5.3.3}
\label{fig:example-of-zh-syntactic-analysis}
\end{figure}
%-------------------------------------------
......@@ -1250,7 +1212,7 @@ r_6: & VP \to VV NN \nonumber
\begin{adjustwidth}{1em}{}
\begin{itemize}
\item 在建模方面,本章介绍的三个任务均采用的是基于人工先验知识进行模型设计的思路。也就是,问题所表达的现象被“一步一步”生成出来。这是一种典型的生成式建模思想,它把要解决的问题看作一些观测结果的隐含变量(比如,句子是观测结果,分词是隐含变量),之后通过对观测变量生成观测结果的过程建模,以达到对问题进行数学描述的目的。这类模型一般需要进行一些独立性假设,假设的好坏对最终的性能有较大影响。相对\textbf{生成模型}(generative models),另一类方法\textbf{判别模型}(discriminative models),它直接对问题进行求解,可以更加灵活的定义不同的特征,而且不依赖过多的独立性假设。判别式模型在自然语言处理中也有广泛应用\cite{shannon1948mathematical}\cite{ng2002discriminative}。在本书的第四章也会使用到判别式模型。
\item 在建模方面,本章介绍的三个任务均采用的是基于人工先验知识进行模型设计的思路。也就是,问题所表达的现象被``一步一步''生成出来。这是一种典型的生成式建模思想,它把要解决的问题看作一些观测结果的隐含变量(比如,句子是观测结果,分词是隐含变量),之后通过对观测变量生成观测结果的过程建模,以达到对问题进行数学描述的目的。这类模型一般需要进行一些独立性假设,假设的好坏对最终的性能有较大影响。相对\textbf{生成模型}(generative models),另一类方法\textbf{判别模型}(discriminative models),它直接对问题进行求解,可以更加灵活的定义不同的特征,而且不依赖过多的独立性假设。判别式模型在自然语言处理中也有广泛应用\cite{shannon1948mathematical}\cite{ng2002discriminative}。在本书的第四章也会使用到判别式模型。
\item 从现在自然语言处理的前沿看,基于端到端学习的深度学习方法在很多任务中都取得了领先的性能。但是,深度学习及相关方法并没有在本章被涉及,这是由于笔者认为对问题的建模是处理自然语言处理问题的基础,对问题的描述并不会因为方法的改变而改变。因此,本章的内容没有太多的陷入到更加复杂的模型和算法设计中,相反,我们希望关注对基本问题的理解和描述。不过,对于本章中涉及的自然语言问题,一些前沿方法可以参考,包括:基于条件随机场和双向长短时记忆模型的序列标注模型(\cite{lafferty2001conditional}\cite{huang2015bidirectional}\cite{ma2016end}、神经语言模型\cite{bengio2003neural}\cite{mikolov2010recurrent}、神经句法分析模型\cite{chen2014fast}\cite{zhu2015long}
......
......@@ -197,7 +197,7 @@
%\end{figure}
%---------------------------
\parinterval 看一个具体的例子,如例\ref{example3-1}所示,有一个汉英互译的句对$(\mathbf{s},\mathbf{t})$。假设,$x=\textrm{``翻译''}$$y=\textrm{``translation''}$,现在要计算$x$$y$共现的总次数。``翻译''和``translation''分别在$\mathbf{s}$$\mathbf{t}$中出现了2次,因此$c(\textrm{``翻译''},\textrm{``translation''};\mathbf{s},\mathbf{t})$ 等于4。而对于$\sum_{x',y'} c(x',y';\mathbf{s},\mathbf{t})$,因为$x'$$y'$分别表示的是$s$$t$中的任意词,所以$\sum_{x',y'} c(x',y';\mathbf{s},\mathbf{t})$表示所有单词对的数量 - 即$\mathbf{s}$的词数乘以$\mathbf{t}$的词数。最后,“翻译”和“translation”的单词翻译概率为:
\parinterval 看一个具体的例子,如例\ref{example3-1}所示,有一个汉英互译的句对$(\mathbf{s},\mathbf{t})$。假设,$x=\textrm{``翻译''}$$y=\textrm{``translation''}$,现在要计算$x$$y$共现的总次数。``翻译''和``translation''分别在$\mathbf{s}$$\mathbf{t}$中出现了2次,因此$c(\textrm{``翻译''},\textrm{``translation''};\mathbf{s},\mathbf{t})$ 等于4。而对于$\sum_{x',y'} c(x',y';\mathbf{s},$ $\mathbf{t})$,因为$x'$$y'$分别表示的是$s$$t$中的任意词,所以$\sum_{x',y'} c(x',y';\mathbf{s},\mathbf{t})$表示所有单词对的数量 - 即$\mathbf{s}$的词数乘以$\mathbf{t}$的词数。最后,“翻译”和“translation”的单词翻译概率为:
\begin{eqnarray}
\textrm{P}(\text{``翻译''},\text{``translation''}; \mathbf{s},\mathbf{t}) & = & \frac{c(\textrm{``翻译''},\textrm{``translation''};\mathbf{s},\mathbf{t})}{\sum_{x',y'} c(x',y';\mathbf{s},\mathbf{t})} \nonumber \\
& = & \frac{4}{|s|\times |t|} \nonumber \\
......@@ -365,7 +365,7 @@ g(s,t) \equiv \prod_{j,i \in \widehat{A}}{\textrm{P}(s_j,t_i)} \times \textrm{P
\label{eqC3.12-new}
\end{eqnarray}
\noindent 其中$\argmax_{t} \textrm{P}(t|s)$表示找到使$\textrm{P}(t|s)$达到最大时的译文$t$。结合上一小节中关于$\textrm{P}(t|s)$的定义,把公式\ref{eqC3.7-new}带入公式\ref{eqC3.12-new}得到:
\noindent 其中$\argmax_{t} \textrm{P}(t|s)$表示找到使$\textrm{P}(t|s)$达到最大时的译文$t$。结合上一小节中关于$\textrm{P}(t|s)$\\的定义,把公式\ref{eqC3.7-new}带入公式\ref{eqC3.12-new}得到:
\begin{eqnarray}
\widehat{t}=\argmax_{t}\frac{g(s,t)}{\sum_{t^{'}g(s,t^{'})}}
\label{eqC3.13-new}
......@@ -411,12 +411,14 @@ g(s,t) \equiv \prod_{j,i \in \widehat{A}}{\textrm{P}(s_j,t_i)} \times \textrm{P
\label{fig:3-10}
\end{figure}
%---------------------------
\vspace{5.0em}
%----------------------------------------------
% 图3.13
\begin{figure}[htp]
\centering
\subfigure{\input{./Chapter3/Figures/greedy-MT-decoding-process-1}}
\subfigure{\input{./Chapter3/Figures/greedy-MT-decoding-process-3}}
\setlength{\belowcaptionskip}{14.0em}
\caption{贪婪的机器翻译解码过程实例}
\label{fig:3-11}
\end{figure}
......@@ -671,7 +673,7 @@ g(s,t) \equiv \prod_{j,i \in \widehat{A}}{\textrm{P}(s_j,t_i)} \times \textrm{P
\end{figure}
%---------------------------
\parinterval 这样就得到了IBM模型1中句子翻译概率的计算式。可以看出IBM模型1的假设把翻译模型化简成了非常简单的形式。对于给定的$s$$a$$t$,只要知道$\varepsilon$$t(s_j |t_(a_j ))$ 就可以计算出$\textrm{P}(s|t)$,进而求出$\textrm{P}(s|t)$\\ \\ \\
\parinterval 这样就得到了IBM模型1中句子翻译概率的计算式。可以看出IBM模型1的假设把翻译模型化简成了非常简单的形式。对于给定的$s$$a$$t$,只要知道$\varepsilon$$t(s_j |t_{a_j })$ 就可以计算出$\textrm{P}(s|t)$,进而求出$\textrm{P}(s|t)$\\ \\ \\
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{IBM模型2}\index{Chapter3.4.2}
......@@ -719,7 +721,7 @@ g(s,t) \equiv \prod_{j,i \in \widehat{A}}{\textrm{P}(s_j,t_i)} \times \textrm{P
\label{eqC3.29-new}
\end{eqnarray}
\noindent 公式\ref{eqC3.29-new}的技巧在于把若干个乘积的加法(等式左手端)转化为若干加法结果的乘积(等式右手端),这样省去了多次循环,把$O((l+1)^m m)$的计算复杂度降为$(l+1)m$\footnote{公式\ref{eqC3.29-new}相比公式\ref{eqC3.28-new}的另一个优点在于,公式\ref{eqC3.29-new}中乘法的数量更少,因为现代计算机中乘法运算的强度要高于加法,因此公式\ref{eqC3.29-new}的计算机实现效率更高。}\ref{fig:3-21}对这个过程进行了进一步解释。
\noindent 公式\ref{eqC3.29-new}的技巧在于把若干个乘积的加法(等式左手端)转化为若干加法结果的乘积(等式右手端),这样省去了多次循环,把$O((l+1)^m m)$的计算复杂度降为$(l+1)m$\footnote{公式\ref{eqC3.29-new}相比公式\ref{eqC3.28-new}的另一个优点在于,公式\ref{eqC3.29-new}中乘法的数量更少,因为现代计算机中乘法运算的强度要高于加法,因此公式\ref{eqC3.29-new}的计算机实现效率更高。}\ref{fig:3-21}对这个过程进行了进一步解释。
%----------------------------------------------
% 图3.32-new
......@@ -860,7 +862,7 @@ f(s_u|t_v) = \lambda_{t_v}^{-1} \frac{\epsilon}{(l+1)^{m}} \prod\limits_{j=1}^{m
\end{figure}
%---------------------------
\noindent\hspace{2em} 为了化简$f(s_u|t_v)$的计算,在此对公式\ref{eqC3.40-new}进行了重新组织,见下图。红色部分表示翻译概率P$(s|t)$;蓝色部分表示$(s_u,t_v)$在句对$(s,t)$中配对的总次数,即$t_v$翻译为$s_u$‘在所有对齐中出现的次数;绿色部分表示$f(s_u|t_v)$对于所有的$t_i$的相对值,即’$t_v$翻译为$s_u$‘在所有对齐中出现的相对概率;蓝色与绿色部分相乘表示“$t_v$翻译为$s_u$这个事件出现次数的期望的估计,称之为期望频次(expected count)。
\noindent\hspace{2em} 为了化简$f(s_u|t_v)$的计算,在此对公式\ref{eqC3.40-new}进行了重新组织,见下图。红色部分表示翻译概率P$(s|t)$;蓝色部分表示$(s_u,t_v)$在句对$(s,t)$中配对的总次数,即`$t_v$翻译为$s_u$'在所有对齐中出现的次数;绿色部分表示$f(s_u|t_v)$对于所有的$t_i$的相对值,即`$t_v$翻译为$s_u$'在所有对齐中出现的相对概率;蓝色与绿色部分相乘表示``$t_v$翻译为$s_u$''这个事件出现次数的期望的估计,称之为期望频次(expected count)。
%----------------------------------------------
% 图3.29
\begin{figure}[htp]
......@@ -1304,6 +1306,7 @@ p_0+p_1 & = & 1 \label{eqC3.62-new}
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{appendices}
\chapter{附录A}
\label{appendix-A}
\section{IBM模型3训练方法}
......@@ -1486,11 +1489,8 @@ d_{>1}(\Delta_i|cb,v;\bm{s},\bm{t}) = \mu_{>1cb}^{-1} \times \sum_{s=1}^{S}c_{>1
\end{eqnarray}
%----------------------------------------------
\parinterval 这里$\tilde{\tilde{b}}(\bm{a})$借用了模型4中$\tilde{b}(\bm{a})$的概念。不过$\tilde{\tilde{b}}(\bm{a})$表示在利用模型3进行排名的列表中满足$\textrm{p}_{\theta}(\bm{a}'|\bm{s},\bm{t};5)$的最高排名的词对齐。
\parinterval
\end{appendices}
......
......@@ -6,14 +6,11 @@
{\scriptsize
\node [anchor=west,minimum height=2.5em,minimum width=5.5em] (sf1) at (2.3em,0) {};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (s1) at ([xshift=2.3em]sf1.east) {科学家};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (s2) at ([xshift=2.3em]s1.east) {};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (s3) at ([xshift=2.3em]s2.east) {并不};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (s4) at ([xshift=2.3em]s3.east) {知道};
}
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (s2) at ([xshift=2.32em]s1.east) {};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (s3) at ([xshift=2.33em]s2.east) {并不};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (s4) at ([xshift=2.30em]s3.east) {知道};
{
{\scriptsize
\node [anchor=west] (tau11) at ([xshift=1.5em]taut.east) {$\tau_0$};
\node [anchor=north] (tau11) at ([xshift=-1.5em,yshift=-3.5em]sf1.south) {$\tau_0$};
\node [anchor=west] (tau12) at ([xshift=-0.5em]tau11.east) {\tiny{1.NULL}};
\node [rounded rectangle,draw,line width=1pt,minimum height=3.4em,minimum width=7.8em] (tau1) [fit = (tau11) (tau12)] {};
......@@ -34,41 +31,43 @@
\node [anchor=west] (tau52) at ([xshift=-0.5em]tau51.east) {\tiny{1.知道}};
\node [rounded rectangle,draw,line width=1pt,minimum height=3.4em,minimum width=7.8em] (tau5) [fit = (tau51) (tau52)] {};
}
\draw [->,thick] ([xshift=-0.68em,yshift=-0.2em]tau22.north) -- (s1.south);
\draw [->,thick] (tau23.east) -- (s2.south);
\draw [->,thick] ([xshift=-0.22em]tau4.north) -- (s3.south);
\draw [->,thick] ([xshift=-0.23em]tau5.north) -- (s4.south);
}
\draw [->,thick,dashed] ([yshift=1em]tau1.north west) -- ([yshift=1em]tau5.north east);
\draw [->,thick,dashed] ([yshift=-1em]tau1.south west) -- ([yshift=-1em]tau5.south east);
{
{
\node [anchor=north] (d1) at ([yshift=-2em]tau1.south) {$...$};
\node [anchor=west] (d2) at ([xshift=4.23em]d1.east) {$...$};
\node [anchor=west] (d31) at ([xshift=4.3em]d2.east) {$...$};
\node [anchor=north] (d1) at ([yshift=-6em]sf1.south) {$...$};
\node [anchor=north] (d2) at ([yshift=-6em]s1.south) {$...$};
\node [anchor=north] (d31) at ([yshift=-6em]s2.south) {$...$};
\node [anchor=north] (d32) at ([xshift=0.2em]d31.south) {\footnotesize{${<{\tau,\pi}>}_1$}};
\node [anchor=west] (d4) at ([xshift=4.27em]d31.east) {$...$};
\node [anchor=west] (d5) at ([xshift=4.25em]d4.east) {$...$};
}
\draw [->,thick] (d1.north) -- (tau1.south);
\draw [->,thick] (d2.north) -- (tau2.south);
\draw [->,thick] (d31.north) -- (tau3.south);
\draw [->,thick] (d4.north) -- (tau4.south);
\draw [->,thick] (d5.north) -- (tau5.south);
\node [anchor=north] (d4) at ([yshift=-6em]s3.south) {$...$};
\node [anchor=north] (d5) at ([yshift=-6em]s4.south) {$...$};
}
\draw [->,thick,dashed] ([yshift=1em]tau1.north west) -- ([yshift=1em]tau5.north east);
\draw [->,thick,dashed] ([yshift=-1em]tau1.south west) -- ([yshift=-1em]tau5.south east);
\draw [->,thick] (tau23.east) -- (s2.south);
\draw [->,thick] ([yshift=4.2em]d2.north) -- (s1.south);
\draw [->,thick] ([yshift=4.2em]d4.north) -- (s3.south);
\draw [->,thick] ([yshift=4.2em]d5.north) -- (s4.south);
\draw [->,thick] (d1.north) -- ([yshift=-4.25em]sf1.south);
\draw [->,thick] (d2.north) -- ([yshift=-4.25em]s1.south);
\draw [->,thick] (d31.north) -- ([yshift=-4.25em]s2.south);
\draw [->,thick] (d4.north) -- ([yshift=-4.25em]s3.south);
\draw [->,thick] (d5.north) -- ([yshift=-4.25em]s4.south);
{\scriptsize
\node [rectangle,draw,anchor=north,line width=1pt,minimum height=2.5em,minimum width=5.5em] (ns1) at ([yshift=-13em]s1.south) {科学家};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (ns2) at ([xshift=2.3em]ns1.east) {};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (ns3) at ([xshift=2.3em]ns2.east) {并不};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (ns4) at ([xshift=2.3em]ns3.east) {知道};
}
\node [rectangle,draw,anchor=north,line width=1pt,minimum height=2.5em,minimum width=5.5em] (ns2) at ([yshift=-13em]s2.south) {};
\node [rectangle,draw,anchor=north,line width=1pt,minimum height=2.5em,minimum width=5.5em] (ns3) at ([yshift=-13em]s3.south) {并不};
\node [rectangle,draw,anchor=north,line width=1pt,minimum height=2.5em,minimum width=5.5em] (ns4) at ([yshift=-13em]s4.south) {知道};
{
{\scriptsize
\node [anchor=north] (ntau11) at ([yshift=-15em]tau11.south) {$\tau_0$};
\node [anchor=west] (ntau12) at ([xshift=-0.5em]ntau11.east) {\tiny{1.NULL}};
\node [rounded rectangle,draw,line width=1pt,minimum height=3.4em,minimum width=7.8em] (ntau1) [fit = (ntau11) (ntau12)] {};
......@@ -90,28 +89,33 @@
\node [anchor=west] (ntau52) at ([xshift=-0.5em]ntau51.east) {\tiny{1.知道}};
\node [rounded rectangle,draw,line width=1pt,minimum height=3.4em,minimum width=7.8em] (ntau5) [fit = (ntau51) (ntau52)] {};
}
\draw [->,thick] ([xshift=-0.05em,yshift=-0.2em]ntau22.north) -- (ns1.south);
\draw [->,thick] (ntau23.east) -- (ns2.south);
\draw [->,thick] ([xshift=-0.22em]ntau4.north) -- (ns3.south);
\draw [->,thick] ([xshift=-0.23em]ntau5.north) -- (ns4.south);
}
\draw [->,thick,dashed] ([yshift=1em]ntau1.north west) -- ([yshift=1em]ntau5.north east);
\draw [->,thick,dashed] ([yshift=-1em]ntau1.south west) -- ([yshift=-1em]ntau5.south east);
{
{
\node [anchor=north] (nd1) at ([yshift=-2em]ntau1.south) {$...$};
\node [anchor=west] (nd2) at ([xshift=4.23em]nd1.east) {$...$};
\node [anchor=west] (nd31) at ([xshift=4.3em]nd2.east) {$...$};
\node [anchor=north] (nd1) at ([yshift=-11em]d1.south) {$...$};
\node [anchor=north] (nd2) at ([yshift=-11em]d2.south) {$...$};
\node [anchor=north] (nd31) at ([yshift=-11em]d31.south) {$...$};
\node [anchor=north] (nd32) at ([xshift=0.2em]nd31.south) {\footnotesize{${<{\tau,\pi}>}_2$}};
\node [anchor=west] (nd4) at ([xshift=4.27em]nd31.east) {$...$};
\node [anchor=west] (nd5) at ([xshift=4.25em]nd4.east) {$...$};
\node [anchor=north] (nd4) at ([yshift=-11em]d4.south) {$...$};
\node [anchor=north] (nd5) at ([yshift=-11em]d5.south) {$...$};
}
\draw [->,thick] (nd1.north) -- (ntau1.south);
\draw [->,thick] (nd2.north) -- (ntau2.south);
\draw [->,thick] (nd31.north) -- (ntau3.south);
\draw [->,thick] (nd4.north) -- (ntau4.south);
\draw [->,thick] (nd5.north) -- (ntau5.south);
\draw [->,thick,dashed] ([yshift=1em]ntau1.north west) -- ([yshift=1em]ntau5.north east);
\draw [->,thick,dashed] ([yshift=-1em]ntau1.south west) -- ([yshift=-1em]ntau5.south east);
\draw [->,thick] (ntau23.east) -- (ns2.south);
\draw [->,thick] ([yshift=4.2em]nd2.north) -- (ns1.south);
\draw [->,thick] ([yshift=4.2em]nd4.north) -- (ns3.south);
\draw [->,thick] ([yshift=4.2em]nd5.north) -- (ns4.south);
\draw [->,thick] (nd1.north) -- ([yshift=-16.15em]sf1.south);
\draw [->,thick] (nd2.north) -- ([yshift=-16.15em]s1.south);
\draw [->,thick] (nd31.north) -- ([yshift=-16.15em]s2.south);
\draw [->,thick] (nd4.north) -- ([yshift=-16.15em]s3.south);
\draw [->,thick] (nd5.north) -- ([yshift=-16.15em]s4.south);
}
}
......
......@@ -4,7 +4,7 @@
{
{
\node [anchor=west] (st) at (0,0) {\textbf{s}};
\node [anchor=north west] (st) at (0,0) {\textbf{s}};
\node [anchor=north] (taut) at ([yshift=-3em]st.south) {\textbf{$\tau$}};
\node [anchor=north] (phit) at ([yshift=-3em]taut.south) {\textbf{$\phi$}};
\node [anchor=north] (tt) at ([yshift=-3em]phit.south) {\textbf{t}};
......@@ -17,7 +17,7 @@
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (s4) at ([xshift=2.3em]s3.east) {知道};
}
{
{\scriptsize
\node [anchor=west] (tau11) at ([xshift=1.5em]taut.east) {$\tau_0$};
\node [anchor=west] (tau12) at ([xshift=-0.5em]tau11.east) {\tiny{1.NULL}};
......@@ -40,13 +40,7 @@
\node [anchor=west] (tau52) at ([xshift=-0.5em]tau51.east) {\tiny{1.知道}};
\node [rounded rectangle,draw,line width=1pt,minimum height=3.4em,minimum width=7.8em] (tau5) [fit = (tau51) (tau52)] {};
}
\draw [->,thick] ([xshift=-0.5em,yshift=-0.2em]tau22.north) -- (s1.south);
\draw [->,thick] (tau23.east) -- (s2.south);
\draw [->,thick] ([xshift=-0.1em]tau4.north) -- (s3.south);
\draw [->,thick] ([xshift=-0.1em]tau5.north) -- (s4.south);
}
{
{\scriptsize
\node [anchor=west] (phi11) at ([xshift=2.4em]phit.east) {$\phi_0$};
\node [anchor=west] (phi12) at ([xshift=-0.5em]phi11.east) {0};
......@@ -68,34 +62,41 @@
\node [anchor=west] (phi52) at ([xshift=-0.5em]phi51.east) {1};
\node [rounded rectangle,draw,line width=1pt,minimum height=3.4em,minimum width=7.8em] (phi5) [fit = (phi51) (phi52)] {};
}
\draw [->,thick] (phi1.north) -- (tau1.south);
\draw [->,thick] (phi2.north) -- (tau2.south);
\draw [->,thick] ([xshift=0.05em]phi3.north) -- (tau3.south);
\draw [->,thick] ([xshift=0.05em]phi4.north) -- (tau4.south);
\draw [->,thick] ([xshift=0.05em]phi5.north) -- (tau5.south);
}
\draw [->,thick,dashed] ([yshift=-1.2em]st.south west) -- ([yshift=-0.8em]s4.south east);
\draw [->,thick,dashed] ([yshift=-5.8em]st.south west) -- ([yshift=-5.4em]s4.south east);
\draw [->,thick,dashed] ([yshift=-10.3em]st.south west) -- ([yshift=-9.9em]s4.south east);
\draw [->,thick,dashed] ([yshift=-1.4em]st.south west) -- ([xshift=0.8em,yshift=-1em]s4.south east);
\draw [->,thick,dashed] ([yshift=-5.8em]st.south west) -- ([xshift=0.8em,yshift=-5.4em]s4.south east);
\draw [->,thick,dashed] ([yshift=-10.3em]st.south west) -- ([xshift=0.8em,yshift=-9.9em]s4.south east);
{
{\scriptsize
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (t1) at ([xshift=1.2em]tt.east) {$t_0$};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (t2) at ([xshift=2.1em]t1.east) {Scientists};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (t3) at ([xshift=2.3em]t2.east) {do};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (t4) at ([xshift=2.3em]t3.east) {not};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2.5em,minimum width=5.5em] (t5) at ([xshift=2.3em]t4.east) {konw};
}
\draw [->,thick] ([xshift=-0.1em]t1.north) -- (phi1.south);
\draw [->,thick] ([xshift=0.05em]t2.north) -- (phi2.south);
\draw [->,thick] ([xshift=0.05em]t3.north) -- (phi3.south);
\draw [->,thick] ([xshift=0.05em]t4.north) -- (phi4.south);
\draw [->,thick] ([xshift=0.05em]t5.north) -- (phi5.south);
\node [rectangle,draw,anchor=north,line width=1pt,minimum height=2.5em,minimum width=5.5em] (t1) at ([yshift=-15em]sf1.south) {$t_0$};
\node [rectangle,draw,anchor=north,line width=1pt,minimum height=2.5em,minimum width=5.5em] (t2) at ([yshift=-15em]s1.south) {Scientists};
\node [rectangle,draw,anchor=north,line width=1pt,minimum height=2.5em,minimum width=5.5em] (t3) at ([yshift=-15em]s2.south) {do};
\node [rectangle,draw,anchor=north,line width=1pt,minimum height=2.5em,minimum width=5.5em] (t4) at ([yshift=-15em]s3.south) {not};
\node [rectangle,draw,anchor=north,line width=1pt,minimum height=2.5em,minimum width=5.5em] (t5) at ([yshift=-15em]s4.south) {konw};
}
\draw [->,thick] (tau23.east) -- (s2.south);
\draw [->,thick] (t1.north) -- ([yshift=-8.8em]sf1.south);
\draw [->,thick] (t2.north) -- ([yshift=-8.8em]s1.south);
\draw [->,thick] (t3.north) -- ([yshift=-8.8em]s2.south);
\draw [->,thick] (t4.north) -- ([yshift=-8.8em]s3.south);
\draw [->,thick] (t5.north) -- ([yshift=-8.8em]s4.south);
\draw [->,thick] ([yshift=4.6em]t1.north) -- ([yshift=-4.4em]sf1.south);
\draw [->,thick] ([yshift=4.6em]t2.north) -- ([yshift=-4.4em]s1.south);
\draw [->,thick] ([yshift=4.6em]t3.north) -- ([yshift=-4.4em]s2.south);
\draw [->,thick] ([yshift=4.6em]t4.north) -- ([yshift=-4.4em]s3.south);
\draw [->,thick] ([yshift=4.6em]t5.north) -- ([yshift=-4.4em]s4.south);
\draw [->,thick] ([yshift=9em]t2.north) -- (s1.south);
\draw [->,thick] ([yshift=9em]t4.north) -- (s3.south);
\draw [->,thick] ([yshift=9em]t5.north) -- (s4.south);
{\scriptsize
\node [anchor=west] (sent11) at ([xshift=1em,yshift=-1em]s4.south east) {把这些元语};
\node [anchor=west] (sent11) at ([xshift=1em,yshift=-2em]s4.south east) {把这些元语};
\node [anchor=west] (sent12) at ([yshift=-1em]sent11.west) {言单词放在};
\node [anchor=west] (sent13) at ([yshift=-1em]sent12.west) {合适的位置};
\node [anchor=west] (sent21) at ([yshift=-3em]sent13.west) {确定生成元};
......
......@@ -20,12 +20,12 @@
{
{\footnotesize
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2em,minimum width=4em] (t1) at ([yshift=-5.5em]s11.west) {$t_0$};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2em,minimum width=4em] (t2) at ([xshift=2em]t1.east) {I};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2em,minimum width=4em] (t3) at ([xshift=2em]t2.east) {changed};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2em,minimum width=4em] (t4) at ([xshift=2em]t3.east) {my};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2em,minimum width=4em] (t5) at ([xshift=2em]t4.east) {mind};
\node [rectangle,draw,anchor=west,line width=1pt,minimum height=2em,minimum width=4em] (t6) at ([xshift=2em]t5.east) {.};
\node [anchor=north,rectangle,draw,line width=1pt,minimum height=2em,minimum width=4em] (t1) at ([yshift=-3.5em]s11.south) {$t_0$};
\node [rectangle,draw,anchor=north,line width=1pt,minimum height=2em,minimum width=4em] (t2) at ([yshift=-3.5em]s1.south) {I};
\node [rectangle,draw,anchor=north,line width=1pt,minimum height=2em,minimum width=4em] (t3) at ([yshift=-3.5em]s2.south) {changed};
\node [rectangle,draw,anchor=north,line width=1pt,minimum height=2em,minimum width=4em] (t4) at ([yshift=-3.5em]s3.south) {my};
\node [rectangle,draw,anchor=north,line width=1pt,minimum height=2em,minimum width=4em] (t5) at ([yshift=-3.5em]s4.south) {mind};
\node [rectangle,draw,anchor=north,line width=1pt,minimum height=2em,minimum width=4em] (t6) at ([yshift=-3.5em]s5.south) {.};
\node [anchor=north] (nd1) at (t2.south) {[1]};
\node [anchor=north] (nd2) at (t3.south) {[2]};
......
......@@ -55,6 +55,7 @@
\IfFileExists{C:/WINDOWS/win.ini}
{\newcommand{\mycfont}{song}}
{\newcommand{\mycfont}{gbsn}}
\begin{CJK}{UTF8}{\mycfont}
\end{CJK}
......
......@@ -550,7 +550,7 @@ addtohook={%
\usepackage{booktabs}
\usepackage{bm}
\usetikzlibrary{shapes.misc}
\usepackage{appendix}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论