Java 如何使用OpenNLP从给定文本中提取关键短语?

Java 如何使用OpenNLP从给定文本中提取关键短语?,java,lucene,nlp,keyword,opennlp,Java,Lucene,Nlp,Keyword,Opennlp,我正在使用ApacheOpenNLP,我想提取给定文本的关键短语。我已经在收集实体了,但是我想要一些关键短语 我的问题是我不能使用TF-IDF,因为我没有这方面的模型,我只有一个文本(而不是多个文档) 下面是一些代码(原型-不太干净) 公共列表关键字(字符串文本,NLPProvider管道){ SentenceDetectorME sentenceDetector=新的SentenceDetectorME(pipeline.getSentenceDetectoto(“en”); Tokenize

我正在使用ApacheOpenNLP,我想提取给定文本的关键短语。我已经在收集实体了,但是我想要一些关键短语

我的问题是我不能使用TF-IDF,因为我没有这方面的模型,我只有一个文本(而不是多个文档)

下面是一些代码(原型-不太干净)

公共列表关键字(字符串文本,NLPProvider管道){
SentenceDetectorME sentenceDetector=新的SentenceDetectorME(pipeline.getSentenceDetectoto(“en”);
TokenizerME令牌化器=新的令牌化器(pipeline.getTokenizer(“en”);
postagerme postager=新的postagerme(pipeline.getPosmodel(“en”);
ChunkerME chunker=新的ChunkerME(pipeline.getChunker(“en”);
ArrayList stopwords=pipeline.getStopwords(“en”);
Span[]sentspands=sentenceDetector.sentPosDetect(文本);
映射结果=新建LinkedHashMap();
SortedMap sortedData=新树映射(新映射sort.FloatValueComparer(结果));
float sentenceCounter=sentspands.length;
浮点突出值=0;
int句子=sentspands.length;
用于(Span sentSpan:sentSpans){
突出值=句子计数器/句子;
句子计数器--;
String语句=sentSpan.getCoveredText(text.toString();
int start=sentSpan.getStart();
Span[]tokSpans=tokenizer.tokenizePos(句子);
String[]tokens=新字符串[tokSpans.length];
for(int i=0;i
它基本上是把名词还给我,然后按突出值(在文本中的位置?)和计数对它们进行排序

但老实说,这不太好用

我也用lucene analyzer试过,但结果也不太好

那么,我怎样才能实现我想做的事情呢?我已经知道KEA/Maui索引器等(但恐怕我不能使用它们,因为GPL:()


还有意思吗?我可以使用哪些其他算法来代替TF-IDF

例如:

本文:


我认为输出良好:Etsy、Grand St、太阳能充电器、制造商市场、技术硬件

最后,我发现了一些东西:

它正在使用opennlp/stanfordnlp的POS。它有ALS2许可证。还没有测量精度和召回率,但我认为它提供了很好的结果

这是我的密码:

 Configuration.setTaggerType("openNLP");
        Configuration.setSingleStrength(6);
        Configuration.setNoLimitStrength(5);
        // if tagger type is "openNLP" then give the openNLP POS tagger path
        //Configuration.setModelFileLocation("model/openNLP/en-pos-maxent.bin"); 
        // if tagger type is "default" then give the default POS lexicon file
        //Configuration.setModelFileLocation("model/default/english-lexicon.txt");
        // if tagger type is "stanford "
        Configuration.setModelFileLocation("Dont need that here");
        Configuration.setPipeline(pipeline);
        TermsExtractor termExtractor = new TermsExtractor();
        TermDocument topiaDoc = new TermDocument();
        topiaDoc = termExtractor.extractTerms(text);
        //logger.info("Extracted terms : " + topiaDoc.getExtractedTerms());
        Map<String, ArrayList<Integer>> finalFilteredTerms = topiaDoc.getFinalFilteredTerms();
        List<KeywordsModel> keywords = new ArrayList<>();
        for (Map.Entry<String, ArrayList<Integer>> e : finalFilteredTerms.entrySet()) {
            KeywordsModel keyword = new KeywordsModel();
            keyword.setLabel(e.getKey());
            keywords.add(keyword);
        }
Configuration.setTaggerType(“openNLP”);
配置。设置单体强度(6);
配置。设置限制强度(5);
//如果标记器类型为“openNLP”,则给出openNLP POS标记器路径
//setModelFileLocation(“model/openNLP/en pos maxent.bin”);
//如果标记器类型为“默认”,则给出默认的词性词典文件
//setModelFileLocation(“model/default/english lexicon.txt”);
//如果标记器类型为“stanford”
setModelFileLocation(“此处不需要它”);
配置。设置管道(管道);
TermsExtractor termExtractor=新的TermsExtractor();
TermDocument topiaDoc=新的TermDocument();
topiaDoc=术语提取器。提取器术语(文本);
//info(“提取的术语:+topiaDoc.getExtractedTerms());
Map finalFilteredTerms=topiaDoc.getFinalFilteredTerms();
列表关键字=新建ArrayList();
对于(Map.Entry e:finalFilteredTerms.entrySet()){
关键字模型关键字=新关键字模型();
关键字.setLabel(e.getKey());
关键词.添加(关键词);
}

我稍微修改了配置文件,以便从管道实例加载POSModel。

您可以尝试评估精度/召回率吗?对于处理这些现象的其他用户来说,这也是非常有趣的:)嘿:=)是的。我会的!可能需要一些时间,但我会回来,在这里给你答案。好的-结果是,这个库工作不太好,因为你不能得到分数。我将以以下策略结束:使用openNLP提取
 Configuration.setTaggerType("openNLP");
        Configuration.setSingleStrength(6);
        Configuration.setNoLimitStrength(5);
        // if tagger type is "openNLP" then give the openNLP POS tagger path
        //Configuration.setModelFileLocation("model/openNLP/en-pos-maxent.bin"); 
        // if tagger type is "default" then give the default POS lexicon file
        //Configuration.setModelFileLocation("model/default/english-lexicon.txt");
        // if tagger type is "stanford "
        Configuration.setModelFileLocation("Dont need that here");
        Configuration.setPipeline(pipeline);
        TermsExtractor termExtractor = new TermsExtractor();
        TermDocument topiaDoc = new TermDocument();
        topiaDoc = termExtractor.extractTerms(text);
        //logger.info("Extracted terms : " + topiaDoc.getExtractedTerms());
        Map<String, ArrayList<Integer>> finalFilteredTerms = topiaDoc.getFinalFilteredTerms();
        List<KeywordsModel> keywords = new ArrayList<>();
        for (Map.Entry<String, ArrayList<Integer>> e : finalFilteredTerms.entrySet()) {
            KeywordsModel keyword = new KeywordsModel();
            keyword.setLabel(e.getKey());
            keywords.add(keyword);
        }