笔记来源:《python自然语言处理核心算法与技术》 涂铭 等

1. NLP 简介

1.1. 定义

nlp 即自然语言处理。

1.2. 研究领域

  1. 机器翻译
  2. 情感分析
  3. 智能问答
  4. 文摘生成
  5. 文本分类
  6. 舆论分析
  7. 知识图谱

1.3. 相关术语

  1. 分词 setgment

英文分词自然的以空格作为分隔符。
中文分词比较困难,典型的思路是基于字典的最长字符匹配,可以解决部分问题,但是对于歧义性很难解决。

  1. 词性标注 part-of-speech tagging

词性指的是:动词、名词、形容词等。标注的目的是表征词的一种隐藏状态。

  1. 命名实体识别 NER , Named Entity Recognition

指的是从文本中识别具体特定类别的实体(通常是名词),例如人名、地名、机构名、专有名词等。

  1. 句法分析 syntax parsing

句法分析的目的是解析句子中哥哥成分之间的依赖关系。

  1. 指代消解 anaphroa resolution

代词出现的频率很高,但是真正具有实际意义的只有第一次出现的具体名词。消解这些代词也是研究方向。

  1. 情感识别 emotion recognition

正负面词汇。有时也有中性词汇

  1. 纠错 correction

自动纠错词汇,输入法中常用。

  1. 问答系统

这种就很厉害了,人工智能小爱等

1.4. 比较重要的语料库

  1. 中文维基百科
  2. 搜狗新闻语料库
  3. IMDB情感分析语料库

1.5. 研究深度层次

  1. 第一层 语法分析
  2. 第二层 句法分析
  3. 第三层 语义分析

2. 前置技术

2.1. 正则表达式

  • 匹配字符串

import retext_string = "我是一个爬虫。我是一个正常程序"regex = "爬虫"p_string = text_string.split("。")for line in p_string:if re.search(regex,line) is not None:print(line)

以上代码就是一个最常用的匹配字符串的代码。

这个部分可以展开将很多,有机会专门出一个博客用于记录。

3. 中文分词技术

前面提到过,中文没有像英语一样的天然分词,所以我们需要专门针对中文得到一些中文分词的关键技术。

经过多年的探索,当前的中文分词技术大致有:

  • 规则分词
  • 统计分词
  • 混合分词

3.1. 规则分词

3.1.1. 正向最大匹配法

囧顶分词词典中的最长词有i个汉字字符,则用被处理文档的当前字符串中的前i个子作为匹配字段,查找字典,若字典中存在这样的一个i字词,则匹配成功,匹配字段被作为在一个词切分出来。如果词典中找不到这样的一个i自此,则匹配失败,将匹配字段中的最后一个字去掉,对剩下的字串进行匹配处理。如此迭代,知道匹配成功,或者剩余的字串长度为0为止。

class MM(object):def __init__(self):self.window_size = 3def cut(self, text: str):result = []index = 0text_length = len(text)dic = ['研究', '研究生', '生命', '命', '的', '起源']while text_length > index:for size in range(self.window_size+index, index, -1):piece = text[index:size]if piece in dic:index = size - 1breakindex = index + 1result.append(piece + '----')print(result)if __name__ == '__main__':text = '研究生命的意义'tokenizer = MM()print(tokenizer.cut(text))

3.1.2. 逆向最大匹配法

大同小异,不再介绍。直接看示例

class RMM(object):def __init__(self):self.window_size = 3def cut(self, text: str):result = []index = len(text)text_length = len(text)dic = ['研究', '研究生', '生命', '命', '的', '起源']while index > 0:for size in range(index-self.window_size, index):piece = text[size:index]if piece in dic:index = size + 1breakindex = index - 1result.append(piece + '----')result.reverse()print(result)if __name__ == '__main__':text = '研究生命的意义'# tokenizer = MM()tokenizer = RMM()print(tokenizer.cut(text))

3.1.3. 双向最大匹配法

是将正向最大匹配法得到的分词结果和逆向最大匹配法得到的结果进行比较,然后按照最大匹配原则,选取次数切分最少的作为结果。

3.2. 统计分词

大规模语料库的建立使得统计学习方法成为中文分词算法的主流。

主要思想是:

  • 词的最小单位是字
  • 相连的两个字出现的频率高,则证明其可能是一个词

一般来说,基于统计的分词需要做下面两个操作:

  1. 建立统计语言模型
  2. 对句子进行单词划分,然后对划分结果进行概率计算,获得概率最大的分词方式。这里就用到了统计学习方法,如隐马尔可夫、条件随机场等。

下面针对一些关键技术作介绍:

