千家论坛_弱电智能化技术与工程讨论(建筑智能,家居智能,人工智能)

人工智能
收藏本版 (4) |订阅

人工智能 今日: 2828 |主题: 1070|排名: 24 

发新帖

基于结构化感知机的词性标注与命名实体识别框架...

[复制链接]
hadoop小学生 发布于: 2019-4-8 14:55 53 次浏览 1 位用户参与讨论
跳转到指定楼层

上周就关于《结构化感知机标注框架的内容》已经分享了一篇《分词工具Hanlp基于感知机的中文分词框架》,本篇接上一篇内容,继续分享词性标注与命名实体识别框架的内容。

词性标注
训练
词性标注是分词后紧接着的一个任务,训练语料同上,接口如下:
命令行
java -cp hanlp.jar com.hankcs.hanlp.model.perceptron.Main -task POS -train -reference data/test/pku98/199801.txt -model data/test/perceptron/pos.bin
API
public void testTrain() throws Exception
{
    PerceptronTrainer trainer = new POSTrainer();
    trainer.train("data/test/pku98/199801.txt", Config.POS_MODEL_FILE);
}
测试
词性标注器接受的输入不再是纯文本,而是分词后的单词数组或列表:
public void testLoad() throws Exception
{
    PerceptronPOSTagger tagger = new PerceptronPOSTagger(Config.POS_MODEL_FILE);
    System.out.println(Arrays.toString(tagger.tag("中国 交响乐团 谭利华 在 布达拉宫 广场 演出".split(" "))));
}
正常情况下输出每个单词的词性:
[ns, n, nr, p, ns, n, v]
关于如何组合分词器和词性标注器,使其同时进行分词与词性标注,请参考接下来的章节。
命名实体识别
目前本系统默认支持人名(nr),地名(ns),机构名(nt)三种命名实体的识别,用户可以重载NERTrainer的createTagSet来支持任意NER类型。
训练
命名实体识别是词性标注的后续任务,训练语料依然同上,接口如下:
命令行
java -cp hanlp.jar com.hankcs.hanlp.model.perceptron.Main -task NER -train -reference data/test/pku98/199801.txt -model data/test/perceptron/ner.bin
API
public void testTrain() throws Exception
{
    PerceptronTrainer trainer = new NERTrainer();
    trainer.train("data/test/pku98/199801.txt", Config.NER_MODEL_FILE);
}
自定义NER类型
重载NERTrainer的createTagSet来支持自己的NER类型。当然,用户提供的语料必须满足2014人民日报格式。
        PerceptronTrainer trainer = new NERTrainer()
        {
            @Override
            protected TagSet createTagSet()
            {
                NERTagSet tagSet = new NERTagSet();
                tagSet.nerLabels.add("YourNER1");
                tagSet.nerLabels.add("YourNER2");
                tagSet.nerLabels.add("YourNER3");
                return tagSet;
            }
        };
测试
命名实体识别器的输入不再是纯文本,而是分词结果与词性标注结果:
public void testTag() throws Exception
{
    PerceptionNERecognizer recognizer = new PerceptionNERecognizer(Config.NER_MODEL_FILE);
    System.out.println(Arrays.toString(recognizer.recognize("吴忠市 乳制品 公司 谭利华 来到 布达拉宫 广场".split(" "), "ns n n nr p ns n".split(" "))));
}
正常情况下输出:
[B-nt, M-nt, E-nt, S, O, S, O]
7个标签代表上述7个词语所属的命名实体成分。

回复

使用道具 举报

已有1人评论

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆 千家通行证登陆

本版积分规则

千家智客微信号
千家智客微信
玩物说商城
玩物说商城