在NLP中,最基础的处理的就是分词,不论是一个网页还是一片文章,还是一段话,都是需要先分词的才能去搞清楚这段话的意思的,这里介绍两个最经典的方法,都是基本的算法。

一:前向最大匹配(forward-max-matching)
分词之前,得知道什么才是单个词,就得有个词典库,作为分词的参考基础。因此我们需要一个包含了我们认为的所有词的词典。

前向最大匹配就是要匹尽量配出最长的字符串,也就是每次希望找到最长的词出来,方向是从前到后,每一步骤中匹配不成功的话,就把待匹配字段的最后一个字去掉继续进行匹配,这块简单,举个例子。

假设所有词语中最长的词语长度是max_len = 5
例子:我们经常有意见分歧
词典:[“我们”,“经常”,“有”,“有意见”,“意见”,“分歧”]

第一个词:
“我们经常有”没有在词典,排除掉。
“我们经常”没有在词典,排除掉。
“我们经”没有在词典,排除掉。
“我们”存在于词典,找到了一个词语。

第二个词:
“经常有意见”没有在词典,排除掉。
“经常有意”没有在词典,排除掉。
“经常有”没有在词典,排除掉。

“经常”存在于词典,找到了一个词语。

第三个词:
“有意见分歧”没有在词典,排除掉。
“有意见分”没有在词典,排除掉。
“有意见”存在于词典,找到了一个词语。

第四个词:
“分歧”存在于词典,找到了一个词语。

因此我们将原始句子分成了四个词语,分别是:
[“我们”,“经常”,“有意见”,“分歧”]

请注意:这里的max_len怎么取值呢?这个需要根据在词典表中做个统计,发现多各个长度等级的词语占比是多少?因为这个值越长,分词也就越准确,但是同时伴随着分词的时候耗费的时间也就越长,因此需要做个权衡,应该把大部分的词语所处的长度等级作为参考,当然为了准确度,在加一些细节上的处理。

二:后向最大匹配算法(backward-max matching)
我们学习了前向最大匹配,是从前到后进行查找最大匹配的词语,那么后向算法顾名思义,只不过是从后到前进行最大长度匹配,每一步骤中匹配不成功的话,就把待匹配字段的第一个字去掉继续进行匹配,举个例子。

假设所有词语中最长的词语长度是max_len = 5
例子:我们经常有意见分歧
词典:[“我们”,“经常”,“有”,“有意见”,“意见”,“分歧”]

第一个词:
“有意见分歧”没有在词典,排除掉。
“意见分歧”没有在词典,排除掉。
“见分歧”没有在词典,排除掉。
“分歧”存在于词典,找到了一个词语。

第二个词:
“经常有意见”没有在词典,排除掉。
“常有意见”没有在词典,排除掉。
“有意见”存在于词典,找到了一个词语。

第三个词:
“我们经常”没有在词典,排除掉。
“们经常”没有在词典,排除掉。
“经常”存在于词典,找到了一个词语。

第四个词:
“我们”存在于词典,找到了一个词语。

因此我们将原始句子分成了四个词语,分别是:
[“我们”,“经常”,“有意见”,“分歧”]

总结一下:这里只介绍了机械的编程下的分词,编程实现简单,也容易理解,但是它没有考虑到词性和语法,所以精确度可能不会很高,不能满足高标准的要求。需要综合考虑词性词义,上下文。

三:双向最大匹配算法(Bi-max matching)
由于前向最大依赖和后向最大匹配的准确度都不是很高,于是有了一个双向的最大匹配算法,也就是分别执行一次前向和后向的算法,90% 的概率二者是一样的结果,这好说,随意取一个结果。

要是二者结果不一样的,就需要按照一些原则来选择了,
1) 一个词语包含的字数越多,信息越多,也就是词语的个数越少越好,这样准确性也越高。
2) 词库中不存在的单个长度的词语越少越好,或者就说词库中不存在的词语也少越好。因为和可能会得到不存在于词典的词语。

比如前向结果:技术、和服、务
比如后向结果:技术、和、服务
很明显单个字的“务”应该不存在于词典中,而后向的结果存在单个字“和”,所以后向的结果更加合理。

四:其他分词方法
上述的方法属于机械式的分析方法,也可以说是基于匹配规则的方法。精确度不高,效率低,不能考虑歧义词义语义,下面提一嘴其他的方式,也可以是基于概率统计的方法,但是这里不展开说。
1) 语言模型(LM)
2) 基于隐马尔可夫模型的分词算法(HMM)
3) 基于条件随机场的分词算法(CRF)

中文分词是比较难的技术,也在不断地发展过程中,既要保证分词的准确度,也要保证分词的效率,才是构建搜索引擎的关键,二者必须都要达到很高的效率。

五:工具介绍
Jieba也可以叫做结巴,是一个比较流行的分词工具,网址是https://github.com/fxsjy/jieba
下面是测试代码,很简单,也特别好理解和使用。

# encoding=utf-8
import jiebaseg_list = jieba.cut("春花秋月何时了,往事知多少,小楼昨夜又东风,故国不堪回首月明中,雕栏玉砌应犹在,只是朱颜改,问君能有几多愁,恰似一江春水向东流", cut_all=False)
print("Result : " + "/".join(seg_list))jieba.add_word('能有')
jieba.add_word('几多愁')
jieba.add_word('月明中')
jieba.add_word('何时了')
seg_list = jieba.cut("春花秋月何时了,往事知多少,小楼昨夜又东风,故国不堪回首月明中,雕栏玉砌应犹在,只是朱颜改,问君能有几多愁,恰似一江春水向东流", cut_all=False)
print("Result : " + "/".join(seg_list))

