【问题标题】:Stanford-NER customization to classify software programming keywordsStanford-NER 定制对软件编程关键词进行分类
【发布时间】:2014-05-21 23:21:22
【问题描述】:

我是 NLP 的新手,我使用斯坦福 NER 工具对一些随机文本进行分类,以提取软件编程中使用的特殊关键字。

问题是,我不知道如何更改斯坦福 NER 中的分类器和文本注释器以识别软件编程关键字。例如:

today Java used in different operating systems (Windows, Linux, ..)

分类结果应如:

Java "Programming_Language"
Windows "Operating_System"
Linux "Operating_system"

您能否帮助了解如何自定义 StanfordNER 分类器以满足我的需求?

【问题讨论】:

    标签: java nlp classification stanford-nlp


    【解决方案1】:

    我认为它在斯坦福 NER 常见问题解答部分 http://nlp.stanford.edu/software/crf-faq.shtml#a 中有很好的记录。

    步骤如下:

    • 在您的属性文件中更改地图以指定如何注释您的训练数据(或 结构化)

    map = word=0,myfeature=1,answer=2

    • src\edu\stanford\nlp\sequences\SeqClassifierFlags.java

      添加一个标志,说明你想使用你的新功能,我们称之为 useMyFeature 在public boolean useLabelSource = false下方,添加 public boolean useMyFeature=true;

      setProperties(Properties props, boolean printProps)方法中的同一文件之后 else if (key.equalsIgnoreCase("useTrainLexicon")) { ..} 告诉工具,如果这个标志为你打开/关闭

      else if (key.equalsIgnoreCase("useMyFeature")) {
            useMyFeature= Boolean.parseBoolean(val);
      }
      
    • src/edu/stanford/nlp/ling/CoreAnnotations.java,添加以下内容 部分

      public static class myfeature implements CoreAnnotation<String> {
        public Class<String> getType() {
          return String.class;
        }
      }
      
    • src/edu/stanford/nlp/ling/AnnotationLookup.javapublic enumKeyLookup{..} 在底部添加

      MY_TAG(CoreAnnotations.myfeature.class,"myfeature")

    • src\edu\stanford\nlp\ie\NERFeatureFactory.java,取决于 特征的“类型”,添加

      protected Collection<String> featuresC(PaddedList<IN> cInfo, int loc)
      
      if(flags.useRahulPOSTAGS){
          featuresC.add(c.get(CoreAnnotations.myfeature.class)+"-my_tag");
      }
      

    调试: 除此之外,还有一些方法可以将功能转储到文件中,使用它们来查看事情是如何在幕后完成的。另外,我认为您也必须花一些时间在调试器上:P

    【讨论】:

    • 我对“useMyFeature”有疑问,是指注释词的特征吗,例如:Java“Prog_Language”,而“Prog_Language”是Java这个词的特征??
    • @user3247440 "useMyFeature" 是一个 标志 是否使用您的功能进行训练。如果你打开它,那么它将使用“对应”功能。
    • 太棒了,“-my_tag”我应该在里面放什么?我对一些术语感到困惑,因为我不是 NLP 领域的专家
    • 你能帮忙吗,我也找不到运行修改后的类的主要功能?!
    • @user3247440 阅读此链接 [链接] (mailman.stanford.edu/pipermail/java-nlp-user/2011-December/…)。每件事都会一清二楚。你可以从这里src/edu/stanford/nlp/ie/crf/CRFClassifier.java 运行。我建议你在调试模式下运行现有的 CRF 模型,看看发生了什么。
    【解决方案2】:

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

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

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

    训练数据格式

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

    这是输入训练文件的示例:

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

    根据您的域,您可以自动或手动构建此类数据集。手动构建这样的数据集真的很痛苦,NER annotation tool 之类的工具可以帮助简化这个过程。

    训练模型

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 2021-01-21
      相关资源
      最近更新 更多