libshorttext 怎样linux构建ftp服务器linux环境

[转]机器学习算法库:liblinear/LibShortText - CSDN博客
[转]机器学习算法库:liblinear/LibShortText
SVM原理简介:最大间隔分类器SVM是一种二类分类模型,其求解目标在于确定一个分类的超平面,以最大化特征空间上的间隔。分类超平面的确定只取决于少数的样本信息,这些关键的样本被称之为支持向量Support Vector,这也是SVM—支持向量机名称的由来。首先我们举一个二维空间的小例子,并假设样本是线性可分的,这样我们就可以在二维空间里划一条直线(高维空间的超平面在二维空间表现为直线),完全分开所有的正负样本。那么引出一个问题,显然存在多条区分正负样本的直线(例如下图的实线和虚线),哪条是更好的选择?线性分类超平面从直观上我们希望正负样本分得越开越好,也就是正负样本之间的几何间隔越大越好。这是因为距离分类超平面越近的样本,分类的置信度越低(实际上几何间隔代表了分类器的误差上界)。SVM的优化目标,正是最大化最接近分类超平面的点到分类超平面的距离。我们把这个二维的分类超平面设为f(x)=wTx+b=0。把样本x代入f(x)中,如果得到的结果小于0,我们对该样本标一个-1的类别标签yi,大于0则标一个+1的yi。(约定为+1或-1只是为了下面的推导便利而已)。首先定义函数间隔(function margin):γ^=|wTx+b|=yi(wTx+b)注意前面乘上yi可以保证这个margin的非负性(因为f(x)&0对应yi=-1的那些样本)。如下图所示,对任意不在分类超平面上的点xi,我们可以依赖它到分类超平面的垂直投影x0,计算出它到分类超平面上的几何间隔(geometrical margin):γ~=|wTxi+b|||w||=yi(wTx+b)||w||=γ^||w||(||w||是向量w的范数,是对w长度的一种度量)。于是我们得到了函数间隔和几何间隔的数值关系。几何间隔假定所有样本到分类超平面的函数间隔最小值表示为γ^,我们可以把SVM的优化问题描述成以下表达式:maxγ~=γ^/||w||,s.t.yi(wTx+b)&=γ^,i=1,…,n由于γ^和||w||是线性关联的,而即便在超平面固定的情况下,||w||仍是可变化的(只要b随着||w||等比缩放,比如x1+x2+1=0和2x1+2x2+2=0其实是一个平面),那么γ^实际上不影响SVM优化问题的求解,为了简化问题,我们设γ^=1,从而把优化问题转化为:maxγ~=1/||w||,s.t.yi(wTx+b)&=1,i=1,…,n这个问题可以转化为一个等价的二次规划问题,也就是说它必然能得到一个全局的最优解。通过求解这个问题,我们可以得到了一个最大化几何间隔的分类超平面(如下图红线所示),另外两条线到红线的距离都等于1/||w||,而橘黄色的样本就是支持向量Support Vector。最优超平面和支持向量到此为止,通过最大化几何间隔,使得该分类器对样本分类时有了最大的置信度,准确的说,是对置信度最小的样本有了最大的置信度,这正是SVM的核心思想。文章来源:0、写在前面的话1.1、摘要1.2、分类问题综述1.3、贝叶斯分类的基础——贝叶斯定理1.4、朴素贝叶斯分类1.4.1、朴素贝叶斯分类的原理与流程1.4.2、估计类别下特征属性划分的条件概率及Laplace校准1.4.3、朴素贝叶斯分类实例:检测SNS社区中不真实账号1.5、分类器的评价文章来源:朴素贝叶斯分类器的应用生活中很多场合需要用到分类,比如新闻分类、病人分类等等。本文介绍(Naive Bayes classifier),它是一种简单有效的常用分类算法。一、病人分类的例子让我从一个例子开始讲起,你会看到贝叶斯分类器很好懂,一点都不难。某个医院早上收了六个门诊病人,如下表。  症状  职业   疾病  打喷嚏 护士   感冒&  打喷嚏 农夫   过敏&  头痛  建筑工人 脑震荡&  头痛  建筑工人 感冒&  打喷嚏 教师   感冒&  头痛  教师   脑震荡现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大?根据: P(A|B) = P(B|A) P(A) / P(B)可得   P(感冒|打喷嚏x建筑工人)&    = P(打喷嚏x建筑工人|感冒) x P(感冒)&    / P(打喷嚏x建筑工人)假定&打喷嚏&和&建筑工人&这两个特征是独立的,因此,上面的等式就变成了   P(感冒|打喷嚏x建筑工人)&    = P(打喷嚏|感冒) x P(建筑工人|感冒) x P(感冒)&    / P(打喷嚏) x P(建筑工人)这是可以计算的。  P(感冒|打喷嚏x建筑工人)&    = 0.66 x 0.33 x 0.5 / 0.5 x 0.33&    = 0.66因此,这个打喷嚏的建筑工人,有66%的概率是得了感冒。同理,可以计算这个病人患上过敏或脑震荡的概率。比较这几个概率,就可以知道他最可能得什么病。这就是贝叶斯分类器的基本方法:在统计资料的基础上,依据某些特征,计算各个类别的概率,从而实现分类。二、朴素贝叶斯分类器的公式假设某个体有n项特征(Feature),分别为F1、F2、...、Fn。现有m个类别(Category),分别为C1、C2、...、Cm。贝叶斯分类器就是计算出概率最大的那个分类,也就是求下面这个算式的最大值: P(C|F1F2...Fn)&  = P(F1F2...Fn|C)P(C) / P(F1F2...Fn)由于 P(F1F2...Fn) 对于所有的类别都是相同的,可以省略,问题就变成了求 P(F1F2...Fn|C)P(C)的最大值。朴素贝叶斯分类器则是更进一步,假设所有特征都彼此独立,因此 P(F1F2...Fn|C)P(C)&  = P(F1|C)P(F2|C) ... P(Fn|C)P(C)上式等号右边的每一项,都可以从统计资料中得到,由此就可以计算出每个类别对应的概率,从而找出最大概率的那个类。虽然&所有特征彼此独立&这个假设,在现实中不太可能成立,但是它可以大大简化计算,而且有研究表明对分类结果的准确性影响不大。下面再通过两个例子,来看如何使用朴素贝叶斯分类器。三、账号分类的例子本例摘自张洋的。根据某社区网站的抽样统计,该站10000个账号中有89%为真实账号(设为C0),11%为虚假账号(设为C1)。  C0 = 0.89  C1 = 0.11接下来,就要用统计资料判断一个账号的真实性。假定某一个账号有以下三个特征:    F1: 日志数量/注册天数&    F2: 好友数量/注册天数&    F3: 是否使用真实头像(真实头像为1,非真实头像为0)    F1 = 0.1&    F2 = 0.2&    F3 = 0请问该账号是真实账号还是虚假账号?方法是使用朴素贝叶斯分类器,计算下面这个计算式的值。    P(F1|C)P(F2|C)P(F3|C)P(C)虽然上面这些值可以从统计资料得到,但是这里有一个问题:F1和F2是连续变量,不适宜按照某个特定值计算概率。一个技巧是将连续值变为离散值,计算区间的概率。比如将F1分解成[0, 0.05]、(0.05, 0.2)、[0.2, +∞]三个区间,然后计算每个区间的概率。在我们这个例子中,F1等于0.1,落在第二个区间,所以计算的时候,就使用第二个区间的发生概率。根据统计资料,可得:  P(F1|C0) = 0.5, P(F1|C1) = 0.1&  P(F2|C0) = 0.7, P(F2|C1) = 0.2&  P(F3|C0) = 0.2, P(F3|C1) = 0.9因此,  P(F1|C0) P(F2|C0) P(F3|C0) P(C0)&    = 0.5 x 0.7 x 0.2 x 0.89&    = 0.0623  P(F1|C1) P(F2|C1) P(F3|C1) P(C1)&    = 0.1 x 0.2 x 0.9 x 0.11&    = 0.00198可以看到,虽然这个用户没有使用真实头像,但是他是真实账号的概率,比虚假账号高出30多倍,因此判断这个账号为真。四、性别分类的例子本例摘自,关于处理连续变量的另一种方法。下面是一组人类身体特征的统计资料。  性别  身高(英尺) 体重(磅)  脚掌(英寸)  男    6       180     12&  男    5.92     190     11&  男    5.58     170     12&  男    5.92     165     10&  女    5       100     6&  女    5.5      150     8&  女    5.42     130     7&  女    5.75     150     9已知某人身高6英尺、体重130磅,脚掌8英寸,请问该人是男是女?根据朴素贝叶斯分类器,计算下面这个式子的值。P(身高|性别) x P(体重|性别) x P(脚掌|性别) x P(性别)这里的困难在于,由于身高、体重、脚掌都是连续变量,不能采用离散变量的方法计算概率。而且由于样本太少,所以也无法分成区间计算。怎么办?这时,可以假设男性和女性的身高、体重、脚掌都是正态分布,通过样本计算出均值和方差,也就是得到正态分布的密度函数。有了密度函数,就可以把值代入,算出某一点的密度函数的值。比如,男性的身高是均值5.855、方差0.035的正态分布。所以,男性的身高为6英尺的概率的相对值等于1.5789(大于1并没有关系,因为这里是密度函数的值,只用来反映各个值的相对可能性)。有了这些数据以后,就可以计算性别的分类了。  P(身高=6|男) x P(体重=130|男) x P(脚掌=8|男) x P(男)&    = 6.1984 x e-9  P(身高=6|女) x P(体重=130|女) x P(脚掌=8|女) x P(女)&    = 5.3778 x e-4可以看到,女性的概率比男性要高出将近10000倍,所以判断该人为女性。(完)文章来源:&和都是国立台湾大学的博士开发的,Libsvm主要是用来进行非线性svm 分类器的生成,提出有一段时间了,而Liblinear则是去年才创建的,主要是应对large-scale的data classification,因为linear分类器的训练比非线性分类器的训练计算复杂度要低很多,时间也少很多,而且在large scale data上的性能和非线性的分类器性能相当,所以Liblinear是针对大数据而生的。&&&两者都是一个跨平台的通用工具库,支持windows/linux/mac os,代码本身是c++写的,同时也有matlab,python,java,c/c++扩展接口,方便不同语言环境使用,可以说是科研和企业人员的首选!像我这样在学校的一般用matlab/c++,而我同学在百度则主要用的是python/c++,所以只是各自侧重不一样,但所使用的核心还是其svm库。&&&以上Libsvm和Liblinear的主页上都有windows下的binary文件下载,zip,tar格式都有,解压后,找到matlab子文件目录,参看里面的readme文件,需要在matlab中进入此目录,运行make.m文件,matlab会根据本机默认的c/c++编译器将.c文件生成为.mexw32文件(由于我是32位操作系统,此处为mexw32,对于64位os,则对应为mexw64),提供matlab下能使用的接口。之后生成了这些.mexw32文件复制到你自己的matlab工程根目录中,就可以在matlab文件中调用libsvm/liblinear库中的函数了~&这位网友对libsvm在matlab中的使用说明的很详细,可以参考下。有关Liblinear和Libsvm各自的优势可以归纳如下:1.libsvm用来就解决通用典型的分类问题2.liblinear主要为大规模数据的线性模型设计&&it can be able to handle large-scaled dataset&可以用来处理大规模的数据it runs really faster than libsvm because it doesn't have to compute thekernel for any two points&由于采用线性核,所以不需要计算kernel value,速度更快trust region method for optimization looks new for machine learning people&&&以下为一位网友采用liblinear进行数据分类的实验性能说明“”今天试用了以下liblinear,速度很快(快到我没有想到),&我的实验数据:&训练集:21504 * 是样本的数量,21504是维度)&测试集:21504 * 2985&速度用秒来衡量,20次实验总共不到2分钟。&&同样的问题我用了libsvm实验速度上相差太大,libsvm实验5次,每次将近10分钟,时间是其次,发现一个问题就是,libsvm比liblinear的结果相差1个百分点,没有读liblinear的文章,不知道问题出在那个地方,libsvm我直接用的默认参数,线性模型。这样必然引起一个问题,如果我想评价线性模型和非线性模型的性能,我不可能一个用liblinear一个用libsvm,如果两个都用libsvm,报告的性能肯定有一些问题。&&所以如果你的问题维度很大(线性模型就有非常好的性能),不妨考虑liblinear.&“&大致看了一下libsvm和liblinear的说明文档,发现一个问题就是在线性问题上两者的目标函数就不一样,所以性能上的差异是正常的,应该说如果优化同一样的目标函数两者性能应该会差不多,但是速度很明显,liblinear快很多。&&对于什么时候用线性模型的问题,我想上面的我举的例子用linear classifier就比较好,非线性分类不一定比线性分类器好,尤其是在样本及其有限,同时特征维度很高的情况下,因为样本有限的情况下,kernel map通常不准确,很有可能错误地划分类别空间,可能造成比线性模型更差的结果。&&说到scale,我建议不要用libsvm里自带的scale,因为一旦使用这个工具,它就会把原来稀疏的数据,变成非稀疏的格式,这样不但会生成非常大的数据文件,而且liblinear对稀疏数据快速处理的优势就不能体现出来了。因此,要scale,就自己写一个,以保持原来稀疏的格式liblinear的好处就是速度快,尤其是对稀疏的特征。缺点就是太吃内存了。10G的数据量需要接近50G的内存,数据量再大就没法做了&。另外,还有一个经常提到的svm库SVM-per:&是康奈尔大学的人设计的。好像对计算机硬件的性能要求比liblinear要低...有做图像处理的人使用这个svm-per代替liblinear。另外,对于多分类问题以及核函数的选取,以下经验规则可以借鉴:&如果如果特征数远远大于样本数的情况下,使用线性核就可以了.如果特征数和样本数都很大,例如文档分类,一般使用线性核, LIBLINEAR比LIBSVM速度要快很多.如果特征数远小于样本数,这种情况一般使用RBF.但是如果一定要用线性核,则选择LIBLINEAR较好,而且使用-s 2选项。&对于多分类问题:对于15类场景来说,每类100幅训练图像,如果直接训练一个15类的multi-class classifier,则训练文件的Label值取1~15,wi标记不用指定(default 1)。如果对于每个类单独训练一个分类器,这样就把这个类的100幅图像作为正样本(假设Label=1),而其余所有的训练图像作为负样本(共1400幅,假设Label=-1),由此可以看出正负样本不平原文地址:liblinear&VS&libSVM对于LibSVM:何时使用线性核而非RBF核■ 样本数远小于特征数&&&例如生物学数据,70多个样本,7000多个特征■ 样本数和特征数都很大&&&例如文本分类,2万多样本,4万多特征■ 样本数远大于特征数&&&该情况作者并非推荐使用线性核,只是用来对比LibLinear和LibSVM的计算速度文章来源:&LibShortText简要入门是一个开源的Python短文本(包括标题、短信、问题、句子等)分类工具包。它在的基础上针对短文本进一步优化,主要特性有:支持多分类直接输入文本,无需做特征向量化的预处理二元分词(Bigram),不去停顿词,不做词性过滤基于线性核SVM分类器(参见),训练和测试的效率极高提供了完整的API,用于特征分析和Bad Case检验安装并在解压后的目录下make就OK了。注意:不支持Windows系统;Mac OS和Linux之间的库不通用性能对比关于LibShortText的性能,我们可以拿scikit-learn的朴素贝叶斯(参见)和SVM(也是基于LibLinear)就前文提到的网页标题分类问题进行横向对比:分类器准确率计算时间(秒)scikit-learn(nb)76.8%134scikit-learn(svm)76.9%121libshorttext79.6%49测试环境为低配版MBA2013显然LibShortText无论在准确率和效率上都要更胜一筹。API说明虽然LibShortText提供了训练和测试的类命令行操作方式,但直接从Python脚本调用更加灵活和强大,了解和训练、预测和分析相关的API是有帮助的。预处理Converter模块负责将文本转化为数值化的数据集(数据格式与LibSVM相同),由于内置的分词器仅支持英文,如果要用于中文短文本的分类,就必须替换分词器(如下代码所示)。分词器是一个将文本转化为单词列表的函数,值得注意的是:分词器不会和模型一起保存,当重载模型时也必须重载分词器。from libshorttext.libshorttext.converter import *
text_converter = Text2svmConverter()
text_converter.text_prep.tokenizer = comma_tokenizer
convert_text(train_file, text_converter, svm_file)
训练文本的格式如下:娱乐\t组图:刘亦菲短裙秀腿 浓妆变冷艳时髦女模型LibShortText提供两组参数供训练时使用:train_arguments实际上是LibLinear的训练参数,可设定松弛参数C等feature_arguments是特征的表现形式,如词数、词频、TF-IDF等预测获得模型后,我们可以预测新文本的类别,LibShortText提供了两个API:predict_text(text_file, model) — 针对以行分隔的测试文本predict_single_text(single_text, model) — 针对单条文本类别预测将返回一个PredictResult的对象,包含下列属性:predicted_y — 预测的类别(对单条文本预测时是字符串对象,对测试文本预测时是列表对象)decvals — 被预测文本对所有类别的决策变量,与文本到分类超平面的距离有关。它是一个列表而非字典对象,如果你希望和类别关联起来,可借助model的get_labels():decvals = zip(model.get_labels(), predict_result.decvals)
true_y — 真实的类别(仅对测试文本预测时存在)get_accuracy() — 获得测试的准确率(仅对测试文本预测时存在)分析analyzer的作用是分析LibShortText的预测结果,通过它我们可以了解哪些特征更为关键、哪些类别容易被混淆。比如分析一条体育新闻的标题:analyzer = Analyzer(model)
analyzer.analyze_single('国青错失绝杀0-0韩国 下轮平越南就出线')
终端输出如下:&sportsnewsgamefoodporn……&&&&&国 青4.600e-01-1.349e-01-4.283e-030.000e+000.000e+00……&&&&&decval1.192e+003.396e-013.132e-012.196e-011.910e-01可见「国」和「青」一起促成最关键的sports类特征。又比如,选择被误分的样本,调用gen_confusion_table()输出sports、star和movie的混淆表格,以了解哪些类别的特征界限比较模糊。analyzer = Analyzer(model)
insts = InstanceSet(predict_result).select(wrong, with_labels(['sports', 'movie', 'star']))
analyzer.gen_confusion_table(insts)
终端输出如下(第一行表示预测类别,第一列表示真实类别):&starmoviesportsstar0195movie2101sports1540完整demo请见。文章来源:&
本文已收录于以下专栏:
相关文章推荐
训练模型读取语料和词典进行训练Scanner getCorpus = new Scanner(new BufferedInputStream(new FileInputStream(new File(...
本文主要基于liblinear-1.93版本的README文件。里面介绍了liblinear的详细使用方法。更多信息请参考:
       http://www.csie.ntu.edu.tw/...
封装Libsvm与Liblinear
开篇我们基于以下场景:
       假设我们已经用libsvm或者是Liblinear训练了一个模型,现在需要读入该模型并基于该模型对一个样本进...
LibLinear(SVM包)使用说明之(一)http://blog.csdn.net/zouxy09  本文主要是翻译liblinear-1.93版本的REA...
在我之前写的word2vec的大概流程中,第一步的分词使用jieba来实现,感觉效果还不错。第二步. 统计词频统计词频,相对来讲比较简单一些,主要在Python自带的Counter类基础上稍作改进。值...
在相关推荐项目的改版中,对liblinear/fm/xgboost等主流成熟算法模型的训练效果进行了尝试和对比,并在一期改造中选择了liblinear实际上线使用。本文主要从工程应用的角度对libli...
word2vec 是 Google 于 2013 年开源推出的一个用于获取词向量(word vector)的工具包,它简单、高效,因此引起了很多人的关注。我在看了@peghoty所写的《word2ve...
这一部分将解释Huffman树的构造方法,并说明了如何根据Huffman树来产生对应的二进制编码。这部分的代码放在HuffmanTree.py中Huffman树的构造Huffman树的构造方法与Huf...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)LibShortText简要入门 - 推酷
LibShortText简要入门
是一个开源的Python短文本(包括标题、短信、问题、句子等)分类工具包。它在
的基础上针对短文本进一步优化,主要特性有:
- 支持多分类
- 直接输入文本,无需做特征向量化的预处理
- 二元分词(Bigram),不去停顿词,不做词性过滤
- 基于线性核SVM分类器(参见
),训练和测试的效率极高
- 提供了完整的API,用于特征分析和Bad Case检验
并在解压后的目录下make就OK了。
注意:不支持Windows系统;Mac OS和Linux之间的库不通用
关于LibShortText的性能,我们可以拿scikit-learn的朴素贝叶斯(参见
)和SVM(也是基于LibLinear)就前文提到的网页标题分类问题进行横向对比:
计算时间(秒)
scikit-learn(nb)
scikit-learn(svm)
libshorttext
测试环境为低配版MBA2013
显然LibShortText无论在准确率和效率上都要更胜一筹。
虽然LibShortText提供了训练和测试的类命令行操作方式,但直接从Python脚本调用更加灵活和强大,了解和训练、预测和分析相关的API是有帮助的。
Converter模块负责将文本转化为数值化的数据集(数据格式与LibSVM相同),由于内置的分词器仅支持英文,如果要用于中文短文本的分类,就必须替换分词器(如下代码所示)。分词器是一个将文本转化为单词列表的函数,值得注意的是:
分词器不会和模型一起保存,当重载模型时也必须重载分词器。
pythonfrom libshorttext.libshorttext.converter import *
text_converter = Text2svmConverter()
text_converter.text_prep.tokenizer = comma_tokenizer
convert_text(train_file, text_converter, svm_file)
训练文本的格式如下:
娱乐\t组图:刘亦菲短裙秀腿 浓妆变冷艳时髦女
LibShortText提供两组参数供训练时使用:
- train_arguments实际上是LibLinear的训练参数,可设定松弛参数C等
- feature_arguments是特征的表现形式,如词数、词频、TF-IDF等
获得模型后,我们可以预测新文本的类别,LibShortText提供了两个API:
predict_text(text_file, model) -- 针对以行分隔的测试文本
predict_single_text(single_text, model) -- 针对单条文本
类别预测将返回一个PredictResult的对象,包含下列属性:
predicted_y -- 预测的类别(
对单条文本预测时是字符串对象,对测试文本预测时是列表对象
decvals -- 被预测文本对所有类别的决策变量,与文本到分类超平面的距离有关。
它是一个列表而非字典对象
,如果你希望和类别关联起来,可借助model的get_labels():
pythondecvals = zip(model.get_labels(), predict_result.decvals)
true_y -- 真实的类别(
仅对测试文本预测时存在
get_accuracy() -- 获得测试的准确率(
仅对测试文本预测时存在
analyzer的作用是分析LibShortText的预测结果,通过它我们可以了解哪些特征更为关键、哪些类别容易被混淆。比如分析一条体育新闻的标题:
pythonanalyzer = Analyzer(model)
analyzer.analyze_single('国青错失绝杀0-0韩国 下轮平越南就出线')
终端输出如下:
-1.349e-01
-4.283e-03
可见「国」和「青」一起促成最关键的sports类特征。又比如,选择被误分的样本,调用gen_confusion_table()输出sports、star和movie的混淆表格,以了解哪些类别的特征界限比较模糊。
pythonanalyzer = Analyzer(model)
insts = InstanceSet(predict_result).select(wrong, with_labels(['sports', 'movie', 'star']))
analyzer.gen_confusion_table(insts)
终端输出如下(
第一行表示预测类别,第一列表示真实类别
完整demo请见
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致(window.slotbydup=window.slotbydup || []).push({
id: '3284507',
container: s,
size: '0,0',
display: 'inlay-fix'
LibShortText简要入门
LibShortText是一个开源的Python短文本(包括标题、短信、问题、句子等)分类工具包。它在LibLinear的基础上针对短文本进一步优化,主要特性有:
支持多分类
直接输入文本,无需做特征向量化的预处理
二元分词(Bigram),不去停顿词,不做词性过滤
基于线性核SVM分类器(参见SVM原理简介:最大间隔分类器),训练和测试的效率极高
提供了完整的API,用于特征分析和Bad Case检验
下载并在解压后的目录下make就OK了。
注意:不支持Windows系统;Mac OS和Linux之间的库不通用
关于LibShortText的性能,我们可以拿scikit-learn的朴素贝叶斯(参见用scikit-learn实现朴素贝叶斯分类器)和SVM(也是基于LibLinear)就前文提到的网页标题分类问题进行横向对比:
计算时间(秒)
scikit-learn(nb)
scikit-learn(svm)
libshorttext
测试环境为低配版MBA2013
显然LibShortText无论在准确率和效率上都要更胜一筹。
虽然LibShortText提供了训练和测试的类命令行操作方式,但直接从Python脚本调用更加灵活和强大,了解和训练、预测和分析相关的API是有帮助的。
Converter模块负责将文本转化为数值化的数据集(数据格式与LibSVM相同),由于内置的分词器仅支持英文,如果要用于中文短文本的分类,就必须替换分词器(如下代码所示)。分词器是一个将文本转化为单词列表的函数,值得注意的是:分词器不会和模型一起保存,当重载模型时也必须重载分词器。
from libshorttext.libshorttext.converter import *&text_converter = Text2svmConverter()text_converter.text_prep.tokenizer = comma_tokenizerconvert_text(train_file, text_converter, svm_file)
训练文本的格式如下:
娱乐\t组图:刘亦菲短裙秀腿 浓妆变冷艳时髦女
LibShortText提供两组参数供训练时使用:
train_arguments实际上是LibLinear的训练参数,可设定松弛参数C等
feature_arguments是特征的表现形式,如词数、词频、TF-IDF等
获得模型后,我们可以预测新文本的类别,LibShortText提供了两个API:
predict_text(text_file, model) & 针对以行分隔的测试文本
predict_single_text(single_text, model) & 针对单条文本
类别预测将返回一个PredictResult的对象,包含下列属性:
predicted_y & 预测的类别(对单条文本预测时是字符串对象,对测试文本预测时是列表对象)
decvals & 被预测文本对所有类别的决策变量,与文本到分类超平面的距离有关。它是一个列表而非字典对象,如果你希望和类别关联起来,可借助model的get_labels():
decvals = zip(model.get_labels(), predict_result.decvals)
true_y & 真实的类别(仅对测试文本预测时存在)
get_accuracy() & 获得测试的准确率(仅对测试文本预测时存在)
analyzer的作用是分析LibShortText的预测结果,通过它我们可以了解哪些特征更为关键、哪些类别容易被混淆。
比如分析一条体育新闻的标题:
analyzer = Analyzer(model)analyzer.analyze_single('国青错失绝杀0-0韩国 下轮平越南就出线')
终端输出如下:
-1.349e-01
-4.283e-03
可见「国」和「青」一起促成最关键的sports类特征。
又比如,选择被误分的样本,调用gen_confusion_table()输出sports、star和movie的混淆表格,以了解哪些类别的特征界限比较模糊。
analyzer = Analyzer(model)insts = InstanceSet(predict_result).select(wrong, with_labels(['sports', 'movie', 'star']))analyzer.gen_confusion_table(insts)
终端输出如下(第一行表示预测类别,第一列表示真实类别):
完整demo请见lst_classifier.py。
标签(Tag):
------分隔线----------------------------
------分隔线----------------------------

我要回帖

更多关于 linux内核构建系统 的文章

 

随机推荐