1. 程式人生 > >奇技淫巧之使用gzip進行文字語言識別

奇技淫巧之使用gzip進行文字語言識別

假設我們有三個很大的語料庫,分別是英語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%的正確率。