3.2.1. 语言模型

长度为mmm的字符串确定其概率分布P(ω1,ω2,ω3,...,ωm)P(\omega_1,\omega_2,\omega_3,...,\omega_m)P(ω1​,ω2​,ω3​,...,ωm​),其中ω1\omega1ω1到ωm\omega_mωm​的依次表示文本中的各个词语。一般采用链式法则计算其概率值,如下面式子所示:

P(ω1,ω2,...,ωm)=P(ω1)P(ω1∣ω2)...P(ωm∣ω1,ω2,...,ωm−1)P(\omega_1,\omega_2,...,\omega_m) = P(\omega_1)P(\omega_1|\omega_2)...P(\omega_m|\omega_1,\omega_2,...,\omega_{m-1})P(ω1​,ω2​,...,ωm​)=P(ω1​)P(ω1​∣ω2​)...P(ωm​∣ω1​,ω2​,...,ωm−1​)

可以发现,当文本过长的时候,公式计算难度加大。为解决这个问题,有人提出了n元模型,以降低计算难度。

所谓n元模型就是在估算条件概率是,忽略距离大于等于n的上文词的影响,因此P(ωi∣ω1,ω2,...,ωi−1)P(\omega_i|\omega_1,\omega_2,...,\omega_{i-1})P(ωi​∣ω1​,ω2​,...,ωi−1​)的计算可以简化为:

P(ωi∣ω1,ω2,...,ωi−1)≈P(ωi∣ωi−(n−1),...,ωi−1)P(\omega_i|\omega_1,\omega_2,...,\omega_{i-1}) \approx P(\omega_i|\omega_{i-(n-1)},...,\omega_{i-1})P(ωi​∣ω1​,ω2​,...,ωi−1​)≈P(ωi​∣ωi−(n−1)​,...,ωi−1​)

当n=1时成为医院模型,此时整个句子的概率可以表示为: P(ω1,ω2,...,ωm)=P(ω1)P(ω2)...P(ωm)P(\omega_1,\omega_2,...,\omega_{m}) = P(\omega_1)P(\omega_2)...P(\omega_m)P(ω1​,ω2​,...,ωm​)=P(ω1​)P(ω2​)...P(ωm​)观察可知,在一元语言模型中,整个句子的该来等于各个词语概率的乘积。言下之意就是各个词之间都是相互独立的,这无疑是完全损失了剧中的此讯信息。所以医院模型的效果并不理想。

n = 2时成为二元模型,n=3时称为3元模型,显示n越大,仅保留的词序信息越丰富,但是计算升本也呈指数级上升。一般使用频率计数的比例来计算n元条件概率:

P(ωi∣ωi−(n−1),...,ωi−1)=count(ωi−(n−1),...,ωi−1,ωi)count(ωi−(n−1),...,ωi−1)P(\omega_i|\omega_{i-(n-1)},...,\omega_{i-1})=\frac{count(\omega_{i-(n-1)},...,\omega_{i-1},\omega_i)}{count(\omega_{i-(n-1)},...,\omega_{i-1})}P(ωi​∣ωi−(n−1)​,...,ωi−1​)=count(ωi−(n−1)​,...,ωi−1​)count(ωi−(n−1)​,...,ωi−1​,ωi​)​

3.2.2. HMM (隐马尔可夫模型)

其将分词作为字在字串中的序列标注任务来实现的。其基本思路是:每个字在构造一一个词语的时候都占据着一个确定的构词位置,先规定每个字最多只有四个构词位置:B(词首)、M(词中)、E(词尾)和S(单独成词)。

马尔可夫模型的话题太大,之后将会作为专题发布博客。

3.2.3. 其他分词模型

  • 条件随机场
  • 神经网络分词算法

3.3. 混合分词

多种分词方式并用,实际中经常如此。

3.4. 中文分词工具————Jieba

这个分词工具是目前看来最棒的中文分词工具,其具有以下特点:

  • 社区活跃
  • 功能丰富
  • 提供多种编程语言的支持
  • 使用简单

3.4.1. Jieba的三种分词模式


import jieba'''
description: jieba分词,全模式
param {*}
return {*}
'''
sent = "中文分词是文本处理不可或缺的一步!"seg_list = jieba.cut(sent,cut_all=True)
print("全模式:", '/ '.join(seg_list))'''
description: jieba分词,精确模式
param {*}
return {*}
'''
seg_list = jieba.cut(sent,cut_all=False)
print("精确模式", '/ '.join(seg_list))'''
description:  默认精确模式
param {*}
return {*}
'''seg_list = jieba.cut(sent)
print("默认精确模式:",'/ '.join(seg_list))'''
description: 搜索引擎模式
param {*}
return {*}
'''seg_list = jieba.cut_for_search(sent)
print("搜索引擎模式:",'/ '.join(seg_list))

