本文主要研究下如何使用opennlp进行词性标注

POS Tagging

词性(Part of Speech, POS),标注是对一个词汇或一段文字进行描述的过程。这个描述被称为一个标注。

目前流行的中文词性标签有两大类:北大词性标注集和宾州词性标注集。现代汉语的词可以分为两类12种词性:一类是实词:名词、动词、形容词、数词、量词和代词;另一类是虚词:副词、介词、连词、助词、叹词和拟声词。

这块的技术大多数使用HMM(隐马尔科夫模型)+ Viterbi算法,最大熵算法(Maximum Entropy)。

OpenNLP里头可以使用POSTaggerME类来执行基本的标注,以及ChunkerME类来执行分块。

POSTaggerME

public static POSModel trainPOSModel(ModelType type) throws IOException {

TrainingParameters params = new TrainingParameters();

params.put(TrainingParameters.ALGORITHM_PARAM, type.toString());

params.put(TrainingParameters.ITERATIONS_PARAM, 100);

params.put(TrainingParameters.CUTOFF_PARAM, 5);

return POSTaggerME.train("eng", createSampleStream(), params,

new POSTaggerFactory());

}

private static ObjectStream createSampleStream() throws IOException {

InputStreamFactory in = new ResourceAsStreamFactory(POSTaggerMETest.class,

"postag/AnnotatedSentences.txt");

return new WordTagSampleStream(new PlainTextByLineStream(in, StandardCharsets.UTF_8));

}

@Test

public void testPOSTagger() throws IOException {

POSModel posModel = trainPOSModel(ModelType.MAXENT);

POSTagger tagger = new POSTaggerME(posModel);

String[] tags = tagger.tag(new String[] {

"The",

"driver",

"got",

"badly",

"injured",

"."});

Assert.assertEquals(6, tags.length);

Assert.assertEquals("DT", tags[0]);

Assert.assertEquals("NN", tags[1]);

Assert.assertEquals("VBD", tags[2]);

Assert.assertEquals("RB", tags[3]);

Assert.assertEquals("VBN", tags[4]);

Assert.assertEquals(".", tags[5]);

}

这里首先进行模型训练,其中训练文本样式如下:

Last_JJ September_NNP ,_, I_PRP tried_VBD to_TO find_VB out_RP the_DT address_NN of_IN an_DT old_JJ school_NN friend_NN whom_WP I_PRP had_VBD not_RB seen_VBN for_IN 15_CD years_NNS ._.

I_PRP just_RB knew_VBD his_PRP$ name_NN ,_, Alan_NNP McKennedy_NNP ,_, and_CC I_PRP 'd_MD heard_VBD the_DT rumour_NN that_IN he_PRP 'd_MD moved_VBD to_TO Scotland_NNP ,_, the_DT country_NN of_IN his_PRP$ ancestors_NNS ._.

So_IN I_PRP called_VBD Julie_NNP ,_, a_DT friend_NN who's_WDT still_RB in_IN contact_NN with_IN him_PRP ._.

She_PRP told_VBD me_PRP that_IN he_PRP lived_VBD in_IN 23213_CD Edinburgh_NNP ,_, Worcesterstreet_NNP 12_CD ._.

I_PRP wrote_VBD him_PRP a_DT letter_NN right_RB away_RB and_CC he_PRP answered_VBD soon_RB ,_, sounding_VBG very_RB happy_JJ and_CC delighted_JJ ._.

标注说明:

DT(Determiner)

NN (Noun, singular or mass)

VBD (Verb, past tense)

RB (Adverb)

VBN (Verb, past participle)

ChunkerME

private Chunker chunker;

private static String[] toks1 = { "Rockwell", "said", "the", "agreement", "calls", "for",

"it", "to", "supply", "200", "additional", "so-called", "shipsets",

"for", "the", "planes", "." };

