Java 针对多种类型的Opennlp名称实体培训

Java 针对多种类型的Opennlp名称实体培训,java,nlp,opennlp,Java,Nlp,Opennlp,我有一个类似“有多少名员工的指定代码123和工资10000或更多”的问题 我已经训练了NameFinderME来处理这些数据 NameFinderME.train("en", "desigcd", SampleStream, modelParams, desigNameFinderFactory); //Training twice for different types of data NameFinderME.train("en", "salary", SampleStream, model

我有一个类似“有多少名员工的指定代码
123
和工资
10000
或更多”的问题

我已经训练了
NameFinderME
来处理这些数据

NameFinderME.train("en", "desigcd", SampleStream, modelParams, desigNameFinderFactory);
//Training twice for different types of data
NameFinderME.train("en", "salary", SampleStream, modelParams, desigNameFinderFactory);

Span desigNumSpans[] = desigFinder.find(strInput.split(" "));
            for(Span span : desigNumSpans)
            {
                //span.gets//
                System.out.println(span);
                System.out.println("Type="+span.getType());
                System.out.println(strInput.split(" ")[span.getStart()]);
            }
这将打印以下输出。 [3..4)设计 类型=设计 123 [8..9)设计 类型=设计 一万


为什么它采用相同的类型(desigcd)两次?这不是错了吗?第二次打印时它不应该为空吗?因为句子10000是sal?

关键是标记“sal”和“desigcd”都是数字。所以尝试提供一个区分两者的功能。

找到了一个解决方案,在培训中,将类型设置为空,比如NameFinderME.train(“en”)“、null、sampleStream、modelParams、desigNameFinderFactory)…我还没有机会理解为什么会是这样。理想情况下,如果我给出类型名,我希望查找只选择与类型名匹配的标记。RKK正确。我假设
train()中的
类型
函数仅在培训语料库中,注释中未明确指定类型时才有用。作为旁注,如果您的值始终采用该格式(即工资可能为5、6、7等位数,指定代码位数较少),并且没有(t太多)重叠,使用基于正则表达式的方法可以获得更高的精度。请参见此处的示例。