最近考虑做些英文词语词干化的工作,听说coreNLP这个工具不错,就拿来用了。
coreNLP是斯坦福大学开发的一套关于自然语言处理的工具(toolbox),使用简单功能强大,有;命名实体识别、词性标注、词语词干化、语句语法树的构造还有指代关系等功能,使用起来比较方便。
coreNLP是使用Java编写的,运行环境需要在JDK1.8,1.7貌似都不支持。这是需要注意的
coreNLP官方文档不多,但是给的几个示例文件也差不多能摸索出来怎么用,刚才摸索了一下,觉得还挺顺手的。
环境:
window7 64位
JDK1.8
需要引进的ar包:
说明:这里只是测试了英文的,所以使用的Stanford-corenlp-3.6.0.models.jar文件,如果使用中文的需要在官网上下对应中文的model jar包,然后引进项目即可。
直接看代码比较简单:
package com.luchi.corenlp; import java.util.List; import java.util.Map; import java.util.Properties; import edu.stanford.nlp.hcoref.CorefCoreAnnotations.CorefChainAnnotation; import edu.stanford.nlp.hcoref.data.CorefChain; import edu.stanford.nlp.ling.CoreAnnotations; import edu.stanford.nlp.ling.CoreAnnotations.LemmaAnnotation; import edu.stanford.nlp.ling.CoreAnnotations.NamedEntityTagAnnotation; import edu.stanford.nlp.ling.CoreAnnotations.PartOfSpeechAnnotation; import edu.stanford.nlp.ling.CoreAnnotations.SentencesAnnotation; import edu.stanford.nlp.ling.CoreAnnotations.TextAnnotation; import edu.stanford.nlp.ling.CoreAnnotations.TokensAnnotation; import edu.stanford.nlp.ling.CoreLabel; import edu.stanford.nlp.pipeline.Annotation; import edu.stanford.nlp.pipeline.StanfordCoreNLP; import edu.stanford.nlp.semgraph.SemanticGraph; import edu.stanford.nlp.semgraph.SemanticGraphCoreAnnotations; import edu.stanford.nlp.trees.Tree; import edu.stanford.nlp.trees.TreeCoreAnnotations.TreeAnnotation; import edu.stanford.nlp.util.CoreMap; public class TestNLP { public void test(){ //构造一个StanfordCoreNLP对象,配置NLP的功能,如lemma是词干化,ner是命名实体识别等 Properties props = new Properties(); props.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref"); StanfordCoreNLP pipeline = new StanfordCoreNLP(props); // 待处理字符串 String text = "judy has been to china . she likes people there . and she went to Beijing ";// Add your text here! // 创造一个空的Annotation对象 Annotation document = new Annotation(text); // 对文本进行分析 pipeline.annotate(document); //获取文本处理结果 List<CoreMap> sentences = document.get(SentencesAnnotation.class); for(CoreMap sentence: sentences) { // traversing the words in the current sentence // a CoreLabel is a CoreMap with additional token-specific methods for (CoreLabel token: sentence.get(TokensAnnotation.class)) { // 获取句子的token(可以是作为分词后的词语) String word = token.get(TextAnnotation.class); System.out.println(word); //词性标注 String pos = token.get(PartOfSpeechAnnotation.class); System.out.println(pos); // 命名实体识别 String ne = token.get(NamedEntityTagAnnotation.class); System.out.println(ne); //词干化处理 String lema=token.get(LemmaAnnotation.class); System.out.println(lema); } // 句子的解析树 Tree tree = sentence.get(TreeAnnotation.class); tree.pennPrint(); // 句子的依赖图 SemanticGraph graph = sentence.get(SemanticGraphCoreAnnotations.CollapsedCCProcessedDependenciesAnnotation.class); System.out.println(graph.toString(SemanticGraph.OutputFormat.LIST)); } // 指代词链 //每条链保存指代的集合 // 句子和偏移量都从1开始 Map<Integer, CorefChain> corefChains = document.get(CorefChainAnnotation.class); if (corefChains == null) { return; } for (Map.Entry<Integer,CorefChain> entry: corefChains.entrySet()) { System.out.println("Chain " + entry.getKey() + " "); for (CorefChain.CorefMention m : entry.getValue().getMentionsInTextualOrder()) { // We need to subtract one since the indices count from 1 but the Lists start from 0 List<CoreLabel> tokens = sentences.get(m.sentNum - 1).get(CoreAnnotations.TokensAnnotation.class); // We subtract two for end: one for 0-based indexing, and one because we want last token of mention not one following. System. out.println(" " + m + ", i.e., 0-based character offsets [" + tokens.get(m.startIndex - 1).beginPosition() + ", " + tokens.get(m.endIndex - 2).endPosition() + ")"); } } } public static void main(String[]args){ TestNLP nlp=new TestNLP(); nlp.test(); } }
具体的注释都给出来了,我们可以直接看结果就知道代码的作用了:
对于每个token的识别结果:
原句中的:
judy 识别结果为:词性为NN,也就是名词,命名实体对象识别结果为O,词干识别为Judy
注意到has识别的词干已经被识别出来了,是“have”
而Beijing的命名实体标注识别结果为“Location”,也就意味着识别出了地名
然后我们看 解析树的识别(以第一句为例):
最后我们看一下指代的识别:
每个chain包含的是指代相同内容的词语,如chain1中两个she虽然在句子的不同位置,但是都指代的是第一句的“Judy”,这和原文的意思一致,表示识别正确,offsets表示的是该词语在句子中的位置
当然我只是用到了coreNLP的词干化功能,所以只需要把上面代码一改就可以处理词干化了,测试代码如下:
package com.luchi.corenlp; import java.util.List; import java.util.Properties; import edu.stanford.nlp.ling.CoreLabel; import edu.stanford.nlp.ling.CoreAnnotations.LemmaAnnotation; import edu.stanford.nlp.ling.CoreAnnotations.SentencesAnnotation; import edu.stanford.nlp.ling.CoreAnnotations.TokensAnnotation; import edu.stanford.nlp.pipeline.Annotation; import edu.stanford.nlp.pipeline.StanfordCoreNLP; import edu.stanford.nlp.util.CoreMap; public class Lemma { // 词干化 public String stemmed(String inputStr) { Properties props = new Properties(); props.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref"); StanfordCoreNLP pipeline = new StanfordCoreNLP(props); Annotation document = new Annotation(inputStr); pipeline.annotate(document); List<CoreMap> sentences = document.get(SentencesAnnotation.class); String outputStr = ""; for (CoreMap sentence : sentences) { // traversing the words in the current sentence // a CoreLabel is a CoreMap with additional token-specific methods for (CoreLabel token : sentence.get(TokensAnnotation.class)) { String lema = token.get(LemmaAnnotation.class); outputStr += lema+" "; } } return outputStr; } public static void main(String[]args){ Lemma lemma=new Lemma(); String input="jack had been to china there months ago. he likes china very much,and he is falling love with this country"; String output=lemma.stemmed(input); System.out.print("原句 :"); System.out.println(input); System.out.print("词干化:"); System.out.println(output); } }
输出结果为:
结果还是很准确的
相关推荐
1. 分词(Tokenization):CoreNLP使用高效的分词算法,能够准确地将文本切割成单个词汇单位,这是NLP中的基础步骤,为后续的处理提供输入。 2. 词性标注(Part-of-Speech Tagging):通过分析上下文,CoreNLP可以...
CoreNLP使用了精确的英文分词算法,能够处理复杂的标点符号和连接词情况。 2. **词性标注**(Part-of-Speech Tagging):识别每个词汇的语法角色,如名词、动词、形容词等,这对于理解句子结构至关重要。 3. **...
CoreNLP使用了精确的分词算法,可以处理各种复杂的语言现象。 2. **词性标注**:识别每个单词的语法角色,如名词、动词、形容词等,这对于理解句子结构至关重要。 3. **命名实体识别**:识别文本中的专有名词,如...
Stanford CoreNLP使用UPenn Treebank词性标注集,该集包含33个类别,如名词(NN)、专有名词(NR)、时间名词(NT)、动词(VV)、形容词(JJ)、副词(AD)等。例如,"北京"是专有名词(NR),"跑"是动词(VV),...
CoreNLP使用基于统计的模型来实现这一点,能有效地处理多种语言和文本格式。 3. **命名实体识别(Named Entity Recognition, NER)**:这个任务是识别文本中的专有名词,如人名、组织名、地点和日期等。CoreNLP的...
下面我们将详细探讨如何在C#中使用Stanford CoreNLP以及相关的知识点。 首先,Stanford CoreNLP是用Java编写的,因此在C#中使用它需要借助Java的.NET接口,如IKVM.NET或Jni4Net。这些库可以让你在C#中无缝地调用...
此外,它还支持命令行工具,方便用户在没有编程背景的情况下使用。 四、性能与效率提升 新版本的Stanford CoreNLP对性能进行了优化,处理速度更快,内存占用更少。这使得在大规模文本数据处理时,系统运行更加流畅...
为了在Java项目中使用这个JAR文件,开发者需要将其添加到项目的类路径(Classpath)中,然后通过Stanford CoreNLP的API来调用相应的模型进行处理。这通常涉及以下步骤: 1. **导入库**:在Java代码中导入必要的...
使用"stanford-corenlp-full-2015-12-09"这个版本的用户,可以通过Java API或命令行界面与工具包进行交互。在实际应用中,开发者通常会结合自己的项目需求,选择合适的工具包功能进行集成,以实现高效且精准的文本...
《 HanLP与Stanford CoreNLP:中文自然语言处理的双雄》 在自然语言处理(NLP)领域,HanLP和Stanford CoreNLP是两款备受瞩目的工具,它们在句法分析和...无论是研究还是开发,这两款工具都值得我们深入研究和使用。
使用"stanford-corenlp-full-2016-10-31"这个版本的CoreNLP工具,开发者可以方便地集成到自己的文本处理流程中,与Pointer-Generator模型协同工作,实现高效且准确的文本摘要。对于研究人员和开发者来说,了解并掌握...
Stanford CoreNLP是一套稳定且经过测试的自然语言处理工具,已被学术界,行业和政府中的各个团体广泛使用。 这些工具使用基于规则的,概率机器学习和深度学习组件。 Stanford CoreNLP代码用Java编写,并根据GNU...
标题中的"PyPI 官网下载 | stanford-corenlp-python-3.3.6-0.linux-x86_64.tar.gz"表明这是一个在Python包索引(PyPI)上发布的软件包,用于在Python环境中使用Stanford CoreNLP。PyPI是Python开发者发布自己软件包...
这个"stanford-corenlp.jar.zip"文件则是Stanford CoreNLP库的Java版本,被封装在一个zip压缩包中,便于下载和使用。 首先,我们来详细了解下Stanford CoreNLP的核心组件和功能: 1. **分词(Tokenization)**:这...
我们努力支持Stanford CoreNLP使用的所有语言。 注释者 AR zh 恩 fr 德 es 标记化/细分 :check_mark: :check_mark: :check_mark: :check_mark: :check_mark: 句子拆分 :check_mark:
本文将深入探讨CoreNLP库在Python中的使用、功能以及常见应用场景。 首先,我们来看一下标题中的"PyPI 官网下载 | corenlp-python-1.1.0.tar.gz",这表明我们可以从Python的官方包管理器PyPI上下载到CoreNLP的...
《斯坦福核心NLP库Stanford-corenlp-3.9.0全面解析》 斯坦福大学开发的CoreNLP库是自然语言处理(NLP)领域的重要工具,其3.9.0版本包含了完整的功能集,即"stanford-corenlp-full",在中文处理方面具有广泛的应用...
使用斯坦福 CoreNLP 的情感分析服务器 这是为 Koding Global Hackathon 创建的子项目。 它用于分析使用斯坦福 CoreNLP 库发送的情感推文。 推文像 /main/analyzeTweet.htm?tweets=xyz 一样发送(每条推文用新行分隔...
CoreNLP 是您在 Java 中进行自然语言处理的一站式商店! CoreNLP 使用户能够为文本导出语言注释,包括标记和句子边界、词性、命名实体、数字和时间值、依赖和选区解析、共指、情感、引用属性和关系。 CoreNLP 目前...