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