cw2vec理论及其实现
导读
本文对AAAI 2018(Association for the Advancement of Artificial Intelligence 2018)高分录用的一篇中文词向量论文(cw2vec: Learning Chinese Word Embeddings with Stroke n-gram Information)进行简述与实现,这篇论文出自蚂蚁金服人工智能部。本文将从背景知识、模型简介、c++实现、实验结果、结论等几个方面来进行阐述。
一、背景知识
目前已经存在很多的词向量模型,但是较多的词向量模型都是基于西方语言,像英语,西班牙语,德语等,这些西方语言的内部组成都是拉丁字母,然而,由于中文书写和西方语言完全不同,中文词语包含很少的中文字符,但是中文字符内部包含了很强的语义信息,因此,如何有效利用中文字符内部的语义信息来训练词向量,成为近些年研究的热点。
通过观察中文字符内部组成,发现中文字符包含偏旁部首、字符组件,笔画信息等语义信息特征(如下图),基于偏旁部首和汉字组件特征的中文词向量模型已经有人提出,并取得了较好的效果。
本篇论文采用笔画信息作为特征,由于每个字符包含很多的笔画,类似于一个英文单词包含很多的拉丁字母,在这个基础之上,提出了笔画的n-gram特征。这个思想来源于2016年facebook提出的论文(Enriching Word Vectors with Subword Information),目前facebook这篇论文已经被引用300多次,影响力很大,cw2vec可以称之为中文版本的fasttext。
二、模型简介
1、 词语分割
把中文词语分割为单个字符,为了获取中文字符的笔画信息。
词语:大人 分割为:(1)大 (2)人
2、 笔画特征
获取中文字符的笔画信息,并且把字符的笔画信息合并,得到词语的笔画信息。
大: 一ノ丶
人: ノ丶
大人: 一ノ丶 ノ丶
3、 笔画特征数字化
为了方便,论文提及把笔画信息数字化,用数字代表每一种笔画信息,如下图。
那么“大人”这个词的笔画信息就可以表示为:
大人: 一ノ丶 ノ丶
大人:13434
我从训练语料中获取到13354个汉字,并获取笔画信息,统计笔画种类和上图一致,只有5种笔画信息。
4、 N元笔画特征
提取词语笔画信息的n-gram特征。
3-gram:134、343、434
4-gram:1343、3434
5-gram:13434
......
上述4个步骤,如下图:
5、cw2vec模型
word2vec提出了CBOW和Skip-Gram两个模型(详解),cw2vec在Skip-Gram基础之上进行改进,把词语的n-gram笔画特征信息代替词语进行训练,cw2vec模型如下图。
短语:治理 雾霾 刻不容缓
中心词:雾霾
上下文词:治理,刻不容缓
论文中提及上下文词向量(context word embedding
)为最终cw2vec模型的输出词向量。
三、c++实现
论文目前还没有公开代码,在这里,我提供一个c++版本的cw2vec(cw2vec-github)。这份代码不仅仅实现了cw2vec
模型,还包括word2vec的 CBOW
和 Skip-Gram
两个模型,以及FaceBook提出的fasttext
。关于这版的CBOW和Skip-Gram的性能,可以看一下word2vec,有简单的性能测试,以下是四个模型。
./word2vec
skipgram ------ train word embedding by use skipgram model
cbow ------ train word embedding by use cbow model
subword ------ train word embedding by use subword(fasttext skipgram) model
substoke ------ train chinses character embedding by use substoke(cw2vec) model
可以根据 -h
参数设置
./word2vec skipgram -h
The Following arguments are mandatory:
-input training file path
-infeature substoke feature file path
-output output file path
......
subword是fasttext skipgram模型,substoke是cw2vec模型。substoke 需要笔画信息的特征文件,这里已经写好了一份脚本从汉典抽取笔画信息(extract_zh_char_stoke),具体使用查看README,特征文件
类似于:
中 丨フ一丨
国 丨フ一一丨一丶一
庆 丶一ノ一ノ丶
假 ノ丨フ一丨一一フ一フ丶
期 一丨丨一一一ノ丶ノフ一一
......
cw2vec论文提出采用context word embedding
作为最终的词向量,在这份代码中,不仅仅考虑了context word embedding ,而且,根据fasttext提供的思路,把笔画信息的n-gram特征取平均作为最后的词向量,所以,substoke模型会输出两份词向量,vec代表context word embedding
,avg代表笔画信息的n-gram特征取平均
。
需要包括的环境:
cmake
make
gcc
更多信息查看cw2vec-github。
四、实验结果
1、训练数据
训练数据采用最新的中文维基百科训练语料(处理过程),利用jieba分词工具对语料进行分词处理,最终得到1.2G的训练数据,根据论文,我们从1.2G的训练语料中获取前20%数据,用这份数据在Word Similarity
任务上进行了评测。
2、参数设置
在对比实验中,几个模型的参数设置如下所示:
设置参数如下:
词向量维度:100
窗口大小:5
负采样数目:5
迭代次数:5
最小词频:10
学习率:skipgram(0.025),cbow(0.05),substoke(0.025)
n-gram特征:minn=3, maxn=18
3、实验结果
在中文word similarity
任务上进行了评测,评测文件是 wordsim-240
和 wordsim-296
,这两份文件来自于Chen et al. 2015; Xu et al. 2016
,基于上述两份文件,我已经写好了一份中文词相似度评测脚本(Chinese-Word-Similarity-and-Word-Analogy),方便大家使用,详细信息看README,下面是实验结果。
下图和表中的substoke-average
代表使用的词向量是笔画信息的n-gram特征取平均
,substoke-context
代表使用的词向量是context word embedding
。
4、结果分析
从上面的实验结果来看,在word similarity
任务上,总体来看,substoke
模型要比skipgram
,cbow
两个模型结果要好。其中在wordsim-240
上,substoke的两份词向量都要比word2vec的好,在wordsim-296
上,substoke-context
表现的相对差一些,但是substoke-average
要好很多。
由于时间原因,目前仅在相似度任务上进行了评测,后续可能会在词汇类比,词性标注,命名实体识别,文本分类等多个任务上进行评测。
五、结论
中文字符内部结构包含了丰富的语义信息,这篇论文提出的思路,挖掘了中文字符笔画特征信息,上述实验证明是有效的,推动了中文词向量的工作进展,后续研究者可以在此基础之上进行实验,更加深层次的挖掘中文字符内部信息。
References
[1] Cao, Shaosheng, et al. "cw2vec: Learning Chinese Word Embeddings with Stroke n-gram Information." (2018).
[2] Bojanowski, Piotr, et al. "Enriching word vectors with subword information." arXiv preprint arXiv:1607.04606 (2016).
[3] Chen, Xinxiong, et al. "Joint Learning of Character and Word Embeddings." IJCAI 2015.
[4] Sun, Yaming, et al. "Radical-enhanced Chinese character embedding." ICNIP 2014.
[5] Li, Yanran, et al. "Component-enhanced Chinese character embeddings." arXiv preprint arXiv:1508.06669 (2015).
[6] Yu, Jinxing, et al. "Joint Embeddings of Chinese Words, Characters, and Fine-grained Subcharacter Components." EMNLP 2017.
[7] Mikolov, Tomas, et al. "Efficient estimation of word representations in vector space." arXiv preprint arXiv:1301.3781 (2013).
转载请注明出处
cw2vec理论及其实现的更多相关文章
- 一份从入门到精通NLP的完整指南 | NLPer
该小博主介绍 本人:笔名zenRRan,方向自然语言处理,方法主要是深度学习. 未来的目标:人工智能之自然语言处理博士. 写公众号目的:将知识变成开源,让每个渴求知识而难以入门人工智能的小白以及想进阶 ...
- 无所不能的Embedding 2. FastText词向量&文本分类
Fasttext是FaceBook开源的文本分类和词向量训练库.最初看其他教程看的我十分迷惑,咋的一会ngram是字符一会ngram又变成了单词,最后发现其实是两个模型,一个是文本分类模型[Ref2] ...
- 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法
若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...
- Atitit.软件研发团队建设原理与概论 理论
Atitit.软件研发团队建设原理与概论 理论 培训 团队文化建设(内刊,ppt,书籍,杂志等) 梯队建设 技术储备人才的问题 团队建设--小红花评比. 团队建设--文化墙.doc 户外拓展 1. 团 ...
- 我的“第一次”,就这样没了:DDD(领域驱动设计)理论结合实践
写在前面 插一句:本人超爱落网-<平凡的世界>这一期,分享给大家. 阅读目录: 关于DDD 前期分析 框架搭建 代码实现 开源-发布 后记 第一次听你,清风吹送,田野短笛:第一次看你,半弯 ...
- 分布式理论之一:Paxos算法的通俗理解
维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性 ...
- 仓位管理 – 1.理论篇
看到文章标题中的"仓位管理",读者可能会认为它只适用于股市投资.其实不然.只要是投资都涉及到风险.回报率.投资额度,都会涉及到仓位管理.再者,人生本身就带着无数的抉择.风险和回报, ...
- UI-初识君面之理论篇
一个好的app不光要用好的功能,还要有好的界面,这样内外兼修才算得上是一个好的App.其实跟人一样,不能只刷帅,要有内涵(看清楚哦,内涵不是指闷骚).不知不觉在园子里已经晃了八年,来深也八年了,.NE ...
- JSP动作元素——————理论篇
JSP动作元素的组成及作用 JSP使用Action来控制Servlet引擎的行为,可重复使用JavaBean组件. 常用Action: jsp:param 在 jsp:include.js ...
随机推荐
- 获取request参数的工具类
package cn.edu.hactcm.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOE ...
- 安卓TV开发(四) 实现主流智能TV视频播放器UI
前言:移动智能设备的发展,推动了安卓另一个领域,包括智能电视和智能家居,以及可穿戴设备的大量使用,但是这些设备上的开发并不是和传统手机开发一样,特别是焦点控制和用户操作体验上有很大的区别,本系列博文主 ...
- 01_MUI之Boilerplate中:HTML5示例,动态组件,自定义字体示例,自定义字体示例,图标字体示例
1安装HBuilder5.0.0,安装后的界面截图如下: 2 按照https://www.muicss.com/docs/v1/css-js/boilerplate-html中的说明,创建上图的 ...
- 使用Gradle发布Android开源项目到JCenter
喜欢做些开源项目的朋友,相信有不少人都希望能把自己的项目发布到公共的中央仓库,如maven中央仓库,以供别人方便地集成使用.而使用了Android Studio的同学,应该也对gradle和jcent ...
- PLSQL WEBSERVICES 发布
一. 在Oracle EBS二次开发中,PL/SQL程序是开发人员使用频率最高的开发语言,同时也是大家最容易掌握的工具之一了,而我们也很希望将自己编写的PL/SQL程序发布为Web服务来提供给 ...
- zTree的调用设使用(跨两个系统,两类技术实现的项目案例SpringMVC+Spring+MyBatis和Struts2+Spring+ibatis框架组合)
1.从zTree官网上下载zTree的包,zTree的官方网址是:http://www.ztree.me/v3/main.php#_zTreeInfo 2.引入zTree所需的依赖,例如(jQuery ...
- Java 继承Thread类和实现Runnable接口的区别
ava中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 在实际应用中,我 ...
- github搭建个人网站
1. 注册账号: 地址: https://github.com/ 输入账号.邮箱.密码,然后点击注册按钮. 2. 初始设置 注册完成后,选择Free免费账号完成设置. 2.1 验证邮箱 请打开你的 ...
- ubuntu下搭建gtk+编程环境
首先gtk+项目主页为: http://www.gtk.org/ gtk+现在有2和3两种版本,使用 sudo apt-get install gnome-core-devel 可以一次性安装2个版本 ...
- 关于GPL329A中获取摄像头sensor id的问题
首先我拿到了sensor_id应用程序的源码,我要在上面添加获取ov2685 的 sensor id的代码. 利用find . -name get_sensor_id找到该代码编译之后生成的a.ou ...