今天听了一个分词讲座,较为基础的全面介绍以及工业上的一些实践。
整理了一下,尽量不写公式用文字说明。
分词是NLP中处理中文数据特有的一种方法,因为英文天然有空格隔开,所以分词主要针对的是中文文本数据。
定义
- 分词指将一串汉字序列,按照一定规范,合理地切分成一个词序列的过程
难点:
- 分词规范不统一(PKU,CTB,etc)
- 歧义切分(交集型:结合/成 or 结/合成;组合型:学生会 or 学生/会;真歧义:一打啤酒 or 打人)
- 未登录词(人名,地名,新词,etc),也叫OOV
评估标准:
- PRF(准确率Precision,召回率Recall,F值F-Measure)
P是模型得到的正确率,R是正确结果被选出来的比例,F是两者的加权平均
历史:
- 基于词表匹配
方法:前向/后向/双向最大匹配,n元最短路径
基于字典先构造全切分图,然后遍历所有可能的路径,评价路径好坏,选择最优的路径
Eg. 小->明-> or 小明->
- 基于语法语言模型
方法:n元语法模型,统计语言模型
基于类似Markov chain的假设,也是先构造全切分图,然后计算每条路径的概率为
Bigram:P(w_1, w_2, ..., w_n)=P(w_1|begin)*P(w_2|w_1)*P(w_3|w_2)*...*P(w_n|w_n-1)
N-gram:P(w_1, w_2, ..., w_n)=P(w_n|w_1, ..., w_n-1)
P(w_1|begin)是w_1作为起始词的概率,P(w_2|w_1)是前一个词为w_1时w_2出现的概率,etc. 这些概率根据训练的语料得出。
- 基于序列标注
方法:隐式马尔科夫(HMM),随机条件场(CRF)
HMM:学习的是一个联合分布P(a,A)
每个字有四种可能的状态,在一个单词的开始B,中间M或结尾E,或者单独成一个词S。
通过统计语料得到三个矩阵,一个是转移矩阵,即状态A到状态B的概率,P(A->B);
第二个是发射矩阵,即在状态A时出现字a的概率,P(a|A);
最后一个是初始矩阵,即第一个字状态是B,M,E,S的概率。
预测时,从初始矩阵开始,乘以发射矩阵得到第一个字不同状态的概率,再乘以转移矩阵计算第二个字,以此类推得到所有路径的概率。(维特比算法)
CRF:建模学习条件概率P(y|x),然后用维特比算法得到最优选择。
- 基于深度学习+序列标注
方法:前馈神经网络,Gated RNN(针对复杂特征),LSTM(针对长距离依赖),Adversarial Multi-Criteria Learning(针对不同标准语料)
工程实践:
- 数据标注
标准数据集表达正规但数据少,应用场景数据多但是格式杂,所以需要对数据进行标注,一般是自动标注或者半标注。
方法:构词特征,搜索引擎,定向挖掘
构词特征:边界熵,主要用于挖掘半标注语料,基于词内部熵减少,边界熵增加。
搜索引擎:挖掘用户Q-T对,可用于部分特定场景。
eg. 输入“爱普生打印机”,统计百度结果频率,可以发现 爱普生/打印机 频率远远大于其余选择。
定向挖掘:利用特定网站进行定向挖掘新词,eg. 影视名称,专业名词等等。
- 模型优化
方法:半监督学习,迁移先验知识,规则融合
半监督学习:限制维特比算法的路径选择
迁移先验知识:词向量通过CNN迁移到发射矩阵
融合规则:满足特定规则,即给特定路径加权
- 计算加速
方法:硬件加速,预测加速
硬件加速:GPU,CPU指令集(SSE/AVX)
预测加速:对于高阶和低阶特征预加和场景,用AC自动机只计算高阶特征
- 内存压缩
方法:低秩分解,剪枝,量化,知识萃取,紧凑网络
低秩分解:SVD,CP,Tensor Train,Tucker,Block Term
剪枝:结构化剪枝,梯度剪枝,滤波器剪枝
eg. 将低频部分去掉,可自由调节压缩比例
量化:低比特量化,总体训练加速量化,分布式梯度量化
eg. 取log在log域量化,权重的取值范围大大减少,近似无损压缩
知识萃取:定义知识,fitnet
紧凑网络:设计小而快的网络,1x1卷积,MobileNet,ShuffleNet,NasNet