如何用Java基于StanfordCoreNLP实现从给定段落中提取核心标题
文本核心标题生成功能实现逻辑
需求为输入聊天对话或段落,输出可概括核心内容、主旨的核心标题。目前已基于StanfordCoreNLP实现了分句、分词、词性标注、词形还原、情感分析、命名实体识别(NER)等基础预处理能力,期望效果为输入「如果你可以创造一个节日,它会是什么样?会有哪些传统?人们在这个节日会吃什么?」,输出核心标题为Holiday(对应中文:节日)。
具体实现步骤
- 第一步:停用词过滤
基于词性标注结果过滤无实际语义的虚词,包括助词、介词、连词、代词、标点符号,再配合通用停用词表过滤「的、地、得、是、如果」这类无核心语义的词汇,仅保留名词、动词、专有名词等实词。 - 第二步:多规则权重加权统计
对过滤后保留的实词做基础词频统计,再叠加权重规则提升核心词的优先级:- NER识别出的命名实体(人物、地点、事件、专有名词)权重×3
- 出现在句首/段首、疑问词后的核心名词权重×2
- 重复出现的实词,每多出现一次权重加0.5
- 第三步:语义聚合消歧
通过已实现的词形还原能力将不同形态的同一个词合并统计,比如holiday和holidays判定为同一个词,再针对多义词结合上下文词性做消歧,避免权重统计偏差。 - 第四步:核心标题输出
取权重最高的1-3个核心词,若为单个核心词可直接输出(如示例中的Holiday),若为多个关联度高的核心词可组合为短语输出,比如输入关于机器学习入门教程的文本,可输出机器学习入门作为核心标题。
现有基础代码参考
Pipeline.java
public class Pipeline { private static Properties properties; private static String propertiesName = "tokenize, ssplit, pos, lemma, parse, sentiment, ner"; private static StanfordCoreNLP stanfordCoreNLP; private Pipeline(){ } static { properties = new Properties(); properties.setProperty("annotators", propertiesName); } public static StanfordCoreNLP getPipeline(){ if(stanfordCoreNLP == null){ stanfordCoreNLP = new StanfordCoreNLP(properties); } return stanfordCoreNLP; } }
SentenceRecognizer.java
public class SentenceRecognizer { public static void main(String[] args) { StanfordCoreNLP stanfordCoreNLP= Pipeline.getPipeline(); String text = "Hey Iam Jhon. Iam doing Math. I like coffee "; CoreDocument coreDocument = new CoreDocument(text); stanfordCoreNLP.annotate(coreDocument); List<CoreSentence> sentences= coreDocument.sentences(); for(CoreSentence sentence: sentences){ System.out.println(sentence.toString()); } } }
运行输出结果
Hey Iam Jhon. Iam doing Math. I like coffee
内容的提问来源于stack exchange,提问作者Chitrang Sharma
相关产品推荐
相关产品推荐

