最近在2018smp的一个比赛中锻炼了一下,该任务为文本分类,重点在于辨别人类作者和机器所写文章的不同,在一番仔细斟酌之后发现两者之间的区别有以下3点:
(1)语序
机器所写的可能想表达的是一样的说法,是基于文本规则对抽取词汇的排列,但是结果呈现在词序的排序上却会出现一些偏差,举个栗子:
正确的句子:
这将是最好的未来 。
错误的句子:
这是将最好的未来 。
(2)语义
机器所写的内容可能存在重复或者上下表达一致,也有出现多个文本内容的糅合,举个例子:
南澳 I 号 涉嫌 武装 走私 。 深圳 261 保障房 申请 户 造假 被 处 5000 元 罚款 。 广东 惠州 破获 操纵 未成年人 犯罪团伙 头目 判 死刑 。 广州 花都 原 区委书记 受贿 500 多 万元 受审 ( 图 ) 。
(3)语法
机器所写的内容有时候会出现少部分的病句,而且在标点符号上也有使用不规范的情况。
对以上的特点,在语序方面采取训练SRILM模型并计算单个句子的困惑度作为特征输入,以下就是具体的流程。
SRILM的主要目标是支持语言模型的估计和评测。估计是从训练数据(训练集)中得到一个模型,包括最大似然估计及相应的平滑算法;而评测则是从测试集中计算其困惑度。其最基础和最核心的模块是n-gram模块,这也是最早实现的模块,包括两个工 具:ngram-count和ngram,相应的被用来估计语言模型和计算语言模型的困惑度
c/c++ compiler,GNU make,GNU gawk,GNU gzip,Tcl
先提前安装好
(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
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 具体到每个词的概率