29 Jun

文本情感分类(三):分词 OR 不分词

去年泰迪杯竞赛过后,笔者写了一篇简要介绍深度学习在情感分析中的应用的博文《文本情感分类(二):深度学习模型》。虽然文章很粗糙,但还是得到了不少读者的反响,让我颇为意外。然而,那篇文章中在实现上有些不清楚的地方,这是因为:1、在那篇文章以后,keras已经做了比较大的改动,原来的代码不通用了;2、里边的代码可能经过我随手改动过,所以发出来的时候不是最适当的版本。因此,在近一年之后,我再重拾这个话题,并且完成一些之前没有完成的测试。

为什么要用深度学习模型?除了它更高精度等原因之外,还有一个重要原因,那就是它是目前唯一的能够实现“端到端”的模型。所谓“端到端”,就是能够直接将原始数据和标签输入,然后让模型自己完成一切过程——包括特征的提取、模型的学习。而回顾我们做中文情感分类的过程,一般都是“分词——词向量——句向量(LSTM)——分类”这么几个步骤。虽然很多时候这种模型已经达到了state of art的效果,但是有些疑问还是需要进一步测试解决的。对于中文来说,字才是最低粒度的文字单位,因此从“端到端”的角度来看,应该将直接将句子以字的方式进行输入,而不是先将句子分好词。那到底有没有分词的必要性呢?本文测试比较了字one hot、字向量、词向量三者之间的效果。

模型测试

本文测试了三个模型,或者说,是三套框架,具体代码在文末给出。这三套框架分别是:

1、one hot:以字为单位,不分词,将每个句子截断为200字(不够则补空字符串),然后将句子以“字-one hot”的矩阵形式输入到LSTM模型中进行学习分类;

2、one embedding:以字为单位,不分词,,将每个句子截断为200字(不够则补空字符串),然后将句子以“字-字向量(embedding)“的矩阵形式输入到LSTM模型中进行学习分类;

3、word embedding:以词为单位,分词,,将每个句子截断为100词(不够则补空字符串),然后将句子以“词-词向量(embedding)”的矩阵形式输入到LSTM模型中进行学习分类。

点击阅读全文...

13 Aug

两个惊艳的python库:tqdm和retry

Python基本是我目前工作、计算、数据挖掘的唯一编程语言(除了符号计算用Mathematica外)。当然,基本的Python功能并不是很强大,但它胜在有巨量的第三方扩展库。在选用Python的第三方库时,我都会经过仔细考虑,希望能挑选出最简单的、最直观的一个(因为本人比较笨,太复杂用不了)。在数据处理方面,我用得最多的是Numpy和Pandas,这两个绝对称得上王者级别的库,当然不能不提的是Scipy,但我很少直接用它,一般会通过Pandas间接调用了;可视化方面不用说是Matplotlib了;在建模方面,我会用Keras,直接上深度学习模型,Keras已经成为相当流行的深度学习框架了,如果做文本挖掘,通常还会用到jieba(分词)、Gensim(主题建模,包含了诸如word2vec之类的模型),机器学习库还有流行的Scikit Learn,但我很少用;网络方面,写爬虫我用requests,这是个人性化的网络库,如果写网站,我会用bottle,这是个单文件版的迷你框架,一切由自己定义,当然,我也不会去写什么大型网站,我就写一个简单的的接口那样而已;最后如果要并行的话,一般直接用multiprocessing。

不过,以上都不是本文要推荐的,本文要推荐的是两个可以渗透到日常写代码的库,它实现了我们平时很多时候都需要的功能,但是不用增加什么代码,绝对让人眼前一亮。

点击阅读全文...

18 Aug

【中文分词系列】 2. 基于切分的新词发现

上一篇文章讲的是基于词典和AC自动机的快速分词。基于词典的分词有一个明显的优点,就是便于维护,容易适应领域。如果迁移到新的领域,那么只需要添加对应的领域新词,就可以实现较好地分词。当然,好的、适应领域的词典是否容易获得,这还得具体情况具体分析。本文要讨论的就是新词发现这一部分的内容。