3.4.2. 高频词提取

高频词一般值文档中出现频率较高且减肥无用的词语,其一定程度上代表了文档的焦点所在。针对单片文档,可以作为一种关键词来看。对于如新闻这样的多篇文档,可以将其作为热词,发现舆论焦点。

高频词提取将在之后作为专题介绍。

4. 词性标注与命名实体识别

4.1. 词性标注

4.1.1. 词性标注简介

词性是词汇的基本语法属性,通常也成为词类。 词性标注是在给定句子中判定每个词的语法范畴,确定其词性并加以标注的过程。例如,表示人、地点、十五以及其他抽象概念的名称几位名词,表示动作或状态变化的词即为动词,描述或修饰名词属性、状态的词为形容词。

在中文中,一个词的词性很多时候都是不固定的,一般表现为同音同形的词在不同的语境下,其表示的语法截然不同,这就为词性标注带来很大的困难;但是另一方面,从整体上看,大多数词语,尤其是诗词,一般只有一道两个词性,且其中一个词性的使用频次远远大于另一个,即使每次都将高频词行作为词性选择进行标注,也能实现80%以上的准确率。如此,若我们对常用词的词性都能进行很好的识别,那么就能覆盖绝大所属场景,满足基本的准确度要求。

目前较为主流的方法是如同分词一样,将句子的词性标注作为一个序列标注问题来解决,纳闷分词中常用的手段,如HMM,RCF等皆可在词性标注任务中使用。

本节介绍利用jieba分词工具来完成词性标注任务。

4.1.2. 词性标注规范

  • https://blog.csdn.net/Jiajikang_jjk/article/details/83049601

4.1.3. jieba分词中的词性标注


import jieba
import jieba.posseg as psgsent = "中文分词是文本处理不可或缺的一步!"seg_list = psg.cut(sent)result =  [(w,t) for w,t in seg_list]print(result)

以上词典相当于用力默认的词典,但是jieba其实是支持自定义词典的。这个有机会作为专题讲解。

4.2. 命名实体识别

4.2.1. 命名实体识别简介

明明实体的目的是识别预料中任命、地名、组织机构名等命名实体。又是这些命名实体数量不断增加,通常不可能在词典中穷尽列出,且其狗比给方法具有各自的规律性,因此,通常吧对这些词的识别在词汇形态处理任务中独立处理,称为明明实体识别NER.。

NER研究的明明实体一般分为3大类(实体类、时间类和数字类)和7小类(任命、地名、组织机构名、时间、日期、货币和百分比)。

中文的命名实体识别主要有一下半点:

  • 任命识别
  • 规律复杂
  • 嵌套情况复杂
  • 长度不确定

当前的主流的明明识别识别方法如下:

  • 基于规则的明明实体识别
  • 基于统计的明明实体识别
  • 混合方法

序列标注方法是目前命名实体识别中的主流方法。HMM,CRF等

条件随机场也将在之后作为专题介绍。

5. 关键词提取算法

较为经典有效的关键词提取算法包括:

  • TF/IDF 词频-逆文档频次算法
  • TextRank算法 可以脱离语料库进行操作,仅对单篇文档进行
  • LSA/LSI/LDA算法

6. 句法分析

6.1. 句法分析概述

这个步骤主要用于机器翻译。句法分析的主要任务是识别出句子所包含的句法成分依据这些成分之间的关系,一般以句法树来表示句法分析的结果。

句法分析主要面对两个难点:

  • 歧义
  • 搜索空间

6.2. 句法分析的数据集与评测方法

6.2.1. 句法分析数据集

统计学习方法多需要预料数据的支撑,统计句法分析也不例外。相较于分词或词性标注,句法分析的数据集要复杂很多,其是一种树型的标注结构,因此有称为树库。

  • 英文宾州树库 Penn TreeBank PTB
  • 中文滨州树库 Chinese TreeBank , CTB

6.2.2. 句法分析的评测方法

句法分析评测主要任务是评测句法分析器生成的树结构与手工标注的树结构之间的相似程度。其主要考虑两方面的性能:满意度和效率。其中满意度是值测试句法分析器是否适合或者胜任某个特定的自然语言处理任务;二效率主要用于对比卷发分析器的运行时间。

目前主流的分析评测方法是PARSEVAL评测体系。

6.3. 句法分析的常用方法

相较于词法分析,句法分析的成熟度相对较低。目前常用的方法如下:

6.3.1. 基于PCFG的句法分析

