结构化感知机标注框架是一套利用感知机作序列标注任务,而且应用到中文分词、词性标注与命名实体识别这三个问题的完整在线学习框架,该框架利用1个算法解决3个问题,时自治赞成的系统,同时三个任务顺序渐进,构成流水线式的系统。本文先介绍中文分词框架部份内容。java
中文分词算法
训练多线程
只需指定输入语料的路径(单文档时为文件路径,多文档时为文件夹路径,灵活处理),以及模型保存位置便可:框架
命令行性能
java -cp hanlp.jar com.hankcs.hanlp.model.perceptron.Main -task CWS -train -reference data/test/pku98/199801.txt -model data/test/perceptron/cws.bin学习
API测试
public void testTrain() throws Exceptionlua
{ spa
PerceptronTrainer trainer = new CWSTrainer();.net
PerceptronTrainer.Result result = trainer.train(
"data/test/pku98/199801.txt",
Config.CWS_MODEL_FILE
);
// System.out.printf("准确率F1:%.2f\n", result.prf[2]);
}
事实上,视语料与任务的不一样,迭代数、压缩比和线程数均可以自由调整,以保证最佳结果:
/**
* 训练
*
* @param trainingFile 训练集
* @param developFile 开发集
* @param modelFile 模型保存路径
* @param compressRatio 压缩比
* @param maxIteration 最大迭代次数
* @param threadNum 线程数
* @return 一个包含模型和精度的结构
* @throws IOException
*/
public Result train(String trainingFile, String developFile,
String modelFile, final double compressRatio,
final int maxIteration, final int threadNum) throws IOException
单线程时使用AveragedPerceptron算法,收敛较好;多线程时使用StructuredPerceptron,波动较大。关于两种算法的精度比较,请参考下一小节。目前默认多线程,线程数为系统CPU核心数。请根据本身的需求平衡精度和速度。
准确率
在sighan2005的msr数据集上的性能评估结果以下:
/**
* 性能测试
*
* @param corpora 数据集
* @return 默认返回accuracy,有些子类可能返回P,R,F1
* @throws IOException
*/
public double[] evaluate(String corpora) throws IOException
速度
目前感知机分词是全部“由字构词”的分词器实现中最快的,比本身写的CRF解码快1倍。新版CRF词法分析器框架复用了感知机的维特比解码算法,因此速度持平。
测试
测试时只需提供分词模型的路径便可:
public void testCWS() throws Exception
{
PerceptronSegmenter segmenter = new PerceptronSegmenter(Config.CWS_MODEL_FILE);
System.out.println(segmenter.segment("商品和服务"));
}
正常状况下对商品和服务的分词结果为[商品, 和, 服务]。建议在任何语料上训练时都试一试这个简单的句子,看成HelloWorld来测试。若这个例子都错了,则说明语料格式、规模或API调用上存在问题,须仔细排查,而不要急着部署上线。
另外,数据包中已经打包了在人民日报语料1998年1月份上训练的模型,不传路径时将默认加载配置文件中指定的模型。
在本系统中,分词器PerceptronSegmenter的职能更加单一,仅仅负责分词,再也不负责词性标注或命名实体识别。这是一次接口设计上的新尝试,将来可能在v2.0中大规模采用这种思路去重构。