中文分词学习笔记

中文分词简介学习笔记 :
分词是中文自然语言处理中非常核心的一个技术。分词是句法分析、词性标注、命名实体识别等自然语言处理技术的基础。
规则分词查询速度快,不能处理未纳入词库的新词。
统计分词能够处理新词,但是查询速充相对规则分词慢。
共同的难点是岐义词的识别。

在这里插入图片描述
规则分词学习笔记 :
选择哪种分词方式根据实际情况来,你的数据集在哪个方式表现好,就选择哪个。
在这里插入图片描述
中文分词逆向最大匹配代码学习笔记 :
这节主要核心代码是CUT函数,其实现了逆向的算法。该代码没有注释,我在关键代码加了相关注释以利于理解代码。

def cut(self, text):
        result = []
        index = len(text)#得到要分词句子长度
        while index > 0:
            word = None
            for size in range(self.maximum, 0, -1):#依次从最大词长度开始分词。
                if index - size < 0:
                    continue
                piece = text[(index - size):index]#逆向取词
                if piece in self.dictionary:
                    word = piece
                    result.append(word)#将分出的词加入result
                    index -= size
                    break
            if word is None:
                index -= 1
        return result[::-1]

统计分词简介学习笔记 :
语言模型是用来计算一个句子概率的模型,即句子中的字或词组合在一起构成一个符合正常语法的句子的概率是多大。
语言模型由于要在大规模语料库中选取字和字之间的组合计算概率所以存在参数多,计算量大的问题,所以要用N-gram模型来降低参数多,计算量大而引起的性能问题。
在这里插入图片描述
概率复习学习笔记:
开始看视频中的公式有很多,有点头大,不过没想到顺着视频中的步骤就听懂了贝叶斯概率是怎么推导来的。反而去看博客中吃瓜的例子,花了我的半天时间,把先验概率、联合概率、条件概率、全概率这些概念温习一遍,再把相关博客中公式代入具体值算了一遍,才确信自已搞明白了。尤其是全概率是如何计算推导来的,要仔细思考。
在这里插入图片描述
HMM中文分词思路学习笔记 :
基本思路就给字在词中确定位置,即这个字在词中是第一个位置(B)还是中间位置(M),还是结束位置(E),还是单独成词(S)可是我们如何能让系统学习到字在词中的位置关系呢?
就是如下图所示,通过三个概率矩阵来及viterbi算法来求解字在词中的位置。
在这里插入图片描述
viterbi算法讲解学习笔记 :
通过本节视频我理解了三个概率矩阵是如何起作用的,也大致了解viterbi算法是如何计算的,如下图中的伪代码所示,是把一个句子中所有字和BMES这四个标志分别进行初始概率矩阵、状态转移概率矩阵、发射概率矩阵的计算,从而得到每个字对应的最大概率标记,全部计算完了,最后把每个最大概率标记找出来连成一线,就把分词标记序列给找出来了。
要特别说明一点视频中并没有给出如何把最大概率标记找出来连成一线的伪代码,咨询老师,老师说后续会讲真实代码,老师还建议我如果对viterbi算法有兴趣,可以再深入去学习viterbi算法到底带来了什么好处,为什么要这样设计,但是这一部分并不是本课程要求学的内容,有兴趣的可以自己查找相关资料自学。
在这里插入图片描述
三个概率矩阵是怎么来的学习笔记 :
视频中的讲解其实就是说明概率矩阵是由频率计算而来。这其实正验证了哪句话,当数据集很大、很多时概率就是频率。
HMM公式推导学习笔记:
由于maxP(o1o2…on|x1,x2,…xn)运算量太大,所以要引入观测独立性假设、隐藏状态之间转移只与前一个相关。
基于以上假设,初始概率矩阵、转移概率矩阵、观测概率矩阵计算才有了基础,HMM公式推导才有了现实意义
在这里插入图片描述
HMM代码调试讲解学习笔记:
调试跟踪学习这些代码合计我花了将近三天时间,因为总是被其它事情打断。花的时间主要是在viterbi算法上,其它的初始化代码及训练生成三个概率矩阵的代码对照视频调试跟踪两三遍就理解了,但是维特比算法我跟踪了好多遍,并且对照一些网上的算法才算是搞懂了。
其最核心的就是如下一段代码需要反复调试跟踪多遍,搞明白其状态逻辑之间的转换关系。

for y in states:
                emitP = emit_p[y].get(text[t], 0) if not neverSeen else 1.0 #设置未知字单独成词
                (prob, state) = max(
                    [(V[t - 1][y0] * trans_p[y0].get(y, 0) * emitP, y0)
                     for y0 in states if V[t - 1][y0] > 0])
                V[t][y] = prob
                newpath[y] = path[state] + [y]

jieba分词学习笔记:
jieba可以调整词频,词频高有利于找出此词,对于新词可以加入到自定义词库中这样就可以识别此词了。这几节课主要也是讲了上述需要实现的功能如何调用API,没什么难度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值