probabilistic Context Free Grammar 是基于概率的短语结构分析方法,是目前研究最为充分,形式最为简单的统计句法分析模型,也可以认为是规则方法与统计方法的结合。

PCFG是上下无关文法的结合。

6.3.2. 基于最大间隔的马尔可夫网络的句法分析

6.3.3. 基于CRF的句法分析

6.3.4. 基于迁移-规约的句法分析模型

6.3.5. 使用Stanford Parser的PCGF算法进行句法分析

7. 文本向量化

7.1. 文本向量化概述

文本表示是自然语言处理中的基础工作,文本表示的好坏直接影响到整个自然语言处理系统的性能。因此,研究者们投入了大量的人力物力来研究文本表示方法,以期提高自然语言处理系统的性能。在自然语言处理研究领域,文本向量化是文本表示的一种重要方式。顾名思义,文本向量化就是将文本表示成一系列能够表达文本语义的向量。无论是中文还是英文,词语都是表达文本处理的最基本单元。当前阶段,对文本向量化大部分的研究都是通过词向量化实现的。

有研究者将文章或者句子作为文本处理的基本单元,由此产生了doc2vec和str2vec技术。

7.2. 向量化算法Word2Vec

基本思想是将文档中所有的单词都单独表示为一个向量的话,最简单的方式是全是(0,1)向量,如果是这个词汇则对应位置为1,其他位置为0(BOW)。但是这样做会造成以下几个问题:

  • 维度灾难
  • 无法保留语序信息
  • 语义鸿沟

word2vec可以从无标注的数据中提取有用信息。

一般来说词语是表达语义的基本单元。因为磁带模型知识将词语符号话,所以磁带模型是不包含任何语义信息的。如何使得“词表示”包含语义信息是该领域研究者们面临的问题。分布假设(distributional hypothesis)的提出也为解决上述问题提供了理论基础。

假说的核心是:

上下文相似的词,其语义也相似。

随后,有学者斋藤利了利用上下文分布表示词义的方法,这类方法就是又名的此空间模型。随着各类硬件设备计算能力的提升和相关算法的发展,神经网络模型逐渐在各个领域中崭露头角,可以灵活的对上下文进行建模是神经网络构造词的最大优点。下文将介绍神经网络构建词向量的方法:

7.2.1. 神经网络语言模型

前面提到过二元语言模型,神经网络语言模型与传统模型的不同点在于,传统的方法是估算P(ωi∣ωi−(n−1),...,ωi−1)P(\omega_i|\omega_{i-(n-1)},...,\omega_{i-1})P(ωi​∣ωi−(n−1)​,...,ωi−1​),而NNLM模型直接通过一个神经网络结构对n元条件概率进行估计。

大致的操作是:

从语料库中搜集一系列长度为n的文本序列ωi−(n−1),...,ωi−1,ωi\omega_{i-(n-1)},...,\omega_{i-1},\omega_iωi−(n−1)​,...,ωi−1​,ωi​,假设这些长度为n的文本序列组成的集合为D,那么NNLM的目标函数如下面式子所示:

∑DP(ωi∣ωi−(n−1),...,ωi−1))\sum_DP(\omega_i|\omega_{i-(n-1)},...,\omega_{i-1}))∑D​P(ωi​∣ωi−(n−1)​,...,ωi−1​))

上式的含义是:在输入词序列为ωi−(n−1),...,ωi−1\omega_{i-(n-1)},...,\omega_{i-1}ωi−(n−1)​,...,ωi−1​的情况下,计算目标词为ωi\omega_iωi​的概率。

上图所示的神经网络语言模型是经典的三层前馈神经网络结构,其中包括三层:输入层、隐藏层和输出层。为解决词袋模型的数据稀疏问题,输入层的输入为低纬度的、紧密的词向量,输入层的操作就是将词序列ωi−(n−1),...,ωi−1\omega_{i-(n-1)},...,\omega_{i-1}ωi−(n−1)​,...,ωi−1​中的每个词向量按顺序拼接。

x=[v(ωi−(n−1));...;v(ωi−2);v(ωi−1)]x = [v(\omega_{i-(n-1)});...;v(\omega_{i-2});v(\omega_{i-1})]x=[v(ωi−(n−1)​);...;v(ωi−2​);v(ωi−1​)]

在得到x支行吧,将x输入到隐藏层h,再将h接入输出层得到最后的输入变量y,隐藏层变量h和输出变量y。

7.2.2. C&W模型

7.2.3. CBOW模型和Skip-gram模型

8. 情感分析

8.1. 情感分析的应用

  • 电子商务
  • 舆情分析
  • 市场呼声
  • 消费者呼声

