在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 570809 点 威望 12 点 阅读权限 255 积分 176466 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
【文本匹配】交互型模型 ' F% e: ~* @) w k" \% V
) B; M) h3 u$ o/ d- e4 o- H8 k9 ^
表示型的文本匹配模型存在两大问题:(1)对各文本抽取的仅仅是最后的语义向量,其中的信息损失难以衡量;(2)缺乏对文本pair间词法、句法信息的比较0 R8 @2 B3 K9 W; C1 L" c/ z/ F; {. H
8 W0 ^8 V: E k" z9 A$ V2 q
而交互型的文本匹配模型通过尽早在文本pair间进行信息交互,能够改善上述问题。
7 @8 i- `# }9 `1 u' B& e' Z2 I! y
0 r* t3 S$ H2 l& ?. }% ] 基于交互的匹配模型的基本结构包括:
# ]' v; }+ L; k2 j" Y" M9 I8 b
2 C/ p( M' ?& \- X+ ]- d (1)嵌入层,即文本细粒度的嵌入表示;
* C8 |; O% A/ N' c/ k K7 u$ \$ h- o$ i1 t' x; Q8 c2 u. T' L
(2)编码层,在嵌入表示的基础上进一步编码;
% } d- V$ e* N9 w; n7 z 9 u* ~: t0 K! r. U$ e* @) o. U* F# i
(3)匹配层:将文本对的编码层输出进行交互、对比,得到各文本强化后的向量表征,或者直接得到统一的向量表征;6 G) T* ^2 ^7 @+ x$ V
4 I; `: p R( d3 t" F1 x$ Y (4)融合层:对匹配层输出向量进一步压缩、融合;$ q5 T1 ?3 Q& o4 s9 n' i. s3 M, z
9 f P, \+ P7 }0 p0 `! L% f& z- i! F (5)预测层:基于文本对融合后的向量进行文本关系的预测。" |' M( T6 i; c2 o" W
& I) C6 J6 b+ k0 E
6 W% @) u9 I/ |; s0 s$ K% q" b t6 g; \5 Q& X+ I
1. ARC-II- S- a8 _4 J/ X' E) j$ f H: T7 C
ARC-II模型是和表示型模型ARC-I模型在同一篇论文中提出的姊妹模型,采用pair-wise ranking loss的目标函数。 M8 k( ^ F1 ]8 Z. \
0 L1 }0 y/ U7 M! n7 D8 b' w 其核心结构为匹配层的设计:
5 `6 d9 x8 l& }$ Q! G& X & ~7 l3 n' `4 u: c+ s
(1)对文本pair的n-gram Embedding结果进行拼接,然后利用1-D CNN得到文本S_X中任一token i和文本S_Y中任一token j的交互张量元素M_{ij}。该操作既然考虑了n-gram滑动窗口对于local信息的捕捉,也通过拼接实现了文本pair间低层级的交互。
' r7 a/ X( G. n; f& G# s! g1 r
( ?' `( a% H9 l/ C+ p3 i (2)对交互张量进行堆叠的global max-pooling和2D-CNN操作,从而扩大感受野。
! U) {/ I/ Q) }2 Z 0 k: _' u. N4 h
2. PairCNN
4 L# s! N( N- o, ?) z2 H d PairCNN并没有选择在Embedding后直接进行query-doc间的交互,而是首先通过TextCNN的方式分别得到query和doc的向量表征,然后通过一个中间Matrix对query和doc向量进行交互得到pair的相似度向量,然后将query的向量表征、doc的向量表征、相似度向量以及其它的特征向量进行拼接,最后经过两层的MPL得到最后的二分类向量。& R+ ], |5 a4 T9 N0 y
' r6 m0 L8 n; P$ y0 C PairCNN的模型架构中的亮点在于各View向量的拼接,既能利用原始的语义向量,还能够很便捷的融入外部特征。! R* d! B2 |& |" N+ A+ x
0 o: j+ k% o8 M3 f
3. MatchPyramid
: ?( Y7 `' D9 S: ]% O: g 无论是ARC-II中的n-gram拼接+1D conv还是Pair-CNN中的中间Matrix虽然均通过运算最终达到了信息交互的作用,但其定义还不够显式和明确,MatchPyramid借鉴图像卷积网络的思想,更加显式的定义了细粒度交互的过程。
/ R4 Q0 `3 O. T) M! o MatchPyramid通过两文本各token embedding间的直接交互构造出匹配矩阵,然后将其视为图片进行2D卷积和2D池化,最后Flatten接MLP计算得匹配分数。本文共提出了三种匹配矩阵的构造方式:
m9 u+ c9 \& X, K
' {0 B& S; l, p- k2 P1 w1 B (1)Indicator:0-1型,即一样的token取1,否则取0;这种做法无法涵盖同义多词的情况;. k, n9 N9 M, v% Z7 i9 F) {
' N a" o1 y/ P2 Z# M
(2)Cosine:即词向量的夹角余弦;3 F. D2 T, S* v$ _- }" A
# E" w% d- Q+ a (3)Dot Product:即词向量的内积
# }8 f6 l5 K& e2 |
+ O# m! R& P1 ~- k- _* V4 t 此外值得注意的是因为各个文本pair中句子长度的不一致,本文并没有采用padding到max-lenght的惯用做法,而是采用了更灵活的动态池化层,以保证MPL层参数个数的固定。
1 K! t2 y8 R2 J# k0 m
# z6 C8 T! R; _ 4. DecAtt, d/ `; I, m" i- Z3 E9 o
DecAtt将注意力机制引入到交互型文本匹配模型中,从而得到各token信息交互后增强后的向量表征。7 U- V) b$ Y5 h, Z
4 |4 t$ @4 l2 e, b u# `% X 模型被概括为如下层级模块:
3 m' s$ I: d- a9 l5 E7 c p
( f8 H y( h3 T' C& Y1 x" N/ l (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。3 L( m/ k5 K; w5 w5 ?( u
5 r+ A: U. i- F7 x( \1 F (2)Compare层:将前序Attend层计算得到的最终embedding,喂入一个全连接层进行向量维度的压缩。4 {1 l2 O9 Y( B1 }
( p9 v S8 j% v! |- U2 q0 G
(3)Aggregate层:将每个文本各token处压缩后的向量进行简单的求和,再拼接起来通过MPL得到最后的匹配得分。+ t& ]9 N h: O( {0 [% n
- @& t5 Z# D' x0 t
5. CompAgg
" m9 i" i$ g: \$ u" [2 I CompAgg详细对比了在文本间cross-attention得到的各token向量表征与原始token向量进行compare的各种方案。
9 k& `$ T! q1 ^; e, P1 v& K
8 G8 p* B4 T( }, s/ H 该模型的主要结构包括:
. z; b- B( J8 \0 G6 _% t" s $ U( j; t( Y2 Y9 g3 \6 w
(1)reprocessing层:采用类似于LSTM/GRU的神经网络得到token的深层表示(图中的\bar a_i);
6 t" ^( _" s% I/ s8 `: y9 C $ D" K4 {3 D! y+ j# V
(2)Attention层:利用软注意力机制计算文本间的cross-attention(与DecAtt相同),从而得到各token处交互后的向量表示(图中的h_i);$ d* t# T* {, _% { }8 L
) P4 J% F# r5 [) u; F
(3)Comparison层:通过各种网络结构或计算将\bar a_i和h_i计算求得各token的最终表征。
6 y7 x& C$ k# f/ H9 x ! ]. ?" y% M" ?( f2 A/ B. C
(4)Aggregation层:利用CNN网络对Comparison层的输出进行计算,得到最后的匹配得分。; L" w5 H! H& k8 V
3 _, y, l' @/ n: a
其中Comparison层的构造方式包括:+ `7 z' c8 H; o
A7 \4 P" c' w5 _3 a
(1)矩阵乘法,类似于Pair-CNN中的中间Matrix
- Z' A3 c6 b6 e' N 0 X" ]( _" Q; E" a
(2)前向神经网络,即将\bar a_i和h_i进行拼接,然后利用输入FFN;
6 }$ E/ g, x, ?! v# @, z. C
4 A% V0 X5 L0 U* h" B (3)分别计算cosine和欧式距离,然后拼接;; S* l5 `0 e; N! U$ e7 i [
- p0 C7 _* X4 f: b: Z (4)各维度进行减法;
# I. E* c' q+ d- |/ k y3 e' `
( b& q2 T( K& U9 y4 [2 _1 @# O# Y9 n (5)各维度进行乘法;9 ^/ L: R5 x0 F1 J8 N
% ]0 n8 P k7 u8 i- C (6)各维度进行减法和乘法,然后再接一个前向网络。0 i: u# b! e) I' x
# b/ \6 Y( d, t2 O2 Q4 A8 w 6. ABCNN
4 u/ R. i/ |, w4 }% W ABCNN是将Attention机制作用于BCNN架构的文本匹配模型。/ k/ X! i; `( E) m3 l" @4 C
9 v0 S* h! H/ R 6.1 BCNN$ k* S. B. m3 ]6 c% g
首先简单介绍下BCNN架构:
) ? ?4 J6 Q! j" y2 L% Z S( {! h, \ 9 K6 Z$ T0 Z9 P1 H
BCNN的整体结构比较简单:(1)输入层;(2)卷积层,因为采用了反卷积的形式,所以在size上会增加;
+ @! H" ~2 u1 j& O- q# m) H ( Y& j$ ]1 ~0 Y/ X. w- p0 G
(3)池化层,采用了两种池化模式,在模型开始阶段采用的是local平均池化,在最后句子向量的抽取时采用了global平均池化;(4)预测层,句子向量拼接后采用LR得到最后的匹配得分。, y, K3 ? G! t, d1 ]% D1 c/ w
. p8 M4 K3 n& n# l9 ^# f' \
ABCNN共包括三种变形,下面依次介绍。# k4 _+ A8 ?, _5 I, M; B
+ i* |7 e" D9 H$ n7 E5 O
6.2 ABCNN; H4 \, W( w# q. v* X' _
, P( ^( V& I& Q. N, ?# T& [ 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
0 O# s7 u+ T1 ~5 D) E/ { ij
7 o$ a" B$ K0 O/ d4 N2 H + ~4 g! ]' Y9 z' m z
=
4 t' I. L- b+ U% y M 1+∣x
/ a: v) T+ o: y, x5 B i
; x& ~9 Q+ g9 E & V0 L, Q) n3 ]/ w1 C
−y
) p$ e9 h* G5 E& w) p0 e j
4 [" b* i. I* t' X/ r' D ) ?4 v/ i8 p( E5 H; ?1 K) v0 B
∣
. q2 y% q/ V" B# b& s) _ 1
' e) P6 j# z9 a8 v% j0 i o
* W$ Y; ^) [9 Y! X& v: p- {8 h ,然后分别乘以可学习的权重矩阵 W 0 W_0 W 8 c( O$ P8 a$ v& R$ }
0
% z) g$ g( I' _9 [' ~- I- ]
7 v& X5 b) W$ T; G 和 W 1 W_1 W
C$ f I- P8 d2 e% ] \4 V 1
7 G/ }2 K5 g& M0 W7 Q
, h6 R5 J) H. [% r 得到attetion feature map。
$ m5 C) d, c3 f' E9 x3 P * u% a' u+ H. B$ o! H: W
6.3 ABCNN-2' T2 H- L, I J- T
8 v) q) ]! |( _ n ABCNN-2将Attention机制作用于word embedding层后的反卷积层的输出结果,其中注意力矩阵的计算原理与ABCNN-1一致。然后将注意力矩阵沿着row和col的方向分别求和,分别代表着各文本token的attention socre;接着将反卷积层的输出结果与attention socre进行加权平均池化,得到与输入层相同shape的特征图。) R& w% S( d/ W5 h7 Q6 x" B
5 |( i. v L0 j8 ^4 _0 _, O* c
6.4 ABCNN-3
4 t2 E D& J" J% Q
5 P m( s6 I3 \9 y ABCNN-3的基本模块可视为ABCNN-1和ABCNN-2的堆叠,即在嵌入层和卷积层上面都引入了attention的机制用来增强对token向量的表示。
5 |& `6 p$ B3 E# _7 a 0 n8 @ {' P( A% b! a' }
7. ESIM& o# L9 h( P$ U$ h, s& C( l; E
ESIM模型基于NLI任务给出了一种强有力的交互型匹配方法。其采用了BiLSTM和Tree-LSTM分别对文本序列和文本解析树进行编码,其亮点在于:5 U' R# h1 z" Q0 v; g7 d% {+ o
9 n) A" s' I1 g' ^6 T: P! P* L (1)匹配层定义了cross-attention得到各token的向量表示与原token向量间的详细交互关系,即采用 [ a ˉ , a ^ , a ˉ − a ^ , a ˉ ∗ a ^ ] [\bar a, \hat a,\bar a-\hat a,\bar a* \hat a] [
6 Q# q) K, B" S2 k& u( C8 t/ N a
& k8 y% \) E) P& k. D" R7 d ˉ
7 e% h; T5 D i5 X4 N8 n ,
3 T" t8 h* I$ h a
1 V: ?) v2 L. v3 }, y+ Q! Z4 | ^
6 N! ?, k7 ]& u* _ ,
( j ~! K! F# j3 |! ^/ O0 Q a' x3 F* H) G$ T3 k: ~1 Z+ K3 q
ˉ* }, ]3 P+ {* h8 I1 P
− 5 f, d0 V# p3 k, x: M$ p
a
, I1 Z: [7 U# y4 h, g2 f: Z F ^
. k$ r, N& k. u: f n8 L) `% s , , Q% b6 K* k' h7 h
a! b; K+ t& A- f8 a# a
ˉ% J% Y5 H1 u9 G0 y K6 b7 a8 d0 Y
∗
# w0 }7 o0 H# I5 e: {% J; |6 }8 ^ a
" W* V# e* W6 C% w) A! R ^4 V. p! W3 [4 ~1 f* g
]作为最终文本token的向量表示,这也成为后续文本匹配模型的惯用做法。( ~% f. T* @3 e! N: B8 z" i% s6 r0 X, k
4 ~- F" R! \2 ]
(2)聚合层通过BiLSTM得到各文本token的编码,从而进一步增强了文本序列的信息传递;. X2 b/ o* D" Q! C/ k$ x/ h y6 E* p
# r, b, A. K3 Q: X# ]5 R: i
(3)预测层通过拼接各文本token编码的max-pooling和mean-pooling结果,再经过MPL进行匹配预测。- @/ g7 m: H6 }2 `5 @5 e
" o% V8 l5 I: E& l& P: A# G 3 a$ T! Z! I0 N
7 O+ X d' y- F1 @( v
8. Bimpm. Q6 e: p+ t3 b* i
Bimpm可视为对之前各类交互型文本匹配模型的一次总结。' {) H2 O7 Q1 f& V6 ?$ W
: F5 v5 g8 Z' b8 s5 P' k# L 该模型在各层的具体做法总结如下:
0 s, b& \- @7 `) [/ |
' c" \' G6 u( V* D! ] (1)编码层采用BiLSTM得到每个token隐层的向量表示;4 s$ a# P @) ]+ z6 f8 G9 z
' i" W. E6 [3 N/ E; `5 @( C7 Z (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
1 L5 Q' N6 H6 n) g" U k# j( G9 ~3 `* [* I6 m; M% t
1 O- Z' n' X' ?2 \# g1 D8 u) ~2 g =cosine(W
, j$ |$ T, q! m3 s. @2 \2 F k
g1 z& ?+ t% |. I& c8 G 9 d" G( z3 H, I; }3 {' v
∗v $ r' ?2 a& p" P. i* x0 K+ T* W
1; A; v M( a$ ^! H m
# e* ]8 C- ~, H" j; W ,W 3 q+ T4 C% M) G9 a" [
k
7 X0 [( t s- |+ s* L
, J& Y4 G P' e" {! j/ a ∗v
2 U. `8 g4 v0 b$ y# W) G 21 |: q+ l) W* S$ \) b: h
' p) ~8 P2 \% m3 y/ ?1 F )的方式可以得到两个文本的任意token pair之间在第k个view下的匹配关系,至于 v 1 v_1 v
7 n( ~7 `7 P$ v' t! I 1
; ]$ A- q Z( Z3 z( c |& J ; |( ~! T0 X4 Q3 r
和 v 2 v_2 v
; ^# B+ q) B1 t 2
1 h9 j: K/ W( ]" z
. Z4 d& |2 {& ~+ c 如何取,文章提供了4种策略:
- V: X3 t% \% C ( {2 Y4 i0 {+ [' K( {' n
策略一:其中一个句子取各token隐层的向量表示,另一个句子采用隐层最后时间步处的输出;
& I0 @, N, e% O# @% b8 d* A7 i# ]! F 策略二:其中一个句子取各token隐层的向量表示,另一个句子采用隐层各时间步输出与之匹配后取再取Max-Pooling值;3 [6 [/ `1 p8 S; u/ |) s; ^" b- I
策略三:其中一个句子取各token隐层的向量表示,另一个句子采用cross-attentive后得到的加权句子向量;
/ w1 Q, z8 C V) W% d7 B M 策略四:其中一个句子取各token隐层的向量表示,另一个句子采用cross-attentive后attention score最高处token的向量作为句子向量。
) \# Z( a! Q4 X3 c 这四种策略的区别在于对句子向量的计算不同。8 U6 `" v$ j# W) l3 `- f. B
1 y j" N& Q( W6 _
9 f' _. b- p+ y
(3)聚合层,首先对上面各种策略得到的输出层再通过一层BiLSTM层,然后将各策略下最后时间步的输出进行拼接,得到最后的聚合向量;0 S. V0 s. A9 R3 G( ?6 R7 X
2 K6 d# s% m, _( j7 H8 @" L3 y (4)预测层:两层MPL+softmax/ C* P/ e) C9 ]" U# C1 P1 j) Y3 p8 q
; N4 u1 _6 C! `, ]7 ~5 [8 N N) g 9. HCAN
0 h+ N4 _; T9 R! [7 ^) D- I HCAN是除Bert类模型外在文本匹配领域表现最为优异的深度模型之一,其采用了较为复杂的模型结构。
0 S b; z/ ?1 N; F. E ! n; ^4 B9 S' P5 Z, l
针对于信息抽取问题,文章首先分析了相关性匹配和语义匹配的差异:9 R, \) T0 m f( k( H; h; N4 l* X
8 Y! E6 U( X5 X (1)相关性匹配主要关注于关键词的对比,因此更关注低层级词法、语法结构层面的匹配性;
( [2 \7 W O$ B6 [. t
) S6 G9 f$ s I& v7 w& \) Q+ V& e (2)语义匹配代表着文本的平均意义,因此其关注更高、更丑想的语义层面的匹配性。1 y( n N8 h9 J8 [/ o# F
v6 O4 i! x# q2 D% {
该模型首先采用三类混合的编码器对query和context进行编码:6 A, H3 s9 U& ]+ C6 q E1 {' \
1 o; `! }* c5 d% h+ r5 f" S0 } (1)深层相同卷积核大小的CNN编码器;
2 f9 a Q8 A2 Y( y5 X& k
. m/ D( Z' E* [# d3 o% O (2)不同卷积核大小的CNN编码器的并行编码;
: I9 C$ _; {* m) e, G7 ?
$ T$ C# A( A' k (3)沿着时序方向的stacked BiLSTM编码;$ `+ }, Y1 N% G* h9 G* M
( z# C5 e7 \5 s' a4 V# t
对于前两者,通过控制卷积核的大小可以更好的捕捉词法和句法特征,即符合相关性匹配的目的;而对于后者,其能表征更长距离的文本意义,满足语义匹配的目的。
* _ O2 q* z. H. O$ M& [
6 _) ] b3 o( F9 k 在这三类编码器的编码结果基础上,模型分别进行了相关性匹配和语义匹配操作。其中相关性匹配主要采用各phrase间内积+max pooling/mean pooling的方式获取相关性特征,并通过IDF指进行各phrase的权重调整。而在语义匹配中,模型采用了精心设计的co-attention机制,并最终通过BiLSTM层输出结果。# T) [$ d4 L2 i& Z n
% X6 m. ]& l! x' w$ ?$ Q9 z 最后的预测层仍采用MPL+softmax进行预测。
5 T3 y9 P& }! S* ^ . B8 F( F, w/ D
10. 小结
6 t- V/ b" Q' T8 @3 q 交互型语言匹配模型由于引入各种花式attention,其模型的精细度和复杂度普遍强于表示型语言模型。交互型语言匹配模型通过尽早让文本进行交互(可以发生在Embedding和/或Encoding之后)实现了词法、句法层面信息的匹配,因此其效果也普遍较表示型语言模型更好。
3 y/ R4 ^2 h2 I+ l8 `; m1 L
3 V! b6 i( I1 Z& G+ t$ h& d8 H2 r+ z 【Reference】
3 i& Y* k3 E7 B" \' ]8 W 4 U* h$ k# \6 x$ f
ARC-II: Convolutional Neural Network Architectures for Matching Natural Language Sentences1 _5 \: ~" j$ x! ~2 ?) B2 T9 }8 m
- R# W0 s. ~. d ], j# q' i& E% u% c PairCNN: Learning to Rank Short Text Pairs with Convolutional Deep Neural Networks; g' ^0 R* x4 F8 A/ ^: q
4 u0 } c$ i6 k! h6 a6 r) z7 r1 ~ MatchPyramid: Text Matching as Image Recognition$ k- R4 G' l6 a2 y* x5 {/ T
$ C+ E, }1 f/ k0 H DecAtt: A Decomposable Attention Model for Natural Language Inference1 F3 e8 p ~5 r2 d
N2 J; f3 @) L) Y
CompAgg: A Compare-Aggregate Model for Matching Text Sequences* b+ Z2 ]1 z. T% J
$ N* V" B5 R3 f
ABCNN: ABCNN: Attention-Based Convolutional Neural Network7 L7 T2 i3 ^% }( z
for Modeling Sentence Pairs) ~' E3 _, c# k$ w& f' [
) ?& P0 K9 E+ t) j& h( d. [ ESIM: Enhanced LSTM for Natural Language Inference7 Y7 `! ]: |, Q5 W! V' a
; x3 J" e3 O6 B
Bimpm: Bilateral Multi-Perspective Matching for Natural Language Sentences
% U' I( [, X; V$ s/ `( v
4 M; H* j- |. C0 F$ K, a HCAN: Bridging the Gap Between Relevance Matching and Semantic Matching
: ^. k+ o9 R. ] l, G. d2 P for Short Text Similarity Modeling
$ E3 a8 [5 _3 ?. L2 l" X! D& \1 x* p
n# R; C* s- c/ H0 ` 文本匹配相关方向打卡点总结(数据,场景,论文,开源工具)
% f/ ?/ Z8 z4 R/ c5 X* ~& v" g
7 |+ C# }2 O; F+ f* j8 Z 谈谈文本匹配和多轮检索
4 d, O4 T1 o0 ~1 X8 e3 u" ^4 ?
6 h, e' \* s b% ]% S# [ 贝壳找房【深度语义匹配模型 】原理篇一:表示型& \& @$ k! \. o2 y# S
————————————————
3 @' b. f, B: i) {/ g4 [ 版权声明:本文为CSDN博主「guofei_fly」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
* V' j# ], n. o 原文链接:https://blog.csdn.net/guofei_fly/article/details/107501276& `$ p7 f8 f, N9 {$ J+ Q* L
9 S* e- ] t. w) D 6 Q# T' g9 U v/ r5 K j4 y
zan