训练自定义的命名实体模型,然后失败了...

小白一枚,买了新书,想训练出自定义的命名实体识别模型;参照了第八章战斗机的例子,但是没出现我所期待的结果,请各位大佬指点一下;代码如下:

public class DemoPlane
{
    static String PLANE_CORPUS ="D:\\hanlp\\HanlpData\\data-for-1.7.4\\data\\test\\Per-D.txt";
    static String PLANE_MODEL = PLANE_CORPUS.replace("Per-D.txt", "model.bin");

    public static void main(String[] args) throws IOException
    {
        NERTrainer nerTrainer = new NERTrainer();

        nerTrainer.tagSet.nerLabels.clear();
        nerTrainer.tagSet.nerLabels.add("Pro"); 
        nerTrainer.tagSet.nerLabels.add("City");
        nerTrainer.tagSet.nerLabels.add("Dist");
        nerTrainer.tagSet.nerLabels.add("Cstre");
        nerTrainer.tagSet.nerLabels.add("Comm");
        nerTrainer.tagSet.nerLabels.add("Road");
        nerTrainer.tagSet.nerLabels.add("Biud");
        nerTrainer.tagSet.nerLabels.add("RoomNum");
        nerTrainer.tagSet.nerLabels.add("Other");
        PerceptronNERecognizer recognizer = new PerceptronNERecognizer(nerTrainer.train(PLANE_CORPUS, PLANE_MODEL).getModel());
        // 在NER预测前,需要一个分词器,最好训练自同源语料库
        LinearModel cwsModel = new CWSTrainer().train(PLANE_CORPUS, PLANE_MODEL.replace("model.bin", "cws.bin")).getModel();
        PerceptronSegmenter segmenter = new PerceptronSegmenter(cwsModel);
        PerceptronLexicalAnalyzer analyzer = new PerceptronLexicalAnalyzer(segmenter, new PerceptronPOSTagger(), recognizer);
        analyzer.enableTranslatedNameRecognize(false).enableCustomDictionary(false);
        
        System.out.println(analyzer.analyze("广东省深圳市南山区南头街道龙屋新村二十巷702房。"));
    }
}

部分标注数据如下:

广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 爱榕路/Road 143号/StreNum 兰园/Biud 10栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 金湾西二路/Road 2019号/StreNum 深圳湾出入境检验检疫局/Biud 2栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 海月路/Road 43号/StreNum 招商海月花园-一期/Biud 22栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 工业九路/Road 28号/StreNum 壹间/Biud 9栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 工业九路/Road 28号/StreNum 壹间/Biud 15栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 爱榕路/Road 62号/StreNum 榆桂小区/Biud 46栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 爱榕路/Road 143号/StreNum 兰园/Biud 1栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 爱榕路/Road 62号/StreNum 榆桂小区/Biud 23栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 爱榕路/Road 62号/StreNum 榆桂小区/Biud 28栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 后海大街/Road 招商服务大厦/Biud 2栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 爱榕路/Road 62号/StreNum 榆桂小区/Biud 9栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 爱榕路/Road 143号/StreNum 兰园/Biud 9栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 工业九路/Road 28号/StreNum 壹间/Biud 16栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 爱榕路/Road 62号/StreNum 榆桂小区/Biud 33栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 工业九路/Road 28号/StreNum 壹间/Biud 8栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 爱榕路/Road 62号/StreNum 榆桂小区/Biud 45栋/RoomNum
广东省/Pro 深圳市/City 南山区/Dist 招商街道/Cstre 工业九路/Road 28号/StreNum 壹间/Biud 18栋/RoomNum

代码运行后的结果如下:

广东省/ns 深圳市/ns 南山区/ns 南头街道/ns 龙屋新村二十巷/ns 702房。/m

分词效果是可以的,但是没有出现我自定义的命名实体标签;是哪个环节出现了问题呢?
另:语料数据1.4w条,总大小1.6mb,训练出的分词模型183kb,命名实体模型才8kb.
end

书里有讲过命名实体识别是针对复合词进行的,否则应该用中文分词和词性标注模块。

对于较短的命名实体,比如人名,完全可以通过分词确定边界,通过词性标注模块确定类别。

你的实体全部都是简单词(没有中括号),不应当使用这个模块。分词效果不错,你再在你的语料上训练一个词性标注模型就可以了。

感谢!我是先训练出词性标注模型再动手训练命名实体识别的,词性标注的效果还是比较可以的;词性标注训练数据42w,用普通的笔记本训练用时还不到5分钟,感觉这速度也比较快了.

请问,如果预料里的实际需求,既有简单词,又有复合词,该如何训练NER呢?

简单词用CWS+POS,复合词用NER,三者用LexicalAnalyzer组合起来。

现在可以输出预期结果了,就是分词效果有的不理想。
浙江省平湖市/county 当湖街道/street 新华南路/road 215号/roadNum