我是openNlp的新手。我开始训练模型(TokenNameFinderTrainer),以识别名称。到目前为止一切顺利,但现在我想识别组织(例如“微软”)。
我的问题是:默认情况下opennlp会识别哪些类型的实体? (如果有的话 ...)
我看到它可以处理<START:person> Daryl Williams <END>
。
但可以创建类似:<START:organization> Metro-Goldwyn-Mayer Studios Inc. <END>
的内容吗?或<START:company> Metro-Goldwyn-Mayer Studios Inc. <END>
含义:我可以随意标记类别吗?或
我必须使用默认类别吗?既然如此,这是默认的?
修改 的
我通过进一步阅读找到了答案。我现在要求确认......
我可以随意标记实体,并且每个实体制作1个模型更明智,我就在那里吗?
例如:1表示位置,1表示名称,1表示公司?
任何想法必须在同一个(例如)公司写的地方进行: 微软,还有微软?
感谢您的帮助!
答案 0 :(得分:2)
你可以为你想要的任何NER模型制作模型,我推荐每种类型一个模型。 OpenNLP使用机器学习来查找实体,因此它会找到模型告诉它的内容。因此,如果你注释微软和微软,甚至微软的拼写错误,它将试图找到它。 如果您有一个小的名称列表,并且每个名称只有几个变体,并且您需要将结果标准化,请考虑使用RegexNameFinder。如果拉动主干,可以使用Map将RegexNameFinder构造为一组正则表达式模式。
编辑:这是RegexNameFinder的OpenNLP单元测试用例的链接。这是1.6快照
http://svn.apache.org/viewvc/opennlp/trunk/opennlp-tools/src/test/java/opennlp/tools/namefind/RegexNameFinderTest.java?view=co
如果链接不起作用,这是一个基本的例子。
public void test() {
Pattern testPattern = Pattern.compile("test");
String sentence[] = new String[]{"a", "test", "b", "c"};
Pattern[] patterns = new Pattern[]{testPattern};
Map<String, Pattern[]> regexMap = new HashMap<>();
String type = "testtype";
regexMap.put(type, patterns);
RegexNameFinder finder =
new RegexNameFinder(regexMap);
Span[] result = finder.find(sentence);
}