作者 yuquanle

公众号 AI小白入门

本文根据自己的学习过程以及查阅相关资料的理解,对自然语言基础技术之词性标注进行了相对全面的简绍,包括定义、目前的难点以及常见方法,还推荐了一大波python实战利器,并且包括工具的用法。

词性定义

维基百科上对词性的定义为:In traditional grammar, a part of speech (abbreviated form: PoS or POS) is a category of words (or, more generally, of lexical items) which have similar grammatical properties.

词性指以词的特点作为划分词类的根据。词类是一个语言学术语,是一种语言中词的语法分类,是以语法特征(包括句法功能和形态变化)为主要依据、兼顾词汇意义对词进行划分的结果。

从组合和聚合关系来说,一个词类是指:在一个语言中,众多具有相同句法功能、能在同样的组合位置中出现的词,聚合在一起形成的范畴。词类是最普遍的语法的聚合。词类划分具有层次性。如汉语中,词可以分成实词和虚词,实词中又包括体词、谓词等,体词中又可以分出名词和代词等。

词性标注就是在给定句子中判定每个词的语法范畴,确定其词性并加以标注的过程,这也是自然语言处理中一项非常重要的基础性工作,所有对于词性标注的研究已经有较长的时间,在研究者长期的研究总结中,发现汉语词性标注中面临了许多棘手的问题。

中文词性标注的难点

汉语是一种缺乏词形态变化的语言,词的类别不能像印欧语那样,直接从词的形态变化上来判别。

常用词兼类现象严重。《现代汉语八百词》收取的常用词中,兼类词所占的比例高达22.5%,而且发现越是常用的词,不同的用法越多。由于兼类使用程度高,兼类现象涉及汉语中大部分词类,因而造成在汉语文本中词类歧义排除的任务量巨大。

研究者主观原因造成的困难。语言学界在词性划分的目的、标准等问题上还存在分歧。目前还没有一个统的被广泛认可汉语词类划分标准,词类划分的粒度和标记符号都不统一。词类划分标准和标记符号集的差异,以及分词规范的含混性,给中文信息处理带来了极大的困难。

词性标注常见方法

关于词性标注的研究比较多,这里介绍一波常见的几类方法,包括基于规则的词性标注方法、基于统计模型的词性标注方法、基于统计方法与规则方法相结合的词性标注方法、基于深度学习的词性标注方法等。

基于规则的词性标注方法

基于规则的词性标注方法是人们提出较早的一种词性标注方法,其基本思想是按兼类词搭配关系和上下文语境建造词类消歧规则。早期的词类标注规则一般由人工构建。

随着标注语料库规模的增大,可利用的资源也变得越来越多,这时候以人工提取规则的方法显然变得不现实,于是乎,人们提出了基于机器学习的规则自动提出方法。

基于统计模型的词性标注方法

统计方法将词性标注看作是一个序列标注问题。其基本思想是:给定带有各自标注的词的序列,我们可以确定下一个词最可能的词性。

现在已经有隐马尔可夫模型(HMM)、条件随机域(CRF)等统计模型了,这些模型可以使用有标记数据的大型语料库进行训练,而有标记的数据则是指其中每一个词都分配了正确的词性标注的文本。

基于统计方法与规则方法相结合的词性标注方法

理性主义方法与经验主义相结合的处理策略一直是自然语言处理领域的专家们不断研究和探索的问题,对于词性标注问题当然也不例外。

这类方法的主要特点在于对统计标注结果的筛选,只对那些被认为可疑的标注结果,才采用规则方法进行歧义消解,而不是对所有情况都既使用统计方法又使用规则方法。

基于深度学习的词性标注方法

可以当作序列标注的任务来做,目前深度学习解决序列标注任务常用方法包括LSTM+CRF、BiLSTM+CRF等。

值得一提的是,这一类方法近年来文章非常多,想深入了解这一块的朋友们可以看这里:https://github.com/sebastianruder/NLP-progress/blob/master/english/part-of-speech_tagging.md

最后再放一个词性标注任务数据集(人民日报1998词性标注数据集):

https://pan.baidu.com/s/1fW908EQmyMv0XB5i0DhVyQ

词性标注工具推荐

Jieba

“结巴”中文分词:做最好的 Python 中文分词组件,可以进行词性标注。

Github地址:https://github.com/fxsjy/jieba

# 安装:pip install jieba
# 国内源安装更快:pip install jieba -i https://pypi.tuna.tsinghua.edu.cn/simple
# 先导包:jieba.posseg.dt 为默认词性标注分词器
# 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。import jieba.posseg as pseg
words = pseg.cut("我爱自然语言处理技术!")
for word, pos in words:print(word, pos)我 r
爱 v
自然语言 l
处理 v
技术 n
! x

SnowNLP

SnowNLP是一个python写的类库,可以方便的处理中文文本内容。

Github地址:https://github.com/isnowfy/snownlp

