1.文本处理的一般流程

snownlp对文本文件分词的代码 文本分词处理_最大匹配

上图中:

清洗包括无用的标签(例如从网上爬取的文本中可能包含html标签)、特殊的符号(!感叹号、省略号等)、停用词、大写转小写

标准化包括stemming、lemmazatic(就是对英文词汇中的名词、动词转换化标准形态)

本篇博客主要包括:分词(word segmentation)、spell correction(拼写纠错)、stop words removal(停用词)、stemming(标准化)

snownlp对文本文件分词的代码 文本分词处理_snownlp对文本文件分词的代码_02

2.分词

(1)主要的分词工具

snownlp对文本文件分词的代码 文本分词处理_snownlp对文本文件分词的代码_03

利用conda安装jieba分词库

snownlp对文本文件分词的代码 文本分词处理_相似度_04

具体参见:

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))

效果图:

snownlp对文本文件分词的代码 文本分词处理_相似度_05

(2)分词算法介绍:

<1>前向匹配算法(forward-max matching)---它是一种贪心算法

snownlp对文本文件分词的代码 文本分词处理_最大匹配_06

上图过程解释:设置最大匹配长度为5,对句子从前到后与词典进行匹配,若未匹配到词,则缩减匹配词的长度,再进行尝试,直到匹配到为止。

算法区别:

贪心算法-----只能选择当前的最有解。

DP(动态规划)-----能够找到全局的最优解(能够看到全局)

<2>后向匹配(back-ward max matching)

snownlp对文本文件分词的代码 文本分词处理_最大匹配_07

推荐阅读博客:中文分词引擎 java 实现 — 正向最大、逆向最大、双向最大匹配法

    

最大匹配算法的缺点:局部最优,效率低,不能考虑语义

<3>考虑语义(Incorporate semantic)

snownlp对文本文件分词的代码 文本分词处理_snownlp对文本文件分词的代码_08

执行过程如下图:

snownlp对文本文件分词的代码 文本分词处理_snownlp对文本文件分词的代码_09

上图中,利用语言模型 unigram language model,计算各个词在出现的联合分布概率。

snownlp对文本文件分词的代码 文本分词处理_相似度_10

注意:直接使用unigram 语言模型多个概率相乘极有可能出现underflow(向下溢出,即double或float类型无法表示)

优化方法:对概率P取对数,将相乘转换为相加

3.拼写纠错

snownlp对文本文件分词的代码 文本分词处理_snownlp对文本文件分词的代码_11

找到词的最短编辑距离

snownlp对文本文件分词的代码 文本分词处理_相似度_12

 

方法优化:通过replace(替换)、add(添加)、delete(删除)生成编辑距离为1或2的字符串。

snownlp对文本文件分词的代码 文本分词处理_词频_13

上图中对生成的字符串进行过滤方法如下所示:

snownlp对文本文件分词的代码 文本分词处理_snownlp对文本文件分词的代码_14

上图中的argmax公式表示选择p(c/s)最大的c,将其返回给用户。

利用贝叶斯公式将其简化为p(s/c)*p(c),贝叶斯公式的推导见上图。

4.词过滤

对于NLP的应用,我们通常将停用词、出现频率很低的词过滤掉。

snownlp对文本文件分词的代码 文本分词处理_最大匹配_15

5.文本表示

(1)one-hot表示

<1>单词的表示形式

将词典看成一个一维向量,若词典里的单词就是该单词,则一维数组的对应位置标为1

snownlp对文本文件分词的代码 文本分词处理_词频_16

 

<2>句子的表达形式(不统计词频)

将词典看成一个一维向量,若词典里的单词在句子中出现,则一维数组的对应位置标为1

snownlp对文本文件分词的代码 文本分词处理_最大匹配_17

<3>句子的表达形式(统计词频)

snownlp对文本文件分词的代码 文本分词处理_snownlp对文本文件分词的代码_18

注意:

并不是出现的越多就越重要

并不是出现的越少就越不重要。

6.文本的相似度

(1)基于欧式距离的文本相似度

snownlp对文本文件分词的代码 文本分词处理_snownlp对文本文件分词的代码_19

欧式距离越小,句子相似度越大(成反比)。

(2)余弦相似度

snownlp对文本文件分词的代码 文本分词处理_最大匹配_20

余弦相似度越大,句子的相似度也越大。(成正比)

7.TF-IDF文本表示

snownlp对文本文件分词的代码 文本分词处理_最大匹配_21

tf表示在文档d中w这个词出现的次数(词频),idf表示单词的重要性。

snownlp对文本文件分词的代码 文本分词处理_词频_22