- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563396 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174242
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
【文本匹配】交互型模型 o1 ]$ K; ?4 Z E; u; S
" v8 R5 s, C4 E: p
表示型的文本匹配模型存在两大问题:(1)对各文本抽取的仅仅是最后的语义向量,其中的信息损失难以衡量;(2)缺乏对文本pair间词法、句法信息的比较9 |- l P U' u" `" F! [; F' j* A/ h, Z
* \# [3 _6 m W# B5 v0 J* p
而交互型的文本匹配模型通过尽早在文本pair间进行信息交互,能够改善上述问题。
: u P$ z7 D1 v; b% k
) I) u- [; a0 D% q' i' t基于交互的匹配模型的基本结构包括:
# A( `( I. X4 w, I, w# t! k# p- S2 ]+ O; u
(1)嵌入层,即文本细粒度的嵌入表示;
- G# }* d; v2 V1 g' d+ w. k. V5 h0 ^9 U9 N9 ^7 E8 D
(2)编码层,在嵌入表示的基础上进一步编码;
' Q* N- k$ w" F& w* U' Z/ Z3 w) D; q8 R1 v; E* ^: }9 [4 D
(3)匹配层:将文本对的编码层输出进行交互、对比,得到各文本强化后的向量表征,或者直接得到统一的向量表征;4 i4 s5 ?0 z" Q1 L6 }
1 ]" Y# u/ W/ l* s(4)融合层:对匹配层输出向量进一步压缩、融合;
, z, P( l/ b+ O+ e' U1 b# b# x9 K8 D$ M# [( X& l, C% u( y* Z7 J
(5)预测层:基于文本对融合后的向量进行文本关系的预测。
0 M" ~1 Q- S3 o' z
$ m* r2 ~7 H, O3 z+ Y' M! h: E; d. f( u& }' |
6 t: p" i! S+ R1 q1. ARC-II3 @5 }% |* x d* a( N- Z2 n- h) ]3 J
ARC-II模型是和表示型模型ARC-I模型在同一篇论文中提出的姊妹模型,采用pair-wise ranking loss的目标函数。
2 g3 z$ h5 L2 p- r8 n. z6 _7 N# `- `
其核心结构为匹配层的设计:
! ?; B" n- t0 E" H0 \1 I9 \
0 ^ I. r. J {2 G(1)对文本pair的n-gram Embedding结果进行拼接,然后利用1-D CNN得到文本S_X中任一token i和文本S_Y中任一token j的交互张量元素M_{ij}。该操作既然考虑了n-gram滑动窗口对于local信息的捕捉,也通过拼接实现了文本pair间低层级的交互。
! Z3 d6 d& k, Y. U# l5 F# k0 Y- A) L& s6 ?
(2)对交互张量进行堆叠的global max-pooling和2D-CNN操作,从而扩大感受野。
5 Z1 y! A* f, X; K' l
# P; ?: X! t/ W5 [2. PairCNN
: h( M$ Q1 |' k0 D2 e$ UPairCNN并没有选择在Embedding后直接进行query-doc间的交互,而是首先通过TextCNN的方式分别得到query和doc的向量表征,然后通过一个中间Matrix对query和doc向量进行交互得到pair的相似度向量,然后将query的向量表征、doc的向量表征、相似度向量以及其它的特征向量进行拼接,最后经过两层的MPL得到最后的二分类向量。
9 r, l, H N$ Q W7 h- H' F& r# q+ ?, O' Y( R
PairCNN的模型架构中的亮点在于各View向量的拼接,既能利用原始的语义向量,还能够很便捷的融入外部特征。* ]5 o$ c" R2 h, K, L) {7 J
9 V+ q9 Z- Z+ l; f4 M- G3. MatchPyramid
3 @' H2 E: h0 O无论是ARC-II中的n-gram拼接+1D conv还是Pair-CNN中的中间Matrix虽然均通过运算最终达到了信息交互的作用,但其定义还不够显式和明确,MatchPyramid借鉴图像卷积网络的思想,更加显式的定义了细粒度交互的过程。 F9 g$ e$ F4 ]1 T4 D1 o0 i1 X. L/ t. j
MatchPyramid通过两文本各token embedding间的直接交互构造出匹配矩阵,然后将其视为图片进行2D卷积和2D池化,最后Flatten接MLP计算得匹配分数。本文共提出了三种匹配矩阵的构造方式:
. s. Y/ w! Y- p. Y( p) o r6 o
0 C: H& V& U [8 ^/ \5 W @8 @9 K, M8 c9 o(1)Indicator:0-1型,即一样的token取1,否则取0;这种做法无法涵盖同义多词的情况;3 s; X! `4 @) d3 d; ?
2 z( v- ?! a) l8 J8 w
(2)Cosine:即词向量的夹角余弦;
! v/ _5 R) ]; g
3 [ m- n3 J- g# r7 {(3)Dot Product:即词向量的内积; _7 w1 C1 a9 c; _. T
; {9 C4 u9 r/ v5 T) V% j此外值得注意的是因为各个文本pair中句子长度的不一致,本文并没有采用padding到max-lenght的惯用做法,而是采用了更灵活的动态池化层,以保证MPL层参数个数的固定。
# B P& @" ^ B3 A8 _- s
2 H6 Z2 q# U* l4 V0 x4. DecAtt
* X8 O7 z& b) t* `& IDecAtt将注意力机制引入到交互型文本匹配模型中,从而得到各token信息交互后增强后的向量表征。
1 E, }- ~+ }$ O5 _' X1 |! D' ]) J7 l0 A8 W. N; r
模型被概括为如下层级模块:' Q) }% i4 ]$ v& u! g; r4 v
% E6 N, b! `7 a! O" G
(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。
* T8 W7 I' Q. \) |0 V) G2 `1 U1 v" z$ I9 z4 _( D, d7 t% t6 A) K
(2)Compare层:将前序Attend层计算得到的最终embedding,喂入一个全连接层进行向量维度的压缩。
$ X7 V+ a* j' v; n3 m
& h* W9 a/ k. ], w9 e }(3)Aggregate层:将每个文本各token处压缩后的向量进行简单的求和,再拼接起来通过MPL得到最后的匹配得分。6 b9 U) Y, I! }" o' i; E
" M8 p6 D3 D7 E+ W( L5 _' Q. M5. CompAgg0 Z% j* G3 ~" O$ Y: b
CompAgg详细对比了在文本间cross-attention得到的各token向量表征与原始token向量进行compare的各种方案。$ D; b% @) n) |4 W0 U8 g2 V: }
% {8 x2 Q$ q$ K
该模型的主要结构包括:
3 z( u3 |) O& z2 r9 [
8 T* ?/ l. g; A# y; h0 N& ^3 \6 z% g(1)reprocessing层:采用类似于LSTM/GRU的神经网络得到token的深层表示(图中的\bar a_i);% {9 a5 e0 f4 b0 d$ g! r
1 q/ k1 T& b3 {* l
(2)Attention层:利用软注意力机制计算文本间的cross-attention(与DecAtt相同),从而得到各token处交互后的向量表示(图中的h_i);
+ O2 _4 s+ M- ]- n/ v- z
Y( N! G! z8 E6 P0 m(3)Comparison层:通过各种网络结构或计算将\bar a_i和h_i计算求得各token的最终表征。
/ a, K7 I4 u" C, z6 t" h8 n: z% v4 q; k) D, @$ h
(4)Aggregation层:利用CNN网络对Comparison层的输出进行计算,得到最后的匹配得分。
r4 W) }* K) b0 t+ S4 l
6 H- l- Q4 t0 {# _% g其中Comparison层的构造方式包括:" h4 i! Y1 t- ]( I+ b
3 O' ?! P, }8 _1 _$ ]; U! g; V& `(1)矩阵乘法,类似于Pair-CNN中的中间Matrix( \1 r& W$ a0 ]" i
' X$ Q2 ?8 h3 a
(2)前向神经网络,即将\bar a_i和h_i进行拼接,然后利用输入FFN;, g" C* R U Q
, a. `+ d# w* c3 ^(3)分别计算cosine和欧式距离,然后拼接;3 ]4 d7 p. k( @" L' o' {
7 L8 s ~: K* i0 M0 H' o
(4)各维度进行减法;2 J4 B1 E6 v8 D) O& ?
, d7 m* a# }4 D6 m
(5)各维度进行乘法;
/ N# @; D* Y, S4 B# [: b9 k0 d& X0 {8 L1 T
(6)各维度进行减法和乘法,然后再接一个前向网络。9 o9 L/ D( ~% R# z+ l
+ I# M' g& w& Q2 m" K
6. ABCNN
3 `' z2 N) k3 X- a* n7 {ABCNN是将Attention机制作用于BCNN架构的文本匹配模型。2 k" S. w# G1 \7 j& R6 i' O; y
6 u8 V9 u C1 A6.1 BCNN
* r& c g; L" H! Q! K首先简单介绍下BCNN架构:
0 d" D+ T' I+ C$ V/ p3 u6 \6 w# Z$ I3 u4 |( p% h
BCNN的整体结构比较简单:(1)输入层;(2)卷积层,因为采用了反卷积的形式,所以在size上会增加;
- l8 a8 M5 V1 F7 L- O- v* f0 K+ ?5 r* ?1 [ {3 C& A
(3)池化层,采用了两种池化模式,在模型开始阶段采用的是local平均池化,在最后句子向量的抽取时采用了global平均池化;(4)预测层,句子向量拼接后采用LR得到最后的匹配得分。
% Q4 _+ l. b2 o0 G" ]* B+ Q
5 j1 p! o, d1 G- D) M: gABCNN共包括三种变形,下面依次介绍。9 R* L. q! A8 S. D0 B! ~, C7 y7 D
1 x8 P f3 M) Y6.2 ABCNN
" H3 T) L: o7 G: k- T1 N/ z7 J) o9 \% y7 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
+ B3 W0 z8 i- ~3 C) Kij4 |$ O. p+ D; j$ S
& F6 p2 E7 P) h. v9 Z
= + |9 @7 ~+ p; g$ _+ z" H, a1 P7 F
1+∣x 5 r, Q- _% |+ ` L' z% B- h# o
i# I* |6 x. L3 g# m6 u3 _
; ]# b- @' D/ Y2 L @ −y
0 r8 |1 g- m! x8 Gj* ^2 a `' F# E6 U9 R
$ \' h, f! M. F# R; ]2 g" c ∣, t9 j6 w1 K% y1 Q# P9 C
1
0 U8 R9 v7 M0 l6 E) ]0 l
- y9 s# X$ ]* K$ T ,然后分别乘以可学习的权重矩阵 W 0 W_0 W
& ]+ Y: h* g" w2 h3 I& V. ~ t0) n; g6 i" F2 k
# f8 u& Z7 {# P* c) T) l% K
和 W 1 W_1 W ( S7 Y3 g( V. T w7 a
19 |% o+ s. Q% t% `6 V
' l$ p: F2 j, }8 w8 M: X7 @
得到attetion feature map。
* A6 F; f/ I2 `6 @6 z( o/ g- q$ F- `8 X6 _9 A
6.3 ABCNN-2
! l! }, C8 O; y' p) }
~5 l) L c* {9 X2 bABCNN-2将Attention机制作用于word embedding层后的反卷积层的输出结果,其中注意力矩阵的计算原理与ABCNN-1一致。然后将注意力矩阵沿着row和col的方向分别求和,分别代表着各文本token的attention socre;接着将反卷积层的输出结果与attention socre进行加权平均池化,得到与输入层相同shape的特征图。
' i/ e0 W" j+ T$ [7 q' R& A
& x: [2 z% D- u6.4 ABCNN-3
) X& [* S/ p; D: u
, A3 c) S# E4 t4 [" B, OABCNN-3的基本模块可视为ABCNN-1和ABCNN-2的堆叠,即在嵌入层和卷积层上面都引入了attention的机制用来增强对token向量的表示。, `3 K! o, G. T0 _0 d
& s* X. L, C( G! p' C8 Z q7. ESIM# _9 L2 g6 v w( i; b A. n U
ESIM模型基于NLI任务给出了一种强有力的交互型匹配方法。其采用了BiLSTM和Tree-LSTM分别对文本序列和文本解析树进行编码,其亮点在于:* j/ v8 D9 i; I) [
/ w6 i7 {) X) F/ _$ N( M
(1)匹配层定义了cross-attention得到各token的向量表示与原token向量间的详细交互关系,即采用 [ a ˉ , a ^ , a ˉ − a ^ , a ˉ ∗ a ^ ] [\bar a, \hat a,\bar a-\hat a,\bar a* \hat a] [ * V- ?9 W$ K [1 }
a
* ?) S6 I8 p* Uˉ) w4 \. ^& J }# q4 U) r5 _
,
5 A. E% i7 d3 V/ l5 ra1 ]# F+ n; L. o. L8 p
^
# L1 y$ y- w6 A# X' m ,
$ F- h" L5 o. N5 I y7 Ya
+ n) L1 F5 D% J0 p( hˉ* a( T' D3 K, `: y; E% b% q% L
−
. |( L1 \ e% B2 ^2 C/ ]a( o# S7 ]: u: Q/ P g
^$ T x: x/ V6 }( z$ J
, # [9 I8 v* c! k) z, T9 d7 K
a ]' e$ c3 @0 h _' D1 a
ˉ6 l2 y2 C0 l7 m9 o8 K* B6 r
∗ , i) A% q! \3 I$ o3 E8 A. q
a
# n/ }$ g' u% [9 W; V6 P, ]^
S, Y2 y1 F9 b- z! o* _( s ]作为最终文本token的向量表示,这也成为后续文本匹配模型的惯用做法。
: {8 B A# X& Y* ]* c$ |& ?4 [) h$ U
(2)聚合层通过BiLSTM得到各文本token的编码,从而进一步增强了文本序列的信息传递;; J! X) M0 H# @* p" h" F0 r
' y9 h) `/ Z: \( i2 a(3)预测层通过拼接各文本token编码的max-pooling和mean-pooling结果,再经过MPL进行匹配预测。, H9 u6 `) c1 P- R5 }
% ]+ f4 m' Z) d/ X, `
+ M. c" X7 P' w5 I6 F
% F* d" p/ E. `$ w) @1 R- N7 {8. Bimpm% b( S2 ?* [3 v
Bimpm可视为对之前各类交互型文本匹配模型的一次总结。1 C. V! e/ g# r. o
8 A8 X' D% |$ E6 D
该模型在各层的具体做法总结如下:
' y0 l* z1 |) M- J2 j2 h
! u+ s x# ]$ F! E# c(1)编码层采用BiLSTM得到每个token隐层的向量表示;
4 I3 M& t! k0 r0 u/ i3 C2 o3 h/ e' ^5 A; m3 F
(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
" a9 j0 Z# e$ |) @9 kk' r8 e- X, r3 S( F. _$ C2 M
9 U; @: E" S8 M% H E" w; s8 m =cosine(W
$ H5 \4 e$ G* B$ Z! @9 k! `& Q, Ek
( ~& k& c: J( n* t$ P1 K. A& O& `
: s+ W. w) U3 ~( y2 G ∗v ' m& x7 b0 O9 o
1
- ^" i0 O3 A7 O! {7 ]
* q' B. `: R' b% k: } ,W
' B4 ]3 Z4 q* { Kk
/ c. Z; z' Y3 D/ y5 |
0 w2 Y2 w/ T7 I( w, @4 L; d: V; R ∗v
" k- H7 t( O1 d, m- M; p+ H" U8 r$ x2: V0 P4 Y6 i- a% \% ~4 @0 J) z
, _/ O; s$ G4 B; Q% u3 m )的方式可以得到两个文本的任意token pair之间在第k个view下的匹配关系,至于 v 1 v_1 v % Z4 |. T( D2 o
16 Q1 `& E9 X) U
! j7 ?" o. I( p# T) s j6 N9 t: y
和 v 2 v_2 v
* m; ^0 `- {" U2- S6 e) ^$ ]+ x% E. ~
( j* v5 b" ]! ~7 ~5 \ f; {2 K9 a9 Z 如何取,文章提供了4种策略:# _) e+ T% Z+ P
( U1 r: i% J* D) T; F' Z; q- _
策略一:其中一个句子取各token隐层的向量表示,另一个句子采用隐层最后时间步处的输出;
6 O' e2 P1 E, C* S% f策略二:其中一个句子取各token隐层的向量表示,另一个句子采用隐层各时间步输出与之匹配后取再取Max-Pooling值;; U, v: K1 t! F4 y. o. L* S: X h
策略三:其中一个句子取各token隐层的向量表示,另一个句子采用cross-attentive后得到的加权句子向量;" L3 {+ h* V0 f( x4 v+ l/ i6 m8 F
策略四:其中一个句子取各token隐层的向量表示,另一个句子采用cross-attentive后attention score最高处token的向量作为句子向量。7 S# x7 _ Y! y* m
这四种策略的区别在于对句子向量的计算不同。* C# ^. P ]; u" `3 B) j
) b- O: ~" R* G& x$ n7 G
1 a! I+ `1 ~, v1 ^2 g0 d6 {6 x(3)聚合层,首先对上面各种策略得到的输出层再通过一层BiLSTM层,然后将各策略下最后时间步的输出进行拼接,得到最后的聚合向量;
3 j1 _5 |+ R' A
& P) m# J% S5 k! B: a0 T(4)预测层:两层MPL+softmax- S! S+ G2 N- e, i5 D j X
# U2 f1 Q# \2 u* I8 F
9. HCAN
& k: Y. f, w8 M6 \' l$ m4 K" [HCAN是除Bert类模型外在文本匹配领域表现最为优异的深度模型之一,其采用了较为复杂的模型结构。
( C. Q4 f' R1 {$ j" Z9 w1 |' y1 V. V$ O& ^7 c6 ?* T; W
针对于信息抽取问题,文章首先分析了相关性匹配和语义匹配的差异: b; W2 P1 I% f$ t
4 X |9 s0 \+ f7 e! E! i X" a(1)相关性匹配主要关注于关键词的对比,因此更关注低层级词法、语法结构层面的匹配性;8 d2 M' m6 W D
2 r, P- Y; w: b0 q. m4 b1 L
(2)语义匹配代表着文本的平均意义,因此其关注更高、更丑想的语义层面的匹配性。# {+ D1 }5 R I& K$ H( \
& C2 i' Y2 _4 v& G4 L3 z该模型首先采用三类混合的编码器对query和context进行编码:; D8 O& m$ o' |
; C0 e, s( d$ ?, N) |(1)深层相同卷积核大小的CNN编码器;; h) p8 T6 J0 i7 m+ U( n% h8 F
" t1 P4 `" y1 U& L+ Q
(2)不同卷积核大小的CNN编码器的并行编码;
A1 f" [ I8 ?5 |
8 c. M9 ?8 ?3 \5 N: t: P! g( Q, @(3)沿着时序方向的stacked BiLSTM编码;
- P& n$ P3 ]& N) _) z, w$ {$ U
& g: }1 @6 R7 b$ N# e9 l Q& p5 z对于前两者,通过控制卷积核的大小可以更好的捕捉词法和句法特征,即符合相关性匹配的目的;而对于后者,其能表征更长距离的文本意义,满足语义匹配的目的。
3 V* `* ~. @6 E& h( S; A. E- A
4 K$ |3 j) b2 P在这三类编码器的编码结果基础上,模型分别进行了相关性匹配和语义匹配操作。其中相关性匹配主要采用各phrase间内积+max pooling/mean pooling的方式获取相关性特征,并通过IDF指进行各phrase的权重调整。而在语义匹配中,模型采用了精心设计的co-attention机制,并最终通过BiLSTM层输出结果。- J+ B7 @3 H: Z" {/ C9 D& D6 Q! f
, d$ U; p2 t6 t6 f
最后的预测层仍采用MPL+softmax进行预测。
6 [7 ]7 G+ H/ _$ a# W3 t9 M* M [
1 P* c- ~, S% V$ C$ W: |10. 小结
; u, m8 s: i( a9 J4 Q' T; Q7 I3 }交互型语言匹配模型由于引入各种花式attention,其模型的精细度和复杂度普遍强于表示型语言模型。交互型语言匹配模型通过尽早让文本进行交互(可以发生在Embedding和/或Encoding之后)实现了词法、句法层面信息的匹配,因此其效果也普遍较表示型语言模型更好。
" o) ?% [% W' |. z* |# j
8 n8 e$ e9 o+ R! a【Reference】2 {% F/ z) \& a. D
. S- g Q, B5 N/ l0 R3 P
ARC-II: Convolutional Neural Network Architectures for Matching Natural Language Sentences
- Y) h# X. Q* e1 K2 a+ E8 |! C& g2 Q" z7 Y
PairCNN: Learning to Rank Short Text Pairs with Convolutional Deep Neural Networks
' D' F4 E$ h/ }' T. h% x; k
& {! r. K5 r) b3 cMatchPyramid: Text Matching as Image Recognition+ h) E* Y8 ]$ F
" h# Z0 m+ |+ ?1 p/ G/ ?+ `DecAtt: A Decomposable Attention Model for Natural Language Inference/ s$ H" A3 f. n, X B |% A
& ^ K6 R: ^+ Z2 E) KCompAgg: A Compare-Aggregate Model for Matching Text Sequences
2 _- S4 y% t" A/ ^2 ?( {9 P- k8 a8 Q
/ Q! @$ [" P8 T3 \! `( S! fABCNN: ABCNN: Attention-Based Convolutional Neural Network
5 Q% r6 H% Q" j& E2 k( M: Ufor Modeling Sentence Pairs
; T% O" i j6 P' |3 W c2 i: `
- |& z' W9 T+ h# S# w( y' m) j: VESIM: Enhanced LSTM for Natural Language Inference% g: j, n. T5 o C2 w' T- s) }9 O
* {* e) T* ~" d4 A! F, q# i
Bimpm: Bilateral Multi-Perspective Matching for Natural Language Sentences& }% y! B8 g4 B" t X1 X( ]
- q2 V" p0 b4 U) i2 EHCAN: Bridging the Gap Between Relevance Matching and Semantic Matching
2 H& W4 R4 e# Z+ \! x7 R$ Gfor Short Text Similarity Modeling
5 v1 w+ c+ J) a- c6 [/ p, Q* j
$ T# s0 c4 d! c文本匹配相关方向打卡点总结(数据,场景,论文,开源工具)
3 ]1 ]. r7 r4 z+ {1 A& A' ~4 G8 [4 n, z6 q6 _4 c; ~, ?0 M6 d
谈谈文本匹配和多轮检索$ j- h) H8 M8 o a
# v, \, K3 ]- `# e& o5 G" M* _, C贝壳找房【深度语义匹配模型 】原理篇一:表示型6 n& _ h- s- C9 H) E
————————————————, f# P) O& o3 l
版权声明:本文为CSDN博主「guofei_fly」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。. O1 a" Y1 G0 _/ E. o# [
原文链接:https://blog.csdn.net/guofei_fly/article/details/107501276# c8 r& C# O" {" N& M- O8 O
3 {2 r$ A2 L) K/ d- X' {! c' \
+ x& z7 K0 O3 F2 l
|
zan
|