NLP(3): 分词和拼写纠错

第一节、Word Segmentation

1、 Tools

  • Jieba
  • SnowNLP
  • LTP
  • HanNLP

使用jieba

import  jieba
seg_list=jieba.cut("贪心学院专注于人工智能教育",cut_all=False)
print("/".join(seg_list))
jieba.add_word("贪心学院")
seg_list=jieba.cut("贪心学院专注于人工智能教育",cut_all=False)
print("/".join(seg_list))

在这里插入图片描述

2、segmentation method 1: Max matching

Forward max-matching

前向最大匹配:
NLP(3): 分词和拼写纠错_第1张图片
定义一个参数:max_len=5,希望匹配到的单词越长越好

NLP(3): 分词和拼写纠错_第2张图片
每次取五个,与词典中对比是否存在该词,如果不存在,从右边开始减一,直到匹配到目标单词为止。结束该次计算
将一次取五个的这个框向右移动上一次计算的单词的个数的步数。

backward-max matching

从后到前匹配,90%以上的与forward max-matching匹配到的一样
NLP(3): 分词和拼写纠错_第3张图片

最大匹配的缺点

  • 无法细分,有时候细分的结果是更好的
  • 局部最优解,贪心未必最优
  • 效率低,max_len越长,时间复杂度越高
  • 歧义:无法考虑语义,看到的只是一个单词,不是语意(即上下文)]

3、segmentation method 2:Incorporate Semantic(考虑语义)

build a black box,将分词后的结果输入进去,会输出一个评估的分数。分数越大代表分词效果越好。

NLP(3): 分词和拼写纠错_第4张图片
具体步骤:

  • 给定一个待被拆分的句子
  • 根据词典里的词将该句子所有分词的可能都列出
  • 工具会输出每个分词结果的概率,符不符合中文的语意
  • 工具:language model 语言模型

举例:unigram language model
NLP(3): 分词和拼写纠错_第5张图片
每一个p的求值方法:统计频率,统计每个词在该文章中出现了几次,term frequency
P 经 常 = 经 常 这 个 词 出 现 的 次 数 / t o t a l w o r d s P_{经常}=经常这个词出现的次数/total words P=/totalwords

NLP(3): 分词和拼写纠错_第6张图片
该方法只考虑词频,不考虑每个词之间的上下文关系。通过统计单词出现的次数,计算得到它出现的概率。根据每个词得概率,假设每个单词之间是条件分布独立的,就可以计算出它们组合成的这句话出现的联合概率。对比每一种拆分后的组合,计算出联合概率最大的哪那一种拆分情况,即为当前分词的最优情况。

  • 当中文词典中单词数量有几十万时,几个单词出现的联合概率分布是非常小的。超出计算机计算范围=====>underflow
  • 解决:计算log(p(经常,有意见,分歧))=log(p(经常))+logp(有)+logp(意见)+logp(分歧)
  • 将一个乘法转变为加法。
  • 为什么可以加log,因为log是一个递增函数,所以加上它不会影响每个
    p之间的大小关系。

step1:生成所有可能的分割
step2:选择最好的

incorporate semantic 的问题:

复杂度太高,可生成的可能的分割是非常多的。

4、segmentation method 3:Viterbi 算法

本质还是DP

找到最短路径:每条路径的长度由-log(p)度量


只考虑直接可达的
NLP(3): 分词和拼写纠错_第7张图片

summary

  • 基于匹配规则方法:
    max-matching
  • 基于概率统计方法(LM,HMM,CRF)
  • 分词可以认为是已经解决的问题
    需要掌握:可以自行实现基于最大匹配和unigram LM的方法

第二节:spelling correction 拼写错误纠正

NLP(3): 分词和拼写纠错_第8张图片
通过系统将用户写错的东西纠错,改进为正确的
input=====>AI=======>correction

  • 1、单词本身就是错误的,错别字
  • 2、不是错别字,但不是适合的单词,I am go home,go的时态不对。

Find the words with smallest edit distance

  • insert
  • delete
  • replace

在计算编辑距离时,不知道insert delete和replace哪种方法可以求到最短编辑距离,所以每种操作都要尝试一次。
NLP(3): 分词和拼写纠错_第9张图片
找到和therr编辑距离最小的单词。

NLP(3): 分词和拼写纠错_第10张图片
如果要循环一边词典,时间复杂度很高。

Alternative Way

  • 用户输入
  • 生成编辑距离为1,2的字符串
  • 过滤
  • 返回(不依赖于词典的大小)
    NLP(3): 分词和拼写纠错_第11张图片
    对于apple
    1、生成编辑距离为1的字符串
  • Replace:bppl,cppl,aapl,abpl…
  • Add:aappl,bappl,abppl,acppl…
  • Delete:ppl,apl,app
    2、生成编辑距离为2的字符串
    在step 1的基础上,生成编辑距离为2的字符串
    从生成的这些字符串中选择最好的,返回。

绝大部分拼写错误的纠正都可以在编辑距离为2内改变,99.9%以上

How to filter?

问题定义,给定一个字符串s,要找出最有可能成为正确的字符串c,也就是
在这里插入图片描述
s:打错的输入
c:正确的字符串, 找到一个c,使得条件概率最大

对于上述的计算,使用贝叶斯定理:

  • p(s|c):统计当用户想输入apple时,有多少用户写错成app,appl,appla的概率,可以从历史文档中统计。
  • p©: unigram probability,apple在所有文章中出现的次数,对于appl的讨论,对于apple,apply,apple拥有更大的p©,因为它在文章中出现的次数更多。
    上述两个分类都可以从之前的统计中得到
    NLP(3): 分词和拼写纠错_第12张图片

你可能感兴趣的:(算法,人工智能,机器学习,python,nlp)