- 在线时间
- 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年大象老师国赛优 |
【文本匹配】交互型模型3 k" b+ p5 c! g2 ?5 q+ O, m7 y A4 |
$ m. f9 x! h3 n+ P. g
表示型的文本匹配模型存在两大问题:(1)对各文本抽取的仅仅是最后的语义向量,其中的信息损失难以衡量;(2)缺乏对文本pair间词法、句法信息的比较4 M# C9 d! j" V( Z' M6 {3 ]
$ z- L5 G2 _- S2 _ W
而交互型的文本匹配模型通过尽早在文本pair间进行信息交互,能够改善上述问题。
; K$ C1 V% p1 G) U+ E- K4 \& `# t J6 A7 Q* h$ s* _
基于交互的匹配模型的基本结构包括:
. S3 Y7 R0 Q X& Q! w& E! ~5 _* [
' y& P2 t5 G* M L2 k0 \( ]. \(1)嵌入层,即文本细粒度的嵌入表示;* m$ L7 Z& B! I
0 X4 _7 y3 Z1 r; B8 o k& ?. p
(2)编码层,在嵌入表示的基础上进一步编码; P9 Q, U. S3 A
; [+ N6 i" A$ ]: o- A& x$ l4 r(3)匹配层:将文本对的编码层输出进行交互、对比,得到各文本强化后的向量表征,或者直接得到统一的向量表征;8 m& p: b3 z1 W7 x0 i
+ o; ~8 {% j6 ~7 w(4)融合层:对匹配层输出向量进一步压缩、融合;& e( Y1 C1 T$ K$ X8 o8 j! `4 S
4 S e: a( y2 s2 o(5)预测层:基于文本对融合后的向量进行文本关系的预测。3 n) z0 _6 p: g
% C' M" V) Y- |8 s7 _8 p
; G% g* j$ S/ w/ F
/ m; d! K6 X7 M4 X' g7 U1. ARC-II
9 n1 Z Y6 C. T) D- VARC-II模型是和表示型模型ARC-I模型在同一篇论文中提出的姊妹模型,采用pair-wise ranking loss的目标函数。; h: D! b( N7 Y" L3 L
) H; f' _; M2 P) M' M( { S, x+ _
其核心结构为匹配层的设计:
% U; [4 ~, G: O2 Y* `9 k" H' R; }5 t4 m1 m) {" \( T6 ^
(1)对文本pair的n-gram Embedding结果进行拼接,然后利用1-D CNN得到文本S_X中任一token i和文本S_Y中任一token j的交互张量元素M_{ij}。该操作既然考虑了n-gram滑动窗口对于local信息的捕捉,也通过拼接实现了文本pair间低层级的交互。- q$ g8 H+ \' g* y
' |# h; i7 W/ K, B5 h3 x. o
(2)对交互张量进行堆叠的global max-pooling和2D-CNN操作,从而扩大感受野。
( w. ?8 j0 S; O, r2 x2 L: ?- R, {3 Y7 S
2. PairCNN
0 E5 d+ z* v! R1 pPairCNN并没有选择在Embedding后直接进行query-doc间的交互,而是首先通过TextCNN的方式分别得到query和doc的向量表征,然后通过一个中间Matrix对query和doc向量进行交互得到pair的相似度向量,然后将query的向量表征、doc的向量表征、相似度向量以及其它的特征向量进行拼接,最后经过两层的MPL得到最后的二分类向量。* q# {1 H8 f& ^4 j9 J0 K/ c
7 l" z7 s" v# \3 R: a. r" z3 J7 u
PairCNN的模型架构中的亮点在于各View向量的拼接,既能利用原始的语义向量,还能够很便捷的融入外部特征。
! d5 z" Q1 W9 C8 X7 K+ Y( d% X: A2 N) H
3. MatchPyramid( \1 _( p7 T1 ^0 M! m9 ^
无论是ARC-II中的n-gram拼接+1D conv还是Pair-CNN中的中间Matrix虽然均通过运算最终达到了信息交互的作用,但其定义还不够显式和明确,MatchPyramid借鉴图像卷积网络的思想,更加显式的定义了细粒度交互的过程。
) g6 _( ]$ ^. R9 UMatchPyramid通过两文本各token embedding间的直接交互构造出匹配矩阵,然后将其视为图片进行2D卷积和2D池化,最后Flatten接MLP计算得匹配分数。本文共提出了三种匹配矩阵的构造方式:
+ H9 e, `; o1 C( h4 K$ J
8 S" N4 b1 u# C(1)Indicator:0-1型,即一样的token取1,否则取0;这种做法无法涵盖同义多词的情况;; P/ Q7 f( G& T3 ^
! m s' o1 G) j: F(2)Cosine:即词向量的夹角余弦;' P0 Y! u( L: f: B. `
' p2 b; G' k3 ]7 m1 P(3)Dot Product:即词向量的内积
' N5 U* R, ], p1 c, l- u' e& k/ E' x& n6 a2 o
此外值得注意的是因为各个文本pair中句子长度的不一致,本文并没有采用padding到max-lenght的惯用做法,而是采用了更灵活的动态池化层,以保证MPL层参数个数的固定。
- f; R- @+ l8 f7 D0 m* ?9 a
' j! r+ U- U/ ], r- s0 k1 B7 ?, G4. DecAtt
/ }9 o2 W" }' }* j# @" xDecAtt将注意力机制引入到交互型文本匹配模型中,从而得到各token信息交互后增强后的向量表征。 D C. ~" N; f" W1 \1 X8 c# z
, l0 a @; \) y* g
模型被概括为如下层级模块:
' x2 O U5 `$ W9 N; |" O( f1 ]: Y) {8 I* j0 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。- G G% G4 i& W v
" e+ H; v) D# X) [5 m
(2)Compare层:将前序Attend层计算得到的最终embedding,喂入一个全连接层进行向量维度的压缩。$ h) V2 N8 n, a% H, y
6 C% M, x- s8 }. K& x3 s(3)Aggregate层:将每个文本各token处压缩后的向量进行简单的求和,再拼接起来通过MPL得到最后的匹配得分。
3 ]: ~1 n( e6 ]3 M5 ~$ L/ t# ^, c: x3 b5 _7 e! F
5. CompAgg
( _, J. W* v1 M8 ^8 ECompAgg详细对比了在文本间cross-attention得到的各token向量表征与原始token向量进行compare的各种方案。& _+ k$ d; V' q$ C9 M
7 U% `, v' E! h9 y5 H
该模型的主要结构包括:
% g2 P/ ]$ j5 ~" I: Y/ o+ r' M
( \2 m8 U$ w' x. l8 Q- W(1)reprocessing层:采用类似于LSTM/GRU的神经网络得到token的深层表示(图中的\bar a_i);
4 u" A8 G! }# ? n* @. q/ a9 ~; d" M; `3 H& |; t% x
(2)Attention层:利用软注意力机制计算文本间的cross-attention(与DecAtt相同),从而得到各token处交互后的向量表示(图中的h_i);
) K' ^* K9 i7 j; ^1 V7 m4 H2 G$ W6 \
D4 j; c3 Y6 u! @2 J! h(3)Comparison层:通过各种网络结构或计算将\bar a_i和h_i计算求得各token的最终表征。
* C0 B4 L3 r& Q6 V1 d$ N2 |& R0 O4 W5 \# K6 y$ S. k
(4)Aggregation层:利用CNN网络对Comparison层的输出进行计算,得到最后的匹配得分。
3 ^8 y D9 \/ x3 N$ U# O! B9 B5 s8 |: M( W: Z
其中Comparison层的构造方式包括:
& v: T1 u6 D2 c; g8 F1 }. i2 Z9 y1 W% I$ j5 B: ~& U# B) |' H* J
(1)矩阵乘法,类似于Pair-CNN中的中间Matrix# e: X. T F4 G" s y& D
+ W2 z& ^4 N9 G: X) M
(2)前向神经网络,即将\bar a_i和h_i进行拼接,然后利用输入FFN;
1 r% {) h+ a* E. p; _1 U4 a% g8 g8 s( F! h. N$ X
(3)分别计算cosine和欧式距离,然后拼接;
8 u$ ~. @7 J) ]; j$ |2 @, Q& q1 ?
4 X' ^- x) P# b/ F$ Y, ^+ i(4)各维度进行减法;! f9 r: N! W# U$ a' n+ t4 j
; z" w6 z. ^ b% d8 K# R6 n. q
(5)各维度进行乘法;, ^7 L; T9 ~: O9 p3 N# k; \% F7 |+ `
Q5 A3 h0 U2 U+ c2 F
(6)各维度进行减法和乘法,然后再接一个前向网络。' c" E) D* K! o4 t. v/ e6 b
" G# \" t- ~! S8 V2 e6. ABCNN7 W$ i t' O" ^% w
ABCNN是将Attention机制作用于BCNN架构的文本匹配模型。
$ h8 O& c% f7 D% E6 m
4 o2 t4 Z& l# f& M; d2 s+ Q6.1 BCNN
0 g# ~( t) Q) C; O首先简单介绍下BCNN架构:
* M4 @. R; j; }" y4 q( m& u9 o/ n) T/ X3 l% K# a( j; {
BCNN的整体结构比较简单:(1)输入层;(2)卷积层,因为采用了反卷积的形式,所以在size上会增加;/ {7 T, s% U3 r4 X$ y3 |
5 l3 Z A) d. l9 ^8 I9 Q
(3)池化层,采用了两种池化模式,在模型开始阶段采用的是local平均池化,在最后句子向量的抽取时采用了global平均池化;(4)预测层,句子向量拼接后采用LR得到最后的匹配得分。
0 Z! a: w! u0 u6 i% T& T1 D8 _. I& ^! ]: E
ABCNN共包括三种变形,下面依次介绍。
( B/ B J! @/ r7 |5 f, a! \( Q' d" }8 s9 s# G% ^
6.2 ABCNN6 r; Y, ?# W( A
4 ]* i8 P; }" Q+ J: B+ [
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 E, q7 k4 P4 R- P5 j( F( ]ij% l, x6 f0 E! {$ B" B r
4 l$ L8 N0 D0 N- j
=
: ~( y1 ]& x5 S ~4 L( y' j1+∣x
+ l) ?: e% ]* R8 f) S- c% I. mi$ B x. T3 A/ y
, g# J- l; w" X6 b' `: P
−y
- j% k2 V: o$ d, v* s4 q! Lj
- G- ?' W u, C* e 7 ]$ h, U* k2 F' i$ p
∣2 ?5 _+ Q9 {) g* f+ B. B) a8 s
1& z1 x4 }$ S* Y( [( {: q
) B( D# y2 o( @6 M
,然后分别乘以可学习的权重矩阵 W 0 W_0 W
! k( P. b: G/ y8 Z0 s$ p. y0
: w7 Y4 ~% Z( `) Q ( y5 U2 X1 B; Y0 u% m* Z% m( {
和 W 1 W_1 W ) i' H6 [9 I- V
1; T6 z2 o& R( O: q: c
2 H1 }2 p1 X. H, S' [! o 得到attetion feature map。# U; c3 v/ F, ?
; j: j0 I3 L$ ^1 l% k
6.3 ABCNN-2
6 M$ Z2 L* L: h5 g& k( f
4 h7 w7 s+ p1 C! J% N0 E( ZABCNN-2将Attention机制作用于word embedding层后的反卷积层的输出结果,其中注意力矩阵的计算原理与ABCNN-1一致。然后将注意力矩阵沿着row和col的方向分别求和,分别代表着各文本token的attention socre;接着将反卷积层的输出结果与attention socre进行加权平均池化,得到与输入层相同shape的特征图。" x% I y# ^4 j' e
0 b! f+ A9 r. U( c; p6.4 ABCNN-3
+ I* G4 U8 O9 t& t9 l$ h* X
& {+ P6 M% E/ \4 e$ r% fABCNN-3的基本模块可视为ABCNN-1和ABCNN-2的堆叠,即在嵌入层和卷积层上面都引入了attention的机制用来增强对token向量的表示。) z g2 |( T3 x" T
* d: m/ d- b3 K- ?1 E
7. ESIM
- B5 p+ k0 R" }' Q3 I. n& B; R% hESIM模型基于NLI任务给出了一种强有力的交互型匹配方法。其采用了BiLSTM和Tree-LSTM分别对文本序列和文本解析树进行编码,其亮点在于:5 d2 z& d3 O; W0 [2 T. _
; n _( C6 N2 N; u
(1)匹配层定义了cross-attention得到各token的向量表示与原token向量间的详细交互关系,即采用 [ a ˉ , a ^ , a ˉ − a ^ , a ˉ ∗ a ^ ] [\bar a, \hat a,\bar a-\hat a,\bar a* \hat a] [ 5 p! A+ ?. X" c1 D" g
a
7 r, n6 R7 z, l9 U, Wˉ% F% l) J9 B) Z
, ! s5 \' z, k W, V& A4 w( [
a$ l0 p* Q% @# W# t% Q: G! M
^
0 x% R: H' J$ n' c1 q- V ,
4 @" [9 ^0 }' i5 \- X% n* l* |" ma
" F0 W i( v' O* }1 E- lˉ. H3 v$ u+ r' a6 M$ q6 }
− ! ^, a2 o! L8 F" h0 S, L. \
a
$ x2 b5 Q: y" ~3 V" r8 }^
3 ?7 g0 d8 Q6 @9 e( u6 G/ ]' n/ z/ j , " o7 w% V$ G9 |/ d
a7 X! G+ d& t, z/ t
ˉ* a9 _ ^) G1 F9 V8 q
∗ 9 m' e, W: s5 S0 E. K
a
' ]* \9 d8 [2 ~" g0 y; T0 Z^
7 y8 B2 u% V, I6 \8 C/ g' t ]作为最终文本token的向量表示,这也成为后续文本匹配模型的惯用做法。
1 ~* i3 |/ _, S' z4 D, F( L5 Z- M* `$ I* A+ M! f" j
(2)聚合层通过BiLSTM得到各文本token的编码,从而进一步增强了文本序列的信息传递;0 F2 W! L/ E( S+ R# U# z
& b1 S9 Z# F. u) g8 s% e- L- K. A
(3)预测层通过拼接各文本token编码的max-pooling和mean-pooling结果,再经过MPL进行匹配预测。
0 a: ~! o' d u2 l+ `; g% x: D& ~& d& j/ L8 r6 r
3 O( }8 q' g2 U& k3 Z3 |
S7 i. q0 g, P4 Q6 w3 X% w8. Bimpm5 W- A( }5 _7 ]9 L3 ^
Bimpm可视为对之前各类交互型文本匹配模型的一次总结。
% ]2 W- }, R' v A1 w
( w% U6 q" q: f7 m该模型在各层的具体做法总结如下:
3 c9 T$ J' k0 K& p5 d. H7 [8 _; E9 R; {' Z' b
(1)编码层采用BiLSTM得到每个token隐层的向量表示;
/ G, o9 u' z) ~. E* ]' N" f
4 L/ w: N5 _+ ]5 c: i* e) v(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
% F. b% C# Q/ G: A" e: \* m2 xk
) [. ]* l; X+ D6 V
) n" Q- }. o( ] m! v4 S6 ? =cosine(W
7 O% {7 A& \" u" X6 pk; i9 N$ E6 _0 l4 \0 J
3 G- f) Z) f0 T
∗v ' K3 P' O* m0 ^' T' R; @$ @
1" W; v, Z) b3 y4 { w4 J k
7 f: k4 _+ e9 R n, g9 n3 O/ ?4 Q$ l ,W 9 C( m# {( R A0 |# z# }% v ]
k! G$ h3 s% T* w4 n* A6 W; n* ^
# x( q/ M4 `/ [) O5 n: v# z/ `7 M ∗v ( @, ~7 F: y( M' s5 E6 d
2
8 j! ^+ f- V. X+ H: k" {( T5 d5 V9 I 2 b) F) u) y0 _" Z* X
)的方式可以得到两个文本的任意token pair之间在第k个view下的匹配关系,至于 v 1 v_1 v
0 |* l9 \9 q3 S1
4 w2 \! R. D% p) }
* S+ y8 @3 f0 u& x C 和 v 2 v_2 v
- m% ^0 O& E. N1 T( |* w5 a29 W5 O( l; T7 s
0 s5 g6 i# ^3 h& y$ [& M; O9 f& P e 如何取,文章提供了4种策略:9 V- ]: r( |9 w) @5 n& x" h1 a5 J
0 p# k* y- ~5 ~( }( n7 F. `
策略一:其中一个句子取各token隐层的向量表示,另一个句子采用隐层最后时间步处的输出;
}, G+ Q+ c, ]6 h/ d" j7 U策略二:其中一个句子取各token隐层的向量表示,另一个句子采用隐层各时间步输出与之匹配后取再取Max-Pooling值;4 u. J0 }1 K" f- \
策略三:其中一个句子取各token隐层的向量表示,另一个句子采用cross-attentive后得到的加权句子向量;
8 J4 d3 J+ u8 |6 ~% L0 m策略四:其中一个句子取各token隐层的向量表示,另一个句子采用cross-attentive后attention score最高处token的向量作为句子向量。% h* L: Y. d: H/ R1 f. b, F0 m
这四种策略的区别在于对句子向量的计算不同。4 `" v. s* |" ~9 W
$ ^9 f; V% \, q/ q% v z6 P5 x. }% Y! i5 k4 {1 V; Y% N1 B- e1 \
(3)聚合层,首先对上面各种策略得到的输出层再通过一层BiLSTM层,然后将各策略下最后时间步的输出进行拼接,得到最后的聚合向量;6 R- C1 F: e6 d: ?- T/ B& [
" r4 ?: H4 G; B9 A(4)预测层:两层MPL+softmax9 N5 _' y3 W8 ]% H+ z$ b8 r
" Y/ K0 Y' m+ B. a0 Z- r7 i
9. HCAN
6 w, X* Z1 S/ r& V/ G2 UHCAN是除Bert类模型外在文本匹配领域表现最为优异的深度模型之一,其采用了较为复杂的模型结构。: M4 D L+ H/ m& E+ a3 h
/ ~' ]6 a3 G( Y0 F8 {
针对于信息抽取问题,文章首先分析了相关性匹配和语义匹配的差异:
7 ^3 L @, q" C: ^# T; c/ b
\8 S, @2 P0 `" x r5 z(1)相关性匹配主要关注于关键词的对比,因此更关注低层级词法、语法结构层面的匹配性;
1 u! W: ]0 f, S( |0 k4 l* D0 n2 A, n- O" E; i
(2)语义匹配代表着文本的平均意义,因此其关注更高、更丑想的语义层面的匹配性。
3 I' G4 m; U7 g3 _+ m6 V' @7 m. ?' l: ?) F( j) P% t2 }& s
该模型首先采用三类混合的编码器对query和context进行编码:
' U5 `8 T" a$ d$ ~" M9 I
& }7 ]% t1 U+ } {- m4 X; U(1)深层相同卷积核大小的CNN编码器;6 `! k: J! n# c4 o; ?7 b; O
; E4 O, d+ C. L( _: z2 T' \
(2)不同卷积核大小的CNN编码器的并行编码;
: x- Y# O. e9 G: J9 T' N) S8 e. M4 F
; q: C. G& A$ T i(3)沿着时序方向的stacked BiLSTM编码;
1 c+ Y1 T% f3 I0 g% B8 z1 c4 p" v# B
对于前两者,通过控制卷积核的大小可以更好的捕捉词法和句法特征,即符合相关性匹配的目的;而对于后者,其能表征更长距离的文本意义,满足语义匹配的目的。5 Q5 T. K: i& t" W$ [5 H
7 y6 K1 ?0 E: [' s2 x- d# W% ~
在这三类编码器的编码结果基础上,模型分别进行了相关性匹配和语义匹配操作。其中相关性匹配主要采用各phrase间内积+max pooling/mean pooling的方式获取相关性特征,并通过IDF指进行各phrase的权重调整。而在语义匹配中,模型采用了精心设计的co-attention机制,并最终通过BiLSTM层输出结果。
9 N! \ t4 i4 v6 N% t3 c- T2 A8 q$ d( y
最后的预测层仍采用MPL+softmax进行预测。( W1 k0 E: e* p1 v
& Y1 g5 d2 b' @- S- S9 ?
10. 小结
) R E( @* k" U8 J( o交互型语言匹配模型由于引入各种花式attention,其模型的精细度和复杂度普遍强于表示型语言模型。交互型语言匹配模型通过尽早让文本进行交互(可以发生在Embedding和/或Encoding之后)实现了词法、句法层面信息的匹配,因此其效果也普遍较表示型语言模型更好。
) r6 `2 ~ p( x/ w6 I9 s" t% M$ j6 q+ P r6 Q
【Reference】
" P3 S6 Z2 M' i9 o, X
; E% S7 t4 x" ^1 b/ C6 A* EARC-II: Convolutional Neural Network Architectures for Matching Natural Language Sentences
" a1 D. E$ b% Q) ]8 Y- y" n
P4 I2 g2 P8 w( ?. D1 sPairCNN: Learning to Rank Short Text Pairs with Convolutional Deep Neural Networks
1 o5 ^3 |. K! E+ m& y8 i; T( p. L/ f% j% }# E6 D1 t
MatchPyramid: Text Matching as Image Recognition
1 u T. E+ Y6 c" z
2 B8 k0 ~2 D+ R4 w6 YDecAtt: A Decomposable Attention Model for Natural Language Inference6 x1 r* y1 r Y* W& g
& E7 r! W, s) J+ mCompAgg: A Compare-Aggregate Model for Matching Text Sequences8 ]& r7 |3 `+ f; G& M$ s
( X5 _& a) @( e6 c, e& [2 n+ n
ABCNN: ABCNN: Attention-Based Convolutional Neural Network6 F' N% H8 L1 F5 j- j! J
for Modeling Sentence Pairs
' n2 c+ ~, Z! |1 b/ I- ]/ q4 y3 F5 _
ESIM: Enhanced LSTM for Natural Language Inference
$ ~) C. |* ` }" h {
$ w8 L c. q, O; gBimpm: Bilateral Multi-Perspective Matching for Natural Language Sentences6 q. ~6 c$ D2 v. [) a7 d7 U
( Q7 M3 }) \$ iHCAN: Bridging the Gap Between Relevance Matching and Semantic Matching
: o% x( c, U/ u x2 j6 ffor Short Text Similarity Modeling
[) Z6 ]0 k2 T& |- {2 Q" @9 A' p) @' Z: k+ F2 F" t
文本匹配相关方向打卡点总结(数据,场景,论文,开源工具)
" K, N0 Z! ]+ N! W/ P" e, D
) v7 ^/ o8 T) R; H谈谈文本匹配和多轮检索1 C/ u: J4 l% X- h3 J9 g
9 B( ~0 o N* `! m; N- X
贝壳找房【深度语义匹配模型 】原理篇一:表示型$ O! H5 W e' H- v/ c) P, t2 y
————————————————5 V. N0 B+ Q2 l9 Z3 w6 r, [
版权声明:本文为CSDN博主「guofei_fly」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& D v$ V7 n- y5 f+ r$ @- G
原文链接:https://blog.csdn.net/guofei_fly/article/details/107501276
' C8 z: e S6 v/ t/ S7 T
9 ~# ~# n2 k1 U; M. \( s* y2 e( X/ x- d/ N, g5 o+ o4 v- t. _
|
zan
|