# 安装:pip install snownlp
# 国内源安装:pip install snownlp  -i https://pypi.tuna.tsinghua.edu.cn/simple
# 使用snownlp进行词性标注
from snownlp import SnowNLP
model = SnowNLP(u'我爱自然语言处理技术!')
for word, pos in model.tags:print(word, pos)我 r
爱 v
自然 n
语言 n
处理 vn
技术 n
! w

THULAC

THULAC(THU Lexical Analyzer for Chinese)由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。

Github地址:https://github.com/thunlp/THULAC

# 安装:pip install thulac
# 国内源安装:pip install thulac     -i https://pypi.tuna.tsinghua.edu.cn/simple
# 使用thulac进行词性标注
import thulac
thulac_model = thulac.thulac()
wordseg = thulac_model.cut("我爱自然语言处理技术!")
print(wordseg)Model loaded succeed
[['我', 'r'], ['爱', 'v'], ['自然', 'n'], ['语言', 'n'], ['处理', 'v'], ['技术', 'n'], ['!', 'w']]

StanfordCoreNLP

斯坦福NLP组的开源,支持python接口。

Github地址:https://github.com/Lynten/stanford-corenlp

# 安装:pip install stanfordcorenlp
# 国内源安装:pip install stanfordcorenlp -i https://pypi.tuna.tsinghua.edu.cn/simple
# 使用stanfordcorenlp进行词性标注
# 同时支持英文和中文的词性标注
from stanfordcorenlp import StanfordCoreNLP
zh_model = StanfordCoreNLP(r'stanford-corenlp-full-2018-02-27', lang='zh')
s_zh = '我爱自然语言处理技术!'
word_pos_zh = zh_model.pos_tag(s_zh)
print(word_pos_zh)[('我爱', 'NN'), ('自然', 'AD'), ('语言', 'NN'), ('处理', 'VV'), ('技术', 'NN'), ('!', 'PU')]eng_model = StanfordCoreNLP(r'stanford-corenlp-full-2018-02-27')
s_eng = 'I love natural language processing technology!'
word_pos_eng = eng_model.pos_tag(s_eng)
print(word_pos_eng)[('I', 'PRP'), ('love', 'VBP'), ('natural', 'JJ'), ('language', 'NN'), ('processing', 'NN'), ('technology', 'NN'), ('!', '.')]

HanLP

HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。

Github地址:https://github.com/hankcs/pyhanlp

# 安装:pip install pyhanlp
# 国内源安装:pip install pyhanlp  -i https://pypi.tuna.tsinghua.edu.cn/simple
# 使用pyhanlp进行词性标注
from pyhanlp import *
s = '我爱自然语言处理技术!'
word_seg = HanLP.segment(s)
for term in word_seg:print(term.word, term.nature)我 rr
爱 v
自然语言处理 nz
技术 n
! w

NLTK

NLTK是一个高效的Python构建的平台,用来处理人类自然语言数据。

Github地址:https://github.com/nltk/nltk 官网:http://www.nltk.org/

# 安装:pip install nltk
# 国内源安装:pip install nltk  -i https://pypi.tuna.tsinghua.edu.cn/simple
import nltk
s = 'I love natural language processing technology!'
s = nltk.word_tokenize(s)
s_pos = nltk.pos_tag(s)
print(s_pos)[('I', 'PRP'), ('love', 'VBP'), ('natural', 'JJ'), ('language', 'NN'), ('processing', 'NN'), ('technology', 'NN'), ('!', '.')]

SpaCy

工业级的自然语言处理工具,遗憾的是不支持中文。 Gihub地址:https://github.com/explosion/spaCy 官网:https://spacy.io/

# 安装:pip install spaCy
# 国内源安装:pip install spaCy  -i https://pypi.tuna.tsinghua.edu.cn/simple
# 下载不了模型,需要python -m spacy download en。 The easiest solution is to re-run the command as admin(意思是用用户管理权限打开CMD下载即可)
import spacy
eng_model = spacy.load('en')
s = 'I love natural language processing technology!'
# 词性标注
s_token = eng_model(s)
for token in s_token:print(token, token.pos_, token.pos)I PRON 94
love VERB 99
natural ADJ 83
language NOUN 91
processing NOUN 91
technology NOUN 91
! PUNCT 96

代码已上传:https://github.com/yuquanle/StudyForNLP/blob/master/NLPbasic/POS.ipynb

参考:

1.统计自然语言处理

2.中文信息处理报告-2016

