`

coreNLP的使用

阅读更多

最近考虑做些英文词语词干化的工作,听说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);
				
		
	}

}

 输出结果为:

 

 结果还是很准确的

  • 大小: 13.6 KB
  • 大小: 2 KB
  • 大小: 1.6 KB
  • 大小: 4.6 KB
  • 大小: 10.6 KB
  • 大小: 5.5 KB
0
3
分享到:
评论

相关推荐

    stanford-corenlp-4.5.6.zip

    1. 分词(Tokenization):CoreNLP使用高效的分词算法,能够准确地将文本切割成单个词汇单位,这是NLP中的基础步骤,为后续的处理提供输入。 2. 词性标注(Part-of-Speech Tagging):通过分析上下文,CoreNLP可以...

    stanford-corenlp-full-2014-08-27

    CoreNLP使用了精确的英文分词算法,能够处理复杂的标点符号和连接词情况。 2. **词性标注**(Part-of-Speech Tagging):识别每个词汇的语法角色,如名词、动词、形容词等,这对于理解句子结构至关重要。 3. **...

    NLP:CoreNLP自然语言分析工具.zip

    CoreNLP使用了精确的分词算法,可以处理各种复杂的语言现象。 2. **词性标注**:识别每个单词的语法角色,如名词、动词、形容词等,这对于理解句子结构至关重要。 3. **命名实体识别**:识别文本中的专有名词,如...

    基于Python的StanfordCoreNLP自然语言分析快速入门教程.pdf

    Stanford CoreNLP使用UPenn Treebank词性标注集,该集包含33个类别,如名词(NN)、专有名词(NR)、时间名词(NT)、动词(VV)、形容词(JJ)、副词(AD)等。例如,"北京"是专有名词(NR),"跑"是动词(VV),...

    CoreNLP一套Java核心自然语言处理工具,用于标记化、句子分词、NER分析、相互引用、情感分析等.zip

    CoreNLP使用基于统计的模型来实现这一点,能有效地处理多种语言和文本格式。 3. **命名实体识别(Named Entity Recognition, NER)**:这个任务是识别文本中的专有名词,如人名、组织名、地点和日期等。CoreNLP的...

    C#下调用Stanford CoreNLP

    下面我们将详细探讨如何在C#中使用Stanford CoreNLP以及相关的知识点。 首先,Stanford CoreNLP是用Java编写的,因此在C#中使用它需要借助Java的.NET接口,如IKVM.NET或Jni4Net。这些库可以让你在C#中无缝地调用...

    stanford-corenlp-4.2.2.zip

    此外,它还支持命令行工具,方便用户在没有编程背景的情况下使用。 四、性能与效率提升 新版本的Stanford CoreNLP对性能进行了优化,处理速度更快,内存占用更少。这使得在大规模文本数据处理时,系统运行更加流畅...

    stanford-chinese-corenlp-2018-10-05-models.jar

    为了在Java项目中使用这个JAR文件,开发者需要将其添加到项目的类路径(Classpath)中,然后通过Stanford CoreNLP的API来调用相应的模型进行处理。这通常涉及以下步骤: 1. **导入库**:在Java代码中导入必要的...

    stanford-corenlp-full-2015-12-09.zip

    使用"stanford-corenlp-full-2015-12-09"这个版本的用户,可以通过Java API或命令行界面与工具包进行交互。在实际应用中,开发者通常会结合自己的项目需求,选择合适的工具包功能进行集成,以实现高效且精准的文本...

    hanLP和Stanford corenlp.rar

    《 HanLP与Stanford CoreNLP:中文自然语言处理的双雄》 在自然语言处理(NLP)领域,HanLP和Stanford CoreNLP是两款备受瞩目的工具,它们在句法分析和...无论是研究还是开发,这两款工具都值得我们深入研究和使用。

    stanford-corenlp-full-2016-10-31.zip

    使用"stanford-corenlp-full-2016-10-31"这个版本的CoreNLP工具,开发者可以方便地集成到自己的文本处理流程中,与Pointer-Generator模型协同工作,实现高效且准确的文本摘要。对于研究人员和开发者来说,了解并掌握...

    CoreNLP:斯坦福大学CoreNLP:Java核心NLP工具套件

    Stanford CoreNLP是一套稳定且经过测试的自然语言处理工具,已被学术界,行业和政府中的各个团体广泛使用。 这些工具使用基于规则的,概率机器学习和深度学习组件。 Stanford CoreNLP代码用Java编写,并根据GNU...

    PyPI 官网下载 | stanford-corenlp-python-3.3.6-0.linux-x86_64.tar.gz

    标题中的"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_jar_zip

    这个"stanford-corenlp.jar.zip"文件则是Stanford CoreNLP库的Java版本,被封装在一个zip压缩包中,便于下载和使用。 首先,我们来详细了解下Stanford CoreNLP的核心组件和功能: 1. **分词(Tokenization)**:这...

    stanford-core-nlp:斯坦福核心NLP工具的Ruby绑定(英语,法语,德语)

    我们努力支持Stanford CoreNLP使用的所有语言。 注释者 AR zh 恩 fr 德 es 标记化/细分 :check_mark: :check_mark: :check_mark: :check_mark: :check_mark: 句子拆分 :check_mark:

    PyPI 官网下载 | corenlp-python-1.1.0.tar.gz

    本文将深入探讨CoreNLP库在Python中的使用、功能以及常见应用场景。 首先,我们来看一下标题中的"PyPI 官网下载 | corenlp-python-1.1.0.tar.gz",这表明我们可以从Python的官方包管理器PyPI上下载到CoreNLP的...

    Stanford-corenlp-3.9.0

    《斯坦福核心NLP库Stanford-corenlp-3.9.0全面解析》 斯坦福大学开发的CoreNLP库是自然语言处理(NLP)领域的重要工具,其3.9.0版本包含了完整的功能集,即"stanford-corenlp-full",在中文处理方面具有广泛的应用...

    SentimentAnalysis:使用斯坦福 CoreNLP 的情感分析服务器

    使用斯坦福 CoreNLP 的情感分析服务器 这是为 Koding Global Hackathon 创建的子项目。 它用于分析使用斯坦福 CoreNLP 库发送的情感推文。 推文像 /main/analyzeTweet.htm?tweets=xyz 一样发送(每条推文用新行分隔...

    Stanford CoreNLP:斯坦福 CoreNLP,核心 NLP 工具的 Java 套件-开源

    CoreNLP 是您在 Java 中进行自然语言处理的一站式商店! CoreNLP 使用户能够为文本导出语言注释,包括标记和句子边界、词性、命名实体、数字和时间值、依赖和选区解析、共指、情感、引用属性和关系。 CoreNLP 目前...

Global site tag (gtag.js) - Google Analytics