在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. IOS 学习---触摸事件与手势
  2. Google搜索技巧-从入门到精通(从此学习进步、工作顺心)
  3. python笔记之利用BeautifulSoup爬取糗事百科首页段子
  4. 成都Uber优步司机奖励政策(3月31日)
  5. MyBatis基于Java API配置
  6. 扩展JavaScript原生方法
  7. 相机视场角和焦距_相机视场角估计
  8. 一线大公司面试必备技能
  9. APP测试中压力和性能的差别以及测试方案攥写
  10. 坚果云和亿方云哪个更适合学校?
  11. 单点登录(Single Sign On)解决方案
  12. 跨境物流的主要操作流程是怎样的?
  13. 浅谈js下的发布订阅模式(观察者模式)
  14. 【HDOJ】4355 Party All the Time
  15. 开源 MQTT Broker 对比
  16. 编写函数,接收一个字符串,分别统计大写字母、小写字母、数字、其他字符的个数,并以元组的形式返回结果。
  17. python中列表的元素是什么数据类型_python基本数据类型之列表和元组(一)
  18. 12306实时余票查询接口
  19. C语言:十进制转十六进制并组合输出
  20. 听说你不会玩直播技术?

热门文章

  1. Web报表工具FineReport填报界面键盘操作
  2. Winform使用DevExpress的WaitDialogForm画面 z
  3. WinForm下DataGridView导出Excel的实现
  4. 如何计算两个字符串之间的文本相似度?
  5. 国外开源的PACS服务器
  6. 容器编排技术 -- Kubernetes kubectl patch 命令详解
  7. .Net Core控制台amp;EFCore连接Mysql
  8. 【Vue 3.0 新特性(四)】Vue 3.0 响应式系统原理
  9. mock-api 使用手册
  10. 【Python】字符串的格式化