1、自然语言的概念
自然语言是指人类社会约定俗成的,并且区别于人工语言(如计算机程序)的语言,,是自然而然的随着人类社会发展演变而来的语言,它是人类学习生活的重要工具。
2、自然语言处理概述
自然语言处理(Natural Language Processing, NLP)是一门以计算机为工具,对书面或口头形式的语言 进行各种处理和加工的技术,同时也是研究人与人交际中以及人与计算机交际中语言问题的一门科学。
NLP是计算机科学领域以及人工智能领域的一个重要的研究方向,是一门融语言学、计算机科学、数学、 统计学于一体的科学。
3、NLP的发展历程
NLP的发展大致经历了3个阶段。
• 1956年以前的萌芽期
• 1980年~1999年的快速发展期
• 21世纪的突飞猛进
4、NLP研究内容
NLP研究内容包括很多的分支领域,如:
文本分类、信息抽取、信息检索、信息过滤、自动文摘、智能问答、话题推荐、机器翻译、主题词识别、 知识库构建、深度文本表示、命名实体识别、文本生成、文本分析(词法、句法和语法)、舆情分析、自 动校对、语音识别与合成等。
5、NLP基本流程
NLP 可以使用传统的机器学习方法来处理,也可以使用深度学习的方法来处理,过程类似。
方式 1:传统机器学习的 NLP 流程

方式 2:深度学习的 NLP 流程

