赞
踩
大家好,今天和大家分享一下,我在自然语言处理(Natural Language Processing,NLP)的一些学习经验和心得体会。
主要内容分为两大部分,
第一部分对汉语自然处理的服务提供商及其服务内容做一个简单的梳理,让大家能够更好的了解目前的技术手段,技术现状。
第二部分,从汉语语言学,到传统的汉语自然语言处理方法的基础,汉语分词,力求在微观上让大家对汉语自然语言处理有一个全方位的认识。
NLP 是人工智能和语言学领域的交叉学科,用于分析、理解和生成自然语言,以方便人和计算机设备进行交流,以及人与人之间的交流
自然语言处理在广义上分为两大部分:
NLP 技术按照由浅入深可以分为三个层次,分别为:
这三个层次中,基础技术主要是对自然语言中的基本元素进行表示和分析,比如词汇,短语,句子。
词汇短语分析中,大家熟知的分词技术,就是为了解决如下问题,比如:我去北京大学玩,北京大学独立成词,而不是分成北京和大学。
句法语义分析:对于给定的句子,进行分词、词性标记、命名实体识别和链接、句法分析、语义角色识别和多义词消歧。
NLP 的核心技术是建立在基础技术之上的的技术产出,基础技术中如词法,句法的分析越准确,核心技术的产出才能越准确。核心技术主要包括以下几个方面:
信息抽取
从给定文本中抽取重要的信息,比如,时间、地点、人物、事件、原因、结果、数字、日期、货币、专有名词等等。通俗说来,就是要了解谁在什么时候、什么原因、对谁、做了什么事、有什 么结果。涉及到实体识别、时间抽取、因果关系抽取等关键技术。
文本挖掘(或者文本数据挖掘)
包括文本聚类、分类、信息抽取、摘要、情感分析以及对挖掘的信息和知识的可视化、交互式的表达界面。目前主流的技术都是基于统计机器学习的。
机器翻译
把输入的源语言文本通过自动翻译获得另外一种语言的文本。根据输入媒介不同,可以细分为文本翻译、语音翻译、手语翻译、图形翻译等。机器翻译从最早的基于规则的方法到二十年前的基于统计的方法,再到今天的基于神经网络(编码-解码)的方法,逐渐形成了一套比较严谨的方法体系。
信息检索
对大规模的文档进行索引。可简单对文档中的词汇,赋之以不同的权重来建立索引,也可利用(句法分析,信息抽取,文本发掘)来建立更加深层的索引。在查询的时候,对输入的查询表达式比如一个检索词或者一个句子进行分析,然后在索引里面查找匹配的候选文档,再根据一个排序机制把候选文档排序,最后输出排序得分最高的文档。
能够真正影响我们生活的黑科技,能够通过图灵测试的机器问答系统,我们可以称之为NLP+
问答系统
对一个自然语言表达的问题,由问答系统给出一个精准的答案。需要对自然语言查询语句进行某种程度的语义分析,包括实体链接、关系识别,形成逻辑表达式,然后到知识库中查找可能的候选答案并通过一个排序机制找出最佳的答案。
对话系统
系统通过一系列的对话,跟用户进行聊天、回答、完成某一项任务。涉及到用户意图理解、通用聊天引擎、问答引擎、对话管理等技术。此外,为了体现上下文相关,要具备多轮对话能力。
AI助手
目前自然语言处理的前沿,已经与人类真假难辨
https://v.qq.com/x/page/w0648xqraxj.html
参考:
https://www.zhihu.com/question/19895141/answer/149475410
以下我们通过一些知名中文NLP服务提供商,包括我们熟知的云服务提供商BAT ,aws,以及两家科研院所的系统简介,来介绍以及宏观认识NLP的各种技术手段和应用场景。
首先介绍的是两家NLP基础分析,准确率很高的科研院所 的产品,源自北理工和哈工大,之后我们介绍知名云服务提供商的产品。
主页:http://ictclas.nlpir.org/
在线演示系统:http://ictclas.nlpir.org/
Python版本:https://github.com/tsroten/pynlpir
(需要频繁更新key)
https://blog.csdn.net/sinat_26917383/article/details/77067515
对于****这篇新闻稿 的实体抽取结果
http://news.163.com/18/0715/14/DMOTHJEK000189FH.html
该系统为汉语自然语言处理领域顶尖大牛,北京理工大学张华平博士20年的专业技术积累,NShort 革命性分词算法的发明者。
主要功能包括中文分词;英文分词;中英文混合分词,词性标注;命名实体识别;新词识别;关键词提取;支持用户专业词典与微博分析。NLPIR系统支持多种编码、多种操作系统、多种开发语言与平台。
该平台的特点为:功能丰富,分词,语义,实体发现准确率高,近期发布了最新的2018版。
(与熟知的jieba,ltp,清华thulac)
https://www.ltp-cloud.com/
源自哈工大知名的分词插件ltp,准确率高
Python版本:https://github.com/HIT-SCIR/pyltp
语言技术平台(Language Technology Platform,LTP)是哈工大社会计算与信息检索研究中心历时十年开发的一整套中文语言处理系统。LTP制定了基于XML的语言处理结果表示,并在此基础上提供了一整套自底向上的丰富而且高效的中文语言处理模块(包括词法、句法、语义等6项中文处理核心技术),以及基于动态链接库(Dynamic Link Library, DLL)的应用程序接口、可视化工具,并且能够以网络服务(Web Service)的形式进行使用。
“语言云”
以哈工大社会计算与信息检索研究中心研发的 “语言技术平台(LTP)” 为基础,为用户提供高效精准的中文自然语言处理云服务。 使用 “语言云” 非常简单,只需要根据 API 参数构造 HTTP 请求即可在线获得分析结果,而无需下载 SDK 、无需购买高性能的机器,同时支持跨平台、跨语言编程等。 2014年11月,哈工大联合科大讯飞公司共同推出 “哈工大-讯飞语言云”,借鉴了讯飞在全国性大规模云计算服务方面的丰富经验,显著提升 “语言云” 对外服务的稳定性和吞吐量,为广大用户提供电信级稳定性和支持全国范围网络接入的语言云服务,有效支持包括中小企业在内开发者的商业应用需要。
有关更多语言云API的使用方法,请参考:http://www.ltp-cloud.com/document/
windows 下安装pyltp的话,应该是需要安装visual studio, 由于LTP是用c++写的,pyltp也是基于它封装而成的,需要调用 cl.exe 完成源码的编译。然后下载源码,使用python setup.py install 的方式进行安装就可以了。
https://amazonaws-china.com/cn/comprehend/?nc2=h_a1
Amazon Comprehend 是一项自然语言处理 (NLP) 服务,可利用机器学习发现文本中的见解和关系。Amazon Comprehend 可以识别文本语言,提取关键的短语、地点、人物、品牌或事件,了解文本的含义是肯定还是否定,还可以自动按主题整理一系列文本文件。
您可使用 Amazon Comprehend API 分析文本,并将结果进行广泛应用,包括客户意见分析、智能文档搜索以及 Web 应用程序的内容个性化设置。
该服务不断地通过各种信息来源 (包括世界上最大的自然语言数据集之一:Amazon.com 商品描述和买家评论) 学习和提升, 以跟上语言的发展演变。
实例:利用 AWS Comprehend 打造近实时文本情感分析
https://amazonaws-china.com/cn/blogs/china/realizing-near-real-time-text-sentiment-analysis-with-aws-comprehend/
可以看到图中,aws 使用kibana 仪表盘和 Comprehend 服务组成了一个实时的电影评论实时分析系统,其实主要功能就是实现了分词和内容来源的地理位置统计,看起来很炫酷。
https://data.aliyun.com/product/nlp?spm=5176.8142029.388261.396.63f36d3eoZ8kNK
阿里的简介为:
自然语言处理是为各类企业及开发者提供的用于文本分析及挖掘的核心工具,
已经广泛应用在电商、文化娱乐、金融、物流等行业客户的多项业务中。
自然语言处理API可帮助用户搭建内容搜索、内容推荐、舆情识别及分析、文本结构化、对话机器人等智能产品,
也能够通过合作,定制个性化的解决方案。
现在购买资源包,享受梯度优惠的同时,基础版API更有每天5万次免费调用额度。
值得注意的是阿里云的nlp 服务刚发布不到1年,应该算是领域内的新手,语料库应该和aws 一样,主要为商品描述和评论,所以它有一项功能叫做商品评价解析
https://cloud.tencent.com/product/nlp
界面友好,功能丰富,语料库为海量综合性语料库
腾讯云智在线演示系统
http://nlp.qq.com/semantic.cgi
http://ai.baidu.com/tech/nlp
依托海量检索数据,并且搜索引擎本身就是NLP 最终的结果产出,所以在NLP领域,百度无论是语料库丰富程度,技术先进性,以及服务多样性等都是遥遥领先其他厂家,基本上可以算作是中文NLP服务提供商的业界最佳实践。
- 词法分析
- 词向量表示
- 词义相似度
- 评论观点抽取
- 文章标签
- 依存句法分析
- DNN语言模型
- 短文本相似度
- 情感倾向分析
- 文章分类
- 对话情绪识别
- 文本纠错
等12个大类的服务,对于个人开发者来说,配比了免费额度,对于词向量来说,每秒免费的额度是5个词,基本可以够用拿来做点有趣的事情了。
从图中结果也可以看出,百度对词向量相似度的分析和我用余弦相似度的结果一样,可以推断出百度的算法比较接地气。
Deep Neural Network(DNN)模型是基本的深度学习框架,DNN语言模型是通过计算给定词组成的句子的概率,从而判断所组成的句子是否符合客观语言表达习惯
通常用于机器翻译、拼写纠错、语音识别、问答系统、词性标注、句法分析和信息检索等
百度这个模型是大厂中首个公开提供服务接口的深度学习语言模型。
提供更加简单的调用方式:类似aws boto3
如果已安装pip,执行pip install baidu-aip即可
Sdk 方式,安装
from aip import AipNlp
""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'
client = AipNlp(APP_ID, API_KEY, SECRET_KEY)
word = "张飞"
""" 调用词向量表示 """
client.wordEmbedding(word);
THULAC实验室在统一测试环境下,对若干流行分词软件和THULAC进行了测试,使用的模型为各分词软件自带模型。THULAC使用的是随软件提供的简单模型Model_1。评测环境为 Intel Core i5 2.4 GHz 评测结果如下:
msr_test(560KB)
Algorithm | Time | Precision | Recall |
---|---|---|---|
LTP-3.2.0 | 3.21s | 0.867 | 0.896 |
ICTCLAS(2015版) | 0.55s | 0.869 | 0.914 |
jieba | 0.26s | 0.814 | 0.809 |
THULAC | 0.62s | 0.877 | 0.899 |
pku_test(510KB)
Algorithm | Time | Precision | Recall |
---|---|---|---|
LTP-3.2.0 | 3.83s | 0.960 | 0.947 |
ICTCLAS(2015版) | 0.53s | 0.939 | 0.944 |
jieba | 0.23s | 0.850 | 0.784 |
THULAC | 0.51s | 0.944 | 0.908 |
除了以上在标准测试集上的评测,我们也对各个分词工具在大数据上的速度进行了评测,结果如下:
CNKI_journal.txt(51 MB)
Algorithm | Time | Speed |
---|---|---|
LTP-3.2.0 | 348.624s | 149.80KB/s |
ICTCLAS(2015版) | 106.461s | 490.59KB/s |
jieba | 22.5583s | 2314.89KB/s |
THULAC | 42.625s | 1221.05KB/s |
本文截取清华和部分网络评测,以及个人使用结果发现。最好使用的开源组件如python的jieba 分词准确度并不是很高,这是由于离线的模型很难在新词的发现上做出比较好的结果。由于云服务提供商的在线模型一般的更新频率 较快,所以准确度较高。
清华评测性能对比:
http://thulac.thunlp.org/
基于python 版本的评测:
https://blog.csdn.net/riario/article/details/78259877
BosonNLP(界面,接口友好,准确率高)
https://bosonnlp.com/demo
如果你在网上搜索汉语分词评测,十有八九你会搜索到专注于汉语自然语言处理技术的这家公司,以及下面这张评测结果:
NLP 领域有非常多的开源组件可以用来快速构建开发的原型,我来简单介绍以下四个知名开源组件
http://www.nltk.org/
https://github.com/fxsjy/jieba
“结巴”中文分词:做最好的 Python 中文分词组件
“Jieba” (Chinese for “to stutter”) Chinese text segmentation: built to be the best Python Chinese word segmentation module.
实现基本功能的代码量在一千行左右,词典长度35w ,安装方式友好,简洁,高效,(但准确性已经跟不上时代!!!85%)
http://ictclas.nlpir.org/
主要功能包括中文分词;词性标注;中英混合分词;命名实体识别;用户词典功能;支持GBK编码、UTF8编码、BIG5编码。新增微博分词、新词发现与关键词提取;张华平博士先后倾力打造20余年,内核升级10次。
全球用户突破20万,先后获得了2010年钱伟长中文信息处理科学技术奖一等奖,2003年国际SIGHAN分词大赛综合第一名,2002年国内973评测综合第一名。
https://radimrehurek.com/gensim/
它的 slogan 是:Topic modelling for humans.
Gensim提供了一个发现文档语义结构的工具,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。它将语料(Corpus)向量化表示后,主要能够实现以下三个功能:
简介参考:https://www.cnblogs.com/iloveai/p/gensim_tutorial.html
下面我们进入第二个部分的介绍,汉语语言学与汉语分词技术。
汉语,即汉族的语言,是中国通用语言,国际通用语言之一,属汉藏语系,汉语历史悠久,使用人数最多,世界上使用汉语的人数至少15亿 ,超过世界总人口的20%
汉字最早起源于商朝的甲骨文,距今已经有3000-4000年的历史了。文字的目的是为了记录,古汉语以独字为核心,即使隋唐以后汉语书面语逐渐向口语化发展,从甲骨文出现至今的4000年中,汉语基本的语法格局和造字方法始终没有本质变化。
秦朝李斯受命统一文字,图中这种文字就是小篆。通行于秦代。形体偏长,匀圆齐整,由大篆衍变而成。小篆也叫“秦篆”。东汉许慎《说文解字·叙》 称:“秦始皇帝初兼天下……罢其不与秦文合者。”李斯作《仓颉篇》,中车府令赵高作《爰历篇》,太史令胡毋敬作《博学篇》,“皆取史籀大篆,或颇省改,所谓小篆者也。”今存《琅琊台刻石》、 《泰山刻石》残石,即小篆代表作。
汉字统一后,我们的祖先通过造字并且成词,成句,最终留下了浩如烟海的璀璨文化。
值得一提的是,对于计算机可以理解的语料库,知识库,我国起步很晚。
1979年开始,中国开始机器可读的语料库的建设,至1991年开始建设国家级的语料库。现在我们使用汉语分词开源组件的大部分语料库都是基于《人民日报》加工的,一般项目包括词语切分、词性标注、专有名词(专有名词短语)标注。还要对多音词注音。
从古至今,汉语的表达基本单位是字,造字的方法六书:
象形,指事,会意,转注,假借,形声
汉语中每个字都有非常丰富的含义。比如图片中的会意字,顺字,就在字本身上表达出了,柔顺通顺的含义。
当然印欧语系与汉语的诸多不同中,有如下两点是至关重要的。
基于印欧语系这些特点,在自然语言诞生的初期阶段,句法分析已经成为西方NLP的核心主题
在汉语自然语言处理的过程中,遇到的问题与印欧语言有诸多不同:首先中文分词就是西方语言所不曾遇到的问题
在句法解析环节,如果照搬西方语言的算法理论,越来越多 的事实证明,句法分析的在汉语上的精度要显著低于西方语言。
汉语词汇是汉语语言中能够独立运用的最小语言单位,是语言中的原子结构。独立运用意味着,单独做句法成分或单独起语法作用。
因此对中文进行分词就显的至关重要。汉字有5-20万多个,但是常用的汉字仅有6000个,在线新华字典中收录了约52万个汉语词汇。
在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比之英文要复杂得多、困难得多。(比如北京大学的划分,是单独成词还是两个词,这样的中文词汇还有很多)
说到汉语词汇,汉语词汇有三个重要特性:
1.稳固性
2.常用性
3.能产性
前两个特性很好理解,能产性说的是,人们给小孩子起名就是词汇能产性的生动体现,汉语的构词机制是一个动态的自组织认知系统,所以汉语自然语言处理的魅力就在于,对于此类在社会发展过程中出现的新词,人名,组织机构名,如何正确切分并且识别。
由于国际上常用的NLP算法,深层次的语法语义分析通常都是以词作为基本单位,很多中文的自然语言处理的任务,也就多了一个预处理的过程来把连续的汉字分隔成更具有语言语义学上意义的词。这个过程就叫做分词。
简要来说分词就是:把没有明显分界标志的字串切分为词串
中文分词研究经历20于年,主要分化为三个流派。
1.机械式分词法(基于词典)
2.基于语法和规则的分词法
3.基于统计的分词法
最终较为成功的实现了中文词汇的自动切分技术(最近兴起的深度学习技术,又提供了新的分词思路)
尽管在语言学语义学上,词有着相对清晰的定义,对于计算机处理自然语言来说,分词很多时候没有放之四海皆准的共同标准。由于分词本身更多的时候是作为一个预处理的过程,判断其质量的好坏更多的时候需要结合下游的应用来进行。
分词问题为中文文本处理的基础性工作,分词效果的好坏对后面的中文信息处理其关键作用
参考:
深入NLP———看中文分词如何影响你的生活点滴
https://baike.baidu.com/tashuo/browse/content?id=d276fc8ff138ce5c74e7683b&lemmaId=&fromLemmaModule=pcBottom
以我认为使用起来最友好的jieba 分词为例,我们来认识一下基于统计类算法的汉语分词流程。
图片中例子参考:http://www.cnblogs.com/zhbzz2007/p/6076246.html
结巴分词安装好即可使用,自带一个35w 的语料库,其中标注了汉语常见词汇的词频,和词性。
概况来说,结巴分词主要有以下三个特点。
1.基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)
2.采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
3.对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法
jieba 分词算法的主要流程为三步
0.首先加载词库,完成初试环境设置
1.对于给定待分词的句子, 使用正则获取匹配的中文字符(和英文字符)切分成的短语列表(在语料库中);
即,对指定的词库dict.txt进行计算生成前缀词典,到jieba进程的初始化工作完成后就调用get_DAG获得句子的DAG(有向无环图);
2.根据句子的DAG则使用DAG(查字典)和动态规划, 得到最大概率路径, 对DAG中那些没有在字典中查到的字, 组合成一个新的片段短语, 使用HMM模型进行分词, 也就是识别新词, 即识别字典外的新词
如果没有前缀词典或者有些词不在前缀词典中,则可以利用HMM模型进行分词,主要是将分词问题视为一个序列标注(sequence labeling)问题,其中,句子为观测序列,分词结果为状态序列。首先通过语料训练出HMM相关的模型,然后利用Viterbi算法进行求解,最终得到最优的状态序列,然后再根据状态序列,输出分词结果。
HMM(Hidden Markov Model) 隐马尔可夫模型,一种简单的网络图模型,同时是一种产生式模型是为了弄清楚并模拟数据产生的原理和机制。
HMM模型+viterbi算法(高通公司的联合创始人发明)进行分词的主要思想就是:
给定训练好的模型(如HMM)参数(λ=(A,B,π)), 然后对模型进行载入,再运行一遍Viterbi算法,就可以找出每个字对应的状态(B, M, E, S),这样就可以根据状态也就可以对句子进行分词。
4-tag,也就是每个字处在词语中的4种可能状态:
B、M、E、S,分别表示
- Begin(这个字处于词的开始位置)
- Middle(这个字处于词的中间位置)
- End(这个字处于词的结束位置)
- Single(这个字是单字成词)
基本规则
B后面只能接(M或者E),不可能接(B或者S);而M后面也只能接(M或者E),不可能接(B或者S)
具体如下图所示,“去”和“玩”都是单字成词,因此状态就是S,“北京大学”是多字组合成的词,因此“北”、“京”、“大”、“学”分别位于“北京大学”中的B、M、M、E。
序列标注,就是将输入句子和分词结果当作两个序列,句子为观测序列,分词结果为状态序列,当完成状态序列的标注,也就得到了分词结果。实际上词性标注问题是一个解码问题。
由Viterbi算法得到状态序列(包含分词及词性标注),也就可以根据状态序列得到分词结果。其中状态以B开头,离它最近的以E结尾的一个子状态序列或者单独为S的子状态序列,就是一个分词。以”去北京大玩学城“为例,其中,“去“和”北京”在前缀词典中有,因此直接通过词–词性词典对其匹配即可,它俩的词性分别为“去/v”,“北京/ns”;而对于”大玩学城“这个句子,是未登录词,因此对其利用隐马尔科夫模型对其进行词性标志,它的隐藏状态序列就是[(u’S’, u’a’), (u’B’, u’n’), (u’E’, u’n’), (u’B’, u’n’)]这个列表,列表中的每个元素为一个元组,则分词为”S / BE / B“,对应观测序列,也就是”大 / 玩学 / 城”。
参考:https://www.cnblogs.com/baiboy/p/jieba2.html
词性标注和未登录词的发现方法一样,都可以使用HMM模型来解决这样的问题。
给定词串W=w1w2…wn,和词性标记集,求对应的词性标记串T=t1t2…tn。
因为有些词有多个词性,所以从概率的角度看就是:给定W的条件下,求使得概率P(T|W)最高的那个词性标注串,即:
从图论的角度来看,就是求解图中哪条路径的权重最大,进而将这个问题转化为使用基于动态规划的viterbi 算法求解一系列相似的子问题,得到权重最大的路径。
我爱自然语言处理
http://www.52nlp.cn/
深度学习与中文短文本分析总结与梳理
https://blog.csdn.net/wangyaninglm/article/details/66477222
分析了近5万首《全唐诗》,发现了这些有趣的秘密
http://www.growthhk.cn/cgo/9542.html
万字干货|10款数据分析“工具”,助你成为新媒体运营领域的“增长黑客”
http://www.woshipm.com/data-analysis/553180.html
jieba分词简介与解析
https://www.cnblogs.com/baiboy/p/jieba2.html
有哪些好的汉语分词方案
https://www.zhihu.com/question/19578687
基于分布式的短文本命题实体识别之----人名识别(python实现)
https://blog.csdn.net/wangyaninglm/article/details/75042151
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。