tgrocery
本文会介绍几个短文本分类工具,主要做问答意图解析的场景下对意图进行解析。
TextGrocery是一个基于LibLinear和结巴分词的短文本分类工具,特点是高效易用,同时支持中文和英文语料。
>>> from tgrocery import Grocery
>>> grocery = Grocery('sample')
# 训练文本可以用列表传入
>>> train_src = [
('education', '名师指导托福语法技巧:名词的复数形式'),
('education', '中国高考成绩海外认可 是“狼来了”吗?'),
('sports', '图文:法网孟菲尔斯苦战进16强 孟菲尔斯怒吼'),
('sports', '四川丹棱举行全国长距登山挑战赛 近万人参与')
]
>>> grocery.train(train_src)
# 也可以用文件传入(默认以tab为分隔符,也支持自定义)
>>> 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)
LibShortText
LibShortText是一个开源的Python短文本(包括标题、短信、问题、句子等)分类工具包。它在LibLinear的基础上针对短文本进一步优化,主要特性有:
支持多分类
直接输入文本,无需做特征向量化的预处理
二元分词(Bigram),不去停顿词,不做词性过滤
基于线性核SVM分类器(参见SVM原理简介:最大间隔分类器),训练和测试的效率极高
提供了完整的API,用于特征分析和Bad Case检验
预处理
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)
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韩国 下轮平越南就出线')
小结
后面还有更加高端的工具,fasttext这类工具也十分好用,需要留给您探索。