1.文本处理的一般流程
上图中:
清洗包括无用的标签(例如从网上爬取的文本中可能包含html标签)、特殊的符号(!感叹号、省略号等)、停用词、大写转小写
标准化包括stemming、lemmazatic(就是对英文词汇中的名词、动词转换化标准形态)
本篇博客主要包括:分词(word segmentation)、spell correction(拼写纠错)、stop words removal(停用词)、stemming(标准化)
2.分词
(1)主要的分词工具
利用conda安装jieba分词库
具体参见:https://www.cnblogs.com/luckyplj/p/12673055.html
jieba分词入门案例:
import jieba # 基于jieba的分词 seg_list = jieba.cut("贪心学院专注于人工智能教育", cut_all=False) print("Default Mode: " + "/ ".join(seg_list)) jieba.add_word("贪心学院") seg_list = jieba.cut("贪心学院专注于人工智能教育", cut_all=False) print("Default Mode: " + "/ ".join(seg_list))
效果图:
(2)分词算法介绍:
<1>前向匹配算法(forward-max matching)---它是一种贪心算法
上图过程解释:设置最大匹配长度为5,对句子从前到后与词典进行匹配,若未匹配到词,则缩减匹配词的长度,再进行尝试,直到匹配到为止。
算法区别:
贪心算法-----只能选择当前的最有解。
DP(动态规划)-----能够找到全局的最优解(能够看到全局)
<2>后向匹配(back-ward max matching)
推荐阅读博客:中文分词引擎 java 实现 — 正向最大、逆向最大、双向最大匹配法
https://blog.csdn.net/selinda001/article/details/79345072
最大匹配算法的缺点:局部最优,效率低,不能考虑语义
<3>考虑语义(Incorporate semantic)
执行过程如下图:
上图中,利用语言模型 unigram language model,计算各个词在出现的联合分布概率。
注意:直接使用unigram 语言模型多个概率相乘极有可能出现underflow(向下溢出,即double或float类型无法表示)
优化方法:对概率P取对数,将相乘转换为相加
3.拼写纠错
找到词的最短编辑距离
方法优化:通过replace(替换)、add(添加)、delete(删除)生成编辑距离为1或2的字符串。
上图中对生成的字符串进行过滤方法如下所示:
上图中的argmax公式表示选择p(c/s)最大的c,将其返回给用户。
利用贝叶斯公式将其简化为p(s/c)*p(c),贝叶斯公式的推导见上图。
4.词过滤
对于NLP的应用,我们通常将停用词、出现频率很低的词过滤掉。
5.文本表示
(1)one-hot表示
<1>单词的表示形式
将词典看成一个一维向量,若词典里的单词就是该单词,则一维数组的对应位置标为1
<2>句子的表达形式(不统计词频)
将词典看成一个一维向量,若词典里的单词在句子中出现,则一维数组的对应位置标为1
<3>句子的表达形式(统计词频)
注意:
并不是出现的越多就越重要
并不是出现的越少就越不重要。
6.文本的相似度
(1)基于欧式距离的文本相似度
欧式距离越小,句子相似度越大(成反比)。
(2)余弦相似度
余弦相似度越大,句子的相似度也越大。(成正比)
7.TF-IDF文本表示
tf表示在文档d中w这个词出现的次数(词频),idf表示单词的重要性。