NLP

Snorkel学习笔记

李勐
1 简介 Snorkel是deepdive的后续项目,当前在github上很活跃。Snorkel将deepdive中的弱监督的思想进一步完善,使用纯python的形式构成了一套完整弱监督学习框架。 2 安装 由于Snorkel当前还处于开发状态,所以官方的安装教程不能保证在所有机器上都能顺利完成。 官方使用了anaconda作为python支持环境,而这个环境在个人看来存在不少问题(在单位这个win 7机器上异常的慢)。 我直接在一个ubuntu虚拟机内使用了virtualenv和原生python2.7对这套环境进行了安装。 step 1: 部署python virtualenv 为了不污染全局python环境,官方推荐使用conda进行虚拟环境管理,这里使用了virtualenv。 sudo apt install python-pip python-dev essential-utils pip install python-virtualenv cd snorkel virtualenv snorkel_env source snorkel_env/bin/activate 根据官方文档安装依赖,并启用jupyter对应的功能。 pip install numba pip install --requirement python-package-requirement.txt jupyter nbextension enable --py widgetsnbextension --sys-prefix step 2: 配置对虚拟机jupyter notebook的远程连接 jupyter notebook规定远程连接jupyter需要密码。 使用以下命令生成密码的md5序列,放置到jupyter的配置文件中(也可以有其他生成密码的方式)。 jupyter notebook generate-config python -c 'from notebook.auth import passwd; print passwd()' vim ~/.jupyter/jupyter_notebook_config.py 修改生成的jupyter配置文件。 c.NotebookApp.ip = '*' c.NotebookApp.password = u'sha1:bcd259ccf...your hashed password here' c.

Deepdive学习笔记

李勐
0 简介 deepdive是一个具有语言识别能力的信息抽取工具,可用作KBC系统(Knowledge Base Construction)的内核。 也可以理解为是一种Automatic KBC工具。 由于基于语法分析器构建,所以deepdive可通过各类文本规则实现实体间关系的抽取。 deepdive面向异构、海量数据,所以其中涉及一些增量处理的机制。 PaleoDeepdive是基于deepdive的一个例子,用于推测人、地点、组织之间的关系。 deepdive的执行过程可以分为: feature extraction probabilistic knowledge engineering statistical inference and learning 系统结构图如下所示: KBC系统中的四个主要概念: Entity Relationship Mention,一段话中提及到某个实体或者关系了 Relation Mention Deepdive的工作机制分为特征抽取、领域知识集成、监督学习、推理四步。 闲话,Deepdive的作者之一Christopher Re之后创建了一个数据抽取公司Lattice.io,该公司在2017年3月份左右被苹果公司收购,用于改善Siri。 1 安装 1.1 非官方中文版cn_deepdive 项目与文档地址: cn-deepdive DeepDive_Chinese 使用了中文版本cndeepdive,来自openkg.cn。但这个版本已经老化,安装过程中有很多坑。 moreutils无法安装问题。0.58版本失效,直接在deepdive/extern/bundled文件夹下的bundle.conf中禁用了moreutils工具,并在extern/.build中清理了对应的临时文件,之后使用了apt进行了安装。 inference/dimmwitterd.sh中17行对g++版本检测的sed出现了问题,需要按照github上新版修改。 numa.h: No such file or directory,直接安装libnuma-dev 1.2 官方版本 按照官方教程进行配置: ln -s articles-1000.tsv.bz2 input/articles.tsv.bz2 在input目录下有大量可用语料。 deepdive do articles deepdive query '?- articles("5beb863f-26b1-4c2f-ba64-0c3e93e72162", content).' \ format=csv | grep -v '^ 使用Stanford CoreNLP对句子进行标注。包含NER、POS等操作。查询特定文档的分析结果:

LDA模型入门

李勐
1 引子 本文是对Blei等人LDA原始论文的总结。给定大量的文档,如何在无标注的情况下确定每个文档的主题词?LDA(Latent Dirichlet Allocation)是这类主题确定问题的一个成熟的解决方案。LDA最初面向文本挖掘领域,但随后在图像分类、行为识别等领域也得到了应用。LDA是一种典型的非监督模型,模型仅需要输入文档集合的词袋模型,模型可输出每个文档对应的主题,每个主题使用关键词的分布来表示。 2 模型定义 LDA的PGM形式如上,我们认为主题数目有K个,文档有M个, 每个文档中有N个词。其中,\(\alpha\) 是Dirichlet分布的参数,大小为1xK,用于控制生成主题的聚集程度; \(\theta\) 表示一个文档中主题的分布大小为1xK;\(z\)为一个为每个词安排主题的01随机变量,大小为1xK,且只有一个值为1;\(\beta\)为一个多项分布的集合,大小为KxV,其中每一行代表一个主题中,不同词出现的概率;而w代表每个文档中的一个词。 沿着上面的PGM的箭头方向,可以总结出词的生成过程。我们已知了每个文档中的词袋模型\(w\),为了找到一组合适的主题,需要对分布 \(p(w\vert\alpha,\beta)\) 进行推理。由于该分部中蕴含了隐变量主题\(\theta\) ,所以积分将\(\theta\)积掉。代入Dirichlet分布\(p(\theta\vert\alpha)\),多项分布\(p(z_n\vert\theta)\),以及一个单独的概率值\(p(w_n\vert z_n,\beta)\),可得参数的后验概率形式。以下为完整的推导: $$p(w|\alpha,\beta) = \int p(\theta|\alpha)\prod_{n=1}^N p(w|\theta, \beta) d\theta$$ $$= \int p(\theta|\alpha) (\prod_{n=1}^N \sum_{z_n}p(z_n|\theta)p(w_n|z_n,\beta))$$ $$ = \frac{\Gamma(\sum_i\alpha_i)}{\prod_i{\Gamma(\alpha_i)}}\int(\prod_{i=1}^k\theta_i^{\alpha_i-1})(\prod_{n=1}^N\sum_{i=1}^k\prod_{j=1}^V(\theta_i\beta_{ij})^{w_n^j})d\theta$$ 模型的两个关键参数可以通过多种方法进行求解,即模型训练。 3 模型训练 3.1 变分推理 Blei最初的LDA论文中,使用了变分推理(VB)求解LDA参数。这种方法试图使用一个不受约束的变分分布近似LDA的模型的联合概率。类似的手段可以参见Laplace近似,最经典的应用为使用高斯分布近似Bayesian Logistic Regression中观测的后验分布\(p(w\vert\bf{t})\)。VB个人理解为一种链式的迭代估计框架。使用一个Q函数去近似真实分布函数。 3.2 Gibbs Sampling 优势是便于编程实现。 3.3 比较 变分推理的计算快于基于采样的方法,但可能会收敛到局部最优解。Matthew、Blei等人对于LDA在线学习中对变分推理进行了改进。采样方法更为直观、易于工程实现,且在多数场景下,采样的最终性能会好于变分推理。 4 参考文献 Blei, David. Latent Dirichlet Allocation