在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 563412 点 威望 12 点 阅读权限 255 积分 174246 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
【文本匹配】交互型模型
2 h9 r+ O; g7 e) I |& e
6 u& Z# [7 n7 T 表示型的文本匹配模型存在两大问题:(1)对各文本抽取的仅仅是最后的语义向量,其中的信息损失难以衡量;(2)缺乏对文本pair间词法、句法信息的比较
9 d' W7 |4 |( R1 W 5 I+ _3 }7 R7 P, f" W
而交互型的文本匹配模型通过尽早在文本pair间进行信息交互,能够改善上述问题。
+ e) J( v% r* V2 x
) j4 c- ]- p1 U" e3 i 基于交互的匹配模型的基本结构包括:& X) Q8 @ [7 z' s, D
! {* y) i1 ^/ h G, i4 V (1)嵌入层,即文本细粒度的嵌入表示;
3 J. e" ^% l& _0 I2 w' b& m ) `- U3 ]6 ?; N- Z# y- Y
(2)编码层,在嵌入表示的基础上进一步编码;
& G4 \: |8 h& O% z! u
- d" e- g% k, L" ~' o (3)匹配层:将文本对的编码层输出进行交互、对比,得到各文本强化后的向量表征,或者直接得到统一的向量表征;. S& |8 K. O/ B) r P
, m) q( h* ~: Z
(4)融合层:对匹配层输出向量进一步压缩、融合;" `0 C: b' @: J( o" m: S" C7 N
9 }8 Y2 o% F! f8 Z" W3 E (5)预测层:基于文本对融合后的向量进行文本关系的预测。" [8 `7 J+ O3 C
0 ]( {8 g, O# a
+ r* g' q% p; M1 R: Q/ L
* j G* t: z9 O7 [$ w9 h# [2 l
1. ARC-II
; z2 O2 E! P7 S7 F) M# K$ o" e$ @ ARC-II模型是和表示型模型ARC-I模型在同一篇论文中提出的姊妹模型,采用pair-wise ranking loss的目标函数。
' }3 x; d3 U( } + L6 ?; ~! w3 Q9 s( |* l$ E* X
其核心结构为匹配层的设计:
8 u* d. u( ?0 l, p
1 U" N# p. _3 x- z- N; ^4 O (1)对文本pair的n-gram Embedding结果进行拼接,然后利用1-D CNN得到文本S_X中任一token i和文本S_Y中任一token j的交互张量元素M_{ij}。该操作既然考虑了n-gram滑动窗口对于local信息的捕捉,也通过拼接实现了文本pair间低层级的交互。
7 U( V( F! I$ e/ e% T/ ^
8 ?& f( }* s6 I: j, h7 }! Z4 Y: D (2)对交互张量进行堆叠的global max-pooling和2D-CNN操作,从而扩大感受野。; F1 S ^$ \9 h5 A
Z- f% e, e' c+ }& P* Y# B1 B+ A 2. PairCNN
) R* e8 F* g! h, W; ^& D1 n/ V5 E PairCNN并没有选择在Embedding后直接进行query-doc间的交互,而是首先通过TextCNN的方式分别得到query和doc的向量表征,然后通过一个中间Matrix对query和doc向量进行交互得到pair的相似度向量,然后将query的向量表征、doc的向量表征、相似度向量以及其它的特征向量进行拼接,最后经过两层的MPL得到最后的二分类向量。, U% X7 }. v% n- [
# [7 D- |* u( e8 _/ \( |
PairCNN的模型架构中的亮点在于各View向量的拼接,既能利用原始的语义向量,还能够很便捷的融入外部特征。4 J1 F& ~) m8 K9 |1 e0 R5 \+ q
* |/ k& `- J0 I: ?' A- M 3. MatchPyramid$ h- J2 l/ ]& w& @! u
无论是ARC-II中的n-gram拼接+1D conv还是Pair-CNN中的中间Matrix虽然均通过运算最终达到了信息交互的作用,但其定义还不够显式和明确,MatchPyramid借鉴图像卷积网络的思想,更加显式的定义了细粒度交互的过程。
p! t$ e% w; }- j. @ MatchPyramid通过两文本各token embedding间的直接交互构造出匹配矩阵,然后将其视为图片进行2D卷积和2D池化,最后Flatten接MLP计算得匹配分数。本文共提出了三种匹配矩阵的构造方式:
- F( D! j% V' n! F/ k l% X $ X5 u8 E; @( G0 `$ r
(1)Indicator:0-1型,即一样的token取1,否则取0;这种做法无法涵盖同义多词的情况;$ a/ N+ ~! E! m% _
4 q: U0 }2 M% b
(2)Cosine:即词向量的夹角余弦;2 m% \: A* E8 c$ d% R
7 [6 ^- T: }: y+ v$ E$ { {) } (3)Dot Product:即词向量的内积; j5 h- A4 {/ w8 O
1 a8 `! U; R! f" n+ w& A& z 此外值得注意的是因为各个文本pair中句子长度的不一致,本文并没有采用padding到max-lenght的惯用做法,而是采用了更灵活的动态池化层,以保证MPL层参数个数的固定。* [/ }7 M$ ?( k
+ \5 T9 m0 Q C/ {# t 4. DecAtt
3 v! A4 ~* _! K1 w, M DecAtt将注意力机制引入到交互型文本匹配模型中,从而得到各token信息交互后增强后的向量表征。( G2 X6 h m, Q- h
; x6 E( @ y; y. ?3 ]1 T: e4 T
模型被概括为如下层级模块:/ Z1 r4 d& I' {- i# ?& p! y
$ k2 N1 j3 g+ T+ |6 z
(1)Attend层:文章提供了两种注意力方案,分别为文本间的cross-attention,以及各文本内的intra-attention。具体而言,分别采用前向网络F和F_{intra}对文本token embedding进行编码,然后通过F(x)F(y)计算cross-attention的score,以及F_{intra}(x)F_{intra}(y)计算self-attention的score。然后利用softmax将attention score进行归一化,再对各token embedding进行加权平均,得到当前query token处的增强表征,最后与原始token embedding进行拼接计为attend后的最终embedding。- l$ v I; v# g# o& t4 ?; P, ~
" ^$ b; i+ y1 q3 v9 s% W% ?, R (2)Compare层:将前序Attend层计算得到的最终embedding,喂入一个全连接层进行向量维度的压缩。
: Z; R; ?! O. @+ D* w
& D# i3 Q* K: s! P3 h (3)Aggregate层:将每个文本各token处压缩后的向量进行简单的求和,再拼接起来通过MPL得到最后的匹配得分。
. m$ r6 `8 [5 {6 X, k W ; ^6 N6 J% H5 D4 v9 [' C& }
5. CompAgg& M/ _0 u0 G7 a( W# v/ C
CompAgg详细对比了在文本间cross-attention得到的各token向量表征与原始token向量进行compare的各种方案。# z+ U% T7 o+ ^/ ]5 Q# w5 }
* T) e$ V: u5 G2 ^5 m8 N+ T4 l7 E# u; m 该模型的主要结构包括:+ i; \9 L, F1 w4 i% {3 w0 l
; `" Z# g+ {& G
(1)reprocessing层:采用类似于LSTM/GRU的神经网络得到token的深层表示(图中的\bar a_i);# p( o+ a2 o' K& m2 b
4 l7 {1 k7 s& f9 p
(2)Attention层:利用软注意力机制计算文本间的cross-attention(与DecAtt相同),从而得到各token处交互后的向量表示(图中的h_i);/ D$ F3 \5 J" b* u
9 v& v/ x. a' D8 Z: i (3)Comparison层:通过各种网络结构或计算将\bar a_i和h_i计算求得各token的最终表征。
* O d* [4 w$ W! N& E) R ; @5 C9 ^( q5 P; Y' E7 T) a
(4)Aggregation层:利用CNN网络对Comparison层的输出进行计算,得到最后的匹配得分。2 i% N8 ^2 y6 ~; h0 }5 c
c7 E4 n7 K. v& W+ X# J 其中Comparison层的构造方式包括:
- ?( W! \ u6 L+ E" ~" t3 C# R: E
# K" y- o6 Y! Q+ S+ X (1)矩阵乘法,类似于Pair-CNN中的中间Matrix# g1 r! i+ c; d7 }' c
/ J. u$ Y% X- ^- { y- i (2)前向神经网络,即将\bar a_i和h_i进行拼接,然后利用输入FFN;) g5 L9 T8 Q7 w5 S6 ~8 j
9 n3 g2 ^' U" J% e2 ]
(3)分别计算cosine和欧式距离,然后拼接;3 h$ T1 w- \3 K8 p% E0 l' w
1 M/ s D% q: L; _+ o (4)各维度进行减法;# w7 Y; j* Q8 G& G, p+ K
* I1 K, ^! g* o7 ?' K, w, y (5)各维度进行乘法;
' f/ z; ~3 ]$ }; }) o; J
6 X' I8 h% C1 K# E (6)各维度进行减法和乘法,然后再接一个前向网络。
$ `2 J+ J6 @ F8 V7 M
0 o1 m9 E5 Y: z& @% J6 X0 @5 C 6. ABCNN
9 n1 @- C8 V& t3 m8 N( }9 s7 ~! q ABCNN是将Attention机制作用于BCNN架构的文本匹配模型。
2 O3 g2 k- \+ e. V3 H, j
5 x: C" i2 l2 L7 z/ ^! `8 ~$ k 6.1 BCNN( g$ ^# Q5 a7 U% p# {
首先简单介绍下BCNN架构:0 N/ Z, f. x# w, z- g
5 r2 l& q% L: h: \5 b' [4 u BCNN的整体结构比较简单:(1)输入层;(2)卷积层,因为采用了反卷积的形式,所以在size上会增加;
* b0 l" {3 q5 P" C; ?5 |; G9 q1 [4 O 1 v: J& G+ D3 X5 c; O7 {. A' O
(3)池化层,采用了两种池化模式,在模型开始阶段采用的是local平均池化,在最后句子向量的抽取时采用了global平均池化;(4)预测层,句子向量拼接后采用LR得到最后的匹配得分。
! _/ M3 [! x" ?2 F1 q4 T
3 b4 b% _. h3 t ABCNN共包括三种变形,下面依次介绍。
) b5 g% K6 r3 v8 `, Y
6 v7 |2 \) E: G' T1 s; p 6.2 ABCNN
. f' R' s# S E0 A, Y" N 2 Y1 k8 O3 b- v
ABCNN-1直接将Attention机制作用于word embedding层,得到phrase 级的词向量表示。区别于CompAgg中的软注意力机制,ABCNN-1直接基于下式得到注意力矩阵: A i j = 1 1 + ∣ x i − y j ∣ A_{ij}=\frac{1}{1+|x_i-y_j|} A 8 L/ d3 ^' D9 L9 S
ij
3 [% J4 _1 Y& B2 V/ Y8 c , y( {% m4 ~. D6 i0 S' M
=
Z6 e3 X! [) M0 `. G7 H; o 1+∣x % ~; w, p& N1 o' R7 ^" K3 j
i8 x" p+ K# c& y; b/ B
s f8 D+ I) l: J
−y 9 }( [2 \5 X1 \$ a1 l7 X
j
4 `8 R4 O& e7 m3 a" Y o: \: \" E % r5 ~6 h: C! f4 w! l$ ?* G
∣8 @% f$ p' u$ k2 p* G- Y" q
1
# j' h7 Z$ F: @5 j; U! _& U: O
$ ?3 g5 j$ f6 }# S& h ,然后分别乘以可学习的权重矩阵 W 0 W_0 W
1 Z }: A6 p$ Z2 r% {; V) { 0# t5 q4 X0 z$ e& i- U0 @! p2 I
- N8 G0 ^- V; \1 G9 @( H. n
和 W 1 W_1 W
, p8 v5 Y& e9 H5 x2 w7 C7 A* v2 ^ 1+ L8 X3 C" h; @
q8 P# l( P; b, q! b3 T
得到attetion feature map。1 b( G t+ U8 z" ?+ I4 W& L& B
+ h0 O- Y5 D$ S! J- ]) V 6.3 ABCNN-2
: Y# ^8 {/ j, t9 R3 m: I4 n5 ?, `% L6 A $ ?. @1 @0 P2 W" E h# @$ K
ABCNN-2将Attention机制作用于word embedding层后的反卷积层的输出结果,其中注意力矩阵的计算原理与ABCNN-1一致。然后将注意力矩阵沿着row和col的方向分别求和,分别代表着各文本token的attention socre;接着将反卷积层的输出结果与attention socre进行加权平均池化,得到与输入层相同shape的特征图。, Y& l% W: O3 r
: k0 i2 W, Y4 x* B. D 6.4 ABCNN-3
1 _# M5 G/ G' X# A. a- a . w4 A: ^( Y; k# ]0 {
ABCNN-3的基本模块可视为ABCNN-1和ABCNN-2的堆叠,即在嵌入层和卷积层上面都引入了attention的机制用来增强对token向量的表示。
% u2 q) G4 x2 | t' z6 s7 ~0 ?
( W( Z7 U5 Z& L. o7 O9 }0 U 7. ESIM
" u/ m- b3 _- t3 q3 \ ESIM模型基于NLI任务给出了一种强有力的交互型匹配方法。其采用了BiLSTM和Tree-LSTM分别对文本序列和文本解析树进行编码,其亮点在于:- T0 K* D+ ?, |! W$ m; s
' O# a; o* P0 @* Y' X, P4 { (1)匹配层定义了cross-attention得到各token的向量表示与原token向量间的详细交互关系,即采用 [ a ˉ , a ^ , a ˉ − a ^ , a ˉ ∗ a ^ ] [\bar a, \hat a,\bar a-\hat a,\bar a* \hat a] [
: |- C" c" ]+ k. X! A a& E9 E8 f: Z% ]+ b
ˉ/ y' _0 o& f# @3 ?# I: R
,
8 P) J) p B0 a8 H1 ~4 X! v) I a
0 N7 w ]; X4 C& d1 L/ n% w1 H ^1 }$ I2 g; M9 |% W$ t5 h
,
; C$ y- e2 ^: r" \ a8 p* c9 e+ ~7 ]; g0 v
ˉ: r; D& \+ J/ r* Q# t
−
6 t( l; j5 S1 m2 K2 w$ q. h a3 c3 c- C3 } ?: q" {3 F$ d9 r- K1 n$ W8 Z
^1 f" _7 i" i( ~% y2 p
,
+ v* |4 E1 F4 ?! H. j! g0 v a2 o5 H3 e1 T$ \! Q% M6 K
ˉ9 v* r6 G' w+ r8 b
∗
6 R% S$ s# B3 U5 K3 ^* i a
( E' _% C: o- @ ^8 K5 S# P/ s; m- I, k! ]8 ^7 L6 [
]作为最终文本token的向量表示,这也成为后续文本匹配模型的惯用做法。* a& T7 G' d# g5 J& c6 L E
9 m4 } D/ J9 n: j
(2)聚合层通过BiLSTM得到各文本token的编码,从而进一步增强了文本序列的信息传递;* u) ?, b2 L- P& ^$ f2 D' U$ Q
5 t; h5 D' G5 o$ \5 ] (3)预测层通过拼接各文本token编码的max-pooling和mean-pooling结果,再经过MPL进行匹配预测。
+ V6 ^/ D" x* F$ y# ] 0 Z/ |0 `; s$ P J
: l; ~* A9 Y7 P9 y8 x2 G6 B; H1 e
9 \ {5 R& S3 }. N) p9 ? 8. Bimpm
6 {/ u" W( P0 F }% |3 c Bimpm可视为对之前各类交互型文本匹配模型的一次总结。
5 U# f4 M2 i/ |) _+ d0 Z " j f- M( k9 L, E1 K% P1 Q
该模型在各层的具体做法总结如下:
G7 ? N) b6 U$ r# Q* h$ Y9 Q$ z 3 C8 B% M; U! B7 L' J
(1)编码层采用BiLSTM得到每个token隐层的向量表示;
3 T" r" F2 _1 g7 T% s& T8 ] 5 Q) v( _! k6 m& C7 x
(2)匹配层遵循 m k = c o s i n e ( W k ∗ v 1 , W k ∗ v 2 ) m_k=cosine(W_k*v_1,W_k*v_2) m
/ C8 c/ l2 \8 W k9 c( u7 \0 e9 K9 W$ h
. ]; k0 X1 J7 d( i* ]3 M" O =cosine(W ) i& N" V9 w* N9 f' D# B* P8 L
k$ R; Z }0 r3 ~8 @$ g% a0 u
9 {2 Y9 P. R+ ^: F& n
∗v
7 k/ B, I" t7 _4 f- i; H: R 1# C! S% o' O# }2 c9 q* B" f, Z
$ v7 _+ l2 X. x. E8 X' _
,W
6 q7 s' _3 m$ y4 L0 D2 G& L k4 ?3 P* Z3 t. ~) {$ [5 z
+ s- V3 y1 O' N) ^$ M2 E
∗v " W; ?! k8 ~7 R6 L9 D8 `' H
2
# |; S2 x$ \8 }1 a6 {( B, P8 | t G7 h% ~* \: e
)的方式可以得到两个文本的任意token pair之间在第k个view下的匹配关系,至于 v 1 v_1 v ' r& R1 E% Q* ~( p
1
1 {8 Q8 l; N; I% _& W8 H$ I - Q. e' q0 E$ s) F; _! H
和 v 2 v_2 v
/ R$ y7 Y! k9 {. A' c 29 |! p |1 q- y6 T- v3 g8 j7 q4 C
. h; T5 |( M# H. Y4 F) c" p' y
如何取,文章提供了4种策略:- _2 @0 ?; h c& ~
$ h0 o$ n& u4 ^, m$ p+ d 策略一:其中一个句子取各token隐层的向量表示,另一个句子采用隐层最后时间步处的输出;3 L8 v- o( Z4 N% A' q" w
策略二:其中一个句子取各token隐层的向量表示,另一个句子采用隐层各时间步输出与之匹配后取再取Max-Pooling值;9 `+ H q8 j& Z5 l" W& Q2 l) p7 n
策略三:其中一个句子取各token隐层的向量表示,另一个句子采用cross-attentive后得到的加权句子向量;
[4 T: ~, F" E 策略四:其中一个句子取各token隐层的向量表示,另一个句子采用cross-attentive后attention score最高处token的向量作为句子向量。! h: R" V6 Y5 Z& J
这四种策略的区别在于对句子向量的计算不同。
( Q4 \. d4 u" L, d( W5 b
0 t! W. N0 m3 [) ]. A) I6 v
u* @# V3 r! p9 ?' m1 d% j (3)聚合层,首先对上面各种策略得到的输出层再通过一层BiLSTM层,然后将各策略下最后时间步的输出进行拼接,得到最后的聚合向量;" i9 b' D: w5 X4 f; U6 V
; U7 o% _2 Z; O; z7 i+ ]" l( F (4)预测层:两层MPL+softmax1 U! ^ \# f/ F6 [5 q R1 ~
7 v4 K- U& j" v. j7 b, b1 f+ x 9. HCAN+ c- e! k6 }8 ]' a4 `) G+ ?
HCAN是除Bert类模型外在文本匹配领域表现最为优异的深度模型之一,其采用了较为复杂的模型结构。% j6 A. U7 N' f
1 @+ J' K: y5 ~7 K/ \! D8 M 针对于信息抽取问题,文章首先分析了相关性匹配和语义匹配的差异:
4 a6 N; a/ D- g- K- y
: x) @% o0 R& ^- `+ @ p3 o (1)相关性匹配主要关注于关键词的对比,因此更关注低层级词法、语法结构层面的匹配性;5 \* f1 ?% k& t# ^
( f( ^! t, d& V6 |3 H% |& J" C E (2)语义匹配代表着文本的平均意义,因此其关注更高、更丑想的语义层面的匹配性。! \0 V" I( n; m+ W
- s+ f) @! I: v- j5 Z7 p2 h( y; {$ U
该模型首先采用三类混合的编码器对query和context进行编码:
/ H% s/ z$ l: f( o
7 \$ J. v# i: T0 Q9 N) o+ ] L (1)深层相同卷积核大小的CNN编码器;
! d: l R7 J8 S" k' B' Z" I
6 M8 n, |9 M; _0 ~ (2)不同卷积核大小的CNN编码器的并行编码;
. s; D* R1 o0 {7 i S/ _
2 P6 p9 A7 Y1 \$ i, b: N+ \ (3)沿着时序方向的stacked BiLSTM编码;* Z: T U3 c9 p- V5 x
; h. d5 Y5 l% N* \! e w 对于前两者,通过控制卷积核的大小可以更好的捕捉词法和句法特征,即符合相关性匹配的目的;而对于后者,其能表征更长距离的文本意义,满足语义匹配的目的。) y h! @8 @2 y% N- }- F
" X6 `; U% p3 g+ m6 M 在这三类编码器的编码结果基础上,模型分别进行了相关性匹配和语义匹配操作。其中相关性匹配主要采用各phrase间内积+max pooling/mean pooling的方式获取相关性特征,并通过IDF指进行各phrase的权重调整。而在语义匹配中,模型采用了精心设计的co-attention机制,并最终通过BiLSTM层输出结果。) {, [! b* [% t1 V. a
4 Y2 b% p2 e( p' b ~ 最后的预测层仍采用MPL+softmax进行预测。- _9 o) b" l; B4 a9 P
) d. g Y8 \3 S. x3 S k
10. 小结
( |( d: }( i. G4 i5 s 交互型语言匹配模型由于引入各种花式attention,其模型的精细度和复杂度普遍强于表示型语言模型。交互型语言匹配模型通过尽早让文本进行交互(可以发生在Embedding和/或Encoding之后)实现了词法、句法层面信息的匹配,因此其效果也普遍较表示型语言模型更好。
0 ]5 ^- `* V, U3 d0 f( |
. c4 r$ Q, S1 N( p6 ?5 @8 r7 n 【Reference】3 I9 z8 H, p; q! o7 L# j
- a1 [1 b$ Q4 v( \( R( F ARC-II: Convolutional Neural Network Architectures for Matching Natural Language Sentences
. `6 p* n$ U4 K$ ?) A
/ c3 O+ A" \6 W) z% L( H PairCNN: Learning to Rank Short Text Pairs with Convolutional Deep Neural Networks* h8 H9 X1 r) u3 f, o
/ `2 Z3 t& q+ o/ R" m MatchPyramid: Text Matching as Image Recognition+ h, N) s9 V. p: g* _& c) O
~3 d" B$ I- O2 V' T6 o
DecAtt: A Decomposable Attention Model for Natural Language Inference
3 ^! m' p: _! [
7 I A$ ~ f/ u, k. V/ X# c2 M CompAgg: A Compare-Aggregate Model for Matching Text Sequences0 L: n5 @7 _+ t! c7 l1 C% M3 c
1 k# D5 U' V& k: r: z5 k
ABCNN: ABCNN: Attention-Based Convolutional Neural Network) K. o5 y' y# z( }4 E% g+ s
for Modeling Sentence Pairs/ C' q7 ?% p/ h
' ~ \6 _- K0 o( s
ESIM: Enhanced LSTM for Natural Language Inference e4 w9 v6 @4 N- T
^ Q% B8 v; {& F& @- k: v Bimpm: Bilateral Multi-Perspective Matching for Natural Language Sentences
7 t( z {$ [: H8 E 0 S& k y' ~9 b3 ]1 y1 o: g
HCAN: Bridging the Gap Between Relevance Matching and Semantic Matching/ T, J0 ]. Z+ |
for Short Text Similarity Modeling" z# `$ }6 b+ s
) d6 R6 }+ J; u* E2 a6 h2 G 文本匹配相关方向打卡点总结(数据,场景,论文,开源工具)
2 d6 `) h7 L L8 G
' B& e1 v* j7 w3 h O 谈谈文本匹配和多轮检索
6 u s, v& }( j- Y( q 1 ]( z- g: [3 e3 |; ^8 `
贝壳找房【深度语义匹配模型 】原理篇一:表示型, m& H9 O: { _2 M' ^# H0 _
————————————————$ s% j8 l3 _) C8 P# t5 ~+ |3 z# o
版权声明:本文为CSDN博主「guofei_fly」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! C% _! ~+ V' S4 I, C) s: J
原文链接:https://blog.csdn.net/guofei_fly/article/details/1075012763 e X1 B/ q! m" |0 n% q
3 S7 P, \" E; i' ] ! D+ g; J# G4 |) T, C
zan