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.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
【讨论】:
我对“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 定制对软件编程关键词进行分类的主要内容,如果未能解决你的问题,请参考以下文章