在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 565537 点 威望 12 点 阅读权限 255 积分 174884 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
【文本匹配】交互型模型
8 o* k4 `- g' J7 }) G
5 `5 A/ O0 a- Y9 a2 k* L 表示型的文本匹配模型存在两大问题:(1)对各文本抽取的仅仅是最后的语义向量,其中的信息损失难以衡量;(2)缺乏对文本pair间词法、句法信息的比较% v& t) H6 z0 j& J0 f- ~" B: A
/ Z \ y7 U' q
而交互型的文本匹配模型通过尽早在文本pair间进行信息交互,能够改善上述问题。
; k/ [% H) O, P' @! ~9 c8 A
8 d0 W0 t f4 |) v2 M 基于交互的匹配模型的基本结构包括:
: e8 g4 s7 Y# k7 z V: ^8 r 8 @# J- _8 @! Z7 Z
(1)嵌入层,即文本细粒度的嵌入表示;6 n, F5 m4 r: }/ o
% g+ a6 K+ @9 w" z8 T
(2)编码层,在嵌入表示的基础上进一步编码;
$ z3 d/ v) `) f3 t$ ~0 r/ y" x ) |4 X& U$ [5 q# O( U6 }( l
(3)匹配层:将文本对的编码层输出进行交互、对比,得到各文本强化后的向量表征,或者直接得到统一的向量表征;
% v- k' g9 F8 n# M& g, E
' U# J/ o, k. F. J (4)融合层:对匹配层输出向量进一步压缩、融合;% F A( D- K( ~2 K
: m+ {7 |( Q+ ? (5)预测层:基于文本对融合后的向量进行文本关系的预测。
) K+ A; P% j0 o3 d$ j 1 F( x& u/ t3 J
! T/ a8 Y! p& F1 a _$ |7 K* z
1 k* }' j* ^- C7 e5 B 1. ARC-II
6 e) M( x$ t9 D$ ~9 i ARC-II模型是和表示型模型ARC-I模型在同一篇论文中提出的姊妹模型,采用pair-wise ranking loss的目标函数。
5 s; J: F" T$ n$ Q! h0 b* u 5 M+ K! N* T& q4 X3 L2 P& F8 ~3 n
其核心结构为匹配层的设计: L) b6 N% H/ h3 n+ D; S- K3 v
/ J0 J3 F4 v+ S T
(1)对文本pair的n-gram Embedding结果进行拼接,然后利用1-D CNN得到文本S_X中任一token i和文本S_Y中任一token j的交互张量元素M_{ij}。该操作既然考虑了n-gram滑动窗口对于local信息的捕捉,也通过拼接实现了文本pair间低层级的交互。
" E8 A' }. G3 M9 V* C5 s# o3 N
- E [, O+ d; d (2)对交互张量进行堆叠的global max-pooling和2D-CNN操作,从而扩大感受野。
5 P2 J- a3 P5 i" p3 y 3 j3 A) A o0 Q9 t- R0 z) V
2. PairCNN8 H2 w {* R" ?+ \, \9 L
PairCNN并没有选择在Embedding后直接进行query-doc间的交互,而是首先通过TextCNN的方式分别得到query和doc的向量表征,然后通过一个中间Matrix对query和doc向量进行交互得到pair的相似度向量,然后将query的向量表征、doc的向量表征、相似度向量以及其它的特征向量进行拼接,最后经过两层的MPL得到最后的二分类向量。. _& e! p C( x! w/ ]" R* i
& j9 q! j( k1 I" u: q% a; I
PairCNN的模型架构中的亮点在于各View向量的拼接,既能利用原始的语义向量,还能够很便捷的融入外部特征。1 w. o. Z5 E) M5 {0 e$ l* s
3 @/ ~7 I1 [0 j0 ~3 e/ [
3. MatchPyramid- C- @4 b! }# m W
无论是ARC-II中的n-gram拼接+1D conv还是Pair-CNN中的中间Matrix虽然均通过运算最终达到了信息交互的作用,但其定义还不够显式和明确,MatchPyramid借鉴图像卷积网络的思想,更加显式的定义了细粒度交互的过程。
8 F* d" ?: Q. ?* Z MatchPyramid通过两文本各token embedding间的直接交互构造出匹配矩阵,然后将其视为图片进行2D卷积和2D池化,最后Flatten接MLP计算得匹配分数。本文共提出了三种匹配矩阵的构造方式:) [3 w- k$ e$ Z1 t7 E
$ ~2 d% f$ j$ u0 J1 X9 t
(1)Indicator:0-1型,即一样的token取1,否则取0;这种做法无法涵盖同义多词的情况;
5 R% ?! g6 b+ U( P 0 k/ K% b& H$ \1 c& o2 I/ ?
(2)Cosine:即词向量的夹角余弦;! G6 S3 ~1 Y1 `/ G; B; Q' t' E- l
e3 c0 c* _8 R f4 w4 o* Y& c( U (3)Dot Product:即词向量的内积+ b& K0 @( u4 o& Y' _5 ?
$ a2 A7 i7 X, }* t) W; K" M* P+ q 此外值得注意的是因为各个文本pair中句子长度的不一致,本文并没有采用padding到max-lenght的惯用做法,而是采用了更灵活的动态池化层,以保证MPL层参数个数的固定。
0 y- `! C: o" \' b+ Y* p - Q# [+ U* q8 w+ x
4. DecAtt/ L7 r. [. ~- c' a3 n
DecAtt将注意力机制引入到交互型文本匹配模型中,从而得到各token信息交互后增强后的向量表征。
: a2 y/ h* _4 w) `
$ a: e% _& M( |! w$ k! e: ?, B 模型被概括为如下层级模块:
; J. Z- J0 ^, c/ k/ m2 B
$ `$ g( o1 K* z1 K3 X: ~ (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。
- o1 c& n/ I1 e& b7 ?4 T: g
) o! ]3 @3 O' k: i# I+ k (2)Compare层:将前序Attend层计算得到的最终embedding,喂入一个全连接层进行向量维度的压缩。! J6 G d0 P$ H& J" \
/ D5 s7 N. A% T& M7 C9 k+ m! p1 n4 l7 k
(3)Aggregate层:将每个文本各token处压缩后的向量进行简单的求和,再拼接起来通过MPL得到最后的匹配得分。$ L: j) k7 m2 ]7 f: Y& P) n
I% p7 W, N7 s/ m, Y
5. CompAgg* V; ~/ C9 ~ E9 k
CompAgg详细对比了在文本间cross-attention得到的各token向量表征与原始token向量进行compare的各种方案。
8 \: F9 C! f- X: b$ e# k! j ; y2 s4 O/ q) @, {9 t* E
该模型的主要结构包括:3 T# [. g: j9 U y
8 E: ]0 I; Y/ F' V# @ (1)reprocessing层:采用类似于LSTM/GRU的神经网络得到token的深层表示(图中的\bar a_i);
0 @3 O) p2 E% K8 ?& w' ]8 n! y- q
/ u' b* H% E* I1 R, s2 `% d# R (2)Attention层:利用软注意力机制计算文本间的cross-attention(与DecAtt相同),从而得到各token处交互后的向量表示(图中的h_i);
0 n2 ?4 I2 w) K; g9 a
0 f u# w }; \ u% D# F0 e4 j) x (3)Comparison层:通过各种网络结构或计算将\bar a_i和h_i计算求得各token的最终表征。
, n" x( e$ X! g( E: C" X & `7 V5 \# `% B- i9 {6 x
(4)Aggregation层:利用CNN网络对Comparison层的输出进行计算,得到最后的匹配得分。
, U$ o& U# X5 u1 k/ n5 D6 i( x ! d6 M/ g% ^* e( A) P
其中Comparison层的构造方式包括:
$ D9 e3 m0 ]! @/ x% G$ |
" ]1 Y/ h* g3 D5 k* j( \0 A (1)矩阵乘法,类似于Pair-CNN中的中间Matrix. O3 d4 p& u% ^1 e5 @# l9 k
' C& V& _; b9 T) | (2)前向神经网络,即将\bar a_i和h_i进行拼接,然后利用输入FFN;
2 ^! c( N. i* A& x( ~ # u# z9 Y7 ]' |$ {1 }
(3)分别计算cosine和欧式距离,然后拼接;; N5 l" u! F# i) M- }5 {4 y
" G; |) c/ H- v9 o, [ `
(4)各维度进行减法;0 w% `' [) z7 V1 V$ |4 }$ i
% y6 ]) I0 e9 {* B% B; `" G
(5)各维度进行乘法; u5 g/ x' o' q3 l9 [( |5 W% `% x+ E8 b
4 `/ b( F# e5 y0 C( D (6)各维度进行减法和乘法,然后再接一个前向网络。
: A0 q4 J6 X2 y! C, y0 R5 P ]7 t) B 1 B, n8 l8 N$ o+ g
6. ABCNN
: V9 y" _* |" O$ e- ~2 v0 a ABCNN是将Attention机制作用于BCNN架构的文本匹配模型。
3 c! T3 C2 R- d, } % u% v7 v8 u$ y- T: U
6.1 BCNN' @8 L% F7 p6 n4 v
首先简单介绍下BCNN架构:
, J& ]; x2 V5 {" J) S
; B0 E9 Z8 M6 N! |* c" W9 D7 N BCNN的整体结构比较简单:(1)输入层;(2)卷积层,因为采用了反卷积的形式,所以在size上会增加;! U) K' v! I4 a
" \/ S. u" H6 r& r5 Y (3)池化层,采用了两种池化模式,在模型开始阶段采用的是local平均池化,在最后句子向量的抽取时采用了global平均池化;(4)预测层,句子向量拼接后采用LR得到最后的匹配得分。* A7 B. R+ ?: `4 M! l- J$ n% o
9 ]+ v( i" v- s ABCNN共包括三种变形,下面依次介绍。
9 F$ Q1 ?8 @* Q9 a d- K 6 y+ W( Y) r1 M# w
6.2 ABCNN
- o4 {, {0 T7 Z! w8 r& W" i9 t+ [+ t * M7 |$ o( b8 x/ O- I
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
6 O! k) g1 a$ ^$ Q$ I ij
' I+ b5 S; B& I8 h7 j/ f' C
( |% I; q9 E0 b* X) Q =
+ v1 F6 _! z% _; Q2 e7 l 1+∣x
5 O, f; h3 T# \7 K i
2 F e( `8 @& j
5 V: ^0 M3 R9 Y% i( \ −y 0 m0 ?3 b# Y$ T- E! K
j9 v V- ~, @$ Q: b, ?* o2 ?0 C
2 q2 R5 o, g* Y2 I: ^ ∣
7 F: J4 S5 f$ C6 |0 r5 Q# h, k7 l/ W* Q 1
% K/ R+ @$ b/ p+ w2 R: R 6 ]% P3 i, r) ]# ]
,然后分别乘以可学习的权重矩阵 W 0 W_0 W
# \$ |. }) |2 a3 k6 s 0
8 t. l1 U2 T! |5 F8 Q$ I 7 H" z8 X$ ~1 s- C* K
和 W 1 W_1 W
. |% E+ o" K& Q5 r 1
3 j# w$ k/ n- j5 c
# E0 i' P, i$ x) M! C/ l; V 得到attetion feature map。3 T) D9 Y5 W4 n4 o! [7 F
7 U4 S5 D8 a1 `9 p 6.3 ABCNN-2
' Q! p* S: E A: b, j
/ S" Z! R, f. O7 H7 e ABCNN-2将Attention机制作用于word embedding层后的反卷积层的输出结果,其中注意力矩阵的计算原理与ABCNN-1一致。然后将注意力矩阵沿着row和col的方向分别求和,分别代表着各文本token的attention socre;接着将反卷积层的输出结果与attention socre进行加权平均池化,得到与输入层相同shape的特征图。
6 S* o {5 d4 Y& a. u& D5 t4 s3 u 8 }. ]9 _8 M1 f. u- F
6.4 ABCNN-3
% A2 J( M1 w4 e
/ t0 d& \5 C& x: ^7 [ ABCNN-3的基本模块可视为ABCNN-1和ABCNN-2的堆叠,即在嵌入层和卷积层上面都引入了attention的机制用来增强对token向量的表示。
' [( Y( Q/ J, u0 O+ k # T8 t% y; M" M8 A2 M {: A
7. ESIM
/ R" J0 x4 h G" i ESIM模型基于NLI任务给出了一种强有力的交互型匹配方法。其采用了BiLSTM和Tree-LSTM分别对文本序列和文本解析树进行编码,其亮点在于:
/ ]5 d- u0 T/ i# w* Z( E 5 Y( N" y ?% T |( r' o+ N
(1)匹配层定义了cross-attention得到各token的向量表示与原token向量间的详细交互关系,即采用 [ a ˉ , a ^ , a ˉ − a ^ , a ˉ ∗ a ^ ] [\bar a, \hat a,\bar a-\hat a,\bar a* \hat a] [ 7 Z; C1 b, _; l! I3 _/ Z% b
a. b$ |, K% T6 O$ ^
ˉ9 n- ~. f% @8 N( n) i
, , F( |. D; L* ~" }3 ~8 A7 f
a0 B' O& _& ~+ U4 ]# ~
^
, j8 M+ J4 U' F" ? , " h5 A8 ^% a' h/ \3 z8 d l: b! C
a/ F6 \1 x; D1 S, n9 _
ˉ
: R; P( c x+ o) W6 ~ −
3 R. f7 j1 d7 A4 v8 W4 D7 O/ X a
# d& @6 T M, A ^
# S# p/ j3 s6 ^) t# _ , * q, g* z$ `' o# R- t* I0 |
a, t) n: U6 D) G8 ~7 }: Y
ˉ( Q4 s1 `1 ?: |/ N8 u# _
∗
% E' S; v3 ?, {3 n' z1 @ a
* L2 Z$ b: L2 T0 X+ _ ^
' J* u0 f8 f/ m l ]作为最终文本token的向量表示,这也成为后续文本匹配模型的惯用做法。
9 Y5 Y' d9 A' e& u: Z% g) ]
- L3 d7 c1 ^% B. R( K (2)聚合层通过BiLSTM得到各文本token的编码,从而进一步增强了文本序列的信息传递;' g+ _* z. T2 w! X1 h
- i/ a$ _1 Z! Z9 F (3)预测层通过拼接各文本token编码的max-pooling和mean-pooling结果,再经过MPL进行匹配预测。 e2 V9 f( q6 P7 ?* `# ~- g
; Z( J) J; S& [% k1 j& R8 \5 P5 g 3 b# A9 K9 r. G' x- e
, J& s, ]* l; B/ A) _% ]; P
8. Bimpm5 t9 K+ S9 k; c; B# C! C
Bimpm可视为对之前各类交互型文本匹配模型的一次总结。
/ t: c! K. i' P% N6 Q ' o/ P9 `% U% s, i( z
该模型在各层的具体做法总结如下:
& i0 B0 o( {/ B [ ( C7 ^& D+ I7 l! ~1 S: d; T
(1)编码层采用BiLSTM得到每个token隐层的向量表示;
6 L5 r7 Q9 ?6 a( a * }- T" j3 N- p! y% M; d
(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 % o5 }; Q* O4 O4 f
k3 l0 u# o$ u5 \
, _: G. E+ c2 x/ o0 [0 E, w
=cosine(W
+ F+ R6 y: E: i) M1 K; K k6 x; D$ }) V- \/ q6 h2 m
6 x7 H0 I7 ^. u# l( ~ ∗v
4 ^- ]8 F' }% Y! P0 Y' d 12 X) y0 e0 p c1 V) j- U/ N6 e
( W3 R. w' U" j+ K2 r& P ,W
; I& S, {6 X/ G* H1 a/ O9 \ k$ b. f- d- }* N' r3 C' M
6 @; P/ y, l# ]9 k3 C9 b: U+ f5 L+ k ∗v 1 I+ k A2 ]* w3 i. b
23 \4 B3 _) g1 a& N6 E- }
, F* ], Q( H- o
)的方式可以得到两个文本的任意token pair之间在第k个view下的匹配关系,至于 v 1 v_1 v 4 N4 l5 r4 W8 Z( U$ S& I
1! K' }, J9 K* O/ L; A
' ], y+ H1 ?' o, W, l$ a4 t2 ~ 和 v 2 v_2 v
9 p4 Q4 k/ H( x- y* x5 Z* M/ C 2# f4 _. n" }3 R6 A' k ~
9 f+ G8 z5 Q( o' }1 _& ?; S
如何取,文章提供了4种策略:+ A$ h* y h; r4 o$ t
) k0 o+ ?2 f0 R' Z2 {
策略一:其中一个句子取各token隐层的向量表示,另一个句子采用隐层最后时间步处的输出;
" d5 A9 A9 j: E1 f9 I: t8 B' W* M 策略二:其中一个句子取各token隐层的向量表示,另一个句子采用隐层各时间步输出与之匹配后取再取Max-Pooling值;
2 Q* n2 _( ^$ o- l# R7 }% r2 { 策略三:其中一个句子取各token隐层的向量表示,另一个句子采用cross-attentive后得到的加权句子向量;+ X. d1 w( v* j+ v/ D. C3 ?
策略四:其中一个句子取各token隐层的向量表示,另一个句子采用cross-attentive后attention score最高处token的向量作为句子向量。- O8 p. i4 G! ]) U( n0 s+ ^
这四种策略的区别在于对句子向量的计算不同。
% [8 l, G5 h* ~+ N
& h- T0 g2 l7 {# u. ~8 H6 f& ^9 }& v ) z! a# T6 E6 s3 _
(3)聚合层,首先对上面各种策略得到的输出层再通过一层BiLSTM层,然后将各策略下最后时间步的输出进行拼接,得到最后的聚合向量;* N* U8 c# Q5 [; k
+ O! _/ F9 P0 X
(4)预测层:两层MPL+softmax9 u9 V' J1 g! O( H. Z( l
' b: H7 B( R9 d 9. HCAN) V5 j$ _5 C: ?+ q0 l/ F
HCAN是除Bert类模型外在文本匹配领域表现最为优异的深度模型之一,其采用了较为复杂的模型结构。0 c- P$ P- I0 k7 ?) R* z
2 \9 d+ I3 n) t& j0 | 针对于信息抽取问题,文章首先分析了相关性匹配和语义匹配的差异:
% k. g" N% v% Q" q) \# v1 |
% L- q4 K0 T% ?1 J. U: ]' j (1)相关性匹配主要关注于关键词的对比,因此更关注低层级词法、语法结构层面的匹配性;
: O* O" D; T3 M2 O , `5 V D2 Y2 M; ]1 y b
(2)语义匹配代表着文本的平均意义,因此其关注更高、更丑想的语义层面的匹配性。
7 F: [3 G1 f/ v K+ t5 V4 Y ' W0 d2 h! n5 L& S
该模型首先采用三类混合的编码器对query和context进行编码:
1 E( h: T) e; { V8 [' J* _
( R R$ @2 c$ \2 O- p& M! {, a (1)深层相同卷积核大小的CNN编码器;
, D% U( K4 Z2 j5 n5 f
2 j1 R/ g4 }$ {3 Q/ T( @8 h (2)不同卷积核大小的CNN编码器的并行编码;
$ R9 }; b% r$ s+ Y % i- O2 X1 D/ e5 |& q% B g+ J4 {
(3)沿着时序方向的stacked BiLSTM编码;5 |8 k* ?$ N% M) O0 j# l/ @8 A
9 T( N5 e! z- j# |# | 对于前两者,通过控制卷积核的大小可以更好的捕捉词法和句法特征,即符合相关性匹配的目的;而对于后者,其能表征更长距离的文本意义,满足语义匹配的目的。
+ D6 }8 ?' P1 F) `% B% K , k* S- `/ S- k5 i& c' e
在这三类编码器的编码结果基础上,模型分别进行了相关性匹配和语义匹配操作。其中相关性匹配主要采用各phrase间内积+max pooling/mean pooling的方式获取相关性特征,并通过IDF指进行各phrase的权重调整。而在语义匹配中,模型采用了精心设计的co-attention机制,并最终通过BiLSTM层输出结果。
) y# g# S/ ~% H& f, W! T
" O- \+ J7 U4 s* _3 t d! s2 N( W 最后的预测层仍采用MPL+softmax进行预测。
# X( d4 j" h2 q: ? Y
2 x) i* e4 k6 M 10. 小结1 {5 K/ g" p) Q) v. g( B9 a
交互型语言匹配模型由于引入各种花式attention,其模型的精细度和复杂度普遍强于表示型语言模型。交互型语言匹配模型通过尽早让文本进行交互(可以发生在Embedding和/或Encoding之后)实现了词法、句法层面信息的匹配,因此其效果也普遍较表示型语言模型更好。" r. l3 b$ c+ |3 |
) W( I! a5 d0 V$ x+ d0 P
【Reference】. |2 f0 F4 h6 @3 Z ^. n
/ R. }* w* B+ ? [" |) i
ARC-II: Convolutional Neural Network Architectures for Matching Natural Language Sentences' B ?/ G: b5 i( d& E" V
4 }* h; O0 l# Y; l7 y' X+ Z$ Y
PairCNN: Learning to Rank Short Text Pairs with Convolutional Deep Neural Networks8 u# x) A# E3 r2 Y
1 ]$ ^. e5 B* T( _" I# _2 l MatchPyramid: Text Matching as Image Recognition% N; b0 j7 X! M! O
, Y8 P8 e; v( K* |& A
DecAtt: A Decomposable Attention Model for Natural Language Inference8 k, Y J9 g9 W' c0 |
+ `1 H) ?$ \1 L3 s CompAgg: A Compare-Aggregate Model for Matching Text Sequences) F" P/ V, r! C* H8 Z
8 Z. e- j5 K: ~6 m, S
ABCNN: ABCNN: Attention-Based Convolutional Neural Network
/ h( u8 Z8 w* p1 l0 Q { for Modeling Sentence Pairs
1 l, y: f8 W( v. T1 O1 v+ {
9 r' ?' {+ K( y9 k; s ESIM: Enhanced LSTM for Natural Language Inference5 _$ v1 U2 O/ ^7 Y5 V& f5 y
) Z- P0 [4 I, q8 P$ u
Bimpm: Bilateral Multi-Perspective Matching for Natural Language Sentences
7 ~8 s. k3 v# p/ ?6 }: Z- E
/ K$ q+ q/ ?/ v4 d) L8 C" k1 O HCAN: Bridging the Gap Between Relevance Matching and Semantic Matching5 h( y+ [: k' e% r- {
for Short Text Similarity Modeling$ A: e; J5 d8 F; _) L1 l4 D/ |( {
4 j8 J. P4 z; |* U/ n6 Z 文本匹配相关方向打卡点总结(数据,场景,论文,开源工具): M" b% e2 v5 A( y
" |/ ]" {% s! e; {
谈谈文本匹配和多轮检索6 D9 b" a, x4 M" P. }
- V4 k5 g8 ~( A) ~7 W" M( f 贝壳找房【深度语义匹配模型 】原理篇一:表示型4 N* T) ~, K/ P: X6 r
————————————————
5 b7 q) c: S5 G" U; n 版权声明:本文为CSDN博主「guofei_fly」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
6 Q. ?/ n* ~8 R& J0 E! X5 x* n4 [2 Z 原文链接:https://blog.csdn.net/guofei_fly/article/details/1075012768 k/ G2 P8 H( D D8 J
2 u! F. C/ A5 V$ z9 E1 ` ; p0 N( d J8 v6 `/ g7 U/ ~2 ]0 o
zan