在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 565548 点 威望 12 点 阅读权限 255 积分 174887 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
【文本匹配】交互型模型 ' q1 Q$ L; w; P8 _3 i
9 t3 {; n7 d5 t 表示型的文本匹配模型存在两大问题:(1)对各文本抽取的仅仅是最后的语义向量,其中的信息损失难以衡量;(2)缺乏对文本pair间词法、句法信息的比较
% ^/ t. r$ a+ ~5 I * ?3 U8 b) x- S( C9 q8 Y$ j
而交互型的文本匹配模型通过尽早在文本pair间进行信息交互,能够改善上述问题。
3 T( ^2 r# W# B: g9 p
% f* O$ H Z8 b2 N2 o+ s( f 基于交互的匹配模型的基本结构包括:9 X9 S, {8 Z* N T6 y6 o
* z# V1 c0 e% X, |% M! ?
(1)嵌入层,即文本细粒度的嵌入表示;! p0 E/ o6 M2 w9 p6 \* i
! ^* f6 n" q8 @: h6 c$ w H
(2)编码层,在嵌入表示的基础上进一步编码;8 e- X# j. t. \
$ } {# ?# u5 ], k7 d
(3)匹配层:将文本对的编码层输出进行交互、对比,得到各文本强化后的向量表征,或者直接得到统一的向量表征;
5 e# |+ Q X/ @5 w% J 2 S- C: b$ |6 J+ s" W
(4)融合层:对匹配层输出向量进一步压缩、融合;
* _& e& `5 ?) s0 h
; n9 _* z9 @2 N/ ~6 n (5)预测层:基于文本对融合后的向量进行文本关系的预测。
" L0 ^8 l4 W1 v; i 6 u/ f: u" W) V, W3 h1 C
: h. ?1 O- Y; b" z8 x
% b- y" N u( E0 w2 C- S
1. ARC-II, B; @' R& U8 A
ARC-II模型是和表示型模型ARC-I模型在同一篇论文中提出的姊妹模型,采用pair-wise ranking loss的目标函数。
) i2 h) w5 l) R; I0 p( d
- v' s6 Y1 Y! D 其核心结构为匹配层的设计:/ k; B' s3 b" q1 K* x) d
# ]$ L& O. N# y5 T( n! A7 b4 p* G
(1)对文本pair的n-gram Embedding结果进行拼接,然后利用1-D CNN得到文本S_X中任一token i和文本S_Y中任一token j的交互张量元素M_{ij}。该操作既然考虑了n-gram滑动窗口对于local信息的捕捉,也通过拼接实现了文本pair间低层级的交互。
& M' P" o) z1 V3 _7 Y* [ 0 Z+ B) r" g. V
(2)对交互张量进行堆叠的global max-pooling和2D-CNN操作,从而扩大感受野。/ D3 w5 E: c2 U; |3 I; r9 ^
% s7 O0 o: |! j1 L
2. PairCNN6 A! L J6 \- J: A
PairCNN并没有选择在Embedding后直接进行query-doc间的交互,而是首先通过TextCNN的方式分别得到query和doc的向量表征,然后通过一个中间Matrix对query和doc向量进行交互得到pair的相似度向量,然后将query的向量表征、doc的向量表征、相似度向量以及其它的特征向量进行拼接,最后经过两层的MPL得到最后的二分类向量。8 m6 k& k3 Y- m6 K
3 b+ ~) c" z7 A [& K PairCNN的模型架构中的亮点在于各View向量的拼接,既能利用原始的语义向量,还能够很便捷的融入外部特征。
3 ? x ?0 ~. M5 `
5 h! ?0 w( _4 x$ z/ a 3. MatchPyramid5 A, N/ K6 w: c
无论是ARC-II中的n-gram拼接+1D conv还是Pair-CNN中的中间Matrix虽然均通过运算最终达到了信息交互的作用,但其定义还不够显式和明确,MatchPyramid借鉴图像卷积网络的思想,更加显式的定义了细粒度交互的过程。+ z) Z2 \) ]& L/ J1 R9 G
MatchPyramid通过两文本各token embedding间的直接交互构造出匹配矩阵,然后将其视为图片进行2D卷积和2D池化,最后Flatten接MLP计算得匹配分数。本文共提出了三种匹配矩阵的构造方式:
8 p: K. g( O8 b+ p: _; k
8 q3 O5 I1 K$ F (1)Indicator:0-1型,即一样的token取1,否则取0;这种做法无法涵盖同义多词的情况;
( W, X) e; A% ~9 l$ B8 E( a
2 Z- G% X. k/ j4 k (2)Cosine:即词向量的夹角余弦;
}, J1 Y4 ^) k8 a3 }1 ? - n* N0 T: W$ I( X! s& c9 \$ ]' z
(3)Dot Product:即词向量的内积7 o2 f7 _3 ?% D* L
$ l0 q* U8 n3 e# m5 Y" b% b
此外值得注意的是因为各个文本pair中句子长度的不一致,本文并没有采用padding到max-lenght的惯用做法,而是采用了更灵活的动态池化层,以保证MPL层参数个数的固定。
! @- d5 L: k7 @' c: {. c" z& J
4 j! X- K4 R( V4 y8 [ V9 Y d; @; B6 U 4. DecAtt
" Z- |1 O& t- [8 w1 {- J DecAtt将注意力机制引入到交互型文本匹配模型中,从而得到各token信息交互后增强后的向量表征。$ ^; K5 M. @& ]2 W- b: r
8 ^0 f0 B$ t- x9 b3 k2 J 模型被概括为如下层级模块:; e% {: i2 E G, i
! }: I& F- b- R# v4 ]6 d9 k: ]3 R9 h# U9 y
(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。
5 z0 Z( x9 g; U5 `( H7 N6 [ 4 v7 A9 n( p' w5 W9 Q3 _& l
(2)Compare层:将前序Attend层计算得到的最终embedding,喂入一个全连接层进行向量维度的压缩。
. e8 d8 \& {, p9 h
( S6 A* b. g4 |) i( Q/ V (3)Aggregate层:将每个文本各token处压缩后的向量进行简单的求和,再拼接起来通过MPL得到最后的匹配得分。5 i9 C, @* j/ ?7 A
$ K. s4 z/ y- \7 p$ F. ~
5. CompAgg
{' \' V0 V" l1 E CompAgg详细对比了在文本间cross-attention得到的各token向量表征与原始token向量进行compare的各种方案。
& Y1 j4 T" w. G: [9 p' ]+ C) R
+ b# A' e" O8 Q. I4 x 该模型的主要结构包括:3 ^! n1 `3 }$ c" y
) u3 S6 x+ t1 C (1)reprocessing层:采用类似于LSTM/GRU的神经网络得到token的深层表示(图中的\bar a_i);& _' ~3 H# r; w. ^# ^
1 p3 h0 `+ {' c# a% R' s
(2)Attention层:利用软注意力机制计算文本间的cross-attention(与DecAtt相同),从而得到各token处交互后的向量表示(图中的h_i);) Q r' x/ G# M/ }1 R
8 i- D5 I4 L3 W# P (3)Comparison层:通过各种网络结构或计算将\bar a_i和h_i计算求得各token的最终表征。4 y3 x1 U) c3 C: w0 C, \& Y! h! R
1 Z+ S R9 A/ m: e7 Q
(4)Aggregation层:利用CNN网络对Comparison层的输出进行计算,得到最后的匹配得分。
- K3 L1 k" T: ?! ?- `* f
8 R: J6 f [. {( O e 其中Comparison层的构造方式包括:4 l, d% t: k2 J6 R, G# ?3 [6 o: r
4 e5 B7 L- a2 b
(1)矩阵乘法,类似于Pair-CNN中的中间Matrix; ^) u0 ~* a. w* D0 e( x" \3 n
. E; G+ ?( v4 }) j0 U4 j4 P2 Q (2)前向神经网络,即将\bar a_i和h_i进行拼接,然后利用输入FFN; N; F; d( @& O" q8 X
) k. S& X6 g% _. |6 I( Y) s4 z. }
(3)分别计算cosine和欧式距离,然后拼接;
, f3 Q H( G; E! K) H6 L
% }+ i x {9 F4 y, f) D, W (4)各维度进行减法;' T) {0 h" O# {# ^
/ c, y+ b3 s9 o& } (5)各维度进行乘法;, C8 W6 v' A0 X' q# ?9 g! b" V
' _8 T' |( \8 i! `' C* n (6)各维度进行减法和乘法,然后再接一个前向网络。
) i. n! g- ?# _- [- P" Y & {' m1 h, w' w6 }6 F6 V# x4 m* b
6. ABCNN
; }; X3 J6 ~ X y+ I" A ABCNN是将Attention机制作用于BCNN架构的文本匹配模型。
& b0 ~1 E, \. W
2 |3 H2 Q0 ~& b1 q) e7 @ 6.1 BCNN
* e. ^( A1 [' f! W$ k6 N 首先简单介绍下BCNN架构:7 V/ z) ~* I# P/ I
. c; k$ U( E( O2 G+ u5 b# p" p1 x
BCNN的整体结构比较简单:(1)输入层;(2)卷积层,因为采用了反卷积的形式,所以在size上会增加;
* h/ y& z1 ^% L+ P, F
' T% z7 s- k: G- b (3)池化层,采用了两种池化模式,在模型开始阶段采用的是local平均池化,在最后句子向量的抽取时采用了global平均池化;(4)预测层,句子向量拼接后采用LR得到最后的匹配得分。
" ]3 w8 [* J$ y' Q8 D$ S5 S6 D
0 t. M# |, G$ ^1 M) x# U9 s ABCNN共包括三种变形,下面依次介绍。
9 c) |. S: ?/ X( H# c& p0 v) Y$ T 7 ]5 Q: O! ^# m2 g, ?+ O# z4 `
6.2 ABCNN
7 ]) D3 r4 E. L( E0 }3 x0 n - O6 m; ^- `/ i" X
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 . W; a! U! W1 X8 A
ij6 d0 |& i6 r3 \6 U ]+ N
" b+ t' N4 x- w' c3 F
= 5 {% l- d; V2 X6 r' e
1+∣x ' r. e+ T* Z! d- M0 x. ]. R0 E0 u
i
^* h6 `" y; M C3 d
9 V$ ~. H9 @- V! J9 n0 k% V% |; P& b −y % J( M# s5 }& b8 c
j
$ Q. p* f4 {7 {7 h4 e, H) ^ 4 _1 l7 J/ e2 r7 y
∣- G# ?( Q% I/ H" o o4 \ F- `
1% X3 a; J Z+ v" J& J& ]
0 v/ v3 e9 L& p$ s: Z# Z
,然后分别乘以可学习的权重矩阵 W 0 W_0 W
9 n" V0 d' p* m9 n I% Q$ T 0
: @' v: M4 z8 w- e7 ` " e+ h9 Q. f( L
和 W 1 W_1 W
" h; C: R$ G7 A% l5 q5 X" \7 c 1
0 B& Z# P0 a, m+ f! }% _3 z
8 O' ~: k- |/ p2 H- L j 得到attetion feature map。
! e: v! \- s1 H% |6 Y: [/ ]6 u
+ W) L- \! z0 U% M" J( S. M7 e 6.3 ABCNN-23 X, q8 d9 k* @, W% I) `" }: z$ C
# ^6 X9 B! X7 Y- l8 r
ABCNN-2将Attention机制作用于word embedding层后的反卷积层的输出结果,其中注意力矩阵的计算原理与ABCNN-1一致。然后将注意力矩阵沿着row和col的方向分别求和,分别代表着各文本token的attention socre;接着将反卷积层的输出结果与attention socre进行加权平均池化,得到与输入层相同shape的特征图。( n! Z3 N! n( k* E
# V5 @3 j9 x; C5 A, R/ _( d) ?7 B 6.4 ABCNN-3
- |6 L* A; Z3 X & z G$ m7 c( k/ b. ~* _
ABCNN-3的基本模块可视为ABCNN-1和ABCNN-2的堆叠,即在嵌入层和卷积层上面都引入了attention的机制用来增强对token向量的表示。
. i# H9 I5 h5 u) Q 0 o& N8 g2 u e2 t7 t
7. ESIM1 `/ @" K J/ X+ G2 ^
ESIM模型基于NLI任务给出了一种强有力的交互型匹配方法。其采用了BiLSTM和Tree-LSTM分别对文本序列和文本解析树进行编码,其亮点在于:. e! A, c( v2 n5 C0 F: B3 P
) O* Y/ o& ]( L0 ^9 T/ W* ~ (1)匹配层定义了cross-attention得到各token的向量表示与原token向量间的详细交互关系,即采用 [ a ˉ , a ^ , a ˉ − a ^ , a ˉ ∗ a ^ ] [\bar a, \hat a,\bar a-\hat a,\bar a* \hat a] [
( q7 d2 _- ~3 t+ a, V! e( h a
" B0 A) H+ ^4 ` ˉ3 d) y% W" d- ^. _4 Y
,
/ ?$ ~) q5 d2 F' q) Y, w a
1 Y. ~1 P, q& u) @ ^
! b, f) N+ e5 X1 C/ ~ ,
- C7 n U# {$ A/ \2 `! e4 T0 i a4 A9 N# t, |9 g: ?0 ~; l1 |0 o
ˉ
/ E/ O1 x9 V o9 E% B − / y. ]) v- |0 ~! u0 h2 f
a
7 f" l5 u; I; } ^
0 y" r t1 ?1 O Y ,
$ Q% j3 ]( N4 x- z6 T- W+ V a
5 ~* g, X3 L3 B& l9 C2 s6 R4 C ˉ1 z& @& H# ^7 R+ N
∗
9 [) S+ k8 d' u- R+ z a
+ q( r& G. ]# X: `" S1 Q* t ^, ~! e$ }' r9 i1 P6 M3 m! G
]作为最终文本token的向量表示,这也成为后续文本匹配模型的惯用做法。
3 P* M; [+ ?2 M4 z; F , Q$ [4 l7 T1 ~/ }# d: g0 B
(2)聚合层通过BiLSTM得到各文本token的编码,从而进一步增强了文本序列的信息传递;! t, q* c( }0 ^0 O* }5 A" Y# B
; @9 O5 D" Y5 ?0 Y (3)预测层通过拼接各文本token编码的max-pooling和mean-pooling结果,再经过MPL进行匹配预测。
! R# G" J S( s4 z# [( ]
3 y5 Z6 s0 P" |7 g0 A. z# n5 @$ d 2 D6 ^8 E5 F0 H7 C7 X: s9 c, h. @6 Y
- w% g- D! Z/ q8 Q6 G/ f9 i 8. Bimpm
, T4 J+ I% x6 {. r; U7 C9 E Bimpm可视为对之前各类交互型文本匹配模型的一次总结。; l, a5 M/ `, E
/ N4 K# o$ q7 p, ~9 j4 O* k
该模型在各层的具体做法总结如下:
v( P& {7 r$ e3 v+ W6 N
" g+ B6 a: ^6 j! G (1)编码层采用BiLSTM得到每个token隐层的向量表示;) P5 K) Y2 q! X' X+ H/ |2 y5 E
3 Y r! l1 t( N
(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
8 V+ _. q2 P4 h7 g k t5 s' g8 W: e A
/ r, |3 E4 U2 I8 D/ k2 j
=cosine(W
j- P8 M1 V9 U6 A0 {3 ?( @- y k
P% d5 F& C Q7 ?. f, y: q# B
( G& h' g7 Z% E6 } L" j ∗v
/ Z* D C9 p, ?! p+ [5 k 1
" l: ]8 E2 g# g
% m: a6 T1 ?% }3 X: f- ~) m) c- j& s ,W 2 O3 P$ [& A. @$ N5 G7 R" C* U
k8 [/ _% J/ E+ N: H) [8 y
, i! j4 y9 G* q% x0 \' Y3 g ∗v
8 u: `# U6 W7 D. z# l 2" P* m4 }. B. K# S! n! e. z7 O7 w) \
0 _# r1 r2 B7 n7 h8 o3 h )的方式可以得到两个文本的任意token pair之间在第k个view下的匹配关系,至于 v 1 v_1 v
/ k. x4 y9 K1 N# f8 `* g 1* q6 q! l7 u( T8 g3 g9 b
, H9 V; T6 q U! U 和 v 2 v_2 v
, s" D; Q2 S0 Y4 B2 {/ v 2
6 `. Y0 q) x) r* L" R' L
3 d" A1 W% h& K: e3 ^2 E$ d% N 如何取,文章提供了4种策略:
! d' r3 \0 x9 p- Q2 k: R+ r + @% \; i$ B0 i) T0 c7 ~
策略一:其中一个句子取各token隐层的向量表示,另一个句子采用隐层最后时间步处的输出;2 U# x$ G2 q9 T' e/ i
策略二:其中一个句子取各token隐层的向量表示,另一个句子采用隐层各时间步输出与之匹配后取再取Max-Pooling值;
0 q$ A W5 \" b. Y 策略三:其中一个句子取各token隐层的向量表示,另一个句子采用cross-attentive后得到的加权句子向量;
/ P2 N% o4 K& z2 h7 ~1 m 策略四:其中一个句子取各token隐层的向量表示,另一个句子采用cross-attentive后attention score最高处token的向量作为句子向量。0 X6 v) O3 g [0 ~1 j1 x0 b& ]" I
这四种策略的区别在于对句子向量的计算不同。5 \: g2 z+ @ |( R S# [! @
: p8 m/ N9 K2 R$ G
, s* I. g. b3 u8 b (3)聚合层,首先对上面各种策略得到的输出层再通过一层BiLSTM层,然后将各策略下最后时间步的输出进行拼接,得到最后的聚合向量;2 V; h' Y) b; f8 g& j r
7 o) `7 i" z! k& X0 s+ S (4)预测层:两层MPL+softmax
$ \' _6 R2 j+ R `' y! H& P6 D* b 7 Y# [: {8 J# z4 U4 S" O5 Q6 _7 r7 j
9. HCAN' H, ~3 t* K/ `, l+ z3 |' R
HCAN是除Bert类模型外在文本匹配领域表现最为优异的深度模型之一,其采用了较为复杂的模型结构。
, g$ V( @0 O+ I. l# B" T # q0 L% M Q4 d$ k# ]. x% k9 X
针对于信息抽取问题,文章首先分析了相关性匹配和语义匹配的差异:+ G* E: ^* `/ Y, }
0 f" u3 q+ [8 p* k1 |- b' r
(1)相关性匹配主要关注于关键词的对比,因此更关注低层级词法、语法结构层面的匹配性;" m2 y% D7 R# E3 L0 X& r6 C
5 q" W1 E& C, y$ r' t (2)语义匹配代表着文本的平均意义,因此其关注更高、更丑想的语义层面的匹配性。9 {- B, N5 W5 U; N* x7 |
( a2 b7 k4 A/ M0 M* q; v 该模型首先采用三类混合的编码器对query和context进行编码:
* W7 A- F2 T# x3 N% O$ W
' a# G) F7 T: {* t. |* ]/ y* e: V (1)深层相同卷积核大小的CNN编码器;) E f' n! h+ c
- l Q: Y7 D. y+ L! T0 \ (2)不同卷积核大小的CNN编码器的并行编码;4 a2 H# `7 i6 Y$ D! p f% {
# Q8 C8 B9 v: ]
(3)沿着时序方向的stacked BiLSTM编码;( Y" f x/ S) f* w+ D0 L" y6 B' |
& J9 _. [; m c
对于前两者,通过控制卷积核的大小可以更好的捕捉词法和句法特征,即符合相关性匹配的目的;而对于后者,其能表征更长距离的文本意义,满足语义匹配的目的。7 |9 ~2 l S- K( C' e, O2 k4 I# f
0 Z. {, G" V ^& G 在这三类编码器的编码结果基础上,模型分别进行了相关性匹配和语义匹配操作。其中相关性匹配主要采用各phrase间内积+max pooling/mean pooling的方式获取相关性特征,并通过IDF指进行各phrase的权重调整。而在语义匹配中,模型采用了精心设计的co-attention机制,并最终通过BiLSTM层输出结果。
$ U1 C2 l: l w$ q, f- s8 [& B
' ]9 R/ B/ |0 ]3 V1 a 最后的预测层仍采用MPL+softmax进行预测。3 m5 `3 c+ }, n! t9 M0 s0 D
5 t) E. C; d7 c Q$ ~
10. 小结
0 r0 [/ l* A; P n" D( @! x% x 交互型语言匹配模型由于引入各种花式attention,其模型的精细度和复杂度普遍强于表示型语言模型。交互型语言匹配模型通过尽早让文本进行交互(可以发生在Embedding和/或Encoding之后)实现了词法、句法层面信息的匹配,因此其效果也普遍较表示型语言模型更好。
4 y1 {$ x( e1 ~2 z( B5 B+ e/ \ $ v; K N, F% \+ G1 o6 u
【Reference】4 `2 P' S7 `+ E; @! h- m; I% l, ]0 p! o
$ d3 G" _9 N8 n4 U7 S; T
ARC-II: Convolutional Neural Network Architectures for Matching Natural Language Sentences& B e; F5 h9 w4 K8 r- K# P0 ]
# q; s5 d" G! S1 H C, w" E. D+ v PairCNN: Learning to Rank Short Text Pairs with Convolutional Deep Neural Networks
9 a% o: B- ]8 ?% N# b
1 Y7 f/ s( ~; [& d/ o& y MatchPyramid: Text Matching as Image Recognition
7 j* \: }3 d7 ^ F: [% B* g! o- K2 b; h
DecAtt: A Decomposable Attention Model for Natural Language Inference/ n8 n) G" W% C8 H8 d
/ _5 t. I, Z( W( u; z: g* p5 } CompAgg: A Compare-Aggregate Model for Matching Text Sequences
4 j1 D( g/ `5 ?$ [' d
) @+ d$ r; {/ F ABCNN: ABCNN: Attention-Based Convolutional Neural Network( R$ v( Q; P2 G- f5 O& m/ z
for Modeling Sentence Pairs
( ?& G8 c- T9 s; } " G5 T. I5 a7 E. m7 L" o
ESIM: Enhanced LSTM for Natural Language Inference
$ G' K5 E1 d. T S# \3 w 1 b0 ^/ C7 x8 V5 k7 u9 |. Q; B1 ^
Bimpm: Bilateral Multi-Perspective Matching for Natural Language Sentences
& ?5 ~" t4 t% G/ ^+ | * W. l0 S x% N3 L
HCAN: Bridging the Gap Between Relevance Matching and Semantic Matching
; y: b& y" f: ]& m for Short Text Similarity Modeling
+ P: E$ F& G# @8 n. |0 r
' ?3 _. b6 y% y* G& i1 m0 F/ ?1 j 文本匹配相关方向打卡点总结(数据,场景,论文,开源工具)
2 _3 k! y" B' K# J" W; o$ F
, j$ w; x) q% b, n+ Q- M 谈谈文本匹配和多轮检索5 [5 G3 e# b4 C
8 D$ A L! x: A; v. U 贝壳找房【深度语义匹配模型 】原理篇一:表示型
6 x3 a8 h) A- K# X4 y ————————————————( I5 A' ]6 G; F+ q( D' b
版权声明:本文为CSDN博主「guofei_fly」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: P7 A0 ?+ m: z- `
原文链接:https://blog.csdn.net/guofei_fly/article/details/107501276
1 m+ D s5 R' H, U. C$ n) p + ~5 X% Q! p0 v3 e
1 k9 X% |+ |) S! |2 g2 J
zan