8.2. 情感分析的基本方法

  • 词法分析
  • 机器学习方法
  • 混合分析

卷积、循环、LSTM

将会持续补充内容。。。。


2021年3月13日 更新

AI基础-NLP概览-极速入门相关推荐

  1. AI基础:机器学习简易入门

    0.导语 Machine Learning(机器学习)是研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能.它是人工智能的核心,是使计算机具有智 ...

  2. AI基础:简易数学入门

    0.导语 学习AI建议掌握的数学资料: 数学分析(微积分),线性代数,概率论,统计,应用统计,数值分析,常微分方程,偏微分方程,数值偏微分方程,运筹学,离散数学,随机过程,随机偏微分方程,抽象代数,实 ...

  3. AI 基础:Python 简易入门

    0.导语 Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的 ...

  4. AI基础:Pandas简易入门

    Pandas 简易入门 0.导语 pandas 是基于 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工 ...

  5. 24小时学会python_零基础python24小时极速入门学习

    本篇文章是 Python 入门必须掌握的知识点,24小时极速入门,是针对那些没有任何编程经验,从零开始学习 Python 的同学 想要快速学会python的6个关键点. 分别是:数据类型. 条件判断. ...

  6. AI基础:Numpy简易入门

    本文提供最简易的 Numpy 的入门教程,适合初学者.(黄海广) 1.Numpy 简易入门 NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型.矢量处理,以及精密 ...

  7. AI基础:入门人工智能必看的论文【附下载链接】

    0.导语 AI领域的发展会是IT中最快的.我们所看到的那些黑科技,其后面无不堆积了大量的论文.而且都是最新.最前沿的论文. 从某种调度来讲,他们所用的技术跟书籍里的内容确实不是一个时代.要想与时俱进, ...

  8. AI基础:入门人工智能必看的论文

    0.导语 AI领域的发展会是IT中最快的.我们所看到的那些黑科技,其后面无不堆积了大量的论文.而且都是最新.最前沿的论文. 从某种调度来讲,他们所用的技术跟书籍里的内容确实不是一个时代.要想与时俱进, ...

  9. AI基础:数据可视化简易入门(Matplotlib 和 Seaborn)

    0 导语 Matplotlib 是一个 Python 的 2D 绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形 . 通过 Matplotlib,开发者可以仅需要几行代码,便可以生 ...

  10. AI基础:深度学习论文阅读路线(127篇经典论文下载)

    0.导语 作者:Floodsung 出处:https://github.com/floodsung/Deep-Learning-Papers-Reading-Roadmap 翻译:黄海广 如果您是深度 ...

最新文章

  1. 初创公司MongoDB最佳实践策略和躲坑秘笈
  2. 爬虫python代码-Python爬虫入门(01) -- 10行代码实现一个爬虫
  3. 消除warning方法
  4. RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较
  5. oracle中directory的使用
  6. 如何彻底删除SVN中的文件和文件夹(附恢复方法)
  7. python交互式和文件式_使用Python创建和自动化交互式仪表盘
  8. Github中国区Star超过1W的大佬和他们的公众号,太强了!
  9. leetcode刷题:除自身以外数组的乘积
  10. Android的TextView部分文字点击切换颜色(ClickableSpan)
  11. 二元偏导数存在的条件_偏导数连续怎么证明
  12. word 编辑域中的汉字_神器!10秒在word中编辑复杂数学公式,不用mathtype也行!...
  13. 刘德华--2初恋时节
  14. SAP MM 增值税改革导致采购业务的变化
  15. 【继电器模块的电路设计和分析】
  16. MyBatis-Spring(五)--MapperScannerConfigurer实现增删改查
  17. RoboCup智能机器人足球教程(二)
  18. 前端工具之WebStorm安装破解和汉化
  19. 5G网络学习(三)——大白话讲解PDU会话(未完待续)
  20. 基于android的记账APP大作业项目

热门文章

  1. 几个好看的echarts表格效果
  2. php校花评比排名,2018大学校花排名出炉,清华高冷,人大“小郑爽”,你pick谁?...
  3. el-upload上传视频截取视频第一帧作为首图
  4. 【软件工程】 文档 - 银行业务管理 - 需求分析
  5. 组织的目的是使平凡的人做出不平凡的事 --- 彼得.德鲁克 《卓有成效的管理者》
  6. SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现
  7. Mini CFA 考试练习题 Ethics and Investment Professionalism
  8. Atcoder ARC093F : Dark Horse
  9. speedoffice(PPT)怎么将背景设置为渐变背景
  10. NAS存储文件权限的设置方法