Stanford-NER 定制对软件编程关键词进行分类

Posted

技术标签:

【中文标题】Stanford-NER 定制对软件编程关键词进行分类【英文标题】:Stanford-NER customization to classify software programming keywords 【发布时间】: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 分类器以满足我的需求?

【问题讨论】:

【参考方案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));
  

希望这会有所帮助。

【讨论】:

以上是关于Stanford-NER 定制对软件编程关键词进行分类的主要内容,如果未能解决你的问题,请参考以下文章

哪里可以进行软件定制开发?

系统定制成iso文件

《自适应路由服务合成:模型及优化》

thinkphp 面向切面编程-行为拓展

二柱子四则运算定制版+升级版

定制rpm包