初学者|一起来看看词性标注相关推荐

  1. 1024,一封写给CSDN家园Python初学者的信 | Python初级、中级、高级学习路线

    又是一年1024,祝所有程序员节日快乐,健康开心,祝CSDN越来越好.转眼,已经在CSDN分享了十多年博客,感谢大家的陪伴和祝福,在这里我与许多人成为了朋友,感恩.非常遗憾,这次没能去长沙岳麓书院见很 ...

  2. 1024,一封写给CSDN家园Python初学者的信 Python初级、中级、高级学习路线

    又是一年1024,祝所有程序员节日快乐,健康开心,祝CSDN越来越好.转眼,已经在CSDN分享了十多年博客,感谢大家的陪伴和祝福,在这里我与许多人成为了朋友,感恩.非常遗憾,这次没能去长沙岳麓书院见很 ...

  3. 有哪些IT初学者(新人)成长为技术大牛的真实经历?

    这里是修真院前端小课堂,本篇分析的主题是 [有哪些IT初学者(新人)成长为技术大牛的真实经历?] 第一章 定调 IT技术是以年来计算的,为什么会是以年来计算,等你们看完就会明白一点点. 做技术的,会就 ...

  4. [论文阅读] (01) 拿什么来拯救我的拖延症?初学者如何提升编程兴趣及LATEX入门详解

    又是在凌晨三点赶作业,又是在Deadline前去熬夜,一次次无眠,一次次抱怨.为什么三年前.两年前.一年前,甚至是昨天,我都下定决心"从现在开始读顶会论文",却又悄悄选择逃避:为什 ...

  5. python删除字典中性别为男_python初学者,用python3实现基本的学生管理系统代码实例...

    本篇文章主要分享python学生管理系统的使用,文章非常详细地介绍了通过示例代码实现的学生管理系统,该系统对每个人的研究或工作都有一定的参考学习价值,希望你能在其中有所收获. 这个是用python实现 ...

  6. eclipse 收缩 选择行_一文解决Java初学者的选择难题

    很多Java初学者在刚开始会被一些诸如环境搭建.软件构建等问题所迷惑,本文将给出答案,帮助初学者找到正确答案,快速上手Java开发. Java Logo 全文答案 Java的版本: Java8 开发环 ...

  7. mysql服务器端的参数有很多_但是对于大多数初学者来说_mysql优化的重要参数 key_buffer_size table_cache...

    MySQL服务器端的参数有很多,但是对于大多数初学者来说,众多的参数往往使得我们不知所措,但是哪些参数是需要我们调整的,哪些对服务器的性能影响最大呢?对于使用Myisam存储引擎来说,主要有key_b ...

  8. 完整的Blender三维课程:素描到三维艺术的初学者

    使用Blender创建3D艺术.初级课程 你会学到什么 使用Blender并理解它的界面 创建3D模型 创建您自己的材料 布料仿真.纹理和雕刻 第三种解释的相机法则 照相机景深 灯光设置 渲染 如何使 ...

  9. 完整的虚幻引擎超级课程:从初学者到专家

    通过这个循序渐进的课程,学习如何像专业人士一样开发游戏和设计! 你会学到什么 如何使用虚幻引擎及其元素 电子游戏力学原理 平衡计分卡几何原理 蓝图脚本的原则 如何设计.开发和编写你的关卡来复制你最喜欢 ...

  10. 面向完全初学者的Unity和C#游戏开发学习教程

    了解如何通过使用Unity游戏引擎和C#制作BomberMan风格的3D游戏来制作您的第一款视频游戏 你会学到: 使用Unity 2021学习3D游戏开发 通过制作你的第一个3D游戏来学习C#编程语言 ...

最新文章

  1. 循环爬取图片_Java爬取简单的网页内容和图片
  2. 我是怎么提高单片机编程能力的?
  3. 用 python print() 函数实现的三个特效
  4. python一行行写文件_python一行行写文件-女性时尚流行美容健康娱乐mv-ida网
  5. thinkphp开启子域名无法正常访问_解决TP6报错“当前访问路由未定义或不匹配”...
  6. Bossie Awards 开源大数据工具最佳列表
  7. 安装脚本实现百度云播放视频加速
  8. Android播放器实现横竖屏切换
  9. 【转载】手机UC浏览器缓存视频合并方法
  10. c程序设计语言看第几版,到底该怎样评价谭浩强版《C程序设计》?
  11. bestpay学习 - - 一个轻量级的完全开源项目
  12. java 浮雕效果,制作逼真缝线牛皮文字效果的PS教程
  13. Zabbix Server trapper命令注入漏洞(CVE-2020-11800)
  14. 用python做股市数据分析一_用python做股票数据分析(兴趣篇)
  15. Web前端:古诗排版网页案例设计
  16. 【个人C++学习日记】
  17. android程序开发笔记
  18. 赂峭狭衷麓炯寥雷绕渍
  19. 查找:顺序查找、二分查找、分块查找
  20. 一个小工具,助力企业开发如虎添翼

热门文章

  1. UVA - 10820欧拉函数的应用
  2. 解决 HttpClient 模拟 http 的get 请求后 ,出现 403 错误
  3. 软件架构——设计原则
  4. Sitecore 6.4 升级Sitecore 8.2.7准备
  5. 26. The Greenhouse Effect and Its Consequences 温室效应及其后果
  6. 【Linux】【Shell】【Basic】函数
  7. Linux 僵尸进程查杀
  8. jsp 基本语法学习笔记
  9. C++编程语言中的值传递(pass-by-value)和引用传递(pass-by-reference)介绍
  10. Codeforces Round #309 (Div. 1) A(组合数学)