这部分内容在去年的文章《新词发现的信息熵方法与实现》已经讨论过了,算法是来源于matrix67的文章《互联网时代的社会语言学:基于SNS的文本数据挖掘》。在那篇文章中,主要利用了三个指标——频数、凝固度(取对数之后就是我们所说的互信息熵)、自由度(边界熵)——来判断一个片段是否成词。如果真的动手去实现过这个算法的话,那么会发现有一系列的难度。首先,为了得到$n$字词,就需要找出$1\sim n$字的切片,然后分别做计算,这对于$n$比较大时,是件痛苦的时间;其次,最最痛苦的事情是边界熵的计算,边界熵要对每一个片段就行分组统计,然后再计算,这个工作量的很大的。本文提供了一种方案,可以使得新词发现的计算量大大降低。

点击阅读全文...

19 Oct

【理解黎曼几何】6. 曲率的计数与计算(Python)

曲率的独立分量

黎曼曲率张量是一个非常重要的张量,当且仅当它全部分量为0时,空间才是平直的。它也出现在爱因斯坦的场方程中。总而言之,只要涉及到黎曼几何,黎曼曲率张量就必然是核心内容。

已经看到,黎曼曲率张量有4个指标,这也意味着它有$n^4$个分量,$n$是空间的维数。那么在2、3、4维空间中,它就有16、81、256个分量了,可见,要计算它,是一件相当痛苦的事情。幸好,这个张量有很多的对称性质,使得独立分量的数目大大减少,我们来分析这一点。

首先我们来导出黎曼曲率张量的一些对称性质,这部分内容是跟经典教科书是一致的。定义
$$R_{\mu\alpha\beta\gamma}=g_{\mu\nu}R^{\nu}_{\alpha\beta\gamma} \tag{50} $$
定义这个量的原因,要谈及逆变张量和协变张量的区别,我们这里主要关心几何观,因此略过对张量的详细分析。这个量被称为完全协变的黎曼曲率张量,有时候也直接叫做黎曼曲率张量,只要不至于混淆,一般不做区分。通过略微冗长的代数运算(在一般的微分几何、黎曼几何或者广义相对论教材中都有),可以得到
$$\begin{aligned}&R_{\mu\alpha\beta\gamma}=-R_{\mu\alpha\gamma\beta}\\
&R_{\mu\alpha\beta\gamma}=-R_{\alpha\mu\beta\gamma}\\
&R_{\mu\alpha\beta\gamma}=R_{\beta\gamma\mu\alpha}\\
&R_{\mu\alpha\beta\gamma}+R_{\mu\beta\gamma\alpha}+R_{\mu\gamma\alpha\beta}=0
\end{aligned} \tag{51} $$

点击阅读全文...

4 Nov

【外微分浅谈】1. 绪论与启发

写在前面

在《理解黎曼几何》系列,笔者分享了一些黎曼几何的“几何”心得,同时遗留了一个问题:怎么真正地去算黎曼张量?MTW的《引力论》中提到了一种基于外微分的方法,可是我不熟悉外微分,遂学习了一番。确实,是《引力论》中快捷计算曲率张量的步骤让笔者决定深入了解外微分的。果然,可观的效益是第一推动力。

这系列文章主要分享一些外微分的学习心得,曾经过多次修改和完善,包含的内容很多,比如外积、活动标架、外微分及其在黎曼几何的一些应用等,最后包括一种计算曲率的有效方式

