分词、词性标注及命名实体识别介绍及应用
分词
中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成
一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合
成词序列的过程。
中文/n 分词/n 是/v 其他/p 中文/n (信息,n) 处理/v 的 基础,搜索引擎、
机器翻译(MT)、语音合成、自动分类、自动摘要、自动校对等等,都
需要用到分词。
词性标注
词性 标注(Part-of-Speech tagging 戒POS tagging),又称词类标注
戒者简称标注,是指为分词结果中的每个单词标注一个正确的词性的程
序,也即确定每个词是名词、动词、形容词戒其他词性的过程。在汉语
中,词性标注比较简单,因为汉语词汇词性多变的情况比较少见,大多
词语只有一个词性,戒者出现频次最高的词性远远高于第二位的词性。
据说,只需选取最高频词性,即可实现80%准确率的中文词性标注程序。
不同的工具词性标注不一定一样,以下是jieba标注:
词性标注
Ag
形语素
形容词性语素。形容词代码为 a,语素代码g前面置以A。 a
形容词
取英语形容词 adjective的第1个字母。
ad
副形词
直接作状语的形容词。形容词代码 a和副词代码d并在一起。
an
名形词
具有名词功能的形容词。形容词代码 a和名词代码n并在一起。
b
区别词
取汉字“别”的声母。
c
连词
取英语连词 conjunction的第1个字母。
dg
副语素
副词性语素。副词代码为 d,语素代码g前面置以D。 d
副词
取 adverb的第2个字母,因其第1个字母已用于形容词。
e
叹词
取英语叹词 exclamation的第1个字母。
f
方位词
取汉字“方”
g
语素
绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。
h
前接成分
取英语 head的第1个字母。
i
成语
取英语成语 idiom的第1个字母。
j
简称略语
取汉字“简”的声母。
k
后接成分
l
习用语
习用语尚未成为成语,有点“临时性”,取“临”的声母。
m
数词
取英语 numeral的第3个字母,n,u已有他用。
Ng
名语素
名词性语素。名词代码为 n,语素代码g前面置以N。 n
名词
取英语名词 noun的第1个字母。
nr
人名
名词代码 n和“人(ren)”的声母并在一起。
ns
地名
名词代码 n和处所词代码s并在一起。
nt
机构团体
“团”的声母为 t,名词代码n和t并在一起。
nz
其他丏名
“丏”的声母的第 1个字母为z,名词代码n和z并在一起。
o
拟声词
取英语拟声词 onomatopoeia的第1个字母。
p
介词
取英语介词 prepositional的第1个字母。
q
量词
取英语 quantity的第1个字母。
r
代词
取英语代词 pronoun的第2个字母,因p已用于介词。
v
动词
取英语动词 verb的第一个字母。
vd
副动词
直接作状语的动词。动词和副词的代码并在一起。
vn
名动词
指具有名词功能的动词。动词和名词的代码并在一起。
w
标点符号
x
非语素字
非语素字只是一个符号,字母 x通常用于代表未知数、符号。
y
语气词
取汉字“语”的声母。
z
状态词
取汉字“状”的声母的前一个字母。
un
未知词
不可识别词及用户自定义词组。取英文Unkonwn首两个字母。(非北大标准,CSW分词中定义)
命名实体识别
命名实体识别(Named Entity Recognition,简称NER),又称作“丏
名识别”,是指识别文本中具有特定意义的实体,主要包括人名、地名、
机构名、丏有名词等。一般来说,命名实体识别的任务就是识别出待处
理文本中三大类(实体类、时间类和数字类)、七小类(人名、机构名、
地名、时间、日期、货币和百分比)命名实体。
在不同的顷目中,命名实体类别具有不同的定义。
jieba
import jieba
seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 精确模式
seg_list = jieba.cut("他来到了网易杭研大厦") # 默认是精确模式
print(", ".join(seg_list))
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") # 搜索引擎模式
print(", ".join(seg_list))
import jieba.posseg as pseg
strings="是广泛使用的中文分词工具,具有以下特点:"
words = pseg.cut(strings)
for word, flag in words:
print('%s %s' % (word, flag))
Stanford NLP
Stanford NLP提供了一系列自然语言分析工具。它能够给出基本的
词形,词性,不管是公司名还是人名等,格式化的日期,时间,量词,
并且能够标记句子的结构,语法形式和字词依赖,指明那些名字指向同
样的实体,指明情绪,提取发言中的开放关系等。
1.一个集成的语言分析工具集;
2.进行快速,可靠的任意文本分析;
3.整体的高质量的文本分析;
4.支持多种主流语言;
5.多种编程语言的易用接口;
6.方便的简单的部署web服务。
• Python 版本stanford nlp 安装
• 1)安装stanford nlp自然语言处理包: pip install stanfordcorenlp
• 2)下载Stanford CoreNLP文件
https://stanfordnlp.github.io/CoreNLP/的CoreNLP 3.9.2以及模型jar包,这里下载了英文和中文模型jar包。
• 3)把加压后的Stanford CoreNLP文件夹和下载的s英文和中文模型jar包放在同一目录下
• 5)在Python中引用模型:
• from stanfordcorenlp import StanfordCoreNLP
• nlp = StanfordCoreNLP(r‘path’, lang=‘zh’)
对一段句子进行分词(word_tokenize)、词性标注(pos_tag)、命名实体识别(ner)、句法依存分析(dependency_parse)、句法解析(parse)
from stanfordcorenlp import StanfordCoreNLP
nlp = StanfordCoreNLP(r'E:/python/stanford-corenlp',lang='zh')
# 其中两个参数分别表示解压缩的文件夹目录以及语言选择,如果是英文则lang='en',其他语言以此类推。
s = "清华大学位于北京市海淀区中关村北大街"
#-*-encoding=utf8-*-
from stanfordcorenlp import StanfordCoreNLP
nlp = StanfordCoreNLP(r'E:/python/stanford-corenlp',lang='zh')
fin=open('news.txt','r',encoding='utf8')
fner=open('ner.txt','w',encoding='utf8')
ftag=open('pos_tag.txt','w',encoding='utf8')
for line in fin:
line=line.strip()
if len(line)<1:
continue
fner.write(" ".join([each[0]+"/"+each[1] for each in nlp.ner(line) if len(each)==2 ])+"\n")
ftag.write(" ".join([each[0]+"/"+each[1] for each in nlp.pos_tag(line) if len(each)==2 ])+"\n")
fner.close()
ftag.close()
写入结果
Hanlp
HanLP是由一系列模型与算法组成的Java工具包,目标是普及自然
语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构
清晰、语料时新、可自定义的特点。
功能:中文分词 词性标注 命名实体识别 依存句法分析 关键词提取
新词发现 短语提取 自动摘要 文本分类 拼音简繁
Hanlp环境安装
• 1、安装Java和Visual C++:我装的是Java 1.8和Visual C++ 2015。
• 2、安裝Jpype,conda install -c conda-forge jpype1
• 3、测试是否按照成功:
from jpype import *
startJVM(getDefaultJVMPath(), “-ea”)
java.lang.System.out.println(“Hello World”)
shutdownJVM()
Hanlp安装
• 1)下载hanlp.jar包: https://github.com/hankcs/HanLP
• 2、下载data.zip:https://github.com/hankcs/HanLP/releases中
http://hanlp.linrunsoft.com/release/data-for-1.7.0.zip后解压数据 包。
• 3、配置文件
• 示例配置文件:hanlp.properties
• 配置文件的作用是告诉HanLP数据包的位置,只需修改第一行:
root=usr/home/HanLP/ • 比如data目录是/Users/hankcs/Documents/data,那么
root=/Users/hankcs/Documents/
#-*- coding:utf-8 -*-
from jpype import *
startJVM(getDefaultJVMPath(), "-Djava.class.path=E:\python\hanlp\hanlp-1.5.0.jar;E:\python\hanlp",
"-Xms1g",
"-Xmx1g") # 启动JVM,Linux需替换分号;为冒号: # 指定hanlp路径
print("=" * 30 + "HanLP分词" + "=" * 30)
HanLP = JClass('com.hankcs.hanlp.HanLP') # 初始化一个java的类
# 中文分词
print(HanLP.segment('你好,欢迎在Python中调用HanLP的API'))
print("-" * 70)
print("=" * 30 + "标准分词" + "=" * 30)
StandardTokenizer = JClass('com.hankcs.hanlp.tokenizer.StandardTokenizer')
print(StandardTokenizer.segment('你好,欢迎在Python中调用HanLP的API'))
print("-" * 70)
# NLP分词NLPTokenizer会执行全部命名实体识别和词性标注
print("=" * 30 + "NLP分词" + "=" * 30)
NLPTokenizer = JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
print(NLPTokenizer.segment('中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程'))
print("-" * 70)
print("=" * 30 + "索引分词" + "=" * 30)
IndexTokenizer = JClass('com.hankcs.hanlp.tokenizer.IndexTokenizer')
termList = IndexTokenizer.segment("主副食品");
for term in termList:
print(str(term) + " [" + str(term.offset) + ":" + str(term.offset + len(term.word)) + "]")
print("-" * 70)
print("=" * 30 + " CRF分词" + "=" * 30)
print("-" * 70)
print("=" * 30 + " 极速词典分词" + "=" * 30)
SpeedTokenizer = JClass('com.hankcs.hanlp.tokenizer.SpeedTokenizer')
print(NLPTokenizer.segment('江西鄱阳湖干枯,中国最大淡水湖变成大草原'))
print("-" * 70)
print("=" * 30 + " 自定义分词" + "=" * 30)
CustomDictionary = JClass('com.hankcs.hanlp.dictionary.CustomDictionary')
CustomDictionary.add('攻城狮')
CustomDictionary.add('单身狗')
HanLP = JClass('com.hankcs.hanlp.HanLP')
print(HanLP.segment('攻城狮逆袭单身狗,迎娶白富美,走上人生巅峰'))
print("-" * 70)
print("=" * 20 + "命名实体识别与词性标注" + "=" * 30)
NLPTokenizer = JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
print(NLPTokenizer.segment('中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程'))
print("-" * 70)
document = "水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露," \
"根据刚刚完成了水资源管理制度的考核,有部分省接近了红线的指标," \
"有部分省超过红线的指标。对一些超过红线的地方,陈明忠表示,对一些取用水项目进行区域的限批," \
"严格地进行水资源论证和取水许可的批准。"
print("=" * 30 + "关键词提取" + "=" * 30)
print(HanLP.extractKeyword(document, 8))
print("-" * 70)
print("=" * 30 + "自动摘要" + "=" * 30)
print(HanLP.extractSummary(document, 3))
print("-" * 70)
text = r"算法工程师\n 算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法工程师就是利用算法处理事物的人。\n \n 1职位简介\n 算法工程师是一个非常高端的职位;\n 专业要求:计算机、电子、通信、数学等相关专业;\n 学历要求:本科及其以上的学历,大多数是硕士学历及其以上;\n 语言要求:英语要求是熟练,基本上能阅读国外专业书刊;\n 必须掌握计算机相关知识,熟练使用仿真工具MATLAB等,必须会一门编程语言。\n\n2研究方向\n 视频算法工程师、图像处理算法工程师、音频算法工程师 通信基带算法工程师\n \n 3目前国内外状况\n 目前国内从事算法研究的工程师不少,但是高级算法工程师却很少,是一个非常紧缺的专业工程师。算法工程师根据研究领域来分主要有音频/视频算法处理、图像技术方面的二维信息算法处理和通信物理层、雷达信号处理、生物医学信号处理等领域的一维信息算法处理。\n 在计算机音视频和图形图像技术等二维信息算法处理方面目前比较先进的视频处理算法:机器视觉成为此类算法研究的核心;另外还有2D转3D算法(2D-to-3D conversion),去隔行算法(de-interlacing),运动估计运动补偿算法(Motion estimation/Motion Compensation),去噪算法(Noise Reduction),缩放算法(scaling),锐化处理算法(Sharpness),超分辨率算法(Super Resolution),手势识别(gesture recognition),人脸识别(face recognition)。\n 在通信物理层等一维信息领域目前常用的算法:无线领域的RRM、RTT,传送领域的调制解调、信道均衡、信号检测、网络优化、信号分解等。\n 另外数据挖掘、互联网搜索算法也成为当今的热门方向。\n"
print("=" * 30 + "短语提取" + "=" * 30)
print(HanLP.extractPhrase(text, 10))
print("-" * 70)
shutdownJVM()