LibShortText
LibShortText是一个开源的Python短文本(包括标题、短信、问题、句子等)分类工具包。它在LibLinear的基础上针对短文本进一步优化,主要特性有:
- 支持多分类
- 直接输入文本,无需做特征向量化的预处理
- 二元分词(Bigram),不去停顿词,不做词性过滤
- 基于线性核SVM分类器,训练和测试的效率极高
- 提供了完整的API,用于特征分析和BadCase检验
LibShortText的安装
注意,LibShortText不支持pip方式安装,需要下载并在解压后的目录下make进行编译安装。(注意:不支持Windows系统)
LibShortText性能对比
关于LibShortText的性能,我们可以拿scikit-learn的朴素贝叶斯和SVM(也是基于LibLinear)就前文提到的网页标题分类问题进行横向对比:
分类器 | 准确率 | 计算时间(秒) |
scikit-learn(nb) | 76.8% | 134 |
scikit-learn(svm) | 76.9% | 121 |
libshorttext | 79.6% | 49 |
显然LibShortText无论在准确率和效率上都要更胜一筹。
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韩国下轮平越南就出线')
终端输出如下:
sports | news | game | food | porn | |
…… | |||||
国青 | 4.600e-01 | -1.349e-01 | -4.283e-03 | 0.000e+00 | 0.000e+00 |
…… | |||||
decval | 1.192e+00 | 3.396e-01 | 3.132e-01 | 2.196e-01 | 1.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)
终端输出如下(第一行表示预测类别,第一列表示真实类别):
star | movie | sports | |
star | 0 | 19 | 5 |
movie | 21 | 0 | 1 |
sports | 15 | 4 | 0 |
参考链接:LibShortText简要入门
TextGrocery
TextGrocery是一个基于LibLinear和结巴分词的短文本分类工具,特点是高效易用,同时支持中文和英文语料。TextGrocery主要参考了LibShortText。LibShortText不仅提供了足够简单的API,而且背后的原理也有扎实的实验数据支撑(不过滤停用词,不过滤词性,使用线性核),同时面向解决如下LibShortText问题:
- 默认不支持中文分词
- 如果不是专业的算法人员,默认参数永远是最好的选择,所以参数的自定义并不是很必要
- 中间数据的保存全部以文件格式,每次的训练和测试留下一些陌生文件
- 代码很不Pythonic,也不支持Pypi的简便安装方式
TextGrocery希望把LibShortText变得更友好一些:
- 引入结巴分词作为内置的默认分词器
- 精简LibShortText的代码,去掉Analyzer和参数自定义模块,修复bug,改善PEP8
- 训练和测试的文本都支持列表传入
- 提供Pypi的安装方式
TextGrocery的安装
pip install tgrocery
备注:不支持Windows,不支持Python3。
TextGrocery的使用
>>> from tgrocery import Grocery # 新开张一个杂货铺,别忘了取名! >>> grocery = Grocery('sample') # 训练文本可以用列表传入 >>> train_src = [ ('education','名师指导托福语法技巧:名词的复数形式'), ('education','中国高考成绩海外认可是"狼来了"吗?'), ('sports','图文:法网孟菲尔斯苦战进16强孟菲尔斯怒吼'), ('sports','四川丹棱举行全国长距登山挑战赛近万人参与') ] >>> grocery.train(train_src) # 也可以用文件传入 >>> grocery.train('train_ch.txt') # 保存模型 >>> grocery.save() # 加载模型(名字和保存的一样) >>> new_grocery = Grocery('sample') >>> new_grocery.load() # 预测 >>> new_grocery.predict('考生必读:新托福写作考试评分标准') education # 测试 >>> test_src = [ ('education','福建春季公务员考试报名18日截止2月6日考试'), ('sports','意甲首轮补赛交战记录:米兰客场8战不败国米10年连胜'), ] >>> new_grocery.test(test_src) # 准确率 0.5 # 同样可以用文本传入 >>> new_grocery.test('test_ch.txt') # 自定义分词器 >>> custom_grocery = Grocery('custom', custom_tokenize=list)
参考链接: