人機文字分類特徵構造——困惑度計算
最近在2018smp的一個比賽中鍛鍊了一下,該任務為文字分類,重點在於辨別人類作者和機器所寫文章的不同,在一番仔細斟酌之後發現兩者之間的區別有以下3點:
(1)語序
機器所寫的可能想表達的是一樣的說法,是基於文字規則對抽取詞彙的排列,但是結果呈現在詞序的排序上卻會出現一些偏差,舉個栗子:
正確的句子:
這將是最好的未來 。
錯誤的句子:
這是將最好的未來 。
(2)語義
機器所寫的內容可能存在重複或者上下表達一致,也有出現多個文字內容的糅合,舉個例子:
南澳 I 號 涉嫌 武裝 走私 。 深圳 261 保障房 申請 戶 造假 被 處 5000 元 罰款 。 廣東 惠州 破獲 操縱 未成年人 犯罪團伙 頭目 判 死刑 。 廣州 花都 原 區委書記 受賄 500 多 萬元 受審 ( 圖 ) 。
(3)語法
機器所寫的內容有時候會出現少部分的病句,而且在標點符號上也有使用不規範的情況。
對以上的特點,在語序方面採取訓練SRILM模型並計算單個句子的困惑度作為特徵輸入,以下就是具體的流程。
關於SRILM模型
SRILM的主要目標是支援語言模型的估計和評測。估計是從訓練資料(訓練集)中得到一個模型,包括最大似然估計及相應的平滑演算法;而評測則是從測試集中計算其困惑度。其最基礎和最核心的模組是n-gram模組,這也是最早實現的模組,包括兩個工 具:ngram-count和ngram,相應的被用來估計語言模型和計算語言模型的困惑度
安裝及使用
1.所需要的依賴包
c/c++ compiler,GNU make,GNU gawk,GNU gzip,Tcl
先提前安裝好
2.安裝SRILM
(1)下載
SRILM下載地址:http://www.speech.sri.com/projects/srilm/download.html
選擇適合的版本,然後accept the license即可,解壓後記住自己的所放路徑(後面需要)
(2)修改srilm/MakeFile:
# SRILM = /home/speech/stolcke/project/srilm/devel (原)
SRILM = $(PWD)
(3)修改srilm/common/Makefile.machine.*
所填的內容和本機硬體平臺有關。可以在終端輸入一下命令檢視:
uname -i
比如我的機子是x86_64,那我修改的是Makefile.machine.i686-m64這個檔案。
找到:
TCL_INCLUDE =
TCL_LIBRARY =
修改為:
TCL_INCLUDE =
TCL_LIBRARY =
NO_TCL = X
找到:
GAWK = /usr/bin/awk
修改為:
GAWK = /usr/bin/gawk
(4)編譯
在SRILM目錄下輸入:
make World
(5)修改環境變數
export PATH=(你的安裝路徑):$PATH
(6)測試
在終端輸入:
make test
3.SRILM的簡單使用
1:詞頻統計
ngram-count -text trainfile.txt -order 3 -write trainfile.count
其中-order 3為3-gram,trainfile.count為統計詞頻的文字
2:模型訓練
ngram-count -read trainfile.count -order 3 -lm trainfile.lm -interpolate -kndiscount
其中trainfile.lm為生成的語言模型,-interpolate和-kndiscount為插值與折回引數
3:測試(困惑度計算)
ngram -ppl testfile.txt -order 3 -lm trainfile.lm -debug 2 > file.ppl
引數:
-debug 0 只輸出整體情況
-debug 1 具體到句子
-degub 2 具體到每個詞的概率