Jieba_cut就是分词的函数
Add_word就是可以增加一些自己想要的词语,算是自己根据自己的场景,自行定制的一些词汇表,丢给结巴。

除此之之外,还可以按照搜索引擎需要的去划分词,标注词性,TF-IDF等多功能。

NLP 《分词方法》相关推荐

  1. 机器学习笔记之马尔可夫链蒙特卡洛方法(四)吉布斯采样

    机器学习笔记之马尔可夫链蒙特卡洛方法--吉布斯采样 引言 回顾:MH采样算法 基于马尔可夫链的采样方式 细致平衡原则与接收率 MH采样算法的弊端 吉布斯采样方法 吉布斯采样的采样过程 吉布斯采样的推导 ...

  2. NLP《词汇表示方法(三)word2vec》

    Word2Vec是2013年Google发布的工具,也可以说是一个产生词向量的一群模型组合,关于词向量,也就是嵌入词向量的解释之前也解释了,这里不赘述.该工具主要包含两个词向量的生成模型,跳字模型(s ...

  3. 深入理解深度学习——Word Embedding(六):负采样(Negative Sampling)优化

    分类目录:<深入理解深度学习>总目录 相关文章: · Word Embedding(一):word2vec · Word Embedding(二):连续词袋模型(CBOW, The Con ...

  4. 负采样Negative Sampling

    1.噪声对比估计(Noise contrastive estimation) 语言模型中,根据上下文c,在整个语料库V中预测某个单词w的概率,一般采用softmax形式,公式为: NCE:将softm ...

  5. 自然语言处理中的负采样

    目录 word2vec出现的背景 跳字模型(skip-gram) 连续词袋模型(CBOW) 小结 负采样 具体训练过程 word2vec出现的背景 我们都知道,自然语言处理需要对文本进行编码,将语言中 ...

  6. NLP《词汇表示方法(四)负采样》

    一:负采样 在CBOW和Skip-Gram模型中,最后输出的都是词汇的one-hot向量,假如我们的词汇表的数量是10000,嵌入空间的维度是300,再假设此时是以Skip-Gram模型只预测cont ...

  7. 花书+吴恩达深度学习(二四)蒙特卡罗方法(重要采样,MCMC)

    文章目录 0. 前言 1. 重要采样 2. 马尔可夫链蒙特卡罗 MCMC 3. 不同峰值之间的混合挑战 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔,我会非常开心的~ 花书+吴恩达深度学习( ...

  8. 【NLP】word2vec负采样

    一.理解负采样之前,需要先回顾一下word2vec的训练流程: 1.初始化一个embedding权重矩阵W1(N*D)→2.根据输入单词直接挑出W1矩阵中对应的行向量→3.相加并求平均得一个向量(1* ...

  9. [nlp] 负采样 nce_loss

    论文:http://demo.clab.cs.cmu.edu/cdyer/nce_notes.pdf 参考:求通俗易懂解释下nce loss? - 知乎 参考:(三)通俗易懂理解--Skip-gram ...

  10. NLP-词向量(Word Embedding)-2013:Word2vec模型(CBOW、Skip-Gram)【对NNLM的简化】【层次Softmax、负采样、重采样】【静态表示;无法解决一词多义】

    一.文本的表示方法 (Representation) 文本是一种非结构化的数据信息,是不可以直接被计算的.因为文本不能够直接被模型计算,所以需要将其转化为向量. 文本表示的作用就是将这些非结构化的信息 ...

最新文章

  1. HDU 6096 String (AC自动机)
  2. Linux字符驱动开发学习总结
  3. Java 8系列之重新认识HashMap(转载自美团点评技术团队)
  4. shell 25个常用命令
  5. 最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁
  6. 2020项目商机_营销“心”思维,赢得“新”商机 ——2020年第二期军师项目顺利落幕...
  7. UPC 条形码的介绍及计算校验码
  8. 生物信息学_分子数据库(二)核酸
  9. 数学建模写作指导20篇(一)-如何写好数学建模论文?
  10. 小米手机miui12系统下拉状态栏开关图标排序方法
  11. html编写扑克牌游戏,用js编写扑克牌小游戏
  12. 修改谷歌和火狐浏览器滚动条的样式
  13. Textpad的安装和配置
  14. 【LeetCode 二分查找专项】最长递增子序列(300)(to be polished...)
  15. 关于lib文件的介绍
  16. 快速获取雪碧图的图标样式插件 - gulp-css-spriter教程
  17. 学习记录570@MySQL查询部门工资前三高的所有员工
  18. 计算机辅助设计所开课程,计算机辅助设计教学存在的问题与改革
  19. 【OpenCV-Python-Tutorial 数字图像处理】opencv3.4 官方API及其实例总结
  20. JVM内存模型总结,有各版本JDK对比、有元空间OOM监控案例、有Java版虚拟机,综合学习更容易!

热门文章

  1. NSOperation的使用细节 [3]
  2. scp 、ssh非22端口的服务器方法
  3. 试hp服务器不识别网卡一则
  4. 使用CSS控制段落首行缩进
  5. 如何使用Tree-shaking减少代码构建体积
  6. 数据可视化组件Grafana详细解读--RedHat/Fedora/CentOS/Oracle上的安装
  7. linux常用yum 安装基本包_linux - yum常用命令
  8. 用户与组管理,磁盘管理
  9. UC神马数据采集api
  10. Docker 制作自定义化的Tomcat镜像