【算法记事本#NLP-1】最大匹配算法分词
#NLP-1 最大匹配算法(MM)
最大匹配算法(Maximum Matching)被用于对一个文段进行词语划分(Word Segmentation)。
注意
这是词元化(Tokenization)算法
此方法不适用于无分隔符的字母语言(e.g.:德语、使用假名替代汉字的日语、被取消分词符的英文等)
但是对汉语这类无词间分隔符但不依赖字母的语言效果拔群
输入输出
input1(文段P)
input2(单词表W)
processor(MM)
output(词元表T)
input1--输入-->processor
input2--输入-->processor
processor--输出-->output
算法内容
人话版本(自然描述)
输入:文段\(\small P\),单词表\(\small W\)
过程:对于给定的\(\small P\)和\(\small W\):
- 令指针\(\small i\)从\(\small P\)的起点开始
- 每当找到最长匹配于\(\small i\)引领文段的单词\(\small w\),则将\(\small w\)加入词元分析表\(\small T\)(一个顺序表结构)中
- \(\small i\)向后移动\(\small w\)长度个位置
- 回到2,直至\(\small i\)无法向后移动为止
输出:词元分析表\(\small T\)
说明
最长匹配??
这个概念用定义去描述其实很不容易理解,这里直接上例子,比如,有一个字符串
The quick brown fox jumps over a lazy dog
现在给出这么几个字符串:Th、The、The slow、The quick brown fox jumps over a lazy dog and a little duck、quick brown
注意,最长匹配的前提是能匹配得上,此外还要求是端点匹配
先看Th,很明显,尽管Th不能完美的匹配上原有字符串,但却是原字符串的子串(Substring),也就是说它能够完美的和原字符串的局部相匹配,而且是从起始位置相匹配,可以暂时认为是原字符串的最长匹配。
再看The,和Th一样,其整体能够匹配上原字符串的部分,而且也是从起始位置匹配,因此也可能是最长匹配,这样一来Th和The都能匹配上原字符串,但是
一个字符串在一个给定的字符串集合中只能找到一个最长匹配,而且是尽可能长的那个
考虑到The比Th长,因此The替掉了Th成为了目前的最长匹配
接下来看看The slow,截止到The 都能匹配到原字符串上,但接下来的s却无法匹配原字符串,尽管匹配部分的长度比The还长,但很遗憾,The slow只能认为是不匹配。
The quick brown fox jumps over a lazy dog and a little duck也是同理,别看它甚至是原字符串的延长串(也就是原字符串是它的子串),但后面多出来的部分匹配不回去,所以也只能认为是不匹配。
原字符串是大爷!!
最后再看看quick brown,当然这也是原字符串的子串,而且匹配长度为11,甚至比The的匹配性还强,但是也很遗憾,这并不是从起点匹配的,所以这个无法认为匹配
于是我们得到了结论:
在上述给出的5个字符串中,最长匹配为
The
当然,这都是目前的最长匹配,如果我们继续给出The quick、The quick brown、……这个结果还是会跟着变化的,因为:
理论上,从所有字符串构成的全集寻找某一字符串的最长匹配,其结果只能是该字符串本身
为什么对汉语效果拔群??
这里先说对英语吧……
因为是做词元化工作,所以这里暂时无视英语中的空格分隔符。
We are talking about weather.
↓ 移除所有分词符
Wearetalkingaboutweather.
当然,我们要对下面的内容做分词,按说分词工作做完后其分割结果应该和移除之前是一样的:We|are|talking|about|weather|.
但如果采用MM算法使用一个标准词库进行匹配,就会是下面这样:
首先从
W开始,从词库中寻找从W开始能够最长匹配的字符串,然后非常巧,我们在词典中找到了……Wear!!
……
于是,我们先不管后面能不能分出来,反正分完肯定是这样子:Wear|...|...。
很明显这种分法是不行的。
这里面的原因就在于:英语一共就26个字母,随便找若干个字母凑成一个单词的概率还是很大的,特别是移除分隔符后出现大量辅音字母+若干元音字母的情况。
而且,英语中词汇的长度方差很大,短的只有一个字母,长的可以10多个,极端情况下也有40多个的甚至更多,很多短单词会成为一些长单词的子串(we之于wear等),而移除分隔符后两个原本独立的子串被拼合成一个更长的单词也不是什么新鲜事。
一种极端情况:
origin("Hear the voice")
obfuscated("Hearthevoice")
mm("Heart|he|voice")
origin--移除分隔符-->obfuscated
obfuscated--MM算法分割-->mm
但是汉语就不一样了,就以GB2312里面的6700多个汉字想随便挑出来几个字就凑巧拼出一个词语还是很困难的,而且词语长度的方差很低,不考虑诗句和歇后语的话,常用的词语和成语绝大多数为2~4个字,较长一些的8个字(比较少),这种情况下即使没有分隔符,两个独立的词语能够被混淆成一个的几率还是比较小的,比如:
一只穿云箭,千军万马来相见
一只|穿云|箭|,|千军万马|来|相见
基本上分割的完全正确,而且即使把标点符号都去掉,也不太影响其分割的结果,斯坦福大学也给出了这样的评价:
Doesn’t generally work in English!
But works astonishingly well in Chinese!
不过其实说到底,这种算法比较依赖于词典(事实上很多词元化算法都挺依赖词典),如果词典编写的不够好,那么即使是汉语其词元化的质量也不尽如人意(特别是汉语需要足够完善的词汇库,其工作量是相当庞大的)。
【算法记事本#NLP-1】最大匹配算法分词的更多相关文章
- seg:NLP之正向最大匹配分词
已迁移到我新博客,阅读体验更佳seg:NLP之正向最大匹配分词 完整代码实现放在我的github上:click me 一.任务要求 实现一个基于词典与规则的汉语自动分词系统. 二.技术路线 采用正向最 ...
- 常用算法3 - 字符串查找/模式匹配算法(BF & KMP算法)
相信我们都有在linux下查找文本内容的经历,比如当我们使用vim查找文本文件中的某个字或者某段话时,Linux很快做出反应并给出相应结果,特别方便快捷! 那么,我们有木有想过linux是如何在浩如烟 ...
- NLP自然语言处理中英文分词工具集锦与基本使用介绍
一.中文分词工具 (1)Jieba (2)snowNLP分词工具 (3)thulac分词工具 (4)pynlpir 分词工具 (5)StanfordCoreNLP分词工具 1.from stanfor ...
- 【算法】串的模式匹配算法(KMP)
串的模式匹配算法 问题: 求子串位置的定位函数如何写? int index(SString S,SString T,int pos); 给定串S,子串T,问T在 ...
- 使用织梦开源的分词算法库编写的YII获取分词扩展
在编辑文章中,很多时候都需要自动根据文章内容获取关键字的功能,因此,本文主要是说明如何在yii中使用织梦开源的分词算法编写一个独立的扩展,可以在不同的模块中使用,步骤如下: 1 到这里下载其他朋友整理 ...
- NLP舞动之中文分词浅析(一)
一.简介 针对现有中文分词在垂直领域应用时,存在准确率不高的问题,本文对其进行了简要分析,对中文分词面临的分词歧义及未登录词等难点进行了介绍,最后对当前中文分词实现的算法原理(基于词表. ...
- KMP算法(改进的模式匹配算法)——next函数
KMP算法简介 KMP算法是在基础的模式匹配算法的基础上进行改进得到的算法,改进之处在于:每当匹配过程中出现相比较的字符不相等时,不需要回退主串的字符位置指针,而是利用已经得到的部分匹配结果将模式串向 ...
- KMP算法(改进后的字符串匹配算法)
转载:http://blog.csdn.net/liu88010988/article/details/50789960 kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O ...
- SQL的循环嵌套算法:NLP算法和BNLP算法
MySQL的JOIN(二):JOIN原理 表连接算法 Nested Loop Join(NLJ)算法: 首先介绍一种基础算法:NLJ,嵌套循环算法.循环外层是驱动表,循坏内层是被驱动表.驱动表会驱动被 ...
随机推荐
- poj-3657 Haybale Guessing(二分答案+并查集)
http://poj.org/problem?id=3657 下方有中文版,不想看英文的可直接点这里看中文版题目 Description The cows, who always have an in ...
- O - 覆盖的面积(线段树+扫描线)
给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1& ...
- 西甲官方APP承认监听球迷,或给国内应用带来新思路
在此前,一般巨头或者官方推出的产品.应用等总是值得信赖的.出问题的话一般都是"不可抗拒的外力因素",比如被黑客攻破导致用户隐私被窃取等.但自从Facebook的用户隐私泄露丑闻被曝 ...
- windows cmd下netstat查看占用端口号的进程和程序
其实很简单,大家可以在cmd窗口 C:\Documents and Settings\Administrator>netstat -help 显示协议统计信息和当前 TCP/IP 网络连接. N ...
- python3下scrapy爬虫(第十四卷:scrapy+scrapy_redis+scrapyd打造分布式爬虫之执行)
现在我们现在一个分机上引入一个SCRAPY的爬虫项目,要求数据存储在MONGODB中 现在我们需要在SETTING.PY设置我们的爬虫文件 再添加PIPELINE 注释掉的原因是爬虫执行完后,和本地存 ...
- android完整资讯App、Kotlin新闻应用MVP + RxJava + Retrofit + Dagger2、优雅区间选择器等源码
Android精选源码 Android完整资讯客户端源码 android展示注册进度效果源码 Android Wifi热点数据传输Socket 通信示例源码 Android Dota的辅助信息app源 ...
- K3CLOUD呼吸时间设置
- LeetCode No.79,80,81
No.79 Exist 单词搜索 题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相 ...
- deeplearning.ai 卷积神经网络 Week 2 卷积神经网络经典架构
1. Case study:学习经典网络的原因是它们可以被迁移到其他任务中. 1.1)几种经典的网络: a)LeNet-5(LeCun et al., 1998. Gradient-based lea ...
- cs231n spring 2017 lecture3 Loss Functions and Optimization
1. Loss function是用来量化评估当前预测的好坏,loss function越小表明预测越好. 几种典型的loss function: 1)Multiclass SVM loss:一般的S ...