Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
T
Toy-MT-Introduction
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
NiuTrans
Toy-MT-Introduction
Commits
a96f10b4
Commit
a96f10b4
authored
Apr 25, 2020
by
xiaotong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
updates of section 4 (phrase-based models)
parent
26cc6efa
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
33 行增加
和
30 行删除
+33
-30
Book/Chapter4/Figures/translation-hypothesis-extension.tex
+1
-1
Book/Chapter4/chapter4.tex
+13
-10
Book/mt-book-xelatex.idx
+19
-19
没有找到文件。
Book/Chapter4/Figures/translation-hypothesis-extension.tex
查看文件 @
a96f10b4
...
@@ -64,7 +64,7 @@
...
@@ -64,7 +64,7 @@
}
}
{
{
\draw
[->,ultra thick,red,line width=2pt,opacity=0.7] ([xshift=-0.
2em]h0.west) -- ([xshift=0.7em]h0.east) -- ([xshift=-0.2em]h3.west) -- ([xshift=0.8em]h3.east) -- ([xshift=-0.2em]h5.west) -- ([xshift=0.8em]h5.east) -- ([xshift=-0.2em]h7.west) -- ([xshift=0.8
em]h7.east);
\draw
[->,ultra thick,red,line width=2pt,opacity=0.7] ([xshift=-0.
5em]h0.west) -- ([xshift=0.7em]h0.east) -- ([xshift=-0.2em]h3.west) -- ([xshift=0.8em]h3.east) -- ([xshift=-0.2em]h5.west) -- ([xshift=0.8em]h5.east) -- ([xshift=-0.2em]h7.west) -- ([xshift=1.5
em]h7.east);
\node
[anchor=north west] (wtranslabel) at ([yshift=-3em]h0.south west)
{
\small
{
翻译路径:
}}
;
\node
[anchor=north west] (wtranslabel) at ([yshift=-3em]h0.south west)
{
\small
{
翻译路径:
}}
;
\draw
[->,ultra thick,red,line width=1.5pt,opacity=0.7] (wtranslabel.east) -- ([xshift=1.5em]wtranslabel.east);
\draw
[->,ultra thick,red,line width=1.5pt,opacity=0.7] (wtranslabel.east) -- ([xshift=1.5em]wtranslabel.east);
}
}
...
...
Book/Chapter4/chapter4.tex
查看文件 @
a96f10b4
...
@@ -719,7 +719,7 @@ dr = \textrm{start}_i-\textrm{end}_{i-1}-1
...
@@ -719,7 +719,7 @@ dr = \textrm{start}_i-\textrm{end}_{i-1}-1
%--4.2.7 栈解码---------------------
%--4.2.7 栈解码---------------------
\subsection
{
栈解码
}
\index
{
Chapter4.2.7
}
\subsection
{
栈解码
}
\index
{
Chapter4.2.7
}
\parinterval
对翻译模型
解码的目的是根据模型以及输入,找到模型得分最高的推导,即:
\parinterval
解码的目的是根据模型以及输入,找到模型得分最高的推导,即:
%公式--------------------------------------------------------------------
%公式--------------------------------------------------------------------
\begin{eqnarray}
\begin{eqnarray}
...
@@ -728,7 +728,7 @@ dr = \textrm{start}_i-\textrm{end}_{i-1}-1
...
@@ -728,7 +728,7 @@ dr = \textrm{start}_i-\textrm{end}_{i-1}-1
\end{eqnarray}
\end{eqnarray}
%公式--------------------------------------------------------------------
%公式--------------------------------------------------------------------
\parinterval
然而想要找到得分最高的翻译推导
,
并不是一件简单的事情。对于每一句源语言句子,可能的翻译结果是指数级的。而机器翻译解码也已经被证明是一个NP难问题
\cite
{
knight1999decoding
}
。简单的暴力搜索显然不现实。因此,在机器翻译中会使用特殊的解码策略来确保搜索的效率。本节将介绍基于栈的自左向右解码方法。它是基于短语的模型中的经典解码方法,非常适于处理语言生成的各种任务。
\parinterval
然而想要找到得分最高的翻译推导并不是一件简单的事情。对于每一句源语言句子,可能的翻译结果是指数级的。而机器翻译解码也已经被证明是一个NP难问题
\cite
{
knight1999decoding
}
。简单的暴力搜索显然不现实。因此,在机器翻译中会使用特殊的解码策略来确保搜索的效率。本节将介绍基于栈的自左向右解码方法。它是基于短语的模型中的经典解码方法,非常适于处理语言生成的各种任务。
\parinterval
首先,看一下翻译一个句子的基本流程。如图
\ref
{
fig:basic-process-of-translation
}
所示,首先需要得到译文句子的第一个单词。在基于短语的模型中,可以从源语言端找出生成句首译文的短语,之后把译文放到目标语言端,例如,源语言的``有''对应的译文是``There is''。这个过程可以重复执行,直到生成完整句子的译文。但是,有两点需要注意:
\parinterval
首先,看一下翻译一个句子的基本流程。如图
\ref
{
fig:basic-process-of-translation
}
所示,首先需要得到译文句子的第一个单词。在基于短语的模型中,可以从源语言端找出生成句首译文的短语,之后把译文放到目标语言端,例如,源语言的``有''对应的译文是``There is''。这个过程可以重复执行,直到生成完整句子的译文。但是,有两点需要注意:
...
@@ -737,7 +737,7 @@ dr = \textrm{start}_i-\textrm{end}_{i-1}-1
...
@@ -737,7 +737,7 @@ dr = \textrm{start}_i-\textrm{end}_{i-1}-1
\item
译文的生成需自左向右连续进行。
\item
译文的生成需自左向右连续进行。
\end{itemize}
\end{itemize}
\parinterval
前者对应了一种
{
\small\bfnew
{
覆盖度模型
}}
(Coverage Model)
,
后者定义了解码的方向,这样可以确保
$
n
$
-gram语言模型的计算是准确的。这样,就得到了一个简单的基于短语的机器翻译解码框架。每次从源语言句子中找到一个短语,作为译文最右侧的部分,重复执行直到整个译文被生成出来。
\parinterval
前者对应了一种
{
\small\bfnew
{
覆盖度模型
}}
(Coverage Model)
;
后者定义了解码的方向,这样可以确保
$
n
$
-gram语言模型的计算是准确的。这样,就得到了一个简单的基于短语的机器翻译解码框架。每次从源语言句子中找到一个短语,作为译文最右侧的部分,重复执行直到整个译文被生成出来。
%----------------------------------------------
%----------------------------------------------
% 图4.26
% 图4.26
...
@@ -752,14 +752,14 @@ dr = \textrm{start}_i-\textrm{end}_{i-1}-1
...
@@ -752,14 +752,14 @@ dr = \textrm{start}_i-\textrm{end}_{i-1}-1
%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%
\subsubsection
{
翻译候选匹配
}
\index
{
Chapter4.2.7.1
}
\subsubsection
{
翻译候选匹配
}
\index
{
Chapter4.2.7.1
}
\parinterval
在解码时,首先要知道每个源语言短语可能的译文都是什么。对于一个源语言短语,每个可能的译文也被称作
{
\small\bfnew
{
翻译候选
}}
(Translation Candidate)。实现翻译候选的匹配很简单。只需要遍历输入的源语言句子中所有可能的短语,之后在短语表中找到相应的翻译即可。比如,图
\ref
{
fig:translation-option
}
展示了句子``桌子
上 有 一个
苹果''的翻译候选匹配结果。可以看到,不同的短语会对应若干翻译候选。这些翻译候选会保存在所对应的跨度中。比如,``upon the table''是短语``桌子 上 有''的翻译候选,即对应源语言跨度[0,3]。
\parinterval
在解码时,首先要知道每个源语言短语可能的译文都是什么。对于一个源语言短语,每个可能的译文也被称作
{
\small\bfnew
{
翻译候选
}}
(Translation Candidate)。实现翻译候选的匹配很简单。只需要遍历输入的源语言句子中所有可能的短语,之后在短语表中找到相应的翻译即可。比如,图
\ref
{
fig:translation-option
}
展示了句子``桌子
\
上
\
有
\
一个
\
苹果''的翻译候选匹配结果。可以看到,不同的短语会对应若干翻译候选。这些翻译候选会保存在所对应的跨度中。比如,``upon the table''是短语``桌子 上 有''的翻译候选,即对应源语言跨度[0,3]。
%----------------------------------------------
%----------------------------------------------
% 图4.27
% 图4.27
\begin{figure}
[htp]
\begin{figure}
[htp]
\centering
\centering
\input
{
./Chapter4/Figures/translation-option
}
\input
{
./Chapter4/Figures/translation-option
}
\caption
{
翻译选项
}
\caption
{
一个句子匹配的短语翻译候选
}
\label
{
fig:translation-option
}
\label
{
fig:translation-option
}
\end{figure}
\end{figure}
%-------------------------------------------
%-------------------------------------------
...
@@ -782,21 +782,24 @@ dr = \textrm{start}_i-\textrm{end}_{i-1}-1
...
@@ -782,21 +782,24 @@ dr = \textrm{start}_i-\textrm{end}_{i-1}-1
%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%
\subsubsection
{
剪枝
}
\index
{
Chapter4.2.7.3
}
\subsubsection
{
剪枝
}
\index
{
Chapter4.2.7.3
}
\parinterval
假设扩展建立了解码算法的基本框架。但是,当句子变长时,这种方法还是面临着搜索空间爆炸的问题。对于这个问题,常用的解决办法是
{
\small\bfnew
{
剪枝
}}
(Pruning),也就是在搜索图中排除掉一些节点。比如,可以使用
{
\small\bfnew
{
束剪枝
}}
(Beam Pruning),确保每次翻译扩展时,最多生成
$
k
$
个新的翻译假设。这里
$
k
$
可以被看做是束的宽度。通过控制
$
k
$
的大小,可以在解码精度和速度之间进行平衡。这种基于束宽度进行剪枝的方法也被称作
{
\small\bfnew
{
直方图剪枝
}}
(Histogram Pruning)。另一种思路是,每次扩展时只保留与最优翻译假设得分相差在
$
\delta
$
之内的翻译假设。
$
\delta
$
可以被看作是一种与最优翻译假设之间距离的阈值,超过这个阈值就被剪枝。
因此
这种方法也被称作
{
\small\bfnew
{
阈值剪枝
}}
(Threshold Pruning)。
\parinterval
假设扩展建立了解码算法的基本框架。但是,当句子变长时,这种方法还是面临着搜索空间爆炸的问题。对于这个问题,常用的解决办法是
{
\small\bfnew
{
剪枝
}}
(Pruning),也就是在搜索图中排除掉一些节点。比如,可以使用
{
\small\bfnew
{
束剪枝
}}
(Beam Pruning),确保每次翻译扩展时,最多生成
$
k
$
个新的翻译假设。这里
$
k
$
可以被看做是束的宽度。通过控制
$
k
$
的大小,可以在解码精度和速度之间进行平衡。这种基于束宽度进行剪枝的方法也被称作
{
\small\bfnew
{
直方图剪枝
}}
(Histogram Pruning)。另一种思路是,每次扩展时只保留与最优翻译假设得分相差在
$
\delta
$
之内的翻译假设。
$
\delta
$
可以被看作是一种与最优翻译假设之间距离的阈值,超过这个阈值就被剪枝。这种方法也被称作
{
\small\bfnew
{
阈值剪枝
}}
(Threshold Pruning)。
\parinterval
不过,即使引入束剪枝,解码过程中仍然会有很多冗余的翻译假设。有两种方法可以进一步加速解码:
\parinterval
不过,即使引入束剪枝,解码过程中仍然会有很多冗余的翻译假设。有两种方法可以进一步加速解码:
\begin{itemize}
\begin{itemize}
\vspace
{
0.5em
}
\item
对相同译文的翻译假设进行重新组合;
\item
对相同译文的翻译假设进行重新组合;
\vspace
{
0.5em
}
\item
对低质量的翻译假设进行裁剪。
\item
对低质量的翻译假设进行裁剪。
\vspace
{
0.5em
}
\end{itemize}
\end{itemize}
\parinterval
对翻译假设进行重新组合又被称作
{
\small\bfnew
{
假设重组
}}
(Hypothesis Recombination)。其核心思想是,把代表同一个译文的不同翻译假设融合为一个翻译假设。如图29所示,对于给定的输入短语``一个
苹果'',系统可能将两个单词``一个''、``苹果''分别翻译成``an''和``apple'',也可能将这两个单词作为一个短语直接翻译成``an apple''。虽然这两个翻译假设得到的译文相同,并且覆盖了相同的源语言短语,但是却是两个不同的翻译假设,模型给它们的打分也是不一样的。这是
,可以舍弃两个翻译假设中分数较低的那个,因为分数较低的翻译假设永远不可能成为最优路径的一部分。这也就相当于把两个翻译假设重组为一个假设。
\parinterval
对翻译假设进行重新组合又被称作
{
\small\bfnew
{
假设重组
}}
(Hypothesis Recombination)。其核心思想是,把代表同一个译文的不同翻译假设融合为一个翻译假设。如图29所示,对于给定的输入短语``一个
\ \
苹果'',系统可能将两个单词``一个''、``苹果''分别翻译成``an''和``apple'',也可能将这两个单词作为一个短语直接翻译成``an apple''。虽然这两个翻译假设得到的译文相同,并且覆盖了相同的源语言短语,但是却是两个不同的翻译假设,模型给它们的打分也是不一样的。这时
,可以舍弃两个翻译假设中分数较低的那个,因为分数较低的翻译假设永远不可能成为最优路径的一部分。这也就相当于把两个翻译假设重组为一个假设。
\parinterval
即使翻译假设对应的译文不同也可以进行假设重组。图
\ref
{
fig:example-of-hypothesis-recombination
}
下半部分的给出了一个这样的实例。在两个翻译假设中,第一个单词分别被翻译成了``it''和``he'',紧接着它们后面的部分都被翻译成了``is not''。这两个翻译假设是非常相似的,因为它们译文的最后两个单词是相同的,而且翻译假设都覆盖了相同的源语言部分。这时,也可以对这两个翻译假设进行假设重组:如果得分较低的翻译假设和得分较高的翻译假设都使用相同的翻译候选进行扩展,且两个翻译假设都覆盖相同的源语言单词,分数低的翻译假设可以被剪枝掉。
不过
,还有两点需要注意:
\parinterval
即使翻译假设对应的译文不同也可以进行假设重组。图
\ref
{
fig:example-of-hypothesis-recombination
}
下半部分的给出了一个这样的实例。在两个翻译假设中,第一个单词分别被翻译成了``it''和``he'',紧接着它们后面的部分都被翻译成了``is not''。这两个翻译假设是非常相似的,因为它们译文的最后两个单词是相同的,而且翻译假设都覆盖了相同的源语言部分。这时,也可以对这两个翻译假设进行假设重组:如果得分较低的翻译假设和得分较高的翻译假设都使用相同的翻译候选进行扩展,且两个翻译假设都覆盖相同的源语言单词,分数低的翻译假设可以被剪枝掉。
此外
,还有两点需要注意:
\begin{itemize}
\begin{itemize}
\item
$
n
$
元语言模型将前
$
n
-
1
$
单词作为历史信息,所以当两个假设最后
$
n
-
1
$
个单词不
同时,不能进行假设重组,因为后续的扩展可能会得到不同的语言模型得分,并影响最终的模型得分;
\item
$
n
$
-gram语言模型将前
$
n
-
1
$
单词作为历史信息,所以当两个假设最后
$
n
-
1
$
个单词不相
同时,不能进行假设重组,因为后续的扩展可能会得到不同的语言模型得分,并影响最终的模型得分;
\item
调序模型通常是用来判断当前输入的短语与前一个输入短语之间的调序代价。因此当两个翻译假设对应短语在源语言中的顺序不同时,也不能被重新组合。
\item
调序模型通常是用来判断当前输入的短语与前一个输入短语之间的调序代价。因此当两个翻译假设对应短语在源语言中的顺序不同时,也不能被重新组合。
\end{itemize}
\end{itemize}
...
@@ -817,7 +820,7 @@ dr = \textrm{start}_i-\textrm{end}_{i-1}-1
...
@@ -817,7 +820,7 @@ dr = \textrm{start}_i-\textrm{end}_{i-1}-1
%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%
\subsubsection
{
解码中的栈结构
}
\index
{
Chapter4.2.7.4
}
\subsubsection
{
解码中的栈结构
}
\index
{
Chapter4.2.7.4
}
\parinterval
当质量较差的翻译假设在扩展早期出现时,这些翻译假设需要被剪枝掉,这样可以忽略所有从它扩展出来的翻译假设,进而有效地减小搜索空间。但是这样做也存在着一定的问题,首先,删除的翻译假设可能会在后续的扩展过程中被重新搜索出来。其次,过早的删除某些翻译假设可能会导致无法搜索到最优的翻译假设。所以最好的情况是尽早删除质量差的翻译假设,同时又不会对整个搜索结果产生过大影响。但是这个``质量''
,
从哪个方面来衡量,也是一个需要思考的问题。理想的情况就是从早期的翻译假设中,挑选一些可比的翻译假设进行筛选。
\parinterval
当质量较差的翻译假设在扩展早期出现时,这些翻译假设需要被剪枝掉,这样可以忽略所有从它扩展出来的翻译假设,进而有效地减小搜索空间。但是这样做也存在着一定的问题,首先,删除的翻译假设可能会在后续的扩展过程中被重新搜索出来。其次,过早的删除某些翻译假设可能会导致无法搜索到最优的翻译假设。所以最好的情况是尽早删除质量差的翻译假设,同时又不会对整个搜索结果产生过大影响。但是这个``质量''从哪个方面来衡量,也是一个需要思考的问题。理想的情况就是从早期的翻译假设中,挑选一些可比的翻译假设进行筛选。
\parinterval
目前比较通用的做法是将翻译假设进行整理,放进一种栈结构中。这里所说的``栈''是为了描述方便的一种说法。它实际上就是保存多个翻译假设的一种数据结构
\footnote
[4]
{
虽然被称作栈,实际上使用一个堆进行实现。这样可以根据模型得分对翻译假设进行排序。
}
。当放入栈的翻译假设超过一定阈值时(比如200),可以删除掉模型得分低的翻译假设。一般,会使用多个栈来保存翻译假设,每个栈代表覆盖源语言单词数量相同的翻译假设。比如,第一个堆栈包含了覆盖一个源语言单词的翻译假设,第二个堆栈包含了覆盖两个源语言单词的翻译假设,以此类推。利用覆盖源语言单词数进行栈的划分的原因在于:翻译相同数量的单词所对应的翻译假设一般是``可比的'',因此在同一个栈里对它们进行剪枝带来的风险较小。
\parinterval
目前比较通用的做法是将翻译假设进行整理,放进一种栈结构中。这里所说的``栈''是为了描述方便的一种说法。它实际上就是保存多个翻译假设的一种数据结构
\footnote
[4]
{
虽然被称作栈,实际上使用一个堆进行实现。这样可以根据模型得分对翻译假设进行排序。
}
。当放入栈的翻译假设超过一定阈值时(比如200),可以删除掉模型得分低的翻译假设。一般,会使用多个栈来保存翻译假设,每个栈代表覆盖源语言单词数量相同的翻译假设。比如,第一个堆栈包含了覆盖一个源语言单词的翻译假设,第二个堆栈包含了覆盖两个源语言单词的翻译假设,以此类推。利用覆盖源语言单词数进行栈的划分的原因在于:翻译相同数量的单词所对应的翻译假设一般是``可比的'',因此在同一个栈里对它们进行剪枝带来的风险较小。
...
...
Book/mt-book-xelatex.idx
查看文件 @
a96f10b4
...
@@ -21,35 +21,35 @@
...
@@ -21,35 +21,35 @@
\indexentry{Chapter4.2.7.1|hyperpage}{30}
\indexentry{Chapter4.2.7.1|hyperpage}{30}
\indexentry{Chapter4.2.7.2|hyperpage}{30}
\indexentry{Chapter4.2.7.2|hyperpage}{30}
\indexentry{Chapter4.2.7.3|hyperpage}{31}
\indexentry{Chapter4.2.7.3|hyperpage}{31}
\indexentry{Chapter4.2.7.4|hyperpage}{3
2
}
\indexentry{Chapter4.2.7.4|hyperpage}{3
3
}
\indexentry{Chapter4.3|hyperpage}{3
3
}
\indexentry{Chapter4.3|hyperpage}{3
4
}
\indexentry{Chapter4.3.1|hyperpage}{36}
\indexentry{Chapter4.3.1|hyperpage}{36}
\indexentry{Chapter4.3.1.1|hyperpage}{3
6
}
\indexentry{Chapter4.3.1.1|hyperpage}{3
7
}
\indexentry{Chapter4.3.1.2|hyperpage}{3
7
}
\indexentry{Chapter4.3.1.2|hyperpage}{3
8
}
\indexentry{Chapter4.3.1.3|hyperpage}{3
8
}
\indexentry{Chapter4.3.1.3|hyperpage}{3
9
}
\indexentry{Chapter4.3.1.4|hyperpage}{
39
}
\indexentry{Chapter4.3.1.4|hyperpage}{
40
}
\indexentry{Chapter4.3.2|hyperpage}{
39
}
\indexentry{Chapter4.3.2|hyperpage}{
40
}
\indexentry{Chapter4.3.3|hyperpage}{41}
\indexentry{Chapter4.3.3|hyperpage}{41}
\indexentry{Chapter4.3.4|hyperpage}{42}
\indexentry{Chapter4.3.4|hyperpage}{42}
\indexentry{Chapter4.3.5|hyperpage}{4
5
}
\indexentry{Chapter4.3.5|hyperpage}{4
6
}
\indexentry{Chapter4.4|hyperpage}{4
8
}
\indexentry{Chapter4.4|hyperpage}{4
9
}
\indexentry{Chapter4.4.1|hyperpage}{
49
}
\indexentry{Chapter4.4.1|hyperpage}{
51
}
\indexentry{Chapter4.4.2|hyperpage}{5
2
}
\indexentry{Chapter4.4.2|hyperpage}{5
1
}
\indexentry{Chapter4.4.2.1|hyperpage}{53}
\indexentry{Chapter4.4.2.1|hyperpage}{53}
\indexentry{Chapter4.4.2.2|hyperpage}{5
4
}
\indexentry{Chapter4.4.2.2|hyperpage}{5
5
}
\indexentry{Chapter4.4.2.3|hyperpage}{5
6
}
\indexentry{Chapter4.4.2.3|hyperpage}{5
7
}
\indexentry{Chapter4.4.3|hyperpage}{5
7
}
\indexentry{Chapter4.4.3|hyperpage}{5
8
}
\indexentry{Chapter4.4.3.1|hyperpage}{58}
\indexentry{Chapter4.4.3.1|hyperpage}{58}
\indexentry{Chapter4.4.3.2|hyperpage}{6
2
}
\indexentry{Chapter4.4.3.2|hyperpage}{6
1
}
\indexentry{Chapter4.4.3.3|hyperpage}{62}
\indexentry{Chapter4.4.3.3|hyperpage}{62}
\indexentry{Chapter4.4.3.4|hyperpage}{63}
\indexentry{Chapter4.4.3.4|hyperpage}{63}
\indexentry{Chapter4.4.3.5|hyperpage}{64}
\indexentry{Chapter4.4.3.5|hyperpage}{64}
\indexentry{Chapter4.4.4|hyperpage}{6
5
}
\indexentry{Chapter4.4.4|hyperpage}{6
6
}
\indexentry{Chapter4.4.4.1|hyperpage}{66}
\indexentry{Chapter4.4.4.1|hyperpage}{66}
\indexentry{Chapter4.4.4.2|hyperpage}{67}
\indexentry{Chapter4.4.4.2|hyperpage}{67}
\indexentry{Chapter4.4.5|hyperpage}{68}
\indexentry{Chapter4.4.5|hyperpage}{69}
\indexentry{Chapter4.4.5|hyperpage}{69}
\indexentry{Chapter4.4.5|hyperpage}{70}
\indexentry{Chapter4.4.7|hyperpage}{73}
\indexentry{Chapter4.4.7|hyperpage}{72}
\indexentry{Chapter4.4.7.1|hyperpage}{73}
\indexentry{Chapter4.4.7.1|hyperpage}{73}
\indexentry{Chapter4.4.7.2|hyperpage}{7
5
}
\indexentry{Chapter4.4.7.2|hyperpage}{7
4
}
\indexentry{Chapter4.5|hyperpage}{76}
\indexentry{Chapter4.5|hyperpage}{76}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论