DisCoCat粗览
DisCoCat(Categorical Compositional Distributional Semantics)是一种使用范畴论来为自然语言提供语义解释的模型,我的导师让我阅读相关的文献做一个综述,作为我的本科毕业论文。我此前对NLP基本一无所知,所以我感觉这对我可能算是一个比较大的挑战,这也是我第一次认真进行科研活动,希望能做得尽量好。我目前粗读了几篇文章,感觉这个模型虽然实用性不大,但能将范畴论用在这个方面也算有点意思,所以打算开个文章简单介绍一下它,也算对我的思路做个梳理。
语法——Pregroup Grammar
我们首先需要一个重要的概念:预群(Pregroup)。一个预群是一个偏序集且是幺半群$(G,\cdot,1)$,满足每个元素$x$都有左、右伴随$x^r,x^l$,使得
$$
\begin{cases}
xx^r\le1,\
x^lx\le1,\
x^rx\ge1,\
xx^l\ge1
\end{cases}
$$
1999年,Lambek首先提出了Pregroup grammar,这是一种将自然语言的语法编码成一种有伴随结构的偏序集的方法,主要思想是这样的:在一个自然语言中,有着一些基础类型(Type),构成一个集合(或者偏序集)$B$,然后用$B$去自由生成一个Pregroup $\mathscr{P}(B)$。随即在这个结构里指定一个特殊的类型$s$,称作句类型(sentence type)。我们然后为这个自然语言的每个单词$w$指定一个类型$T\in\mathscr P(B)$。在这些操作之后,一个句子作为一串单词的组合$w_1…w_n$,就自然拥有一个类型$T_1…T_n$,假如$T_1…T_n\le s$,我们就认为这个句子符合语法(grammatical)。基于$B$中的基本序关系和预群公理的将复合类型$T$不断消去为$1$的过程称为类型推导(Type reduction)
总结来说,一个Pregroup grammar就是一个四元组$G=(B,\Sigma,\Delta,s)$,其中,$B$表示基础类型的集合(偏序集),$\Sigma$表示词汇表,即所有的单词,$\Delta\subset\Sigma\times\mathscr P(B)$是一个关系,称作字典,也就是为单词分配类型,最后$s\in\mathscr P(B)$表示句类型。
但是敏锐的人可以发现,依赖自由预群的方法有一个明显的缺陷:即无法区分同一句子的不同的类型推导。举个简单的例子:men and women whom I liked. 这句话明显是有两种意思,根据whom的修饰对象确定,也就是说它有两种可能的语法结构,Pregroup grammar必须要对此作出区分。
假设以下基本类型:$\pi_1,\pi,s_2,s,p$以及偏序关系$s_2\to s,\pi_1\to\pi$,并为单词分配合适的类型(这里省略)。则以上例句的语法正确性由下式保证:
$pp^r \quad p \quad p^lpp^rp \quad o^lls^lπ_1π^r \quad s_2 \quad o^l \to p$
而如果仔细检查语法推导过程,可以发现存在两种推导方法(我用括号标出关键不同之处),这似乎对应了两种语法结构。
$pp^r \quad p \quad p^l(pp^r)p \quad o^lls^lπ_1π^r \quad s_2 \quad o^l \to p$
$pp^r \quad p \quad (p^lp)p^rp \quad o^lls^lπ_1π^r \quad s_2 \quad o^l \to p$
可惜在自由预群的视角下,推导过程并不重要,只有大小关系而已。后来(2010年之后)Anne Preller提出应当使用自由刚性范畴代替自由预群。这是非常天才且关键的观察,根据她的具体构造方法,不同的推导过程天然地被区分开了。
语义——Semantics
有了这做基础,我们可以继续为Pregroup grammar赋予语义。2010年时,Bob Coecke使用$\mathscr P(B)\times\mathbf{FVect}_\mathbb{R}$这个范畴为一个句子赋予语义,他的方法后来被称为Product Space Representation。
但结合后来者的工作,这种表示方式实在有些不自然。现在常用的赋予语义的方法是首先给定一个预群语法$G$,我们作一个词汇范畴(Lexical category)$\mathscr L(G)$来同时编码语法与词汇(作法后面详说),然后选定一个语义范畴(Semantic category),通常的选择是$\mathbf{FVect}_\mathbb{R}$。于是乎,只要给出一个强幺半函子(还要求保持所有刚性结构,注意$\mathbf{FVect}_\mathbb{R}$也是刚性的,只是左右伴随相等),我们基本上就做到了把单词的语义组合为句子的语义。
虽然Preller最初给出的是对任何一个范畴自由生成刚性范畴的方法,但我们需要的并不是此,而是Antonin Delpeuch在2014年提出的幺半范畴的自守化,基本思想差不多,但后者只对幺半范畴做,且使得生成的范畴的幺半结构保持为原本的。
词汇范畴的构造简要来说是先对偏序集$\mathscr{P}(B)$作范畴化,将此范畴幺半化,然后根据字典$\Delta$往其中添加所谓的Lexical morphisms(但实际上刚才定义的字典是不够的,我与曾经在此领域工作的一位学者讨论了一下,他认为lexical morphisms are beyond the lexicon,也就是说我们需要假设更多的信息),最后对得到的幺半范畴作自守化。
我目前卡在这个地方。非常多的作者默认了这个操作:使用一些基本类型,再用单词对自由生成预群中的类型的字典给出一些箭头,然后用这些东西来自由生成一个刚性范畴。但这种自由生成并不是Preller的自由生成方法(不是基于一个范畴,添加的箭头没有被复合),也不是自守化(添加的箭头预先就需要有基本类型的伴随复合)
Product space representation
先不使用词汇范畴的概念,传统的做法是这样的:首先对$\mathscr P(B)$自由生成一个刚性范畴得到语法范畴$\mathscr C(B)$。然后选定一个语义范畴,这里用$\mathbf{FVect}_\mathbb{R}$来做示范。考虑乘积范畴$\mathscr C(B)\times \mathbf{FVect}_\mathbb{R}$,然后为每个基本类型$T$取定一个对应的线性空间$N_T$,而词汇$w$本身是一些通过分布式语义的方法得到的词向量$\vec w$,它们存在于对应类型对应的空间中。现在任意给一个句子$p=w_1…w_n$,为了得到句子的词向量$\vec p\in N_s$,我们:
- 为每个词$w_i$确定一个类型$T_i$
- 在范畴$\mathscr C(B)$中确定一个type reduction$f:T_1…T_n\to s$,对应地,选择一个线性映射$g:N_1\otimes…\otimes N_n\to N_s$
- 计算$g(\vec{w_1}\otimes…\otimes\vec{w_n})=\vec p$