private static String[] tags1 = { "NNP", "VBD", "DT", "NN", "VBZ", "IN", "PRP", "TO", "VB",

"CD", "JJ", "JJ", "NNS", "IN", "DT", "NNS", "." };

private static String[] expect1 = { "B-NP", "B-VP", "B-NP", "I-NP", "B-VP", "B-SBAR",

"B-NP", "B-VP", "I-VP", "B-NP", "I-NP", "I-NP", "I-NP", "B-PP", "B-NP",

"I-NP", "O" };

@Before

public void startup() throws IOException {

ResourceAsStreamFactory in = new ResourceAsStreamFactory(getClass(),

"chunker/test.txt");

ObjectStream sampleStream = new ChunkSampleStream(

new PlainTextByLineStream(in, StandardCharsets.UTF_8));

TrainingParameters params = new TrainingParameters();

params.put(TrainingParameters.ITERATIONS_PARAM, 70);

params.put(TrainingParameters.CUTOFF_PARAM, 1);

ChunkerModel chunkerModel = ChunkerME.train("eng", sampleStream, params, new ChunkerFactory());

this.chunker = new ChunkerME(chunkerModel);

}

@Test

public void testChunkAsArray() throws Exception {

String[] preds = chunker.chunk(toks1, tags1);

Assert.assertArrayEquals(expect1, preds);

}

这里同样也进行了模型训练,其训练文本样式如下:

Rockwell NNP B-NP

International NNP I-NP

Corp. NNP I-NP

's POS B-NP

Tulsa NNP I-NP

unit NN I-NP

said VBD B-VP

it PRP B-NP

signed VBD B-VP

a DT B-NP

tentative JJ I-NP

agreement NN I-NP

extending VBG B-VP

its PRP$ B-NP

contract NN I-NP

with IN B-PP

Boeing NNP B-NP

Co. NNP I-NP

to TO B-VP

provide VB I-VP

structural JJ B-NP

parts NNS I-NP

for IN B-PP

Boeing NNP B-NP

's POS B-NP

747 CD I-NP

jetliners NNS I-NP

标注说明:

\B 标注开始

\I 标注的中间

\E 标注的结束

NP 名词块

VB 动词块

小结

本文初步展示了如何使用opennlp进行词性标注,模型训练是个比较重要的一个方面,可以通过特定训练提高特定领域文本的标注准确性。

doc

