我是 NLP 新手,我使用 Stanford NER 工具对一些随机文本进行分类,以提取软件编程中使用的特殊关键字。
问题是,我不知道如何更改 Stanford NER 中的分类器和文本注释器以识别软件编程关键字。例如:
today Java used in different operating systems (Windows, Linux, ..)
分类结果应该是这样的:
Java "Programming_Language"
Windows "Operating_System"
Linux "Operating_system"
您能否帮助我了解如何自定义 StanfordNER 分类器以满足我的需求?
最佳答案
我认为它在斯坦福 NER 常见问题解答部分 http://nlp.stanford.edu/software/crf-faq.shtml#a 中有很好的记录.
步骤如下:
- 在您的属性文件中更改 map 以指定您的训练数据的注释方式(或 结构化)
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.java
中public 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
关于java - Stanford-NER 自定义对软件编程关键字进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22950995/