1.文本处理的一般流程 pipeline
分词主要是中文,英语使用空格区分不涉及,清洗包括无用的标签(例如从网上爬取的文本中可能包含html标签)、特殊的符号(!感叹号、省略号等)、停用词、大写转小写
标准化包括stemming、lemmazatic(就是对英文词汇中的名词、动词转换化标准形态),这个主要是英语,中文不涉及。
特征提取:常见的TF-IDF(ES就是这个打分机制),word2vec
建模: 主要是AI的算法。
再下面是评估,所以NLP相对复杂些。要具备工程能力把这些不同的模块整合起来。
本篇主要包括:分词(word segmentation)、spell correction(拼写纠错)、stop words removal(停用词)、stemming(标准化)
2 分词
1)主要的分词工具
jieba\hanlp.等等
我之前用的ansj,从开源来看,你有人维护,定期更新就会使用的越来越多。
这个都差不多,方便加自定义词典是业务需求。
(2)分词算法介绍
前提:语句已经去掉特殊标点符号
需要预先设置一个字典,然后根据字典进行匹配
老师给出的例子:“我们经常有意见分歧”
前向最大匹配
过程解释:设置最大匹配长度为5,对句子从前到后与词典进行匹配,若未匹配到词,则缩减匹配词的长度,再进行尝试,直到匹配到或者到单字为止。
如果剩余长度不足为最大长度,那就取剩余长度。
下面是Java的一个demo。maxlength我取了5.(经验值5-10,需要综合考虑:1 词典里面的那些词语,大部分情况会事多长。因为长度跟每步是线性的,所以太长影响时间复杂度)
输出结果:[我们, 经常, 有意见, 分歧]
算法区别:
贪心算法-----只能选择当前的最有解(不能保证全局最优)。
DP(动态规划)-----在降低时间复杂度的情况下,能够找到全局的最优解(能够看到全局)
老师引申出一个工程师的问题,使用三方开源框架时,遇到的不足或者问题,要有别的措施来解决或者弥补。
后向最大匹配:(back-ward max matching)
跟前向最大匹配差不多,需要注意的就是数据输出前需要反转下。或者用stack来弹出。
优缺点:
最大匹配算法的缺点:局部最优,效率低,不能考虑语义。(需要词典不算缺点)
<3>考虑语义(Incorporate semantic)
考虑语义,假设我们有个工具(通常是语言模型),根据这个工具能给出某句话分词之后的分值。那么我们可以根据词典生成所有的分词组合,
再根据工具对组合进行打分,筛选分高的。
利用语言模型 unigram language mode,事先统计出每个分词的频率,在计算各个词在出现的联合分布概率。
如p(经常|有|意见|分歧)=p(经常)p(有)p(意见)p(分歧) 把联合的概率看做是单独的概率的乘积,最终的结果看作是这句话符合语义程度的概率。
注意:直接使用unigram 语言模型多个概率相乘极有可能出现underflow(向下溢出,即double或float类型无法表示)
log(x*y*z)= log(x)+log(y)+log(z)
优化方法:对概率P取对数,将相乘转换为相加.因为加log不改变相对比较大小。因为当X>Y时,logX >log Y.
缺点:复杂度太高,生成的组合太多了。