Commit c067ad78 by 曹润柘

合并分支 'master' 到 'caorunzhe'

Master

查看合并请求 !127
parents ec3d9848 3499e2fb
......@@ -118,7 +118,7 @@
%----------------------------------------------
\begin{figure}[htp]
\centering
\includegraphics[scale=0.4]{./Chapter1/Figures/figure-eniac.jpg}
\includegraphics[scale=0.4]{./Chapter1/Figures/figure-eniac.jpeg}
\caption{世界上第一台通用电子数字计算机“埃尼阿克”(ENIAC)}
\label{fig:1-4}
\end{figure}
......
......@@ -8,9 +8,9 @@
\node[anchor=west,hide](yn-1)at([xshift=2em]dots.east){$y_{n-1}$};
\node[anchor=west,hide](yn)at([xshift=2em]yn-1.east){$y_n$};
\node[anchor=north,draw,line width=1pt,inner sep=2pt,fill=red!30,minimum height=2em,minimum width=12em](see)at ([yshift=-3em,xshift=2em]y3.south){$X=x_1,x_2,\ldots,x_{n-1},x_n$};
\node[anchor=south,font=\footnotesize] at ([yshift=1em,xshift=2em]y3.north){(待预测的隐藏状态序列)};
\node[anchor=north,font=\footnotesize] at ([yshift=-1em]see.south){(可见状态序列)};
\node[anchor=north,draw,line width=1pt,inner sep=2pt,fill=red!30,minimum height=2em,minimum width=12em](see)at ([yshift=-3em,xshift=2em]y3.south){$\mathbf{X}=(x_1,x_2,\ldots,x_{n-1},x_n)$};
\node[anchor=south,font=\footnotesize] at ([yshift=1em,xshift=2em]y3.north){待预测的隐藏状态序列};
\node[anchor=north,font=\footnotesize] at ([yshift=-1em]see.south){可见状态序列};
\draw[line width=1pt] (y1.east) -- (y2.west);
\draw[line width=1pt] (y2.east) -- (y3.west);
......
......@@ -44,15 +44,15 @@
}
{
\node [anchor=west,thick,draw,minimum width=3.4em,minimum height=1.5em] (w1) at (c3.west){};
\draw [->,thick] (entry3.30) ..controls +(70:1) and +(south:1.5).. ([xshift=0.3em]w1.south) node [pos=0.5, above] {\footnotesize{命中}};
\node [anchor=west,thick,draw,minimum width=3.4em,minimum height=1.5em,ugreen] (w1) at (c3.west){};
\draw [->,thick,ugreen] (entry3.30) ..controls +(70:1) and +(south:1.5).. ([xshift=0.3em]w1.south) node [pos=0.5, above] {\footnotesize{命中}};
}
{
\node [anchor=west,very thick,draw,dotted,minimum width=3.4em,minimum height=1.9em,red] (w3) at (c2.west){};
\draw [->,very thick,dotted,red] ([yshift=-0.2em]entry6.30) ..controls +(60:2) and +(south:3).. ([xshift=-0.6em]w3.south) node [pos=0.5, below] {\color{red}{\footnotesize{命中}}};
\node [anchor=west,very thick,draw,dotted,minimum width=3.4em,minimum height=1.9em,ublue] (w3) at (c2.west){};
\draw [->,very thick,dotted,ublue] ([yshift=-0.2em]entry6.30) ..controls +(60:2) and +(south:3).. ([xshift=-0.6em]w3.south) node [pos=0.5, below] {\color{ublue}{\footnotesize{命中}}};
}
......
......@@ -2,15 +2,19 @@
\tikzstyle{unit} = [draw,circle,line width=0.8pt,align=center,fill=green!30,minimum size=1em]
\node[minimum width=3em,minimum height=1.8em] (o) at (0,0){};
\node[anchor=north,inner sep=1pt,font=\footnotesize] (state_A) at ([xshift=-1em,yshift=-1em]o.south){state A};
\node[anchor=north,inner sep=1pt,font=\footnotesize] (state_B) at ([yshift=-2em]state_A.south){state B};
\node[anchor=north,inner sep=1pt,font=\footnotesize] (state_C) at ([yshift=-2em]state_B.south){state C};
\node[anchor=north,inner sep=1pt,font=\footnotesize] (state_D) at ([yshift=-2em]state_C.south){state D};
\node[anchor=north,inner sep=1pt,font=\footnotesize] (state_A) at ([xshift=-0em,yshift=-1em]o.south){隐藏状态A};
\node[anchor=north,inner sep=1pt,font=\footnotesize] (state_B) at ([yshift=-1.6em]state_A.south){隐藏状态B};
\node[anchor=north,inner sep=1pt,font=\footnotesize] (state_C) at ([yshift=-1.6em]state_B.south){隐藏状态C};
\node[anchor=north,inner sep=1pt,font=\footnotesize] (state_D) at ([yshift=-1.6em]state_C.south){隐藏状态D};
\node[anchor=west,inner sep=1pt,font=\footnotesize] (c1) at ([yshift=0.2em,xshift=2em]o.east){T};
\node[anchor=west,inner sep=1pt,font=\footnotesize] (c2) at ([xshift=5em]c1.east){F};
\node[anchor=west,inner sep=1pt,font=\footnotesize] (c3) at ([xshift=5em]c2.east){F};
\node[anchor=west,inner sep=1pt,font=\footnotesize] (c4) at ([xshift=5em]c3.east){T};
\node[anchor=south,font=\scriptsize] (cl1) at (c1.north) {时刻1};
\node[anchor=south,font=\scriptsize] (cl2) at (c2.north) {时刻2};
\node[anchor=south,font=\scriptsize] (cl3) at (c3.north) {时刻3};
\node[anchor=south,font=\scriptsize] (cl4) at (c4.north) {时刻4};
\node[anchor=north,unit,fill=red!30] (u11) at ([yshift=-1.6em]c1.south){};
\node[anchor=north,unit] (u21) at ([yshift=-1.6em]u11.south){};
......@@ -32,23 +36,22 @@
\node[anchor=north,unit] (u34) at ([yshift=-1.6em]u24.south){};
\node[anchor=north,unit] (u44) at ([yshift=-1.6em]u34.south){};
\draw[line width=1pt] (o.north west)--(o.south east);
\node[anchor=south west,align=center,font=\tiny] at ([yshift=-1.4em,xshift=-1.2em]o.45){$i+1$位置\\隐藏状态};
\node[anchor=north east,align=center,font=\tiny] at ([yshift=1.2em,xshift=1.2em]o.-135){$i$位置\\可见状态};
\node[anchor=south west,align=center,font=\footnotesize] (label) at ([yshift=-1.4em,xshift=-4em]o.45){可见状态序列};
\draw[->] ([xshift=-0.2em]label.east) -- ([xshift=0.7em]label.east);
\draw[->,line width=1pt] (u11.east) -- node[above,red!50,font=\footnotesize]{0.65}(u12.west);
\draw[->,line width=1pt] (u12.east) -- node[above,red!50,font=\footnotesize]{0.55}(u13.west);
\draw[->,line width=1pt] (u12.east) -- node[right,pos=0.6,font=\footnotesize]{0.45}(u23.west);
\draw[->,line width=1pt] (u12.east) -- node[right,pos=0.6,font=\footnotesize,xshift=0.2em]{0.45}(u23.west);
\draw[->,line width=1pt] (u13.east) -- node[above,red!50,font=\footnotesize]{0.5}(u14.west);
\draw[->,line width=1pt] (u13.east) -- node[right,pos=0.6,font=\footnotesize]{0.5}(u24.west);
\draw[->,line width=1pt] (u11.east) -- node[right,font=\footnotesize]{0.35}(u22.west);
\draw[->,line width=1pt] (u22.east) -- node[left,pos=0.4,font=\footnotesize]{0.3}(u13.west);
\draw[->,line width=1pt] (u22.east) -- node[font=\footnotesize]{0.2}(u23.west);
\draw[->,line width=1pt] (u22.east) -- node[font=\footnotesize]{0.2}(u33.west);
\draw[->,line width=1pt] (u22.east) -- node[below,font=\footnotesize]{0.3}(u43.west);
\draw[->,line width=1pt] (u23.east) -- node[left,pos=0.4,font=\footnotesize]{0.35}(u14.west);
\draw[->,line width=1pt] (u23.east) -- node[font=\footnotesize]{0.15}(u24.west);
\draw[->,line width=1pt] (u23.east) -- node[font=\footnotesize]{0.15}(u34.west);
\draw[->,line width=1pt] (u23.east) -- node[below,font=\footnotesize]{0.35}(u44.west);
\draw[->,line width=1pt] (u13.east) -- node[right,pos=0.6,font=\footnotesize,xshift=0.2em]{0.5}(u24.west);
\draw[->,line width=1pt] (u11.east) -- node[right,font=\footnotesize,xshift=0.4em,yshift=-0.1em]{0.35}(u22.west);
\draw[->,line width=1pt] (u22.east) -- node[left,pos=0.4,font=\footnotesize,yshift=0.1em,xshift=-0.3em]{0.3}(u13.west);
\draw[->,line width=1pt] (u22.east) -- node[below,font=\footnotesize,yshift=0.2em]{0.2}(u23.west);
\draw[->,line width=1pt] (u22.east) -- node[below,font=\footnotesize,yshift=0.1em]{0.2}(u33.west);
\draw[->,line width=1pt] (u22.east) -- node[below,font=\footnotesize,yshift=-0.1em]{0.3}(u43.west);
\draw[->,line width=1pt] (u23.east) -- node[left,pos=0.4,font=\footnotesize,xshift=-0.2em]{0.35}(u14.west);
\draw[->,line width=1pt] (u23.east) -- node[below,font=\footnotesize,yshift=0.2em]{0.15}(u24.west);
\draw[->,line width=1pt] (u23.east) -- node[below,font=\footnotesize,xshift=0.4em,yshift=-0.2em,pos=0.6]{0.15}(u34.west);
\draw[->,line width=1pt] (u23.east) -- node[below,font=\footnotesize,yshift=-0.3em]{0.35}(u44.west);
\end{tikzpicture}
\ No newline at end of file
......@@ -102,8 +102,8 @@
}
{
\node [anchor=west,thick,draw,red,minimum width=1.6em,minimum height=1.3em] (w18) at ([xshift=0.1em]c8.west){};
\node [anchor=north] (l18) at ([yshift=0.2em]w18.south) {{\color{red} \footnotesize{命中:2}}};
\node [anchor=west,thick,draw,ublue,minimum width=1.6em,minimum height=1.3em] (w18) at ([xshift=0.1em]c8.west){};
\node [anchor=north] (l18) at ([yshift=-0.2em]w18.south) {{\color{ublue} \footnotesize{命中:第2号单词}}};
}
\end{tikzpicture}
......
......@@ -28,7 +28,7 @@
\draw [->,very thick,ublue] ([xshift=0.2em]corpus.east) -- ([xshift=4.2em]corpus.east) node [pos=0.5, above] {\color{red}{\scriptsize{统计学习}}};
\draw [->,very thick,ublue] ([xshift=0.2em]model.east) -- ([xshift=4.2em]model.east) node [pos=0.5, above] {\color{red}{\scriptsize{搜索\&计算}}};
\draw [->,very thick,ublue] ([xshift=0.2em]model.east) -- ([xshift=4.2em]model.east) node [pos=0.5, above] {\color{red}{\scriptsize{预测}}};
{\scriptsize
\node [anchor=north west] (sentlabel) at ([xshift=6.2em,yshift=-1em]model.north east) {\color{red}{自动分词系统}};
......@@ -53,7 +53,7 @@
\end{pgfonlayer}
{
\draw [-,thick,red,dotted] ([yshift=0.3em]modellabel.north) ..controls +(north:0.5) and +(south:0.5).. ([xshift=-3em]label1content.south);
\draw [-,thick,dotted] ([yshift=0.3em]modellabel.north) ..controls +(north:0.5) and +(south:0.5).. ([xshift=-3em]label1content.south);
}
}
......@@ -122,7 +122,7 @@
\end{pgfonlayer}
{
\draw [-,thick,red,dotted] (segcontent.north) ..controls +(north:0.7) and +(south:0.7).. (segsystem.south);
\draw [-,thick,dotted] (segcontent.north) ..controls +(north:0.7) and +(south:0.7).. (segsystem.south);
}
\end{tikzpicture}
......
......@@ -18,12 +18,12 @@
\node[anchor=west,inner sep=0pt,font=\footnotesize] at ([xshift=0.5em]n17.east){\Large{/}};
\node[unit,anchor=west] (n18) at ([xshift=1.2em]n17.east){首都};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n11.south){B-GPE};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n11.south){B-CIT};
\node[lab,anchor=north] at ([yshift=-0.8em,xshift=0.2em]n12.south){O};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n13.south){B-GPE};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n14.south){I-GPE};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n15.south){I-GPE};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n16.south){I-GPE};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n13.south){B-CNT};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n14.south){I-CNT};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n15.south){I-CNT};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n16.south){I-CNT};
\node[lab,anchor=north] at ([yshift=-0.8em,xshift=0.2em]n17.south){O};
\node[lab,anchor=north] at ([yshift=-0.8em,xshift=0.2em]n18.south){O};
\end{tikzpicture}
\ No newline at end of file
......@@ -18,12 +18,12 @@
\node[anchor=west,inner sep=0pt,font=\footnotesize] at ([xshift=0.5em]n17.east){\Large{/}};
\node[unit,anchor=west] (n18) at ([xshift=1.2em]n17.east){首都};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n11.south){S-GPE};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n11.south){S-CIT};
\node[lab,anchor=north] at ([yshift=-0.8em,xshift=0.2em]n12.south){O};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n13.south){B-GPE};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n14.south){I-GPE};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n15.south){I-GPE};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n16.south){E-GPE};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n13.south){B-CNT};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n14.south){I-CNT};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n15.south){I-CNT};
\node[lab,anchor=north] at ([yshift=-1.4em,xshift=0.2em]n16.south){E-CNT};
\node[lab,anchor=north] at ([yshift=-0.8em,xshift=0.2em]n17.south){O};
\node[lab,anchor=north] at ([yshift=-0.8em,xshift=0.2em]n18.south){O};
\end{tikzpicture}
\ No newline at end of file
......@@ -8,12 +8,12 @@
\begin{tikzpicture}
\begin{scope}
\node [] (input) at (0,0) {{\scriptsize 猫喜欢吃鱼}};
\node [] (input) at (-0.6em,0) {{\scriptsize 猫喜欢吃鱼}};
\node [] (output) at ([xshift=3.35in]input.east) {{\scriptsize Cats like eating fish}};
\draw[->,thick] ([xshift=-1pt]input.east) -- ([xshift=8pt]input.east);
\draw[->,thick] ([xshift=-10pt]output.west) -- ([xshift=-0pt]output.west);
\draw[->,thick] ([xshift=-6pt]output.west) -- ([xshift=2pt]output.west);
%{
%\draw[->,thick] ([xshift=-12pt]mtengine.west) -- ([xshift=-2pt]mtengine.west);
......@@ -29,13 +29,13 @@
\node [anchor=south] (outputlabel) at ([yshift=-0.5em]output.north) {{\scriptsize \color{red}{\textbf{输出}}}};
{
\node [anchor=west] (mtinputlabel) at ([xshift=0.32in]inputlabel.east) {{\scriptsize \color{red}{\textbf{}}}};
\node [anchor=west] (mtinputlabel) at ([xshift=0.35in]inputlabel.east) {{\scriptsize \color{red}{\textbf{}}}};
\node [anchor=west] (mtoutputlabel) at ([xshift=0.88in]mtinputlabel.east) {{\scriptsize \color{red}{\textbf{}}}};
\node[rectangle,draw=ublue, inner sep=0mm] [fit = (mtinputlabel) (mtoutputlabel) (inputmarking) (outputmarking)] {};
}
{
\node[rectangle,fill=ublue,inner sep=0mm] [fit = (mtinputlabel) (mtoutputlabel) (inputmarking) (outputmarking)] {{\color{white} \textbf{\Large{MT 系统}}}};
\node[rectangle,fill=ublue,inner sep=2pt] [fit = (mtinputlabel) (mtoutputlabel) (inputmarking) (outputmarking)] {{\color{white} \textbf{\Large{MT 系统}}}};
}
......
......@@ -8,7 +8,7 @@
\begin{tikzpicture}
\begin{scope}
\node [] (input) at (0,0) {{\scriptsize 猫喜欢吃鱼}};
\node [] (input) at (-0.6em,0) {{\scriptsize 猫喜欢吃鱼}};
{
\begin{scope}[scale=0.8,xshift=0.9in,yshift=-0.87in,level distance=20pt,sibling distance=-1pt,grow'=up]
......@@ -46,7 +46,7 @@
\node [] (output) at ([xshift=3.35in]input.east) {{\scriptsize Cats like eating fish}};
\draw[->,thick] ([xshift=-1pt]input.east) -- ([xshift=8pt]input.east);
\draw[->,thick] ([xshift=-10pt]output.west) -- ([xshift=-0pt]output.west);
\draw[->,thick] ([xshift=-6pt]output.west) -- ([xshift=2pt]output.west);
{
\draw[->,thick] ([xshift=-12pt]mtengine.west) -- ([xshift=-2pt]mtengine.west);
......@@ -62,9 +62,9 @@
\node [anchor=south] (outputlabel) at ([yshift=-0.5em]output.north) {{\scriptsize \color{red}{\textbf{输出}}}};
{
\node [anchor=west] (mtinputlabel) at ([xshift=0.29in]inputlabel.east) {{\scriptsize \color{red}{\textbf{实际的输入}}}};
\node [anchor=west] (mtinputlabel) at ([xshift=0.35in]inputlabel.east) {{\scriptsize \color{red}{\textbf{实际的输入}}}};
\node [anchor=west] (mtoutputlabel) at ([xshift=1.0in]mtinputlabel.east) {{\scriptsize \color{red}{\textbf{实际的输出}}}};
\node[rectangle,draw=ublue, inner sep=0mm] [fit = (mtinputlabel) (mtoutputlabel) (inputmarking) (outputmarking)] {};
\node[rectangle,draw=ublue, inner sep=2pt] [fit = (mtinputlabel) (mtoutputlabel) (inputmarking) (outputmarking)] {};
}
\end{scope}
......
......@@ -3,12 +3,12 @@
\tikzstyle{word} = [draw,inner sep=2pt,line width=1pt,align=center,drop shadow,fill=red!30,font=\footnotesize,minimum height=1.4em,minimum width=1.6em]
\coordinate (o) at (0,0);
\node[anchor=west,class] (c1) at ([xshift=0em]o.east){B-GPE};
\node[anchor=west,class] (c1) at ([xshift=0em]o.east){B-CIT};
\node[anchor=west,class] (c2) at ([xshift=4em]o.east){O};
\node[anchor=west,class] (c3) at ([xshift=8em]o.east){B-GPE};
\node[anchor=west,class] (c4) at ([xshift=12em]o.east){I-GPE};
\node[anchor=west,class] (c5) at ([xshift=16em]o.east){I-GPE};
\node[anchor=west,class] (c6) at ([xshift=20em]o.east){I-GPE};
\node[anchor=west,class] (c3) at ([xshift=8em]o.east){B-CNT};
\node[anchor=west,class] (c4) at ([xshift=12em]o.east){I-CNT};
\node[anchor=west,class] (c5) at ([xshift=16em]o.east){I-CNT};
\node[anchor=west,class] (c6) at ([xshift=20em]o.east){I-CNT};
\node[anchor=west,class] (c7) at ([xshift=24em]o.east){O};
\node[anchor=west,class] (c8) at ([xshift=28em]o.east){O};
......
\begin{tikzpicture}
\tikzstyle{unit} = [draw,minimum size=1em,circle]
\node[unit,fill=green!20] (g1) at (0,0){};
\node[anchor=west,unit,fill=green!20] (g2)at([xshift=1.8em]g1.east){};
\node[anchor=west,unit,fill=green!20] (g3)at([xshift=1.8em]g2.east){};
\node[anchor=west,unit,fill=green!20] (g4)at([xshift=1.8em]g3.east){};
\node[unit,fill=ugreen!20] (g1) at (0,0){};
\node[anchor=west,unit,fill=ugreen!20] (g2)at([xshift=1.8em]g1.east){};
\node[anchor=west,unit,fill=ugreen!20] (g3)at([xshift=1.8em]g2.east){};
\node[anchor=west,unit,fill=ugreen!20] (g4)at([xshift=1.8em]g3.east){};
\node[anchor=north,unit,fill=red!30] (r1)at([yshift=-4em]g1.south){};
\node[anchor=north,unit,fill=red!30] (r2)at([yshift=-4em]g2.south){};
......@@ -12,15 +12,15 @@
\node[anchor=north,unit,fill=red!30] (r4)at([yshift=-4em]g4.south){};
\begin{pgfonlayer}{background}
\node [draw=green!20,rectangle,inner sep=2pt,rounded corners=4pt,dashed,line width=1.5pt] [fit = (g1)(g2)(g3)(g4)] (box1) {};
\node [draw=red!30,rectangle,inner sep=2pt,rounded corners=4pt,dashed,line width=1.5pt] [fit = (r1)(r2)(r3)(r4)] (box2) {};
\node [draw=ugreen!70,rectangle,inner sep=2pt,rounded corners=4pt,dashed,line width=1.0pt] [fit = (g1)(g2)(g3)(g4)] (box1) {};
\node [draw=red!70,rectangle,inner sep=2pt,rounded corners=4pt,dashed,line width=1.0pt] [fit = (r1)(r2)(r3)(r4)] (box2) {};
\end{pgfonlayer}
\node[anchor=north,draw,inner sep=2pt,rounded corners=2pt,fill=blue!30,minimum width=6em](cla) at ([yshift=-1em]box1.south){分类器};
\node[anchor=south,font=\scriptsize] at ([yshift=0.4em,xshift=1.4em]g2.north){(待预测标签)};
\node[anchor=north,font=\scriptsize] at ([yshift=-0.4em,xshift=1.4em]r2.south){(待标注标签)};
\node[anchor=south,font=\scriptsize] at ([yshift=0.4em,xshift=1.4em]g2.north){待预测标签序列};
\node[anchor=north,font=\scriptsize] at ([yshift=-0.4em,xshift=1.4em]r2.south){观测序列};
\draw[->,thick] (cla.north) -- (box1.south);
\draw[->,thick] (box2.north) -- (cla.south);
......
\begin{tikzpicture}
\tikzstyle{unit} = [draw,minimum size=1em,circle]
\node[unit,fill=green!20] (g1) at (0,0){};
\node[anchor=west,unit,fill=green!20] (g2)at([xshift=1.8em]g1.east){};
\node[anchor=west,unit,fill=green!20] (g3)at([xshift=1.8em]g2.east){};
\node[anchor=west,unit,fill=green!20] (g4)at([xshift=1.8em]g3.east){};
\node[unit,fill=ugreen!20] (g1) at (0,0){};
\node[anchor=west,unit,fill=ugreen!20] (g2)at([xshift=1.8em]g1.east){};
\node[anchor=west,unit,fill=ugreen!20] (g3)at([xshift=1.8em]g2.east){};
\node[anchor=west,unit,fill=ugreen!20] (g4)at([xshift=1.8em]g3.east){};
\node[anchor=north,unit,fill=red!30] (r1)at([yshift=-1.8em,xshift=1.4em]g2.south){};
\node[anchor=south,font=\scriptsize] at ([yshift=0.4em,xshift=1.4em]g2.north){(待预测标签)};
\node[anchor=north,font=\scriptsize] at ([yshift=-0.4em]r1.south){(待标注标签)};
\node[anchor=south,font=\scriptsize] at ([yshift=0.4em,xshift=1.4em]g2.north){待预测标签序列};
\node[anchor=north,font=\scriptsize] at ([yshift=-0.4em]r1.south){观测序列};
\draw[-,thick] (g1.east) -- (g2.west);
\draw[-,thick] (g2.east) -- (g3.west);
......
\begin{tikzpicture}
\tikzstyle{unit} = [draw,minimum size=1em,circle]
\node[unit,fill=green!2] (g1) at (0,0){};
\node[anchor=west,unit,fill=green!20] (g2)at([xshift=1.8em]g1.east){};
\node[anchor=west,unit,fill=green!20] (g3)at([xshift=1.8em]g2.east){};
\node[anchor=west,unit,fill=green!20] (g4)at([xshift=1.8em]g3.east){};
\node[unit,fill=ugreen!20] (g1) at (0,0){};
\node[anchor=west,unit,fill=ugreen!20] (g2)at([xshift=1.8em]g1.east){};
\node[anchor=west,unit,fill=ugreen!20] (g3)at([xshift=1.8em]g2.east){};
\node[anchor=west,unit,fill=ugreen!20] (g4)at([xshift=1.8em]g3.east){};
\node[anchor=north,unit,fill=red!30] (r1)at([yshift=-1.8em]g1.south){};
\node[anchor=north,unit,fill=red!30] (r2)at([yshift=-1.8em]g2.south){};
\node[anchor=north,unit,fill=red!30] (r3)at([yshift=-1.8em]g3.south){};
\node[anchor=north,unit,fill=red!30] (r4)at([yshift=-1.8em]g4.south){};
\node[anchor=south,font=\scriptsize] at ([yshift=0.4em,xshift=1.4em]g2.north){(待预测标签)};
\node[anchor=north,font=\scriptsize] at ([yshift=-0.4em,xshift=1.4em]r2.south){(待标注标签)};
\node[anchor=south,font=\scriptsize] at ([yshift=0.4em,xshift=1.4em]g2.north){待预测标签序列};
\node[anchor=north,font=\scriptsize] at ([yshift=-0.4em,xshift=1.4em]r2.south){观测序列};
\draw[->,thick] (g1.east) -- (g2.west);
\draw[->,thick] (g2.east) -- (g3.west);
......
......@@ -44,7 +44,7 @@
}
{
\draw [->,very thick,ublue] ([xshift=0.2em]model.east) -- ([xshift=4.2em]model.east) node [pos=0.5, above] {\color{red}{\scriptsize{搜索\&计算}}};
\draw [->,very thick,ublue] ([xshift=0.2em]model.east) -- ([xshift=4.2em]model.east) node [pos=0.5, above] {\color{red}{\scriptsize{推断}}};
}
{\scriptsize
......@@ -71,7 +71,7 @@
\node [anchor=east,draw,dashed,red,thick,minimum width=13em,minimum height=1.4em] (final) at (p2seg2.east) {};
\node [anchor=west,red] (finallabel) at ([xshift=3.1em]sentlabel.east) {输出概率最大的结果};
%\node [anchor=north east,red] (finallabel2) at ([yshift=0.5em]finallabel.south east) {的结果};
\draw [->,thick,red] ([xshift=0.0em,yshift=-0.5em]final.north east) ..controls +(east:0.3) and +(south:0.0).. ([xshift=1.0em]finallabel.south);
\draw [->,thick,red] ([xshift=0.0em,yshift=-0.5em]final.north east) ..controls +(east:0.2) and +(south:1.0).. ([xshift=2.0em]finallabel.south);
}
}
......
......@@ -21,7 +21,7 @@
%----------------------------------------------------------------------------------------
\chapter{词法分析和语法分析基础}
\parinterval 机器翻译并非是一个孤立的系统,它依赖于很多模块,并且需要很多学科知识的融合。其中就会用到一些自然语言处理工具来对不同语言的文字进行分析。因此,在正式开始机器翻译内容的介绍之前,本章会对相关的词法分析和语法分析知识进行概述,包括:分词、命名实体识别、成分句法分析。它们都是自然语言处理中的经典问题,而且在机器翻译中也经常被使用。本章会重点介绍这些任务的定义和求解问题的思路。其中也会使用到统计建模方法,可以被看作是第二章内容的延伸。
\parinterval 机器翻译并非是一个孤立的系统,它依赖于很多模块,并且需要多个学科知识的融合。其中就会用到许多自然语言处理工具来对不同语言的文字进行分析。因此,在正式开始机器翻译内容的介绍之前,本章会对相关的词法分析和语法分析知识进行概述,包括:分词、命名实体识别、短语结构句法分析。它们都是自然语言处理中的经典问题,而且在机器翻译中被广泛使用。本章会重点介绍这些任务的定义和求解问题的思路。其中也会使用到统计建模方法,因此本章也可以被看作是第二章内容的延伸。
%----------------------------------------------------------------------------------------
% NEW SECTION
......@@ -41,13 +41,13 @@
\end{figure}
%-------------------------------------------
\parinterval\ref{fig:3.1-1}(b)展示了一个机器翻译系统的输入和输出形式。可以看到,输入的中文词串``猫喜欢吃鱼''被加工成一个新的结构(图\ref{fig:3.1-2})。直觉上,这个结构有些奇怪,因为上面多了很多新的符号,而且还有一些线将不同符号进行连接。实际上这就是语言分析中对句子常用的结构表示\ \dash \ 短语结构树。这里会涉及两方面问题:
\parinterval\ref{fig:3.1-1}(b)展示了一个机器翻译系统的输入和输出形式。可以看到,输入的中文词串``猫喜欢吃鱼''被加工成一个新的结构(图\ref{fig:3.1-2})。直觉上,这个结构有些奇怪,因为上面多了很多新的符号,而且还有一些线将不同符号进行连接。实际上这就是一种常见的句法表示\ \dash \ 短语结构树。生成这样的结构会涉及两方面问题:
\begin{itemize}
\vspace{0.5em}
\item {\small\bfnew{分词}}\index{分词}(Segmentation)\index{Segmentation}:这个过程会把词串进行切分,切割成最小的单元。因为只有知道了什么是待处理字符串的最小单元,机器翻译系统才能对其进行表示、分析和生成。
\item {\small\bfnew{分词}}\index{分词}(Segmentation)\index{Segmentation}:这个过程会把词串进行切分,切割成最小的具有完整功能的单元\ \dash\ {\small\bfnew{单词}}\index{单词}(Word\index{单词})。因为只有知道了什么是单词,机器翻译系统才能完成对句子的表示、分析和生成。
\vspace{0.5em}
\item {\small\bfnew{句法分析}}\index{句法分析}(Parsing)\index{Parsing}:这个过程会对分词的结果进行进一步分析。比如,可以对句子进行浅层分析,得到一些句子中实体的信息(如人名、地名等)。也可以对句子进行更深层次的分析,得到完整的句法结构,类似于图\ref{fig:3.1-2}中的结果。这种结构可以被看作是对句子的进一步抽象,被称为成分句法树,比如,NP+VP就可以表示由名词短语(NP)和动词短语(VP)构成的主谓结构。利用这些信息,机器翻译可以更加准确地对语言的结构进行分析和生成。
\item {\small\bfnew{句法分析}}\index{句法分析}(Parsing)\index{Parsing}:这个过程会对分词的结果进行进一步分析。比如,可以对句子进行浅层分析,得到句子中实体的信息(如人名、地名等)。也可以对句子进行更深层次的分析,得到完整的句法结构,类似于图\ref{fig:3.1-2}中的结果。这种结构可以被看作是对句子的进一步抽象,被称为短语结构树,比如,NP+VP就可以表示由名词短语(NP)和动词短语(VP)构成的主谓结构。利用这些信息,机器翻译可以更加准确地对句子的结构进行分析和生成。
\vspace{0.5em}
\end{itemize}
......@@ -55,20 +55,20 @@
\begin{figure}[htp]
\centering
\input{./Chapter3/Figures/figure-analysis-of-sentence-participle&syntactic}
\caption{中文句子``猫喜欢吃鱼''的分析结果(分词和句法分析)}
\caption{汉语句子``猫喜欢吃鱼''的分析结果(分词和句法分析)}
\label{fig:3.1-2}
\end{figure}
%-------------------------------------------
\parinterval 类似地,机器翻译输出的结果也可以包含同样的信息。甚至系统输出英文译文之后,还有一个额外的步骤来把部分英文单词的大小写恢复出来,比如,上例中句首单词``Cats''的首字母要大写。
\parinterval 类似地,机器翻译输出的结果也可以包含同样的信息。甚至系统输出英语译文之后,还有一个额外的步骤来把部分英语单词的大小写恢复出来,比如,上例中句首单词``Cats''的首字母要大写。
\parinterval 一般来说,在送入机器翻译系统前需要对文字序列进行处理和加工,这个过程被称为{\small\bfnew{预处理}}\index{预处理}(Preprocessing)\index{Preprocessing}同理,在机器翻译模型输出译文后进行的处理被称作{\small\bfnew{后处理}}\index{后处理}(Postprocessing)\index{Postprocessing}。这两个过程对机器翻译性能影响很大,比如,在神经机器翻译里,不同的分词策略可能会造成翻译性能的天差地别。
\parinterval 一般来说,在送入机器翻译系统前需要对文字序列进行处理和加工,这个过程被称为{\small\bfnew{预处理}}\index{预处理}(Preprocessing)\index{Preprocessing}类似地,在机器翻译模型输出译文后进行的处理被称作{\small\bfnew{后处理}}\index{后处理}(Postprocessing)\index{Postprocessing}。这两个过程对机器翻译性能影响很大,比如,对于神经机器翻译系统来说,不同的分词策略可能会造成翻译性能的天差地别。
\parinterval 值得注意的是,有些观点认为,对于机器翻译来说,不论是分词还是句法分析,并不要求符合人的认知和语言学约束。换句话说,机器翻译所使用的``单词''和``结构''本身并不是为了符合人类的解释,它们更直接目的是为了进行翻译。从系统开发的角度,有时候即使使用一些与人类的语言习惯有差别的处理,仍然会带来性能的提升,比如在神经机器翻译中,在传统分词的基础上进一步使用{\small\bfnew{双字节编码}}\index{双字节编码}(Byte Pair Encoding,BPE)\index{Byte Pair Encoding}子词切分会使得机器翻译性能大幅提高。当然,自然语言处理中语言学信息的使用一直是学界关注的焦点。甚至关于语言学结构对机器翻译是否有作用这个问题也有争论。但是不能否认的是,无论是语言学的知识,还是计算机自己学习到的知识,对机器翻译都是有价值的。在后续章节会看到,这两种类型的知识对机器翻译帮助很大。
\parinterval 值得注意的是,有些观点认为,对于机器翻译来说,不论是分词还是句法分析,并不要求符合人的认知和语言学约束。换句话说,机器翻译所使用的``单词''和``结构''本身并不是为了符合人类的解释,它们更直接目的是为了进行翻译。从系统开发的角度,有时候即使使用一些与人类的语言习惯有差别的处理,仍然会带来性能的提升,比如在神经机器翻译中,在传统分词的基础上进一步使用{\small\bfnew{双字节编码}}\index{双字节编码}(Byte Pair Encoding,BPE)\index{Byte Pair Encoding}子词切分会使得机器翻译性能大幅提高。当然,自然语言处理中语言学信息的使用一直是学界关注的焦点。甚至关于语言学结构对机器翻译是否有作用这个问题也有一些不同的观点。但是不能否认的是,无论是语言学的知识,还是计算机自己学习到的知识,对机器翻译都是有价值的。在后续章节会看到,这两种类型的知识对机器翻译帮助很大。
\parinterval 剩下的问题是如何进行句子的切分和结构的分析。思路有很多,一种常用的方法是对问题进行概率化,用统计模型来描述问题并求解之。比如,一个句子切分的好坏,并不是非零即一的判断,而是要估计出这种切分的可能性大小,最终选择可能性最大的结果进行输出。这也是一种典型的用统计建模的方式来描述自然语言处理问题的方法。
\parinterval 本章将会对上述问题及求解问题的方法进行介绍。并将统计建模应用到中文分词、命名实体识别和成分句法分析等任务
\parinterval 本章将会对上述问题及求解问题的方法进行介绍。并将统计建模应用到中文分词、命名实体识别和短语结构句法分析等任务中
%----------------------------------------------------------------------------------------
% NEW SECTION
......@@ -76,7 +76,7 @@
\section{中文分词}
\parinterval 对于机器翻译系统而言,输入的是已经切分好的单词序列,而不是原始的字符串(图\ref{fig:3.2-1})。比如,对于一个中文句子,单词之间是没有间隔的,因此需要把一个个的单词切分出来,这样机器翻译系统可以区分不同的翻译单元。甚至,可以对语言学上的单词进行进一步切分,得到词片段序列(比如:中国人$\to$中国/人)。可以把上述过程看作是一种分词(Segmentation)过程,即:将一个输入的自然语言字符串切割成单元序列(token序列),每个单元都对应可以处理的最小单位。
\parinterval 对于机器翻译系统而言,输入的是已经切分好的单词序列,而不是原始的字符串(图\ref{fig:3.2-1})。比如,对于一个中文句子,单词之间是没有间隔的,因此需要把一个个的单词切分出来,这样机器翻译系统可以区分不同的翻译单元。甚至,可以对语言学上的单词进行进一步切分,得到词片段序列(比如:中国人$\to$中国/人)。广义上,可以把上述过程看作是一种分词过程,即:将一个输入的自然语言字符串切割成单元序列,每个{\small\bfnew{单元}}\index{单元}(Token\index{Token}都对应可以处理的最小单位。
%----------------------------------------------
\begin{figure}[htp]
......@@ -87,7 +87,7 @@
\end{figure}
%-------------------------------------------
\parinterval 分词得到的单元序列可以是语言学上的词序列,也可以是根据其他方式定义的基本处理单元。在本章中,把分词得到的一个个单元称为{\small\bfnew{单词}}\index{单词}(Word)\index{Word}或词,尽管这些单元可以不是语言学上的完整单词。而这个过程也被称作{\small\bfnew{词法分析}}\index{词法分析}(Lexical Analysis)\index{Lexical Analysis}。除了汉语,词法分析在日语、泰语等单词之间无明确分割符的语言中有着广泛的应用,芬兰语、维吾尔语等一些形态学十分丰富的语言,也需要使用词法分析来解决复杂的词尾、词缀变化等形态学变化。
\parinterval 分词得到的单元序列可以是语言学上的词序列,也可以是根据其他方式定义的基本处理单元。在本章中,把分词得到的一个个单元称为{\small\bfnew{单词}}\index{单词}(Word)\index{Word}或词,尽管这些单元可以不是语言学上的完整单词。而这个过程也被称作{\small\bfnew{词法分析}}\index{词法分析}(Lexical Analysis)\index{Lexical Analysis}。除了汉语,词法分析在日语、泰语等单词之间无明确分割符的语言中有着广泛的应用,芬兰语、维吾尔语等一些形态学十分丰富的语言,也需要使用词法分析来解决复杂的词尾、词缀变化等形态学变化。
\parinterval 在机器翻译中,分词系统的好坏往往会决定译文的质量。分词的目的是定义系统处理的基本单元,那么什么叫做``词'' 呢?关于词的定义有很多,比如:
......@@ -106,17 +106,20 @@
\end{definition}
\parinterval 从语言学的角度来看,人们普遍认为词是可以单独运用的、包含意义的基本单位。这样可以使用有限的词组合出无限的句子,这也正体现出自然语言的奇妙之处。不过,机器翻译并不仅仅局限在语言学定义的单词。比如,神经机器翻译中广泛使用的BPE子词切分方法,可以被理解为将词的一部分也进行切开,也就是得到词片段送给机器翻译系统使用。比如,对如下英文字符串,可以得到如下切分结果:
\parinterval 从语言学的角度来看,人们普遍认为词是可以单独运用的、包含意义的基本单位。这样可以使用有限的词组合出无限的句子,这也正体现出自然语言的奇妙之处。不过,机器翻译并不仅仅局限在语言学定义的单词。比如,神经机器翻译中广泛使用的BPE子词切分方法,可以被理解为将词的一部分也切分出来,也就是得到词片段送给机器翻译系统使用。比如,对如下英语字符串,可以得到切分结果:
\parinterval Interesting \; $\to$ \; Interest/ing selection \hspace{0.08em} $\to$ \;se/lect/ion procession \hspace{0.43em} $\to$ \; pro/cess/ion
\parinterval Interested \hspace{0.62em} $\to$ \; Interest/ed selecting \hspace{0.34em} $\to$ \; se/lect/ing processing \hspace{0.22em} $\to$ \; pro/cess/ing
\vspace{0.8em}
\parinterval Interests \hspace{1.17em} $\to$ \; Interest/s selected \hspace{1.24em} $\to$ \; se/lect/ed processed \hspace{0.82em} $\to$ \; pro/cess/ed
\noindent
\begin{tabular}{l l l}
Interesting \; $\to$ \; Interest/ing & selection $\to$ \;se/lect/ion & procession $\to$ \; pro/cess/ion \\
Interested $\to$ \; Interest/ed & selecting $\to$ \; se/lect/ing & processing $\to$ \; pro/cess/ing \\
Interests $\to$ \; Interest/s & selected $\to$ \; se/lect/ed & processed $\to$ \; pro/cess/ed
\end{tabular}
\vspace{0.5em}
\vspace{0.8em}
\parinterval 词法分析的重要性在自然语言处理领域已经有共识。如果切分的颗粒度很大,获得的单词的歧义也很小,比如``中华人民共和国''整体作为一个单词不存在歧义,而如果单独的一个单词``国'',可能会代表``中国''、``美国''等不同的国家,存在歧义。但是随着切分颗粒度的增大,特定单词出现的频也随之降低,低频词容易和噪音混淆,系统很难进行学习。因此,处理这些问题并开发适合翻译任务的分词系统是机器翻译的第一步。
\parinterval 词法分析的重要性在自然语言处理领域已经有共识。如果切分的颗粒度很大,获得的单词的歧义也很小,比如``中华人民共和国''整体作为一个单词不存在歧义,而如果单独的一个单词``国'',可能会代表``中国''、``美国''等不同的国家,存在歧义。但是随着切分颗粒度的增大,特定单词出现的频也随之降低,低频词容易和噪音混淆,系统很难进行学习。因此,处理这些问题并开发适合翻译任务的分词系统是机器翻译的第一步。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -124,9 +127,9 @@
\subsection{基于词典的分词方法}
\parinterval 计算机并不能像人类一样在概念上理解``词'',因此需要使用其他方式让计算机可以进行分词。一个最简单的方法就是给定一个词典,在这个词典中出现的汉字组合就是所定义的``词''。也就是,通过一个词典定义一个标准,符合这个标准定义的字符串都是合法的``词''。
\parinterval 计算机并不能像人类一样在概念上理解``词'',因此需要使用其他方式让计算机“学会”如何分词。一个最简单的方法就是给定一个词典,在这个词典中出现的汉字组合就是所定义的``词''。也就是,通过一个词典定义一个标准,符合这个标准定义的字符串都是合法的``词''。
\parinterval 在使用基于词典的分词方法时,只需预先加载词典到计算机中,扫描输入句子,查询每个词串是否出现在词典中。如图\ref{fig:3.2-2}所示,有一个包含六个词的词典,给定输入句子``确实现在物价很高''后,分词系统自左至右遍历输入句子的每个字,发现词串``确实''在词典中出现,说明``确实''是一个``词'',进行分词操作并在切分该``词''之后重复这个过程。
\parinterval 在使用基于词典的分词方法时,只需预先加载词典到计算机中,扫描输入句子,查询每个词串是否出现在词典中。如图\ref{fig:3.2-2}所示,有一个包含六个词的词典,给定输入句子``确实现在物价很高''后,分词系统自左至右遍历输入句子的每个字,发现词串``确实''在词典中出现,说明``确实''是一个``词''。之后,重复这个过程。
%----------------------------------------------
\begin{figure}[htp]
......@@ -137,7 +140,7 @@
\end{figure}
%-------------------------------------------
\parinterval 但是,基于词典的分词方法很``硬''。这是因为自然语言非常灵活,经常出现歧义,用词典定义的合法单词之间有重叠的交叉型歧义就很难解决。图\ref{fig:3.2-3}就给出了上面例子中的交叉型歧义,从词典中查看,``实现''和``现在''都是合法的单词,但是在句子中二者有重叠,因此词典无法告诉系统哪个结果是正确的。
\parinterval 但是,基于词典的分词方法很``硬''。这是因为自然语言非常灵活,经常出现歧义。图\ref{fig:3.2-3}就给出了上面例子中的交叉型歧义,从词典中查看,`` 实现''和``现在''都是合法的单词,但是在句子中二者有重叠,因此词典无法告诉系统哪个结果是正确的。
%----------------------------------------------
\begin{figure}[htp]
......@@ -150,7 +153,7 @@
\parinterval 类似的例子在生活中也很常见。再比如``答辩结束的和尚未答辩的同学都请留在教室''一句中,正常的分词结果是``答辩/结束/的/和/尚未/答辩/的/同学/都/请/留在/教室'',但是由于``尚未''、``和尚''都是常见词汇,使用基于词典的分词方法在这时很容易出现切分错误。
\parinterval 基于词典的分词方法是典型的基于规则的方法,完全依赖于人工给定的词典。在遇到歧义时,需要人工定义消除歧义的规则,比如,可以自左向右扫描每次匹配最长的单词,这是一种简单的启发式的消歧策略。图\ref{fig:3.2-2}中的例子实际上就是使用这种策略得到的分词结果。但是,启发式的消岐方法对人工的依赖程度很高,而且启发式规则也不能处理所有的情况。所以说简单的基于词典的方法还不能很好的解决分词问题。
\parinterval 基于词典的分词方法是典型的基于规则的方法,完全依赖于人工给定的词典。在遇到歧义时,需要人工定义消除歧义的规则,比如,可以自左向右扫描每次匹配最长的单词,这是一种简单的启发式的消歧策略。图\ref{fig:3.2-2}中的例子实际上就是使用这种策略得到的分词结果。但是,启发式的消岐方法仍然需要人工设计启发式规则,而且启发式规则也不能处理所有的情况。所以说简单的基于词典的方法还不能很好的解决分词问题。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -166,13 +169,13 @@
\subsubsection{1. 统计模型的学习与推断}
\parinterval 在分词任务中,数据驱动主要指用已经分词切分好的数据``喂''给系统,这个数据也被称作{\small\bfnew{标注数据}}\index{标注数据}(Annotated Data)\index{Annotated Data}。在获得标注数据后,系统自动学习一个统计模型来描述分词的过程,而这个模型会把分词的``知识''作为参数保存在模型中。当送入一个新的需要分词的句子时,可以利用学习到的模型对所有可能的分词结果进行预测,并进行概率化的描述,最终选择概率最大的结果作为输出。这个方法就是基于统计的分词方法。具体来说,可以分为两个步骤:
\parinterval 统计分词也是一种典型的数据驱动方法。这种方法将已经经过分词的数据``喂''给系统,这个数据也被称作{\small\bfnew{标注数据}}\index{标注数据}(Annotated Data)\index{Annotated Data}。在获得标注数据后,系统自动学习一个统计模型来描述分词的过程,而这个模型会把分词的``知识''作为参数保存在模型中。当送入一个新的需要分词的句子时,可以利用学习到的模型对可能的分词结果进行概率化的描述,最终选择概率最大的结果作为输出。这个方法就是基于统计的分词方法,其与{\chaptertwo}介绍的统计语言建模方法本质上是一样的。具体来说,可以分为两个步骤:
\begin{itemize}
\vspace{0.5em}
\item {\small\bfnew{训练}}\index{训练}(Training)\index{Training}。利用标注数据,对统计模型的参数进行学习。
\vspace{0.5em}
\item {\small\bfnew{推断}}\index{推断}(Inference)\index{Inference}。利用学习到的模型和参数,对新的句子进行切分
\item {\small\bfnew{预测}}\index{预测}(Prediction)\index{Prediction}。利用学习到的模型和参数,对新的句子进行切分。这个过程也可以被看作是利用学习到的模型在新的数据上进行{\small\bfnew{推断}}\index{推断}(Inference)\index{Inference}
\vspace{0.5em}
\end{itemize}
......@@ -195,7 +198,7 @@
\parinterval 上述过程的核心在于从标注数据中学习一种对分词现象的统计描述,即句子的分词结果概率$\funp{P}(\cdot)$。如何让计算机利用分好词的数据学习到分词知识呢?本书的{\chaptertwo}曾介绍如何对单词概率进行统计建模,而对分词现象的统计描述就是在单词概率的基础上,基于独立性假设获取的\footnote{即假定所有词的出现都是相互独立的。}。虽然独立性假设并不能完美描述分词过程中单词之间的关系,但是它大大化简了分词问题的复杂度。
\parinterval 如图\ref{fig:3.2-5}所示,可以利用大量人工标注好的分词数据,通过统计学习方法获得一个统计模型$\funp{P}(\cdot)$,给定任意分词结果$W = w_1w_2 \ldots w_m$,都能通过$\funp{P}(W)=\funp{P}(w_1) \cdot \funp{P}(w_2) \cdot \ldots \cdot \funp{P}(w_m)
\parinterval 如图\ref{fig:3.2-5}所示,可以利用大量人工标注好的分词数据,通过统计学习方法获得一个统计模型$\funp{P}(\cdot)$,给定任意分词结果$W = w_1w_2 \ldots w_m$,都能通过$\funp{P}(W)=\funp{P}(w_1) \cdot \funp{P}(w_2) \cdot \ldots \cdot \funp{P}(w_m)
$计算这种切分的概率值。
%----------------------------------------------
......@@ -211,15 +214,13 @@ $计算这种切分的概率值。
\begin{eqnarray}
&\funp{P}&\textrm{(确实/现在/数据/很/多)} \nonumber \\
& = &\funp{P}\textrm{(确实)} \cdot \funp{P}\textrm{(现在)} \cdot \funp{P}\textrm{(数据)} \cdot \funp{P}\textrm{(很)} \cdot \funp{P}\textrm{(多)}
& = &\funp{P}\textrm{(确实)} \cdot \funp{P}\textrm{(现在)} \cdot \funp{P}\textrm{(数据)} \cdot \funp{P}\textrm{(很)} \cdot \funp{P}\textrm{(多)}
\label{eq:3.2-1}
\end{eqnarray}
\parinterval 经过充分训练的统计模型$\funp{P}(\cdot)$就是得到的分词模型。对于输入的新句子S,通过这个模型找到最佳的分词结果$W^{*}$输出。假设输入句子S是``确实现在数据很多'',可以通过列举获得不同切分方式的概率,其中概率最高的切分方式,就是系统的目标输出。
\parinterval 经过充分训练的统计模型$\funp{P}(\cdot)$就是得到的分词模型。对于输入的新句子$S$,通过这个模型找到最佳的分词结果输出。假设输入句子$S$是``确实现在数据很多'',可以通过列举获得不同切分方式的概率,其中概率最高的切分方式,就是系统的目标输出。
\parinterval 这种分词方法也被称作基于1-gram语言模型的分词,或全概率分词,使用标注好的分词数据进行学习,获得分词模型。这种方法最大的优点是整个学习过程(模型训练过程)和推导过程(处理新句子进行切分的过程)都是全自动进行的。这种方法虽然简单,但是其效率很高,因此被广泛应用在工业界系统里。
\parinterval 当然,真正的分词系统还需要解决很多其他问题,比如使用动态规划等方法高效搜索最优解以及如何处理未见过的词等等,由于本节的重点是介绍中文分词的基础方法和统计建模思想,因此无法覆盖所有中文分词的技术内容,有兴趣的读者可以参考\ref{sec3:summary}节的相关文献做进一步深入研究。
\parinterval 这种分词方法也被称作基于1-gram语言模型的分词,或全概率分词。全概率分词最大的优点在于方法简单、效率高,因此被广泛应用在工业界系统里。它本质上就是一个1-gram语言模型,因此可以直接复用$n$-gram语言模型的训练方法和未登录词处理方法。与传统$n$-gram语言模型稍有不同的是,分词的预测过程需要找到一个给定字符串所有可能切分中1-gram语言模型得分最高的切分。因此,可以使用{\chaptertwo}中所描述的搜索算法实现这个预测过程,也可以使用动态规划方法快速找到最优切分结果。由于本节的重点是介绍中文分词的基础方法和统计建模思想,因此不会对相关搜索算法进行进一步展开,有兴趣的读者可以参考{\chaptertwo}和本章\ref{sec3:summary}节的相关文献做进一步深入研究。
%----------------------------------------------------------------------------------------
% NEW SECTION
......@@ -227,7 +228,7 @@ $计算这种切分的概率值。
\section{命名实体识别}
\parinterval 在人类使用语言的过程中,单词往往不是独立出现的。很多时候,多个单词会组合成一个更大的单元,来表达特定的意思。其中,最典型的代表是{\small\bfnew{命名实体}}\index{命名实体}(Named Entity)\index{Named Entity}。通常,命名实体是指名词性的专用短语,例如公司名称、品牌名称、产品名称等专有名词和行业术语。准确地识别出这些命名实体,是提高机器翻译质量的关键。比如,在技术文献中,往往需要对术语进行识别并进行准确翻译。因此引入{\small\bfnew{命名实体识别}}\index{命名实体识别}(Named Entity Recognition)\index{Named Entity Recognition}可以帮助系统对特定术语进行更加细致的处理。
\parinterval 在人类使用语言的过程中,单词往往不是独立出现的。很多时候,多个单词会组合成一个更大的单元来表达特定的意思。其中,最典型的代表是{\small\bfnew{命名实体}}\index{命名实体}(Named Entity)\index{Named Entity}。通常,命名实体是指名词性的专用短语,例如公司名称、品牌名称、产品名称等专有名词和行业术语。准确地识别出这些命名实体,是提高机器翻译质量的关键。比如,在翻译技术文献时,往往需要对术语进行识别并进行准确翻译。因此引入{\small\bfnew{命名实体识别}}\index{命名实体识别}(Named Entity Recognition)\index{Named Entity Recognition}可以帮助系统对特定术语进行更加细致的处理。
\parinterval 从句法分析的角度来说,命名实体识别是一种浅层句法分析任务。它在分词的基础上,进一步对句子浅层结构进行识别。包括词性标注、组块识别在内的很多任务都可以被看作是浅层句法分析的内容。本节会以命名实体识别为例,对基于序列标注的浅层句法分析方法进行介绍。
......@@ -237,7 +238,7 @@ $计算这种切分的概率值。
\subsection{序列标注任务}
\parinterval 命名实体识别是一种典型的序列标注任务。对于一个输入的序列,它会生成一个相同长度的输出序列。输入序列的每一个位置,都有一个与之对应的输出,输出的内容是这个位置所对应的标签(或者类别)。比如,对于命名实体识别,每个位置的标签可以被看作是一种命名实体``开始''和``结束''的标志,而命名实体识别的任务就是得到这种``开始''和``结束''标注的序列。不仅如此,分词、词性标注、组块识别等也都可以被看作是序列标注任务。
\parinterval 命名实体识别是一种典型的{\small\bfnew{序列标注}}\index{序列标注}(Sequence Labeling\index{Sequence Labeling})任务。对于一个输入序列,它会生成一个相同长度的输出序列。输入序列的每一个位置,都有一个与之对应的输出,输出的内容是这个位置所对应的标签(或者类别)。比如,对于命名实体识别,每个位置的标签可以被看作是一种命名实体``开始''和``结束''的标志,而这里就是得到这种``开始''和``结束''标注的序列。不仅如此,分词、词性标注、组块识别等也都可以被看作是序列标注任务。
\parinterval 通常来说,序列标注任务中首先需要定义标注策略,即使用什么样的格式来对序列进行标注。为了便于描述,这里假设输入序列为一个个单词\footnote{广义上,序列标注任务并不限制输入序列的形式,比如,字符、单词、多个单词构成的词组都可以作为序列标注的输入单元。}。常用的标注策略有:
......@@ -259,13 +260,13 @@ $计算这种切分的概率值。
\end{figure}
%-------------------------------------------
%
\parinterval\ref{fig:3.3-1}给出了不同标注格式所对应的标注结果\footnote{标注中的``GPE''在命名实体识别任务中被用于标注``地缘政治实体''。},可以看出文本序列中的非命名实体直接被标注为``O'',而命名实体的标注则被分为了两部分:位置和命名实体类别,图中的``B''、``I''、``E''等标注出了位置信息,而``GPE''则标注出了命名实体类别。可以看到,命名实体的识别结果可以通过BIO、BIOES这类序列标注结果归纳出来:例如在BIOES格式中,标签``B-GPE''后面的标签只会是``I-GPE''或``E-GPE'',而不会是其他的标签。同时,在命名实体识别任务中涉及到实体边界的确定,而``BIO''或``BIOES''的标注格式本身就暗含着边界问题:在``BIO''格式下,实体左边界只能在``B''的左边,右边界只能在``B''或``I''的右边;在``BIOES''格式下,实体左边界只能在``B''或``S''的左边,右边界只能在``E''和``S''的右边。
\parinterval\ref{fig:3.3-1}给出了不同标注格式所对应的标注结果。可以看出文本序列中的非命名实体直接被标注为``O'',而命名实体的标注则被分为了两部分:位置和命名实体类别,图中的``B''、``I''、``E''等标注出了位置信息,而``CIT''和``CNT''则标注出了命名实体类别(``CIT''表示城市,``CNT''表示国家)。可以看到,命名实体的识别结果可以通过BIO、BIOES这类序列标注结果归纳出来:例如在BIOES格式中,标签``B-CNT''后面的标签只会是``I-CNT''或``E-CNT'',而不会是其他的标签。同时,在命名实体识别任务中涉及到实体边界的确定,而``BIO''或``BIOES''的标注格式本身就暗含着边界问题:在``BIO''格式下,实体左边界只能在``B''的左边,右边界只能在``B''或``I''的右边;在``BIOES''格式下,实体左边界只能在``B''或``S''的左边,右边界只能在``E''和``S''的右边。
\parinterval \ref{fig:3.3-1}的例子中的命名实体识别以单词为基本标注单位,有时也会在输入的字序列上进行命名实体识别。其方法与基于词序列的命名实体识别是一样的。因此,这里仍然以基于词序列的方法为例进行介绍。
\parinterval 主要注意的是,虽然图\ref{fig:3.3-1}中的命名实体识别以单词为基本单位进行标注,但真实系统中也可以在字序列上进行命名实体识别。其方法与基于词序列的命名实体识别是一样的。因此,这里仍然以基于词序列的方法为例进行介绍。
\parinterval 对于像命名实体识别这样的任务,早期的方法主要是基于词典和规则的方法。这些方法依赖于手工构造的规则模板,通过字符串匹配的方式识别出文本中的命名实体\upcite{rau1991extracting}\upcite{张小衡1997中文机构名称的识别与分析}。严格意义上来说,那时命名实体识别还并没有被看作是一种序列标注
\parinterval 对于像命名实体识别这样的任务,早期的方法主要是基于词典和规则的方法。这些方法依赖于人工构造的识别规则,通过字符串匹配的方式识别出文本中的命名实体\upcite{rau1991extracting,张小衡1997中文机构名称的识别与分析}。严格意义上来说,那时命名实体识别还并没有被看作是一种序列标注问题
\parinterval 序列标注这个概念更多的是出现在基于统计建模的方法中。许多统计机器学习方法都被成功应用用于命名实体识别任务,例如{\small\bfnew{隐马尔可夫模型}}\index{隐马尔可夫模型}(Hidden Markov Model,HMM)\index{HMM}{\small\bfnew{条件随机场}}\index{条件随机场}(Conditional Random Fields,CRFs)\index{Conditional Random Fields}{\small\bfnew{最大熵}}\index{最大熵}(Maximum Entropy,ME)\index{ME}模型和{\small\bfnew{支持向量机}}\index{支持向量机}(Support Vector Machine,SVM)\index{SVM}等。而命名实体识别也成为了验证机器学习方法有效的代表性任务之一。本节将对几类基础统计方法进行介绍。其中会涉及概率图模型、统计分类器等方法。特别是统计分类的概念,在后续章节的学习中也会被使用到。
\parinterval 序列标注这个概念更多的是出现在基于统计建模的方法中。许多统计机器学习方法都被成功应用用于命名实体识别任务,例如{\small\bfnew{隐马尔可夫模型}}\index{隐马尔可夫模型}(Hidden Markov Model,HMM)\index{HMM}{\small\bfnew{条件随机场}}\index{条件随机场}(Conditional Random Fields,CRFs)\index{Conditional Random Fields}{\small\bfnew{最大熵}}\index{最大熵}(Maximum Entropy,ME)\index{ME}模型和{\small\bfnew{支持向量机}}\index{支持向量机}(Support Vector Machine,SVM)\index{SVM}等。此外,近些年深度学习的兴起也给命名实体识别带来了新的思路{\color{red}(参考文献!!!!)}。而命名实体识别也成为了验证机器学习方法有效性的重要任务之一。本节将对序列标注中几类基础的方法进行介绍。其中会涉及概率图模型、统计分类模型等方法。特别是统计分类的概念,在后续章节中也会被使用到。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -283,7 +284,7 @@ $计算这种切分的概率值。
\parinterval 概率图模型中的一个基础概念是``特征''。简单来说,{\small\bfnew{特征}}\index{特征}(Feature)\index{Feature}是指能够反映事物在某方面表现或行为的一种属性,如现实生活中小鸟的羽毛颜色、喙的形状、翼展长度等就是小鸟的特征;命名实体识别任务中的每个词的词根、词性和上下文组合也可以被看做是识别出命名实体可以采用的特征。
\parinterval 从统计建模的角度看,特征的形式可以非常灵活。比如,可以分为连续特征和离散型特征,前者通常用于表示取值蕴含数值大小关系的信息,如人的身高和体重,后者通常用于表示取值不蕴含数值大小关系的信息,例如人的性别。正是由于这种灵活性,系统开发者可以通过定义多样的特征从多个不同的角度对目标问题进行建模。而这种设计特征的过程也被称作{\small\bfnew{特征工程}}\index{特征工程}(Feature Engineering)\index{Feature Engineering}
\parinterval 从统计建模的角度看,特征的形式可以非常灵活。比如,可以分为连续特征和离散型特征,前者通常用于表示取值蕴含数值大小关系的信息,如人的身高和体重,后者通常用于表示取值不蕴含数值大小关系的信息,例如人的性别。正是由于这种灵活性,系统开发者可以通过定义多样的特征从多个不同的角度对目标问题进行建模。而这种设计特征的过程也被称作{\small\bfnew{特征工程}}\index{特征工程}(Feature Engineering)\index{Feature Engineering}
\parinterval 设计更好的特征也成为了很多机器学习方法的关键。通常有两个因素需要考虑:
......@@ -315,7 +316,7 @@ $计算这种切分的概率值。
\end{center}
}\end{table}
\parinterval 在相当长的一段时期内,基于特征工程的方法都是自然语言处理领域的主流。虽然深度学习的逐渐兴起使得系统研发人员可以逐步摆脱繁重的特征设计工作。但是很多传统的模型和方法在今天仍然被广泛使用。比如,在当今最先进的序列标注模型中\upcite{lample2016neural},本节即将介绍的条件随机场模型仍然是一个主要部件。
\parinterval 在相当长的一段时期内,基于特征工程的方法都是自然语言处理领域的主流范式。虽然深度学习技术的进步使得系统研发人员可以逐步摆脱繁重的特征设计工作。但是很多传统的模型和方法在今天仍然被广泛使用。比如,在当今最先进的序列标注模型中\upcite{lample2016neural},本节即将介绍的条件随机场模型仍然是一个主要部件。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
......@@ -323,9 +324,11 @@ $计算这种切分的概率值。
\subsubsection{2. 经典概率图模型}
\vspace{0.5em}
\noindent a) {\small\bfnew{隐马尔可夫模型}}
\vspace{0.5em}
\parinterval 隐马尔可夫模型是一种经典的序列模型\upcite{Baum1966Statistical}\upcite{baum1970maximization}。它在语音识别、自然语言处理的很多领域得到了广泛的应用。隐马尔可夫模型的本质是一个概率模型,用来描述一个含有隐含参数的马尔可夫过程,这个过程隐含着状态的转移和可见状态的概率。
\parinterval 隐马尔可夫模型是一种经典的序列模型\upcite{Baum1966Statistical,baum1970maximization}。它在语音识别、自然语言处理的很多领域得到了广泛的应用。隐马尔可夫模型的本质概率化的马尔可夫过程,这个过程隐含着状态间转移和可见状态生成的概率。
\parinterval 这里用一个简单的``抛硬币''游戏来对这些概念进行说明:假设有三枚质地不同的硬币A、B、C,已知这三个硬币抛出正面的概率分别为0.3、0.5、0.7。在游戏中,游戏发起者在上述三枚硬币中选择一枚硬币上抛,每枚硬币被挑选到的概率可能会受上次被挑选的硬币的影响,且每枚硬币正面向上的概率都各不相同。不停的重复挑选硬币、上抛硬币的过程,会得到一串硬币的正反序列,例如:抛硬币6次,得到:正正反反正反。游戏挑战者通过观察6次后获得的硬币正反序列,猜测每次选择的究竟是哪一枚硬币。
......@@ -341,9 +344,31 @@ $计算这种切分的概率值。
\label{fig:3.3-2}
\end{figure}
%-------------------------------------------
%
\parinterval 由于隐含状态序列之间存在转移概率,并且隐马尔可夫模型中隐含状态和可见状态之间存在着发射概率,因此根据可见状态的转移猜测隐藏状态序列并非无迹可循。图\ref{fig:3.3-3}描述了如何使用隐马尔可夫模型根据``抛硬币''结果推测挑选的硬币序列。可见,通过隐藏状态之间的联系(绿色方框及它们之间的连线)可以对有序的状态进行描述,进而得到隐藏状态序列所对应的可见状态序列(红色圆圈)。
\parinterval 从统计建模的角度看,上述过程本质上在描述隐含状态和可见状态出现的联合概率。这里,用$\mathbf{X}=(x_1,...,x_m)$表示可见状态序列,用$\mathbf{Y}=(y_1,...,y_m)$表示隐藏状态序列。(一阶)隐马尔可夫模型假设:
\begin{itemize}
\vspace{0.5em}
\item 当前位置的隐含状态仅与前一个位置的隐含状态相关,即$y_i$仅与$y_{i-1}$相关;
\vspace{0.5em}
\item 当前位置的可见状态仅与当前位置的隐含状态相关,即$x_i$仅与$y_i$相关。
\vspace{0.5em}
\end{itemize}
于是,联合概率$\funp{P}(\mathbf{X},\mathbf{Y})$可以被定义为:
\begin{eqnarray}
\funp{P}(\mathbf{X},\mathbf{Y}) & = & \funp{P}(\mathbf{X}|\mathbf{Y})\funp{P}(\mathbf{Y}) \nonumber \\
& = & \funp{P}(x_1,...,x_m|y_1,...,y_m) \funp{P}(y_1,...,y_m) \nonumber \\
& = & \prod_{i=1}^{m} \funp{P}(x_i|x_1,...,x_{i-1},y_1,...,y_m) \prod_{i=1}^{m} \funp{P}(y_i | y_{i-1}) \nonumber \\
& = & \prod_{i=1}^{m} \funp{P}(x_i|y_i) \prod_{i=1}^{m} \funp{P}(y_i | y_{i-1}) \nonumber \\
& = & \prod_{i=1}^{m} \funp{P}(x_i|y_i) \funp{P}(y_i | y_{i-1}) \label{eq:joint-prob-xy}
\end{eqnarray}
\noindent 这里,$y_{0}$表示一个虚拟的隐含状态。这样,可以定义$\funp{P}(y_1|y_{0}) \equiv \funp{P}(y_1)$,它表示起始隐含状态出现的概率。隐马尔可夫模型的假设也大大化简了问题,因此可以通过式\ref{eq:joint-prob-xy}很容易地计算隐含状态序列和可见状态序列出现的概率。值得注意的是,发射概率和转移概率都可以被看作是描述序列生成过程的“特征”。但是,这些“特征”并不是随意定义的,而是符合问题的概率解释。而这种基于事件发生的逻辑所定义的概率生成模型,通常可以被看作是一种{\small\bfnew{生成式模型}}\index{生成式模型}(Generative Model\index{Generative Model})。
%----------------------------------------------
\begin{figure}[htp]
\centering
......@@ -360,7 +385,7 @@ $计算这种切分的概率值。
\vspace{0.5em}
\item 参数学习:即给定硬币种类(隐含状态数量),根据多个可见状态序列(抛硬币的结果),估计模型的参数(转移概率),这个问题的求解需要用到EM算法\upcite{1977Maximum}
\vspace{0.5em}
\item 解码:即给定模型(转移概率和发射概率)和可见状态序列(抛硬币的结果),计算在可见状态序列的情况下,最可能出现的对应的状态序列,这个问题的求解需要用到基于动态规划方法,通常被称作{\small\bfnew{维特比算法}}\index{维特比算法}(Viterbi Algorithm)\index{Viterbi Algorithm}\upcite{1967Error}
\item 解码:即给定模型(转移概率和发射概率)和可见状态序列(抛硬币的结果),计算在可见状态序列的情况下,最可能出现的对应的状态序列,这个问题的求解需要用到基于动态规划的方法,通常也被称作{\small\bfnew{维特比算法}}\index{维特比算法}(Viterbi Algorithm)\index{Viterbi Algorithm}\upcite{1967Error}
\vspace{0.5em}
\end{itemize}
......@@ -368,13 +393,13 @@ $计算这种切分的概率值。
\begin{itemize}
\vspace{0.5em}
\item [(1)]根据可见状态序列(输入序列)和其对应的隐藏状态序列(标记序列)样本,估算模型的转移概率和发射概率;
\item 第一步:根据可见状态序列(输入序列)和其对应的隐藏状态序列(标记序列)样本,估算模型的转移概率和发射概率;
\vspace{0.5em}
\item [(2)]对于给定的可见状态序列,预测概率最大的隐藏状态序列,比如,根据输入的词序列预测最有可能的命名实体标记序列
\item 第二步:对于给定的可见状态序列,预测概率最大的隐藏状态序列,比如,根据输入的词序列预测最有可能的命名实体标记序列
\vspace{0.5em}
\end{itemize}
\parinterval 这里,用输入文本$\mathbf{X}$表示可见状态序列,待预测标签$\mathbf{Y}$表示隐藏状态序列。一种简单的办法是使用相对频度估计得到转移概率和发射概率估计值(公式\ref{eq:3.3-1}和公式\ref{eq:3.3-2})。
\parinterval 一种简单的办法是使用相对频次估计得到转移概率和发射概率估计值。令$x_i$表示第$i$个位置的可见状态,$y_i$表示第$i$个位置的隐藏状态,$\funp{P}(y_i|y_{i-1})$表示第$i-1$个位置到第$i$个位置的状态转移概率,$\funp{P}(x_i|y_{i}) $表示第$i$个位置的发射概率,于是有:
\begin{eqnarray}
\funp{P}(y_i|y_{i-1}) = \frac{{\textrm{Count}}(y_{i-1},y_i)}{{\textrm{Count}}(y_{i-1})}
\label{eq:3.3-1}
......@@ -385,27 +410,28 @@ $计算这种切分的概率值。
\label{eq:3.3-2}
\end{eqnarray}
\parinterval 其中${\rm{Count}}()$表示训练集中某种现象出现的次数。$i$表示序列的第$i$个位置。$x_i$是某可见状态,$y_i$是某隐藏状态。:
\noindent 其中,${\rm{Count}}()$统计训练集中某种现象出现的次数。
\parinterval 在获得转移概率和发射概率的基础上,对于一个句子进行命名实体识别可以被描述为:在观测序列$\mathbf{X}$(可见状态,即输入的词序列)的条件下,最大化标签序列$\mathbf{Y}$(隐藏状态,即标记序列)的概率,即
\parinterval 在获得转移概率和发射概率的基础上,对于一个句子进行命名实体识别可以被描述为:在观测序列$\mathbf{X}$(可见状态,即输入的词序列)的条件下,最大化标签序列$\mathbf{Y}$(隐藏状态,即标记序列)的概率,即
\begin{eqnarray}
\hat{\mathbf{Y}} = \arg\max_{\mathbf{Y}}\funp{P}(\mathbf{Y}|\mathbf{X})
\label{eq:3.3-3}
\end{eqnarray}
\parinterval 根据贝叶斯定理,该概率被分解为$\funp{P}(\mathbf{Y}|\mathbf{X})=\frac{\funp{P}(\mathbf{Y})\funp{P}(\mathbf{X}|\mathbf{Y})}{\funp{P}(\mathbf{X})}$,其中$\funp{P}(\mathbf{X})$是固定概率,因为$\mathbf{X}$在这个过程中可以被认为是不变的。因此只需考虑如何求解分子,则可将问题转换为求解公式\ref{eq:3.3-4}
\parinterval 根据贝叶斯定理,该概率被分解为$\funp{P}(\mathbf{Y}|\mathbf{X})=\frac{\funp{P}(\mathbf{X},\mathbf{Y})}{\funp{P}(\mathbf{X})}$,其中$\funp{P}(\mathbf{X})$是固定概率,因为$\mathbf{X}$在这个过程中是确定的不变量。因此只需考虑如何求解分子,即将求条件概率$\funp{P}(\mathbf{Y}|\mathbf{X})$的问题转化为求联合概率$\funp{P}(\mathbf{Y},\mathbf{X})$的问题
\begin{eqnarray}
\hat{\mathbf{Y}} = \arg\max_{\mathbf{Y}}\funp{P}(\mathbf{Y})\funp{P}(\mathbf{X}|\mathbf{Y})
\hat{\mathbf{Y}} = \arg\max_{\mathbf{Y}}\funp{P}(\mathbf{X},\mathbf{Y}) \label{eq:markov-sequence-argmax}
\label{eq:3.3-4}
\end{eqnarray}
\parinterval 在隐马尔可夫模型中隐含着这样的假设:某隐藏状态的概率仅由上一个隐藏状态决定(``抛硬币''游戏中,每枚硬币被挑选到的概率可能会受上次被挑选的硬币的影响)。这就意味着在隐马尔可夫模型中有:
\parinterval 将式\ref{eq:joint-prob-xy}带入式\ref{eq:markov-sequence-argmax}可以得到最终计算公式,如下:
\begin{eqnarray}
\hat{\mathbf{Y}} = \arg\max_{\mathbf{Y}}\prod_{i=1}^{m}\funp{P}(x_i|y_i)\funp{P}(y_i|y_{i-1})
\label{eq:3.3-5}
\end{eqnarray}
\parinterval\ref{fig:3.3-4}展示了基于隐马尔可夫模型的命名实体识别模型。值得注意的是,这种描述序列生成的过程也可以被应用于机器翻译,在第五章还将看到隐马尔可夫模型在翻译建模中的应用。
\parinterval\ref{fig:3.3-4}展示了基于隐马尔可夫模型的命名实体识别模型。实际上,这种描述序列生成的过程也可以被应用于机器翻译,在第五章还将看到隐马尔可夫模型在翻译建模中的应用。
%----------------------------------------------
\begin{figure}[htp]
......@@ -416,19 +442,20 @@ $计算这种切分的概率值。
\end{figure}
%-------------------------------------------
\vspace{0.5em}
\noindent b) {\small\bfnew{条件随机场}}
\vspace{0.5em}
\parinterval 隐马尔可夫模型有一个很强的假设:一个隐藏状态出现的概率仅由上一个隐藏状态决定。这个假设也会带来一些问题。举一个例子:在某个隐马尔可夫模型中,隐藏状态集合为\{A, B, C, D\},可见状态集合为\{T, F\}。其中隐藏状态A可能的后继隐藏状态集合为\{A, B\},隐藏状态B可能的后继隐藏状态集合为\{A, B, C, D\},于是有:
\parinterval 在隐马尔可夫模型中隐藏着这样的假设:某隐藏状态的概率仅由上一个隐藏状态决定。这个假设也会带来一些问题。举一个例子:在某个隐马尔可夫模型中,隐藏状态集合为{A、B、C、D},可见状态集合为{T、F},待预测的可见序列为T F F T。其中隐藏状态A可能的后继隐藏状态集合为{A、B},隐藏状态B可能的后继隐藏状态集合为{A、B、C、D},于是有:
\begin{eqnarray}
\funp{P}({\rm A}|{\rm A})+\funp{P}({\rm A}|{\rm B})=1
\label{eq:3.3-6}
\end{eqnarray}
\begin{eqnarray}
\funp{P}({\rm A}|{\rm B})+\funp{P}({\rm B}|{\rm B})+\funp{P}({\rm C}|{\rm B})+\funp{P}({\rm D}|{\rm B})=1
\label{eq:3.3-7}
\funp{P}({\rm A}|{\rm A})+\funp{P}({\rm A}|{\rm B}) & = & 1 \label{eq:3.3-6} \\
\funp{P}({\rm A}|{\rm B})+\funp{P}({\rm B}|{\rm B})+\funp{P}({\rm C}|{\rm B})+\funp{P}({\rm D}|{\rm B}) & = & 1 \label{eq:3.3-7}
\end{eqnarray}
\parinterval 其中,$\funp{P}(y|x)$表示由状态$x$转移到状态$y$的概率。由于式\ref{eq:3.3-6}中的分式数量少于式\ref{eq:3.3-7},这就导致在统计中获得的$\funp{P}({\rm A}|{\rm A})$$\funp{P}({\rm A}|{\rm B})$的值很可能会比$\funp{P}({\rm A}|{\rm B})$$\funp{P}({\rm B}|{\rm B})$$\funp{P}({\rm C}|{\rm B})$$\funp{P}({\rm D}|{\rm B})$要大。如图\ref{fig:3.3-5}所示,假设初始隐藏状态是A,图中线上的概率值是对应的转移概率与发射概率的乘积,比如图中隐藏状态A开始,下一个隐藏状态是A且可见状态是F的概率是0.45,下一个隐藏状态是B且可见状态是F的概率是0.55。图中可以看出,由于有较大的值,当可见状态序列为T F F T时,隐马尔可夫计算出的最有可能的隐藏状态序列为A A A A。但是如果对训练集进行统计可能会发现,当可见序列为T F F T 时,对应的隐藏状态是A A A A的概率可能是比较大的,但也可能是比较小的。这个例子中出现预测偏差的主要原因是:由于比其他状态转移概率要大得多,隐藏状态的预测一直停留在状态A。
\noindent 其中,$\funp{P}(b|a)$表示由状态$a$转移到状态$b$的概率。由于式\ref{eq:3.3-6}中的分式数量少于式\ref{eq:3.3-7},这就导致在统计中获得的$\funp{P}({\rm A}|{\rm A})$$\funp{P}({\rm A}|{\rm B})$的值很可能会比$\funp{P}({\rm A}|{\rm B})$$\funp{P}({\rm B}|{\rm B})$$\funp{P}({\rm C}|{\rm B})$$\funp{P}({\rm D}|{\rm B})$要大。
\parinterval\ref{fig:3.3-5}展示了一个具体的例子。有一个可见状态序列T F F T,假设初始隐藏状态是A,图中线上的概率值是对应的转移概率与发射概率的乘积,比如图中隐藏状态A开始,下一个隐藏状态是A 且可见状态是F 的概率是0.45,下一个隐藏状态是B 且可见状态是F的概率是0.55。图中可以看出,由于有较大的值,当可见状态序列为T F F T时,隐马尔可夫计算出的最有可能的隐藏状态序列为A A A A。但是如果对训练集进行统计可能会发现,当可见序列为T F F T 时,对应的隐藏状态是A A A A的概率可能是比较大的,但也可能是比较小的。这个例子中出现预测偏差的主要原因是:由于比其他状态转移概率要大得多,隐藏状态的预测一直停留在状态A。
%----------------------------------------------
\begin{figure}[htp]
......@@ -441,27 +468,27 @@ $计算这种切分的概率值。
\parinterval 上述现象也被称作{\small\bfnew{标注偏置}}\index{标注偏置}(Label Bias)\index{Label Bias}。条件随机场模型在隐马尔可夫模型的基础上,解决了这个问题\upcite{lafferty2001conditional}。在条件随机场模型中,以全局范围的统计归一化代替了隐马尔可夫模型中的局部归一化。除此之外,条件随机场模型中并非使用概率计算而是特征函数的方式对可见状态序列$\mathbf{X}$对应的隐藏状态序列$\mathbf{Y}$的概率进行计算。
\parinterval 条件随机场中一般有若干个特征函数,都是经过设计的、能够反映序列规律的一些二元函数\footnote{二元函数的函数值一般非1即0},并且每个特征函数都有其对应的权重$\lambda$。特征函数一般由两部分组成:能够反映隐藏序列之间转移规则的转移特征$\textbf{t}(y_{i-1},y_i,\mathbf{X},i)$和状态特征$\textbf{s}(y_i,\mathbf{X},i)$。其中$y_i$$y_{i-1}$分别是位置$i$和前一个位置的隐藏状态,$\mathbf{X}$则是可见状态序列。转移特征$\textbf{t}(y_{i-1},y_i,\mathbf{X},i)$反映了两个相邻的隐藏状态之间的转换关系,而状态特征$\textbf{s}(y_i,\mathbf{X},i)$则反映了第$i$个可见状态应该对应什么样的隐藏状态。这两部分共同组成了一个特征函数$F(y_{i-1},y_i,\mathbf{X})$,即
\parinterval 条件随机场中一般有若干个特征函数,都是经过设计的、能够反映序列规律的一些二元函数\footnote{二元函数的函数值一般非1即0},并且每个特征函数都有其对应的权重$\lambda$。特征函数一般由两部分组成:能够反映隐藏序列之间转移规则的转移特征$t(y_{i-1},y_i,\mathbf{X},i)$和状态特征$s(y_i,\mathbf{X},i)$。其中$y_i$$y_{i-1}$分别是位置$i$和前一个位置的隐藏状态,$\mathbf{X}$则是可见状态序列。转移特征$t(y_{i-1},y_i,\mathbf{X},i)$反映了两个相邻的隐藏状态之间的转换关系,而状态特征$s(y_i,\mathbf{X},i)$则反映了第$i$个可见状态应该对应什么样的隐藏状态。这两部分共同组成了一个特征函数$F(y_{i-1},y_i,\mathbf{X})$,即
\begin{eqnarray}
F(y_{i-1},y_i,\mathbf{X})=\textbf{t}(y_{i-1},y_i,\mathbf{X},i)+\textbf{s}(y_i,\mathbf{X},i)
F(y_{i-1},y_i,\mathbf{X}) & = & t(y_{i-1},y_i,\mathbf{X},i)+s(y_i,\mathbf{X},i)
\label{eq:3.3-8}
\end{eqnarray}
\parinterval 实际上,基于特征函数的方法更像是对隐藏状态序列的一种打分:根据人为设计的规则(特征函数),测试隐藏状态之间的转换以及隐藏状态与可见状态之间的对应关系是否符合这种规则。在处理序列问题时,假设可见状态序列$\mathbf{X}$的长度和待预测隐藏状态序列$\mathbf{Y}$的长度均为$I$,且共设计了$k$个特征函数,则有:
\parinterval 实际上,基于特征函数的方法更像是对隐藏状态序列的一种打分:根据人为设计的模板(特征函数),测试隐藏状态之间的转换以及隐藏状态与可见状态之间的对应关系是否符合这种模板。在处理序列问题时,假设可见状态序列$\mathbf{X}$的长度和待预测隐藏状态序列$\mathbf{Y}$的长度均为$m$,且共设计了$k$个特征函数,则有:
\begin{eqnarray}
\funp{P}(Y|X)=\frac{1}{Z(X)}\exp(\sum_i^I\sum_k\lambda_kF_k(y_{i-1},y_i,x,i))
\funp{P}(\mathbf{Y}|\mathbf{X}) & = & \frac{1}{Z(\mathbf{X})}\exp(\sum_{i=1}^m\sum_{j=1}^{k}\lambda_{j}F_{j}(y_{i-1},y_i,x,i))
\label{eq:3.3-9}
\end{eqnarray}
\parinterval 公式\ref{eq:3.3-9}中的$Z(X)$即为上面提到的实现全局统计归一化的归一化因子,其计算方式为:
\begin{eqnarray}
Z(X)=\sum_y\exp(\sum_i^I\sum_k\lambda_kF_k(y_{i-1},y_i,x,i))
Z(\mathbf{X})=\sum_{\mathbf{Y}}\exp(\sum_{i=1}^m\sum_{j=1}^k\lambda_{j}F_{j}(y_{i-1},y_i,x,i))
\label{eq:3.3-10}
\end{eqnarray}
\parinterval 由公式\ref{eq:3.3-10}可以看出,归一化因子的求解依赖于整个可见状态序列和每个位置的隐藏状态条件随机场模型中的归一化是一种全局范围的归一化方式。图\ref{fig:3.3-6}为条件随机场模型处理序列问题的示意图。
\parinterval 由公式\ref{eq:3.3-10}可以看出,归一化因子的求解依赖于整个可见状态序列和每个位置的隐藏状态,因此条件随机场模型中的归一化是一种全局范围的归一化方式。图\ref{fig:3.3-6}为条件随机场模型处理序列问题的示意图。
%----------------------------------------------
\begin{figure}[htp]
......@@ -472,8 +499,9 @@ Z(X)=\sum_y\exp(\sum_i^I\sum_k\lambda_kF_k(y_{i-1},y_i,x,i))
\end{figure}
%-------------------------------------------
\parinterval 虽然,式\ref{eq:3.3-9}和式\ref{eq:3.3-10}的表述相较于隐马尔可夫模型更加复杂,但是其实现有非常高效的方式。比如,可以使用动态规划方法完成整个条件随机场模型的计算,具体方法读者可以参看参考文献\upcite{lafferty2001conditional}
\parinterval 条件随机场模型处理命名实体识别任务时,可见状态序列对应着文本内容,隐藏状态序列对应着待预测的标签。对于命名实体识别任务,需要单独设计若干适合命名实体识别任务的特征函数。例如在使用BIOES标准标注命名实体识别任务时,标签``B-ORG''\footnote{表示机构实体名的开始标签}后面的标签必然是``I-ORG''或是``E-ORG'',而绝不可能是``O'',针此规则可以设计相应特征函数。
\parinterval 条件随机场模型处理命名实体识别任务时,可见状态序列对应着文本内容,隐藏状态序列对应着待预测的标签。对于命名实体识别任务,需要单独设计若干适合命名实体识别任务的特征函数。例如在使用BIOES标准标注命名实体识别任务时,标签``B-ORG''\footnote{ORG表示机构实体}后面的标签必然是``I-ORG''或是``E-ORG'',而不可能是``O'',针此规则可以设计相应特征函数。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -481,20 +509,20 @@ Z(X)=\sum_y\exp(\sum_i^I\sum_k\lambda_kF_k(y_{i-1},y_i,x,i))
\subsection{基于分类器的方法}
\parinterval 基于概率图的模型将序列表示为有向图或无向图,用图中的节点表示文本或是标签,如图\ref{fig:3.3-7}(a)、(b)所示。这种方法增加了建模的复杂度。既然这里要得到每个位置的类别输出,另一种更加直接的方法是使用分类器对每个位置进行独立预测。分类器是机器学习中广泛使用的方法,它可以根据输入自动地对类别进行预测。如图\ref{fig:3.3-7}(c)所示,对于序列标注任务,如果把每一个位置所对应的所有特征看作是输入,而把这个位置对应的标注看作输出,就可以直接使用分类器预测每个位置的标注结果。从这个角度说,隐马尔可夫模型等方法实际上也是在进行一种``分类''操作,只不过这些方法考虑了不同位置输出(或隐藏状态)之间的依赖。
\parinterval 基于概率图的模型将序列表示为有向图或无向图,如图\ref{fig:3.3-7}(a)、(b)所示。这种方法增加了建模的复杂度。既然要得到每个位置的类别输出,另一种更加直接的方法是使用分类器对每个位置进行独立预测。分类器是机器学习中广泛使用的方法,它可以根据输入自动地对类别进行预测。如图\ref{fig:3.3-7}(c)所示,对于序列标注任务,分类器把每一个位置所对应的所有特征看作是输入,而把这个位置对应的标签看作输出。从这个角度说,隐马尔可夫模型等方法实际上也是在进行一种``分类''操作,只不过这些方法考虑了不同位置输出(或隐含状态)之间的依赖。
%----------------------------------------------
\begin{figure}[htp]
\centering
\begin{tabular}{l l l}
\subfigure[HMM处理序列标注]{\input{./Chapter3/Figures/figure-process-sequence-labeling-by-hmm}} & \subfigure[CRF处理序列标注]{\input{./Chapter3/Figures/figure-process-sequence-labeling-by-crf}} & \subfigure[分类算法处理序列标注]{\input{./Chapter3/Figures/figure-process-sequence-labeling-by-classfication}}
\subfigure[HMM处理序列标注]{\input{./Chapter3/Figures/figure-process-sequence-labeling-by-hmm}} & \subfigure[CRF处理序列标注]{\input{./Chapter3/Figures/figure-process-sequence-labeling-by-crf}} & \subfigure[分类模型处理序列标注]{\input{./Chapter3/Figures/figure-process-sequence-labeling-by-classfication}}
\end{tabular}
\caption{HMM、CRF、分类算法三种方法对比}
\label{fig:3.3-7}
\end{figure}
%-------------------------------------------
\parinterval 值得注意的是分类模型可以被应用于序列标注之外的很多任务。在后面的章节中还会看到,机器翻译中的很多模型也借鉴了统计分类模型的思想。其中使用到的基础数学模型和特征定义形式,与这里提到的分类器本质上是一样的。
\parinterval 值得注意的是分类模型可以被应用于序列标注之外的很多任务。在后面的章节中还会看到,机器翻译中的很多模块也借鉴了统计分类的思想。其中使用到的基础数学模型和特征定义形式,与这里提到的分类器本质上是一样的。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
......@@ -504,11 +532,11 @@ Z(X)=\sum_y\exp(\sum_i^I\sum_k\lambda_kF_k(y_{i-1},y_i,x,i))
\parinterval 无论在日常生活中还是在研究工作中,都会遇到各种各样的分类问题,例如挑选西瓜时需要区分``好瓜''和``坏瓜''、编辑看到一篇新闻稿件时要对稿件进行分门别类。事实上,在机器学习中,对``分类任务''的定义会更宽泛而并不拘泥于``类别''的概念:在对样本进行预测时,只要预测标签集合是有限的且预测标签是离散的,就可认定其为分类任务。
\parinterval 具体来说,分类任务目标是训练一个可以根据输入数据预测离散标签的分类器(也可称为分类模型)。在有监督的分类任务中\footnote{与之相对应的,还有无监督、半监督分类任务,不过这些内容不是本书讨论的重点。读者可以参看\upcite{周志华2016《机器学习》}\upcite{李航2019统计学习方法}对相关概念进行了解。},训练数据集合通常由形似$(\mathbf{x}_i,y_i)$的带标注数据构成:$\mathbf{x}_i=(x_1,x_2,\ldots,x_m)$作为分类器的输入数据(通常被称作一个训练样本),例如文本分类任务中的单词表示、图像分类任务中的像素表示;$y_i$作为输入数据对应的{\small\bfnew{标签}}\index{标签}(label)\index{label},反映了输入数据对应的``类别''。若标签集合大小为$n$,则分类任务的本质是通过对训练数据集合的学习,建立一个从$m$维样本空间到$n$维标签空间的映射关系。更确切地说,分类任务的最终目标是学习一个条件概率分布:$\funp{P}(Y|X)$,其中$X=(\mathbf{x}_1,\mathbf{x}_2,\ldots,\mathbf{x}_m)$代表着所有可能出现的输入数据集合,$Y=(y_1,y_2,\ldots,y_n)$代表着标签集合,通过比较$\funp{P}(y_1|\mathbf{x}_i)$$\funp{P}(y_2|\mathbf{x}_i)$$\ldots$$\funp{P}(y_n|\mathbf{x}_i)$之间的大小关系从而确定输入数据$\mathbf{x}_i$最终的类别标签
\parinterval 具体来说,分类任务目标是训练一个可以根据输入数据预测离散标签的{\small\bfnew{分类器}}\index{分类器}(Classifier\index{Classifier}),也可称为分类模型。在有监督的分类任务中\footnote{与之相对应的,还有无监督、半监督分类任务,不过这些内容不是本书讨论的重点。读者可以参看参考文献\upcite{周志华2016《机器学习》,李航2019统计学习方法}对相关概念进行了解。},训练数据集合通常由形似$(\mathbf{x}_i,y_i)$的带标注数据构成:$\mathbf{x}_i=(x_i^1,x_i^2,\ldots,x_i^k)$作为分类器的输入数据(通常被称作一个训练样本),其中$x_i^j$表示样本$\mathbf{x}_i$的第$j$个特征;$y_i$作为输入数据对应的{\small\bfnew{标签}}\index{标签}(Label)\index{Label},反映了输入数据对应的``类别''。若标签集合大小为$n$,则分类任务的本质是通过对训练数据集合的学习,建立一个从$k$维样本空间到$n$维标签空间的映射关系。更确切地说,分类任务的最终目标是学习一个条件概率分布$\funp{P}(y|\mathbf{x})$,这样对于输入$\mathbf{x}$可以找到概率最大的$y$作为分类结果输出
\parinterval 与概率图模型一样,分类模型中也依赖特征定义。其定义形式与\ref{sec3:feature}节的描述一致,这里不再赘述。分类任务一般根据类别数量分为二分类任务和多分类任务。二分类任务是最经典的分类任务,只需要对输出进行非零即一的预测。多分类任务则可以有多种处理手段,比如,可以将其``拆解''为多个二分类任务求解,或者直接让模型输出多个类别中的一个。在命名实体识别中,往往会使用多类别分类模型。比如,在BIO标注下,有三个类别(B、I和O)。一般来说,类别数量越大分类的难度也越大。比如,BIOES标注包含5个类别,因此使用同样的分类器,它要比BIO标注下的分类问题难度大。另一方面,更多的类别有助于准确的刻画目标问题。因此在实践中需要在类别数量和分类难度之间找到一种平衡。
\parinterval 在机器翻译和语言建模中也会遇到类似的问题,比如,生成单词的过程可以被看做是一个分类问题,类别数量就是词表的大小。显然,词表越大可以覆盖更多样的词法变化,但是过大的词表里会包含很多低频词,其计算复杂度会显著增加。但是,过小的词表又无法包含足够多的单词。因此,在设计这类系统的时候对词表大小的选择(类别数量的选择)是十分重要的,往往要通过大量的实验得到最优的设置。
\parinterval 在机器翻译和语言建模中也会遇到类似的问题,比如,生成单词的过程可以被看做是一个分类问题,类别数量就是词表的大小。显然,词表越大可以覆盖更多样的单词及形态学变化,但是过大的词表里会包含很多低频词,其计算复杂度会显著增加。但是,过小的词表又无法包含足够多的单词。因此,在设计这类系统的时候对词表大小的选择(类别数量的选择)是十分重要的,往往要通过大量的实验得到最优的设置。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
......@@ -516,19 +544,19 @@ Z(X)=\sum_y\exp(\sum_i^I\sum_k\lambda_kF_k(y_{i-1},y_i,x,i))
\subsubsection{2. 经典的分类模型}
\parinterval 经过多年的发展,研究者提出了很多分类模型。由于篇幅所限,本书无法一一列举这些模型,这里仅列出了部分经典的模型。关于分类模型更全面的介绍可以参考相关文献\upcite{harrington2013机器学习实战}\upcite{李航2019统计学习方法}
\parinterval 经过多年的发展,研究者提出了很多分类模型。由于篇幅所限,本书无法一一列举这些模型,这里仅列出了部分经典的模型。关于分类模型更全面的介绍可以参考相关文献\upcite{harrington2013机器学习实战,李航2019统计学习方法}
\begin{itemize}
\vspace{0.5em}
\item K-近邻分类算法。K-近邻分类算法通过计算不同特征值之间的距离进行分类,这种方法适用于可以提取到数值型特征\footnote{即可以用数值大小对某方面特征进行衡量。}的分类问题。该方法的基本思想为:将提取到的特征分别作为坐标轴,建立一个$n$维坐标系(当特征数量为$n$时),此时每个样本都将成为该$n$维空间的一个点,将未知样本与已知类别样本的空间距离作为分类依据进行分类。
\item $K$-近邻分类算法。$K$-近邻分类算法通过计算不同特征值之间的距离进行分类,这种方法适用于可以提取到数值型特征\footnote{即可以用数值大小对某方面特征进行衡量。}的分类问题。该方法的基本思想为:将提取到的特征分别作为坐标轴,建立一个$k$维坐标系(对应特征数量为$k$的情况),此时每个样本都将成为该$k$维空间的一个点,将未知样本与已知类别样本的空间距离作为分类依据进行分类,比如,考虑与输入样本最近的$K$个样本的类别进行分类。
\vspace{0.5em}
\item 支持向量机。支持向量机是一种二分类模型,其思想是通过线性超平面将不同输入划分为正例和负例,并使线性超平面与不同输入的距离都达到最大。与K-近邻分类算法类似,支持向量机也适用于可以提取到数值型特征的分类问题。
\item 支持向量机。支持向量机是一种二分类模型,其思想是通过线性超平面将不同输入划分为正例和负例,并使线性超平面与不同输入的距离都达到最大。与$K$-近邻分类算法类似,支持向量机也适用于可以提取到数值型特征的分类问题。
\vspace{0.5em}
\item 最大熵模型。最大熵模型是根据最大熵原理提出的一种分类模型,其基本思想是:以在训练数据集中学习到的经验知识作为一种``约束'',并在符合约束的前提下,在若干合理的条件概率分布中选择``使条件熵最大''的模型。
\vspace{0.5em}
\item 决策树分类算法。决策树分类算法是一种基于实例的归纳学习方法:将样本中某些决定性特征作为决策树的节点,根据特征表现进行对样本划分,最终根节点到每个叶子节点均形成一条分类的路径规则。这种分类方法适用于可以提取到离散型特征\footnote{即特征值是离散的。}的分类问题。
\vspace{0.5em}
\item 朴素贝叶斯分类算法。朴素贝叶斯算法是以贝叶斯定理(其主要内容为$\funp{P}(B_i|A)=\frac{\funp{P}(B_i)\funp{P}(A|B_i)}{\sum_{j=1}^n\funp{P}(B_j)\funp{P}(A|B_j)}$为基础并且假设特征之间相互独立的方法:以特征之间相互独立作为前提假设,学习从输入到输出的联合概率分布,并以后验概率最大的输出作为最终类别。
\item 朴素贝叶斯分类算法。朴素贝叶斯算法是以贝叶斯定理为基础并且假设特征之间相互独立的方法:以特征之间相互独立作为前提假设,学习从输入到输出的联合概率分布,并以后验概率最大的输出作为最终类别。
\vspace{0.5em}
\end{itemize}
......@@ -538,7 +566,7 @@ Z(X)=\sum_y\exp(\sum_i^I\sum_k\lambda_kF_k(y_{i-1},y_i,x,i))
\section{句法分析(短语结构分析)}
\parinterval 前面两节已经介绍了什么叫做``词''、如何对分词问题进行统计建模。同时,也介绍了如何对多个单词构成的命名实体进行识别。无论是分词还是命名实体识别都是句子浅层信息的一种表示。对于一个自然语言句子来说,它更深层次的结构信息可以通过更完整的句法结构来描述,而句法结构也是机器翻译和自然语言处理其他任务中常用的知识之一。
\parinterval 前面两节已经介绍了什么叫做``词''、如何对分词问题进行统计建模。同时,也介绍了如何对多个单词构成的命名实体进行识别。无论是分词还是命名实体识别都是句子浅层信息的一种表示。对于一个自然语言句子来说,它更深层次的结构信息可以通过更完整的句法结构来描述,而句法结构也是机器翻译和自然语言处理其他任务中常用的知识之一。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -811,7 +839,7 @@ r_6: & & \textrm{VP} \to \textrm{VV}\ \textrm{NN} \nonumber
\label{eq:3.4-8}
\end{eqnarray}
\parinterval\ref{fig:3.4-7}展示了通过这种方法计算规则概率的过程。与词法分析类似,可以统计树库中规则左部和右部同时出现的次数,除以规则左部出现的全部次数,所得的结果就是所求规则的概率。这种方法也是典型的相对频估计。但是如果规则左部和右部同时出现的次数为0时是否代表这个规则概率是0呢?遇到这种情况,可以使用平滑方法对概率进行平滑处理,具体思路可参考{\chaptertwo}内容。
\parinterval\ref{fig:3.4-7}展示了通过这种方法计算规则概率的过程。与词法分析类似,可以统计树库中规则左部和右部同时出现的次数,除以规则左部出现的全部次数,所得的结果就是所求规则的概率。这种方法也是典型的相对频估计。但是如果规则左部和右部同时出现的次数为0时是否代表这个规则概率是0呢?遇到这种情况,可以使用平滑方法对概率进行平滑处理,具体思路可参考{\chaptertwo}内容。
%-------------------------------------------
\begin{figure}[htp]
......@@ -858,4 +886,4 @@ r_6: & & \textrm{VP} \to \textrm{VV}\ \textrm{NN} \nonumber
\vspace{0.5em}
\item 从自然语言处理的角度来看,词法分析和语法分析的一部分内容都是典型的序列标注问题,例如本章正文部分介绍的分词和命名实体识别都可以看成序列标注的问题,此外序列标注还可以被扩展到词性标注\upcite{brants-2000-tnt}、组块识别\upcite{tsuruoka-tsujii-2005-chunk}、关键词抽取\upcite{li-etal-2003-news-oriented}、词义角色标注\upcite{chomsky1993lectures}等任务,本章着重介绍了传统的基础方法,前沿的方法大多与深度学习相结合,感兴趣的读者可以自行了解,其中比较有代表性的包括双向长短期记忆网络和条件随机场相结合的模型结构(BiLSTM-CRF)\upcite{2015Bidirectional}、双向长短期记忆网络和卷积神经网络的混合模型(BiLSTM-CNNs)\upcite{chiu2016named}、双向长短期记忆网络和softmax结构相结合的模型\upcite{vzukov2018named}等。此外,对于序列标注任务,模型性能很大程度上依赖其输入表示,因此集成或微调预训练语言模型的方法也能应用于序列标注任务\upcite{Li2020A},常见的预训练语言模型包括BERT\upcite{devlin2018bert}、GPT\upcite{radford2018improving}、XLM\upcite{conneau2019unsupervised}等。
\vspace{0.5em}
\end{itemize}
\ No newline at end of file
\end{itemize}
......@@ -131,12 +131,12 @@
% CHAPTERS
%----------------------------------------------------------------------------------------
\include{Chapter1/chapter1}
\include{Chapter2/chapter2}
%\include{Chapter1/chapter1}
%\include{Chapter2/chapter2}
\include{Chapter3/chapter3}
\include{Chapter4/chapter4}
\include{Chapter5/chapter5}
\include{Chapter6/chapter6}
%\include{Chapter4/chapter4}
%\include{Chapter5/chapter5}
%\include{Chapter6/chapter6}
%\include{Chapter7/chapter7}
%\include{Chapter8/chapter8}
%\include{Chapter9/chapter9}
......@@ -149,7 +149,7 @@
%\include{Chapter16/chapter16}
%\include{Chapter17/chapter17}
%\include{Chapter18/chapter18}
\include{ChapterAppend/chapterappend}
%\include{ChapterAppend/chapterappend}
%----------------------------------------------------------------------------------------
......
File mode changed from 100644 to 100755
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论