我现在正在使用一些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));
}
希望这能有所帮助。