java 中文词性标注_使用opennlp进行词性标注相关推荐

  1. python词性标注_文本分类的词性标注

    我是一个新的python,正在处理一个文本分类问题.我用不同的在线资源开发了一个代码.但是这个代码并没有做词性标注.有人能帮我找出我的代码中我真正出错的那一行吗.我在代码中做词性标记,但结果中没有显示 ...

  2. java 中文乱码_好程序员Java学习路线分享如何处理中文参数

    好程序员Java学习路线分享如何处理中文参数,为什么表单中会产生中文乱码. 好程序员Java培训 产生乱码,就是因为服务器和客户端沟通的编码不一致造成的,因此解决的办法是:在客户端和服务器之间设置一个 ...

  3. java 中文参数_关于JAVA中URL传递中文参数的问题

    今天在调用一个接口时,需要传递一个中文参数,结果获取不到数据,原因就在于中文传参的编码问题. 问题来源:URL url= new URL("http://XXX?OrganName=司法厅& ...

  4. mysql java中文乱码_解决Mysql+Java的中文乱码问题(学习心得)

    最近几天一直都在学JSP,我用的数据库是Mysql.在连接数据库的过程中,刚开始我只是简单的执行了查询命令,发现从数据库取出的中文数据全部显示成了乱码,查了一些资料之后,我先用了下面的一个转换函数,值 ...

  5. mysql java中文乱码_解决JAVA写mysql时出现中文乱码的现象

    参考地址:http://www.cnblogs.com/amboyna/archive/2008/06/18/1224570.html 今天部署已有一个java服务到另一台机器时出现写入数据库中文乱码 ...

  6. js java 中文乱码_编码问题(.java/.jsp/.js等文件的中文乱码)

    乱码的出现是因为编码与解码的不一致造成的,假如你对"中文"两个字进行了gbk格式的保存,却用utf-8格式的解读,是肯定会出现乱码的. 如何避免中文乱码:应用上下统一用一种编码格式 ...

  7. 微信小程序java中文乱码_如何解决微信小程序显示中文无法上传或者出现乱码的问题?...

    今天小编给大家讲解如何解决微信小程序显示中文无法上传或者出现乱码的问题?有需要或者有兴趣的朋友们可以看一看下文,相信对大家会有所帮助的. 在formData中对文字进行编码,使用encodeURI() ...

  8. 中文分词_中文分词最佳纪录刷新,两大模型分别解决中文分词及词性标注问题...

    伊瓢 发自 中关村 量子位 报道 | 公众号 QbitAI 中文分词的最佳效果又被刷新了. 在今年的ACL 2020上,来自创新工场大湾区人工智能研究院的两篇论文中的模型,刷新了这一领域的成绩. WM ...

  9. [Python知识图谱] 三.Jieba工具中文分词、添加自定义词典及词性标注详解

    本系列文章主要结合Python语言实现知识图谱构建相关工程,具有一定创新性和实用性,非常希望各位博友交流讨论,相互促进成长.前面两篇文章详细讲解了哈工大Pyltp工具,包括中文分词.词性标注.实体识别 ...

  10. java http 中文乱码_关于java发送http请求时中文乱码的一种解决办法

    在jsp中常见的乱码解决办法无外乎是关于get和post两种方式的,但只有切实地在实践中使用时才会注意或者说注重到其他方式.例如,在http请求头中传送中文参数,出现乱码,如何解决? 实际场景:使用S ...

最新文章

  1. PHP 实现无限分类
  2. Maven 新版本 3.8.1 打包报错 maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories
  3. LinkedList模拟队列和堆栈
  4. 完善Linux/UNIX审计 将每个shell命令记入日志
  5. linux数据库创建表空间语句,如何用LINUX用命令创建ORACLE数据库表空间和用户
  6. 获取3的倍数_获取和设置pdf目录
  7. 如何处理non-resolvable parent POM的错误
  8. Hive分析hadoop进程日志
  9. 2017济南北大青鸟accp和学士后课程的真实情况
  10. python安装pandas失败_详解pandas安装若干异常及解决方案总结
  11. android dex2oat 编译,dex2oat代码阅读笔记
  12. veu的常用指令(复习使用)
  13. 【数模之数据分析-1】
  14. fiddler手机抓包问题详解
  15. 黑苹果睡眠唤醒usb失灵_黑苹果解决USB3.0驱动问题
  16. 计算机弹音乐百度百科,电子音乐合成器
  17. 一级计算机的分类汇总在哪里,在Excel工作表的数据列表中插入分类汇总
  18. CIO如何推广ERP系统
  19. 小白入门IT行业,该从哪儿下手?
  20. 什么是SOA,谈谈你的SOA的理解

热门文章

  1. 建网站购买服务器,建网站购买服务器
  2. 使用电脑风扇控制软件Macs Fan Control Pro更好的管理电风扇
  3. win7 虚拟wifi服务器,w7虚拟wifi在哪里设置_win7虚拟wifi怎么开启
  4. Undefined和Null的区别
  5. 【转】资深眼镜人告诉你一些所不为人知的眼镜知识和内幕
  6. 低代码指南100方案:28高效HR如何做好面试管理,提高招聘效率?
  7. Field类及相关类解读
  8. ORA-20011: Approximate NDV failed: ORA-29913: error in executing ODCIEXTTABLEOPEN callout
  9. 在线的棋牌类网络游戏java服务端实现
  10. DB2数据库HANG住的时候应该收集什么数据以及如何处理