自然语言的特性
为什么计算机难以理解人类的自然语言呢?主要是下面6个特性:
- 词汇量
在自然语言中含有很丰富的词汇,而编程语言中能使用的关键字数量是有限的 - 结构化
自然语言是非结构化的,而编程语言是结构化的,例如类和成员。自然语言是线性字符串,要分析它,需要用到分词、命名实体识别、指代消解和关系抽取等。 - 歧义性
我们说话含有大量的歧义,要根据上下文语境来判断。中文就更加多歧义了。 - 容错性
即使是多次校对的文稿,也可能会有错误,所以互联网的文本就更加的多错误,但是即使它错的离谱,人类还是能理解它表达的意思。
5.易变性
我们可以自由创造和传播新用法,学习外来语来创造很多新的词汇,每天都在发生变化,而编程语言的变化是缓慢的,根据维护的组织来进行修改。 - 简略性
我们为了追求快捷,往往说话带有很多简写,这些简写省略了大量背景知识和常识,例如“工行”,“老地方见”。
技术名词解释(按照NLP任务的执行顺序)
- 语音识别Speech Recognition:语音转文字
- 光学字符识别Optical Character Recognition:图片转文字
- 词法分析:包括下面3种,都是围绕词语分析
1. 中文分词:将文本分隔为有意义的词语
2. 词性标注:确定词语的类别和浅层的歧义消除
3. 命名实体识别:识别一些较长的专有名词 - 信息提取:从有意义的单词列表种,抽取有用信息,用到一些信息抽取算法
- 文本分类和聚类:判断垃圾邮件是分类,相似文本归档或排除重复文档是聚类
- 句法分析:关注词语之间的关系,关注主谓宾结构,关于语法
- 语义和篇章分析:侧重于语义而非语法,
1. 词义消歧:确定一个词在语境中的含义,而不是简单的词义
2. 语义角色标注:标注句中谓语和其他成分的关系
3. 语义依存分析:分析句子中的词语之间的语义关系 - 高级任务: 自动回答,自动摘要,机器翻译。信息检索算是另一个学科,但与nlp有密切联系
NLP的流派
-
基于规则的专家系统(1950-1990)
专家手工制定一些确定性的流程,例如我们常用的正则表达式,是固定的规则。弱点是难以拓展,规则会出现冲突,引起矛盾,当规则变多了,要考虑的兼容问题更多,系统维护成本高。 -
基于统计学习方法(1990-2010)
利用统计学习方法在语料库上进行统计,语料库就是人工标注的结构化文本,其实就是让机器学习语料库中的规律,这种就是比较常用的机器学习方法处理nlp任务。 -
深度学习(2010-至今)
现在比较火的Bert,CNN,LSTM就是深度学习处理nlp任务,不需要专家制定特征模板,能够自动学习原始数据的抽象表示。
语料库
- 中文分词语料库:人工正确切分后的句子集合,涉及到语料规范的制定,规范很难执行
- 词性标注语料库:切分并为每个词指定一个词性的语料,词性标注集
- 命名实体识别语料库:关注实体名词和实体类别,命名实体类型取决于制作者关心什么
- 句法分析语料库:带有词性标签和单词间的联系。已经做过分词、词性标注和句法标注
- 文本分类语料库:由人工标注了所属分类的文章构成
如何建设语料库?
- 规范指定
由语言学家指定一套标注规范,包括了标注集定义、样例、和实施方法 - 人员培训
大型语料库需要多人协同标注,必须大家都对规范了解一直,否则出现内部冲突,影响质量 - 人工标注
成熟的标注软件brat,是典型B/S架构,亮点是可以多人协同标注。
使用Hanlp
本系列内容按照何晗大佬的书学习的,安装hanlp时出现问题的同学可参考下面这个链接,我觉得很有帮助!
安装pyhanlp