两种方式的过程区别不大,均需要先取得语料后对其进行预处理、分词、获取特征向量、建立模型。
1、语料获取
在NLP之前,需要得到文本语料。文本语料的获取一般有下面几种方法:
• 利用已经建好的数据集,或第三方语料库,这样可以省去很多处理成本。
• 获取网上数据。很多时候所要解决的是某种特定领域的应用,仅靠开放语料库经常无法满足需求,这 就需要用爬虫技术去获取需要的信息。
• 制定数据搜集策略来搜集数据。可以通过制定数据搜集策略,从业务的角度来搜集所需要的数据。
• 与第三方的合作获取数据。通过购买的方式满足部分需求文本数据
2、语料预处理
对于语料来说,英文和中文的表达有所区别。
英文语料的处理过程:
• 分词
• 词干提取
• 词性标注等
中文语料预处理:
• 语料字符处理:
大多数情况下,获取的文本数据存在很多无用的部分,如爬取来的一些html代码、css标 签和不需要用的标点符号等,这些都需要分步骤去除。
• 中文分词:
中文文本一般需要用分词算法完成分词。常用的中文分词工具有很多,如jieba、NLTK、HanLP 、THULAC、NLPIR、LTP等。
• 词性标注:
给词语标上词类标签,比如名词、动词、形容词等,常用的词性标注方法有基于规则的、基于 统计的算法等。
• 去停用词:
停用词就是句子中没必要的单词,去掉停用词对理解整个句子的语义没有影响。中文文本中存 在大量的虚词、代词或者没有特定含义的动词、名词,在文本分析的时候需要去掉。
语料字符处理
在进行分词、特征工程等任务前,必要的步骤是对语料文本进行字符的处理,去除一些无用的字符可以减 少噪声、提升分词的准确性等。
这里以中文的语料作为主要对象,实现字符处理经常使用的技术是字符串函数和正则表达式。
字符串是Python中最常用的数据类型,可以使用引号('或")来创建字符串。
常见的字符串处理函数如下(chars表示字符串):
• len( chars ):计算字符串的长度
• str[start : end : step] :字符串截取
• str.split(sep, maxsplit) :字符串分割
• str.find( chars ) :查找字符串位置
• str.count( chars ) :字符串数量位置
• str.strip( chars ) :删除字符串前后的特殊字符或空格
• str.replace( chars1|chars2|..., rep ) :把字符串chars1|chars2|...替换成rep
正则表达式函数
正则表达式是一种可以用于模式匹配和替换的工具,能方便的检查一个字符串是否与某种模式匹配。
通过正则表达式可以对指定的文本实现匹配测试、内容查找、内容替换、字符串分割等功能。
re模块支持正则表达式,正则表达式常用函数如下。
• re.match(pattern, string):检测字符串开头位置是否匹配模式pattern。
• re.search(pattern, string):在整个字符串内查找并返回第一个成功的匹配模式pattern。
• re.findall(pattern, string):返回字符串中所有匹配模式pattern的结果列表。
• re.sub(pattern, repl, string):把所有匹配模式pattern的字符串用指定的字符串repl替换。
• re.split(pattern, string): 根据正则表达式分割字符串,将分割后的所有子字符串放在一个表中 返回
正则表达式的元字符
详细讲解请看我前面的文章 Python正则表达式之学习正则表达式三步曲
中文分词
简介
汉语自然语言处理第一项核心技术-分词
在英文中,单词之间以空格为自然分隔符,分词自然地以空格为单位切分,而中文分词则需要依靠一定技术和方法寻找类似英文中空格作用的分隔符。简单来说,中文分词是指将汉字序列按照一定规范、逐个切分为词序列的过程。
两种分词标准
粗粒度切分主要应用于自然语言处理的各种应用,如文本分类、聚类。
细粒度切分最常应用的领域是搜索引擎。
eg:
浙江大学坐落在西湖旁边
• 粗粒度:浙江大学/坐落/在/西湖/旁边。
• 细粒度:浙江/大学/坐落/在/西湖/旁边。
分词中的两大难题
•切分歧义
•新词识别
切分歧义:
AB和BC都是词典中的词
交集型歧义 :
eg: [网球场]:网球/场, 网/球场
组合型歧义
他从马上下来\]: 他/从/马/上/下来 ,他/从/马上/下来 混合型歧义 这样的**人才能**经受住考 ### 分词方法 #### 基于规则或词典的分词方法 是一种较为机械的分词方法,其基本思想: • 将待分词语句中的字符串和词典逐个匹配。 • 找到匹配的字符串则切分,不匹配则减去边缘的某些字符。 • 从头再次匹配,直至匹配完毕或者没有找到词典的字符串而结束。 ##### 基于规则分词主要方法如下: **• 正向最大匹配法(Maximum Match Method,MM法)。** **• 逆向最大匹配法(Reverse Maximum Match Method,RMM法)。** **• 双向最大匹配法(Bi-direction Matching** #### 正向最大匹配法基本思想如下: •假设有一个待分词中文文本和一个分词词典,词典中最长的字符串长度为K。 •从左至右切分待分词文本的前K个字符,然后查找是否有和词典一致的字符串。 •若匹配失败,则删去该字符串的最后一个字符,仅留下前 K-1个字符,继续匹配这个字符串,以此类推。 • 如果匹配成功,那么被切分下来的第二个文本成为新的待分词文本,重复以上操作直至匹配完毕。如果一 个字符串全部匹配失败,那么逐次删去最后一个字符,重复上述操作  代码实现: # #### 逆向最大匹配法基本思想如下: • RMM与MM法原理相反,从右至左匹配待分词文本的后K个字符串,查找是否有和词典一致的字符串。 • 若匹配失败,仅留下待分词文本的后K-1个词,继续匹配这个字符串,以此类推。 • 如果匹配成功,则被切分下来的第一个文本序列成为新的待分词文本,重复以上操作直至匹配完毕。 • 如果一个词序列全部匹配失败,则逐次删去第一个字符,重复上述操作  代码实现: # #### 双向最大匹配法基本思想如下。 双向最大匹配法基本思想是将MM法和RMM法的结果进行对比,选取两种方法中切分次数较少的作为切 分结果。 • 用正向最大匹配法和逆向最大匹配法对"北京市民办高中"进行分词,结果分别为"北京市民"、" 办"、"高中"和"北京市"、"民办高中"。 • 选取切分次数最少的结果为"北京市"、"民办高中"。 研究表明,利用正向最大匹配法和逆向最大匹配法匹配,中文分词大约90%的词句完全重合且正确,有9% 左右的句子得到的结果不一样,但其中有一个是正确的。 剩下不到1%的句子使用两种方法进行切分都是错 误的。 因而,双向最大匹配法在中文分词领域中得以广泛运 **基于规则的中文分词常常会遇到歧义问题和未登录词问题**。 **未登录词**也称为生词,即词典中没有出现的词,未登录词可以分为四大类。 • 第一类是日常生活出现的普通新词汇,尤其是网络热门词语,这类词语更新换代快,且不一定符合现 代汉语的语法规定; • 第二类是专有名词,主要指人名、地名和组织机构名,它还包括时间和数字表达等; • 第三类是研究领域的专业名词,如化学试剂的名称等; • 第四类是其他专用名词,如近期新上映的电影、新出版的文学作品等。遇到未登录词时,分词技术往 往束手无策。 以上问题均可以通过更新词典解决,但维护成本高,实时性要求高。 #### 基于统计的分词方法: 有效解决了中文分词遇到歧义问题和未登录词问题。 **基本思想**:中文语句中相连的字出现的次数越多,作为词单独使用的次数也越多,语句拆分的可靠性越高 ,分词的准确率越高。 **基本原理**:统计词出现的次数,次数足够高的词作为单独的词语被保留。 **优势**:能够较好地处理未登录词和歧义词,不需要人为的搭建和维护词典。 **缺点**:需要依靠语料库进行分词,语料库的准确度不一定高,计算量较大,分词速度一般。 **两个步骤**:建立统计语言模型;运用模型划分语句,计算被划分语句的概率,选取最大概率的划分方式进 行分词。 **常见的基于统计的分词方法有:** •**n元语法模型** •**隐马尔可夫模型**。 ### jieba 分词 jieba库------"结巴"中文分词:做最好的 Python 中文分词组件 最常用的是以基于词典的分词方法为主,以统计分词方法为辅进行中文分词,这种方法既能较好地处理未 登录词和歧义词,又能避免词典准确率带来的问题。 中文分词工具jieba库就采用了这种方法进行中文分词 #### jieba 分词的基本步骤 jieba分词结合了基于规则和基于统计的分词方法,分词过程包含3个步骤: •基于前缀词典快速扫描词图,搭建可能的分词结果的有向无环图,构成多条分词路径。 •采用动态规划的方法寻找最大概率路径,从右往左反向计算最大概率,依此类推,得到概率最大的分词路 径,作为最终的分词结果。 •采用HMM模型处理未登录词,借助模型中语句构成的4个状态B、M、E、S推导,最后利用维特比算法求解最 优分词路径。 #### 分词模式 **jieba分词支持精确模式、全模式和搜索引三种模式**。 • 精确模式采用最精确的方式将语句切开,适用于文本分析。 • 全模式可以快速地扫描语句中所有可以成词的部分,但无法解决歧义问题。 • 搜索引模式在精确模式的基础上再切分长词,适用于搜索引擎的分词。 通过对 "中文分词是自然语言处理的一部分"采用三种模型进行分词,介绍jieba的分词模式。 **3中分词模式的结果如下**。 • 全模式: 中文/ 分词/ 是/ 自然/ 自然语言/ 语言/ 处理/ 的/ 一部/ 一部分/ 部分/ • 精确模式: 中文/ 分词/ 是/ 自然语言/ 处理/ 的/ 一部分/ • 搜索引擎模式: 中文/ 分词/ 是/ 自然/ 语言/ 自然语言/ 处理/ 的/ 一部/ 部分/ 全模式和搜索引擎模式会打印所有可能的分词结果,精确模式仅输出一种分词,除了一些适合全模式和搜 索引擎模式的场合,一般情况下会较多地使用精确模式。 这3种模式的分词主要用jieba.cut()函数和jieba.cut_for_search()函数。 • jieba.cut()函数可输入3个参数,待分词字符串、cut_all参数选择是否采用全模式(默认精确模式 )、HMM参数控制是否使用HMM模型。 • jieba.cut_for_search函数可输入两个参数。待分词字符串、是否使用HMM模型 #### Jieba库常用功能 Jieba库的安装和使用都比较简单,通过pip install jieba即可安装。 • 分词 :cut_words = jieba.cut(word) • 添加自定义字典:jieba.load_userdict(path) 或者 jieba.add_word() • 关键词提取:jieba.analyse.extract_tags(word, topK=3) #### 文本预处理技术:停用词 停用词(Stop Words) ,词典译为"电脑检索中的虚字、非检索用字"。 停用词一定程度上相当于过滤词(Filter Words),不过过滤词的范围更大一些,包含黄色、政治等敏感信 息的关键词都会被视做过滤词加以处理,停用词本身则没有这个限制。 常见的停用词有两种: 1、人类预言中包含的功能词、语气助词、副词、介词、连接词等 2、常见的符号,比如逗号、句号、问号、●、★等。 去除停用词的一般方法是:从分词后的结果中删除掉认为是停用词的词,参考停用词表。 几种常见的停用词表: • 中文停用词表 [https://github.com/Pirate-Xing/stopwords/blob/master/中文停用词表.txt](https://github.com/Pirate-Xing/stopwords/blob/master/%E4%B8%AD%E6%96%87%E5%81%9C%E7%94%A8%E8%AF%8D%E8%A1%A8.txt "https://github.com/Pirate-Xing/stopwords/blob/master/中文停用词表.txt") • 哈工大停用词表.[https://github.com/Pirate-Xing/stopwords/blob/master/哈工大停用词表.txt](https://github.com/Pirate-Xing/stopwords/blob/master/%E5%93%88%E5%B7%A5%E5%A4%A7%E5%81%9C%E7%94%A8%E8%AF%8D%E8%A1%A8.txt "https://github.com/Pirate-Xing/stopwords/blob/master/哈工大停用词表.txt") • 四川大学机器智能实验室停用词库[https://github.com/Pirate-Xing/stopwords/blob/master/四川大学机器智能实验室停用词库.txt](https://github.com/Pirate-Xing/stopwords/blob/master/%E5%9B%9B%E5%B7%9D%E5%A4%A7%E5%AD%A6%E6%9C%BA%E5%99%A8%E6%99%BA%E8%83%BD%E5%AE%9E%E9%AA%8C%E5%AE%A4%E5%81%9C%E7%94%A8%E8%AF%8D%E5%BA%93.txt "https://github.com/Pirate-Xing/stopwords/blob/master/四川大学机器智能实验室停用词库.txt") • 百度停用词表 [https://github.com/Pirate-Xing/stopwords/blob/master/百度停用词表.txt]( "https://github.com/Pirate-Xing/stopwords/blob/master/百度停用词表.txt")