假设我们有三个很大的语料库,分别是英语EN,德语DE 以及 阿塞拜疆语AZ,当我们拿到一段新的语料NEW(长度足够长),我们应该如何判断NEW是哪种语言呢?
这实际上是自然语言处理中的一个基本问题,我们立即会想到使用有监督的机器学习方法来解决这个问题,比如朴素贝叶斯分类、KNN分类、SVM分类、逻辑斯特回归LR分类等。
但是这些方法需要预先训练模型,如果没有机器学习基础,学习曲线会比较陡峭。如果你只是临时遇到这么个问题需要快速解决,你其实不必去研究机器学习理论,可以试试本文介绍的这个看似奇怪的技巧。当然,如果你的工作就是自然语言处理或机器学习,还是老老实实去打基础吧。
这个技巧是什么呢?它就是GZIP!
什么?GZIP不是用来压缩文件的吗?你可能会这么问?不要着急,先使用下面的命令试一下:
echo `cat NEW EN|gzip|wc -c` EN; \
echo `cat NEW DE|gzip|wc -c` DE; \
echo `cat NEW AZ|gzip|wc -c` AZ; \
|sort -n|head -1
上面的命令将NEW分别和EN、ED、AZ串联后用gzip压缩,统计压缩后长度后找出最短的那个。
那么它为什么会有用呢?原因是gzip会将相同的字符序列进行压缩,假设NEW是英语语料,那么它和EN连接在一起,就会有更多的相同字符序列,那么被压缩之后它就会比其他组合压缩出来的长度更小。
当然这个方法需要EN、ED、AZ的长度大致相等,且包括NEW在内的所有语料都比较长,不然它可能就会误判。而且就像其他机器学习方法一样,不会有100%的正确率。
参考资料
https://classroom.udacity.com/courses/cs271/lessons/48641663/concepts/486487210923