请教自定义领域命名实体识别(书本第8章)的问题。

问题描述:您好!我这段时间仿照战斗机的例子,想训练出输电领域命名实体识别的模型。在此之前,我先加了一个自定义词典(大概800行,词性/npow)。然后根据感知机模型(系统自带的)进行分词及词性标注,将一个生语料分词得到一个分词后txt文件,然后用中括号标出边界和词性,
(如:为了/p 在/p [交流110kV/npow 〜/v 750kV/npow]/nelec [架空输电线路/npow 的/u 设计/vn]/nelec 中/f 贯彻/v 国家/n 的/u 基本建设/l 方针/n 和/c 技术/n 经济/n 政策/n ,/w 做到/v 安全可靠/i 、/w 先进/a 适用/a 、/w 经济/n 合理/a 、/w 资源/n 节约/v 、/w 环境友好/nz ,/w 制定/v 本/r 规范/n 。)
最后得到一个熟语料tran.txt(比较小81KB,而你的战斗机的tran.txt有1179KB)。
然后运行训练程序,


运行结果如下:

结果并没有出现我想要识别的/nelec:为了/p 在/p [交流110kV/npow 〜/v 750kV/npow]/nelec [架空输电线路/npow 的/u 设计/vn]/nelec 中/f 贯彻/v 国家/n 的/u 基本建设/l 方针/n…

我想得到一点建议。
我出现这个无法识别的问题,我有几个猜测:是不是语料的量级太小?是不是需要在NER预测前,需要训练一个分词器,最好训练自同源语料库?是不是我的自定义词典会有影响?
最后我想问一下DS_STORE文件可以通用吗,我加了该文件,战斗机的例子就能识别新的战斗机型号,去掉了战斗机例子中的.DS_Store文件就无法正确识别新型号。


先谢谢大佬抽空看完了。。。

1 Like
  1. pku pos tagger标注出来的词性就是pku标注集,不是你定义的词性。
  2. 感知机的特征模板词性占了快一半。
  3. .DS_Store是mac的系统文件,跟问题无关。你可以删了pyhanlp/static/data/test/plane-re重试一遍。
  4. 感知机是随机算法,不保证一定对某个样本怎么怎么样。
1 Like

谢谢您!您的第四条建议随机性给了我启发。
我刚调试了一下程序,将train.txt内容重复20倍,变1500KB,训练了一下,能识别几种模式,
[npow-w-npow-wpow-npow n]及[npow-w-n-w-npow-w-n]两种
运行结果如下:

其实最后我想请教一下,训练出来的cws.bin和model.bin是不是加到 pyhanlp/static/data/model/perceptron文件中就OK了。

放到任何可访问的路径都可以。

您好!谢谢您的指导。
我发现我生成的 model.bin 只有放到 pyhanlp/static/data/model/perceptron/pku1998 中,并改名为 ner.bin 才能执行,而非任何路径。这样会导致我需要删除原来系统自带的 ner.bin 文件。
我的测试结果如下:
1.当我将 ner.bin 文件改名为 ner88.bin 或删除 ner.bin 时。结果报错
image


说明 PerceptronNERecognizer 类只会加载pyhanlp/static/data/model/perceptron/pku1998/ner.bin 的感知机命名实体识别模型

2.当我将原来系统自带的98年 ner.bin 删掉,并将我上次生成的 model.bin 放到 pyhanlp/static/data/model/perceptron/pku1998 文件夹中并改名为 ner.bin 时。运行结果如下
image


结果是能识别我训练出来的实体的,说明刚加入的模型能正常运行。

现在我想请教一下,我现在如果要加载自己训练出来的模型,就需要将 data/model/perceptron/pku1998/ner.bin 中的 ner.bin 删除,然后将我的模型改为 ner.bin 并放入其中。说明程序无法加载两个模型的,怎么才能让系统即加载其自带的 ner.bin 模型,还能加载 我训练出来的 ner.bin 模型。

我用的 pyhanlp 版本是0.1.60 ;
程序报错是:jpype._jclass.IOException: java.io.IOException: D:/Python36/lib/site-packages/pyhanlp/static/data/model/perceptron/pku1998/ner.bin 加载失败

第一个参数就是模型路径: