是否可以训练Stanford NER系统识别更多命名实体类型



我现在正在使用一些NLP库(stanford和nltk)斯坦福大学我看到了演示部分,但只是想问是否可以使用它来识别更多的实体类型。

因此,目前斯坦福大学的NER系统(如演示所示)可以将实体识别为个人(姓名)、组织或地点。但被认可的组织仅限于大学或一些大型组织。我想知道我是否可以使用它的API为更多的实体类型编写程序,比如如果我的输入是"Apple"或"Square",它可以将其识别为一家公司。

我必须制作自己的训练数据集吗?

此外,如果我想提取实体及其彼此之间的关系,我觉得我应该使用stanford依赖性解析器。我的意思是,首先提取命名实体和标记为"名词"的其他部分,并找到它们之间的关系。

我说得对吗。

谢谢。

是的,您需要自己的训练集。经过预训练的斯坦福模型只将"斯坦福"一词识别为命名实体,因为他们是在将该词(或根据他们使用的特征集非常相似的词,我不知道那是什么)标记为命名实体的数据上进行训练的。

一旦你有了更多的数据,你需要把它放在这个问题和斯坦福教程中描述的正确格式中。

您可以轻松地训练自己的数据语料库。

在斯坦福大学NER常见问题解答中,第一个问题是如何为NER 训练我们自己的模型

链接是http://nlp.stanford.edu/software/crf-faq.shtml

例如,你可以给出像这样的训练数据

O的产品OBJ

Microsoft ORG

同样,您可以构建自己的训练数据并构建模型,然后使用它来获得所需的输出

似乎您想要训练您的自定义NER模型。

这里有一个完整代码的详细教程:

https://dataturks.com/blog/stanford-core-nlp-ner-training-java-example.php?s=so

训练数据格式

训练数据作为文本文件传递,其中每行是一个单词标签对。行中的每个单词都应该以类似"单词\tLABEL"的格式进行标记,单词和标签名称由制表符"\t"分隔。对于一个文本句子,我们应该将其分解为单词,并在训练文件中为每个单词添加一行。为了标记下一行的开始,我们在训练文件中添加一个空行。

以下是输入训练文件的示例:

hp  Brand
spectre ModelName
x360    ModelName
home    Category
theater Category
system  0
horizon ModelName
zero    ModelName
dawn    ModelName
ps4 0

根据您的域,您可以自动或手动构建这样的数据集。手动构建这样的数据集可能非常痛苦,像NER注释工具这样的工具可以帮助简化过程。

列车型号

public void trainAndWrite(String modelOutPath, String prop, String trainingFilepath) {
Properties props = StringUtils.propFileToProperties(prop);
props.setProperty("serializeTo", modelOutPath);
//if input use that, else use from properties file.
if (trainingFilepath != null) {
props.setProperty("trainFile", trainingFilepath);
}
SeqClassifierFlags flags = new SeqClassifierFlags(props);
CRFClassifier<CoreLabel> crf = new CRFClassifier<>(flags);
crf.train();
crf.serializeClassifier(modelOutPath);
}

使用模型生成标签:

public void doTagging(CRFClassifier model, String input) {
input = input.trim();
System.out.println(input + "=>"  +  model.classifyToString(input));
}  

希望这能有所帮助。

最新更新