SVM+LTP进行问题分类

SVM三特征

词袋特征(BOW): 忽略其词序和语法、句法,而将其仅仅看作是一个词集合,在这个集合中每个词的出现都是独立的,不依赖于其他词是否出现。

    def analyze(self, text) :
        # 分词
        words = self.segmentor.segment(text)
        print('\t'.join(words))

例如,对于用户的提问:“国际交流英语考试的中文简称是什么?”,经过分词和词性标注以后,只取词袋特征则得到如下形式: {国际,交流,英语,考试,的,中文,简称,是,什么,?

词性特征(POS): 属于词的语法范畴,利用LTP分词和词性标注工具可以方便地将中文问题句子切分成词序列并为每个词标注上词性。
下表给出LTP平台所采用的词性标注体系

词性标记含义词性标记含义
a形容词ni机构名
b区别词nl处所名词
c连词ns地名
d副词nt时间词
e叹词nz其他专名
g语素字o拟声词
h前接成分p介词
i习用语q量词
j简称r代词
k后接成分u助词
m数词v动词
n普通名词wp标点符号
nd方位名词ws字符串
nh人名x非语素字

例如,对于用户的提问:“中国哪一条河流经过的省份最多?”,经过分词和词性标注以后,则得到如下形式: 中国 哪 一 条 河流 经过 的 省份 最 多 ? ns r m q n p u n d a wp 该问句的POS特征为{ns,r,m,q,n,p,u,n,d,a,wp}

    def postags(self, words) :
        # 词性标注
        postags = self.postagger.postag(words)
        # print('\t'.join(postags))
        return list(postags)
        # return '\t'.join(postags)

依存关系(DR): 依存文法认为句子中述语动词是支配其它成分的中心,而它本身却不受其它任何成分的支配,所有的受支配成分都以某种依存关系从属于其支配者。下表给出LTP平台所采用的依存句法标注体系

依存关系标记含义依存关系标记含义
ATT定中关系DE“的”字结构
QUN数量关系DI“地”字结构
COO并列关系DEI“得”字结构
APP同位关系BA“把”字结构
LAD前附加关系BEI“被”字结构
RAD后附加关系ADV状中结构
SIM比拟关系VOB动宾关系
MT语态结构SBV主谓关系
IS独立结构VV连动关系
CMP动补结构CNJ关联结构
POB介宾关系IC独立分句
HED核心DC依存分句
NOT无法确定的关系

例如,利用平台对上面例句进行依存分析的结果如下: 在这里插入图片描述所得的依存关系特征集合为: {ATT,SBV,RAD,HED,WP}

    def parse(self, words, postags) :
        # 句法分析
        arcs = self.parser.parse(words, postags)
        # print("\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs))
        # print("\t".join(arc.relation for arc in arcs))
        return "\t".join(arc.relation for arc in arcs)

特征编码

将经过分词后的问题中的特征表示成分类器可以接受的数据形式。

首先将分词后所得到的所有词进行排列并剔除重复词组成待用词库。
本文是基于LibSVM分类器进行中文问题分类的,所接受的特征向量格式为:
在这里插入图片描述这里的label为问题类别序号,index为特征项的编号,value为特征项的对应取值。
实际构建特征向量时,首先根据某个特征的所有取值构造对应该特征的一个特征词典,该词典中每一行对应一个特征项及其取值,行号表示该特征项的编号,对于特征项的取值采用布尔编码的方式,即该特征项出现则为1,否则为0。
例如,对于词袋特征,通过扫描它在对应特征词典中的位置作为其在特征向量中的index并将其值赋为1,就可以将一个问题转化为一个特征向量的形式。
对于多个特征的编码,每个特征的特征项的取值方式完全相同,即均为布尔编码,但在对每个特征的特征项进行标号时要使得第二个特征的第一个特征项的编号要紧接着第一个特征的最后一个特征项的编号依次进行,第三个特征的第一个特征项的编号要紧接着第二个特征的最后一个特征项的编号依次进行,以此类推。
例如,若词的特征词典有m个特征项,词性的特征词典有n个特征项,则第一个特征(词袋特征)的每个特征项的编号依次为1...m,而第二个特征(词性特征)的每个特征项的编号依次为m+1,...m+n。
例如,对于问题“"ACLU"的全称是什么?”,在仅考虑词袋特征的情况下,其编码形式如下:1 1548:1 1926:1 2189:1 2247:1 3130:1 5430:1
这里的第一个“1”是该问题对应的类别标签,后面的每一个以“:”连接的成分分别表示该问题所对应的每个特征项编号及其特征值。

具体实现

提取特征之后可进行训练: svm_read_problem() : 读取数据 svm_problem(y, x):返回一个problem类,作用等同于记录y,x列表 svm_parameter(‘training_options’):返回一个parameter类,作用是记录参数选 svm_train() : 训练SVM模型

y, x = svm_read_problem('trainFeature.txt')
yt, xt = svm_read_problem('testFeature.txt')
prob = svm_problem(y, x)
param = svm_parameter('-t 2 -c 128 -g 0.0078125') 
model = svm_train(prob, param)

使用LibSVM软件包时,其中对于选取参数C和gamma,不同的选取会有不同的结果。因此需要通过一定的方法来选取参数使得分类的最终结果最好。LibSVM的作者推荐使用一种称为grid的搜索方法来搜寻这样一组参数。通过其自带的脚本grid.py对参数C和gamma进行了参数优选。而后将优选出的参数输入到LibSVM软件包中进行交叉验证。如下图所示,这里给出细分类的调参结果:c=2048,g=0.001953125,交叉验证的准确率为74.56%
在这里插入图片描述
使用训练好的模型进行测试,并检验预测效果

p_labs, p_acc, p_vals = svm_predict(yt, xt, model)
ACC, MSE, SCC = evaluations(yt, p_labs)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值