我是斯坦福NLP的新手,我正在尝试在我的Java应用程序中使用它来解决以下问题。 我有一篇维基百科的文章(比如标题为“华盛顿特区”的文章),我想确定形成标题的短语(在我的情况下,“华盛顿特区”)是否通过分析来命名实体。文章的文字。
按照我在Stanford NLP发行版中包含的Demo.java文件中找到的示例,我声明了以下分类器:
AbstractSequenceClassifier<CoreLabel> classifier = CRFClassifier.getClassifier("src/main/resources/org/graphipedia/ner/classifiers/english.all.3class.distsim.crf.ser.gz");
然后我在这个分类器上调用了方法classify:
List<List<CoreLabel>> resClassifier = classifier.classify(text)
其中参数是维基百科页面的文本。 现在的问题是,当我迭代分类器的结果时,列表的每个元素都是单个单词(用类注释)。 因此,三个代币形成我的头衔“华盛顿”,“,”和“D.C.”被单独处理,并且(可能)以不同方式注释。 因此,我可以确定我的标题的任何部分是否是命名实体,但我不能在整个标题上做同样的事情。
我在斯坦福NLP网站上看到,使用RegexNER可以实现类似的功能,可以将单词组视为单个实体。 但我不确定如何将它与AbstractSequenceClassifier一起使用。此外,似乎使用RegexNER我必须在一个文件中指定我想要被视为单个实体(在我的例子中,短语“Washington,D.C。”)的标记,这不是我想要的东西。 理想情况下,我想为许多维基百科文章重复这个分类任务,我真的不想为每篇文章创建一个文件。
你能否给我一些关于如何解决这个看似容易解决的问题的提示?
提前致谢。
詹卢卡
答案 0 :(得分:0)
Stanford CoreNLP提供了一个mentions
注释器,它将具有相同NER标签的相邻单词组合成一个提及。但是,在您的情况下,自己这样做几乎肯定更容易。如果标题中的大多数单词都有与之关联的NER标记,则标题可能是命名实体。
切向,但我还建议使用StanfordCoreNLP
对象来注释NER标记(new StanfordCoreNLP(props).annotate(annotation)
),或者使用最新版本中包含的简单CoreNLP API:List<String> tags = new Sentence("your headline").nerTags();
。