我希望训练自己的模型,例如这个字符串我需要通过我训练有素的模型:“49本杂志关于丰田兰德酷路泽的文章1956-1987黄金投资组合http://t.co/EqxmY1VmLg http://t.co/F0Vefuoj9Q”
tsv文件如下所示:
Toyota PERS
Land PERS
当我通过该程序运行时:
public static void main(String[] args) {
String serializedClassifier2 = "C:/standford-ner/ner-model.ser.gz";
try {
NERClassifierCombiner classifier = new NERClassifierCombiner(false, false,
serializedClassifier2);
String ss = "Book of 49 Magazine Articles on Toyota Land Cruiser 1956-1987 Gold Portfolio http://t.co/EqxmY1VmLg http://t.co/F0Vefuoj9Q";
System.out.println("---");
List<List<CoreLabel>> out = classifier.classify(ss);
for (List<CoreLabel> sentence : out) {
for (CoreLabel word : sentence) {
System.out.print(word.word() + '/' + word.get(AnswerAnnotation.class) + ' ');
}
System.out.println();
}
} catch (ClassCastException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
以下是我得到的输出:
Book/PERS of/PERS 49/O Magazine/PERS Articles/PERS on/O Toyota/PERS Land/PERS Cruiser/O 1956-1987/PERS Gold/PERS Portfolio/PERS http://t.co/EqxmY1VmLg/PERS http://t.co/F0Vefuoj9Q/PERS
对我来说,输出是错误的。我需要Book/O of/O
。我不确定它是如何获得这个价值的,例如我的tsv文件中没有提到“book”。我在tsv文件中没有提到的词应该是O
。这个tsv文件只是一个开始;我还有更多的话需要补充。
答案 0 :(得分:1)
您已经提供了分类器培训数据,其中100%的数据是一个类:PERS
。由于100%的培训数据都是该课程,因此它将为您提供100%的课程作业。
对于算法,O
只是另一个类。您没有给出O
的示例,因此它不会将其归类为O
。
Stanford NER CRF FAQ提供an example of training data:
CHAPTER O
I O
Emma PERS
Woodhouse PERS
, O
handsome O
, O
clever O
, O
and O
rich O
, O
with O
a O
comfortable O
home O
...
所以你可以看到,在那里,他们用O
类的大量例子标记每个 in situ 的标记。我并不完全熟悉CRF分类器的工作方式,但我怀疑您需要为其提供实际数据,并对其进行适当标记,而不仅仅是目标类成员示例列表。
这又引出了另一个问题 - 如果您只想匹配此任务的字符串,为什么使用NER?为什么不匹配字符串?如果那是你的目标,那么就可以省去严重的麻烦,跳过复杂的NLP。您可以更快地获得结果,更容易手动调整。