首页 文章

是否有可能训练斯坦福NER系统识别更多命名的实体类型?

提问于
浏览
20

我现在正在使用一些NLP库,(stanford和nltk)斯坦福我看过演示部分,但只是想问一下是否有可能用它来识别更多的实体类型 .

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

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

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

我对么 .

谢谢 .

3 回答

  • 8

    是的,你需要自己的训练集 . 经过预先训练的斯坦福模型只识别“Stanford”这个词作为命名实体,因为他们已经接受了有关该词的数据的训练(或根据他们使用的特征集非常相似的词,我不知道那是什么)标记为命名实体 .

    获得更多数据后,需要将其放在this question和斯坦福教程中描述的正确格式中 .

  • 2

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

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

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

    例如,您可以提供类似的培训数据

    O Microsoft ORG的产品OBJ

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

  • 6

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

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

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

    Training data format

    训练数据作为文本文件传递,其中每一行是一个单词 - 标签对 . 行中的每个单词都应以“word \ tLABEL”之类的格式标记,单词和标签名称由制表符'\ t'分隔 . 对于文本句子,我们应该将其分解为单词,并为训练文件中的每个单词添加一行 . 要标记下一行的开头,我们在训练文件中添加一个空行 .

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

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

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

    Train model

    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);
    }
    

    Use the model to generate tags:

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

    希望这可以帮助 .

相关问题