机械分词实战:南京 / 市长 / 江大桥 ?
机械分词
前面在 分词是什么?
中,我们一起讨论了「分词」相关的方法和技巧.
这次我们从最简单的机械分词上手,来感受一下平常调个包就能解决事情,摸起来是什么样子的。
我们先用一句话来描述这次的任务:
从文本中匹配字典中的文字,记录词语的位置(起点,终点),最后以 / 切分。
我会在代码中尽量的加注释来说明,如下 👇:
1 | import re |
打印的结果是:
大家 / 好 / , / 我 / 是 / 锅贴 / 。 / 什么 / 是 / 洗 / 摸 / 杯 / ? / 张 / 美丽 / 人 / 长得 / 真 / 好看 / ! / 你 / 好, / 欢迎 / 来到 / 南京 / 市长 / 江大桥 / 参观 / 。
问题
这里面有很多显而易见的问题:
洗 / 摸 / 杯
这三个字是一个整词
洗摸杯
,解释一下这是一个零零后们的网络用语,意思为:“我手洗干净了能摸摸你的奖杯吗?”。
这种新词在词典中是没有的,这也是基于词典的机械切分最大的问题之一。
改进方法就是不断的丰富词典。张 / 美丽
如果我们人来分的话,肯定会知道这是个人名
张美丽
,而这里没有做上下文联系以及语义上的理解,导致了切分错误。
一个很好的改进方法是做NER
,也就是命名实体识别,它会把一些人名、地名等识别出来。你 / 好
导致
你好
被分开的原因是我们的词典中,既有你
也有你好
,如果先对你
进行的匹配,那么你好
就会被切分。
常见的做法是对于字典中的词进行从长到短的排序,先用长的词匹配,然后再用短的词匹配。好,
这个没有分开是代码的问题,由于代码仅做演示用,所有就没有做多次匹配,也就是说这个
,
没有被匹配到。南京 / 市长 / 江大桥
似乎写到这里终于点题了。
在我们的字典中,既有市长
也有长江大桥
,如果仅仅正向匹配,那么就会只有前面的词被匹配出来。
为了解决这个,可以采取双向匹配,先正向再逆向,这样很容易找出有歧义的地方。
但如何判断歧义的地方如何选择呢?简单来说就是对于两次的结果取得到分词数量少的那个。
局限性
机械分词没有使用文本的上下文进行语义层次的切分,具有很大的局限性。
在业界中一些公开评测中,机械分词的最高精度也只能在 80% 左右,而利用了语言模型的分词器可以做到 98% !
因此,大家有兴趣尝试一下机械分词,平时开发还是老老实实的调包吧~
机械分词实战:南京 / 市长 / 江大桥 ?
https://blog.ailln.com/v2ai/2018/06/23/nature-language-processing/4-ws-practical/