符号说明:在本系列中,用粗体的字母表示向量、矩阵以及基底,用普通字母来表示标量,它有可能是一个标量函数,也有可能是向量的分量,如无说明,则用$n$表示空间(流形)的维度。本文中同样使用了爱因斯坦求和法则,即相同的上下指标表示$1\sim n$遍历求和,即$\alpha_{\mu}\beta^{\mu}=\sum_{\mu=1}^{n} \alpha_{\mu}\beta^{\mu}$,习惯上将下标写在前面,比如$\alpha_{\mu}\beta^{\mu}$事实上跟$\beta^{\mu}\alpha_{\mu}$等价,但习惯写成前者。常用的一些记号是:$\mu,\nu$表示分量指标,$x^{\mu}$表示点的坐标分量,$dx^{\mu}$表示切向量(微元)的分量,$\alpha,\beta,\omega$等希腊字母也常用来表示微分形式。符号的使用有重复的地方,但符号的意义基本都在符号出现的附近有说明,因此应该不至于混淆。

最后,就是笔者其实对外微分还不是特别有感觉,因此文章中可能出现谬误之处,请读者见谅并指出。本系列命名为“外微分浅谈”,不是谦虚,确实是很浅,认识得浅,说的也很浅~

点击阅读全文...

5 Nov

【外微分浅谈】3. 正交标架

众所周知,要掌握黎曼几何,需要强烈的几何直观感。但除此之外,用分量语言描述的黎曼几何,也需要很好的分析能力才能梳理清楚,因为有$N$多的指标在表示着分量和求和,咋看上去处处皆指标。这种繁琐的分量语言并不总讨人喜欢,甚至在不少地方是声名狼籍的。

在分量的语言中,我们本质上可以在局部建立任意形式的坐标系,也就是采用任意形式的基底$\{\boldsymbol{e}_{\mu}\}$,或者说自然标架。但不可否认,在正交标架(标准正交基)之下,很多方程会简单不少,并且得益于我们对欧氏空间的熟练,我们对正交标架下的研究可能会更有感觉。因此,如果条件允许的话,我们应当使用正交标架$\{\hat{\boldsymbol{e}}_{\mu}\}$,哪怕是活动的,这里我们用$\hat{}$标记正交标架。

比如,我们有微元
$$d\boldsymbol{r} = \boldsymbol{e}_{\mu}dx^{\mu} \tag{12} $$
是在一般标架下测量的,那么就可以得到黎曼度量

点击阅读全文...

5 Nov

【外微分浅谈】4. 微分不微

外微分

向量的外积一般只定义于不超过3维的空间。为了在更高维空间中使用反对称运算,我们需要下面描述的微分形式与外微分。

我们知道,任意$x$的函数的微分都可以写成$dx^{\mu}$的线性组合,在这里,各$dx^{\mu}$实则上扮演了一个基的角色,因此,我们不妨把$dx^{\mu}$看成是一组基,并且把任意函数称为微分0形式,而诸如$\omega_{\mu}dx^{\mu}$的式子,称为微分1形式。

在$dx^{\mu}$这组基之上,我们定义外积$\land$,即有反对称的运算$dx^{\mu}\land dx^{\nu}$,并且把诸如$\omega_{\mu\nu}dx^{\mu}\land dx^{\nu}$的式子,称为微分2形式。注意到这是$n$维空间中的外积,$dx^{\mu}\land dx^{\nu}$事实上是一个新空间的基,而不能用$dx^{\mu}$的线性组合来表示。

点击阅读全文...

16 Nov

为什么勒贝格积分比黎曼积分强?

学过实变函数的朋友,总会知道有个叫勒贝格积分的东西,号称是黎曼积分的改进版。虽然“实变函数学十遍,泛函分析心泛寒”,在学习实变函数的时候,我们通常都是云里雾里的,不过到最后,在老师的“灌溉”之下,也就耳濡目染了知道了一些结论,比如“黎曼可积的函数(在有限区间),也是勒贝格可积的”,说白了,就是“勒贝格积分比黎曼积分强”。那么,问题来了,究竟强在哪儿?为什么会强?

黎曼

黎曼

勒贝格

勒贝格

这个问题,笔者在学习实变函数的时候并没有弄懂,后来也一直搁着,直到最近认真看了《重温微积分》之后,才有了些感觉。顺便说,齐民友老师的《重温微积分》真的很赞,值得一看。

本是同根生,相煎何太急?

点击阅读全文...