文章目录
《Python自然语言处理实战》
概述
本书介绍了NLP的一些基本问题和方法,如中文分词、词性标注、命名实体识别、关键词提取、句法分析、文本向量化以及深度学习NLP的一些内容。全书偏基础,可作为NLP的入门科普,其中前半部分的规则和统计方法值得看一下,且有相应的代码示例。而后半部分更多的是深度学习基础,按需。
本文主要是个人看完之后的一些备忘点记录,方便以后实际应用时定位。
NLP基础
-
NLP的一些应用:机器翻译、情感分析、智能问答、文摘生成、文本分类、舆论分析、知识图谱
-
基本术语:分词(segment)、词性标注(part-of-speech tagging)、命名实体识别(NER,Named Entity Recognition)、句法分析(syntax parsing)、指代消解(anaphora resolution)、情感识别(emotion recognition)、纠错(correction)、问答系统(QA system)
-
NLP的一些知识结构:句法语义分析、关键词抽取、文本挖掘、机器翻译、信息检索、问答系统、对话系统。
-
语料库:中文维基百科、搜狗新闻语料库、IMDB情感分析语料库
-
NLP的三个层面:词法分析、句法分析、语义分析
-
正则表达式是NLP的基本手段之一。python里的re模块。
中文分词
- 英文单词本身就是词,且天然的用空格分开,所以不做处理也能有较好效果。而中文必须通过分词才能表达出完整意思。而中文分词的主要困难在于“分词歧义”
- 分词方法可归纳为:规则分词、统计分词、混合分词
规则分词
正向最大匹配法(Maximum Match Method, MM法)
基本原则是从正向开始,对照词典进行匹配,且尽可能匹配最长的词。
1. 从左到右取m个字符做匹配字段,其中m为词典中的最长词条字符数
2. 若匹配成功,将该词切出,剩余文本重复进行;
3. 若匹配失败,取m-1个字符做匹配字段,重新匹配。
逆向最大匹配法(Reverse Maximum Match Method, RMM法)
与MM法类似,但从逆向执行。由于汉语中偏正结构较多,从后向前匹配会提高精确度。统计结果表明,正向错误率为1/169,而逆向错误率为1/245。
1. 文档倒排,准备逆序词典
2. 按照MM法记性匹配
双向最大匹配法(Bi-direction Matching method)
融合MM和RMM的方法,并根据最大匹配原则,取切分词数最少的那个。
1. 分别做正反最大匹配分词,取词数较少的那个
2. 若词数相同,而分词结果不同,则返回单字较少的那个
3. 若分词结果相同,则任意取一个
统计分词
基本思想是将词看做各个字组成,然后相连的字在文本中出现词数越多,则越可能就是一个词。包括建立统计语言模型、去概率最大的分词结果。
- 语言模型:为长度为m的字符串确定其概率分布 P ( w 1 , w 2 , . . . , w m ) P(w_1,w_2,...,w_m) P(w1,w2,...,wm),公式为
P ( w 1 , w 2 , . . . , w m ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 , w 2 ) . . . P ( w i ∣ w 1 , w 2 , . . . , w i − 1 ) . . . P ( w m ∣ w 1 , . . . , w m − 1 ) P(w_1,w_2,...,w_m)=P(w_1)P(w_2|w_1)P(w_3|w_1,w_2) ... P(w_i|w_1,w_2,...,w_{i-1})...P(w_m|w_1,...,w_{m-1}) P(w1,w2,...,wm)=P(w1)P(w2∣w1)P(w3∣w1,w2)...P(wi∣w1,w2,...,wi−1)...P(wm∣w1,...,wm−1)
N元模型(n-gram model)
上式中当文本过长时计算难度比较大,通常用n元模型降低难度,即只考虑距离为n以内的字的关系,n取1、2、3时分别称为一元模型(unigram model)、二元模型(bigram model)、三元模型(trigram model)。另外在实际使用时,由于可能分子分母为0的情况,所以一般配合平滑算法使用,如拉普拉斯平滑。
P ( w i ∣ w 1 , . . . , w i − 1 ) ≈ P ( w i ∣ w i − ( n − 1 ) , . . . , P ( w i − 1 ) ) = c o u n t ( w i − ( n − 1 ) , . . . , w i ) c o u n t ( w i − ( n − 1 ) , . . . , w i − 1 ) P(w_i|w_1,...,w_{i-1})\approx P(w_i|w_{i-(n-1),...,P(w_{i-1})})\\ =\frac{count(w_{i-(n-1),...,w_i})}{count(w_{i-(n-1),...,w_{i-1}})} P(wi∣w1,...,wi−1)≈P(wi∣wi−(n−1),...,P(wi−1))=count(wi−(n−1),...,wi−1)count(wi−(n−1),...,wi