1.自然语言处理简介
自然语言处理(Natural Language Processing,NLP)关注的是自然语言与计算机之间的交互。
它是人工智能(Artificial Intelligence,AI)和计算语言学的主要分支之一。它提供了计算机和人类之间的无缝交互并使得计算机能够在机器学习的帮助下理解人类语言。
- 音系学: 研究语言中声音系统的学科。它关注语言中哪些声音是有意义的,以及这些声音是如何组合和变化的。
- 对于英文而言:探讨的是语言的声音如何构成音位(phonemes),音位是语言中能够区别意义的最小声音单位。例如,/p/ 和 /b/ 是两个不同的音位,因为它们可以改变单词的意义(如 "pat" 和 "bat"),音系学还研究音位的组合规则(phonotactics),即哪些音位可以相邻出现,哪些不能,以及音位的变化规则,如连读、弱化、同化等现象。对于中文而言:探讨声调、声母韵母、音节结构、同音词多音字、方言差异、音变现象如:连读变调、轻声等,这些现象会影响音节的发音和意义,音系学有助于我们更好地理解和分析汉语的发音系统,为语言教学、语音识别、语音合成等应用领域提供理论基础。
- 词态学: 研究词的构成和变化的学科。它关注词是如何由更小的单位(如词根、前缀、后缀)构成的,以及这些单位如何组合和变化来形成新词或改变词的意义和语法功能。句法学: 研究语言中句子的结构规则,即如何将单词组合成有意义的句子。句法学试图解释和描述不同语言中句子结构的模式和原则。
- 中文句法:
- 词序:主语、谓语、宾语- 助词:用来标记句子成分和语法关系如:“的”、“了”--->我的好朋友- 量词:标记数量,如:一本书- 语气词:标记疑问、命令、感叹等语气,如“吗”、“呢”、“啊”如:你吃饭了吗?。
- 英文句法:
- 词序:主语、谓语、宾语但是英语的词序相对固定,改变词序可能会改变句子的意义或使其变得不合法,如:“He eats an apple.”(他吃一个苹果。)如果改变词序,如“An apple eats he.”,则不符合英语的语法规则- 冠词:英文中使用冠词(a/an, the)来标记名词的特定性或非特定性。例如:“He eats an apple.”(他吃一个苹果。)中的“an”表示非特定性。- 时态和语态:英文通过动词的变化来表达时态(过去、现在、将来)和语态(主动、被动)。例如:“He eats.”(他吃。)表示现在时主动语态;“He was eaten.”(他被吃。)表示过去时被动语态。- 从句:英文中广泛使用从句(如名词性从句、形容词性从句、副词性从句)来表达复杂的句子结构。例如:“He knows that she is coming.”(他知道她要来。)中的“that she is coming”是名词性从句。- 代词和格:英文中代词有主格、宾格、所有格等不同的形式,用以标记句子成分。•例如:“He gives it to her.”(他把它给她。)中的“he”是主格,“it”是宾格,“her”是宾格。
- 语义句法学:它结合了句法学(Syntax)和语义学(Semantics)的研究,以探索句子结构如何影响和决定其意义。这个领域试图理解句子成分之间的结构关系如何与它们所传达的意义相互作用语用学:它研究在特定语境中语言的理解和使用。语用学关注的是语言的实际交际功能,包括说话人如何使用语言来达到特定的交际目的,以及听话人如何解释这些话语。语用学试图解释语言在社会互动中的意义和作用,以及语言使用者如何在不同的社会和文化背景下理解和使用语言。
2.NLP的应用领域
- 机器翻译:将一种语言翻译成另一种语言。情感分析:能够判断用户评论是否积极。智能问答:计算机能够正确回答输入的问题。文摘生成:计算机能够准确归纳、总结并产生文本摘要。文本分类:计算机能够采集各种文章,进行主题分析,从而进行自动分类。舆论分析:计算机能够判断目前舆论的导向。知识图谱:知识点相互连接而成的语义网络。
3.自然语言处理的主要技术
分词(segment)
分词常用的手段是基于字典的最长串匹配,据说可以解决85%的问题,但是歧义分词很难。举个例子,“美国会通过对台售武法案”,我们既可以切为“美国/会/通过对台售武法案”,又可以切分成“美/国会/通过对台售武法案”。
词性标注(part-of-speech tagging)
词性一般是指动词、名词、形容词等。例如:我/爱/v/北京/ns天安门/ns。其中,ns代表名词,v代表动词,ns、v都是标注,以此类推。
命名实体识别(NER,Named Entity Recognition)
命名实体是指从文本中识别具有特定类别的实体(通常是名词),例如人名、地名、机构名、专有名词等。
句法分析(syntax parsing)
句法分析是对输入的文本以句子为单位,进行分析以得到句子的句法结构的处理过程。对句法结构进行分析,一方面是为了帮助理解句子的含义,另一方面也为更高级的自然语言处理任务提供支持(比如机器翻译、情感分析等)“小李是小杨的班长”和“小杨是小李的班长”,这两句话句法分析可以分析出其中的主从关系,真正理清句子的关系。
词法分析
除了分词之外,词性标注也通常被认为是词法分析的一部分,词性标注的目的是为每一个词赋予一个类别,这个类别可以是名词(noun)、动词(verb)、形容词(adjective)等。通常来说,属于相同词性的词,在句法中承担类似的角色。
语义分析
语义分析的最终目的是理解句子表达的真实语义。
指代消解( anaphora resolution )
中文中代词出现的频率很高,它的作用的是用来表征前文出现过的人名、地名等。例如,清华大学
坐落于北京,这家大学是目前中国最好的大学之一。在这句话中,其实“清华大学”这个词出现了
两次,“这家大学”指代的就是清华大学。但是出于中文的习惯,我们不会把“清华大学”再重复
一遍。
情感识别( emotion recognition )
所谓情感识别,本质上是分类问题,经常被应用在舆情分析等领域。情感一般可以分为正面、负面
,中性三类别。在电商企业,情感识别可以分析商品评价的好坏,以此作为下一个环节的评判依据。
纠错( correction )
自动纠错在搜索技术以及输入法中利用得很多。由于用户的输入出错的可能性比较大,出错的场景
也比较多。所以,我们需要一个纠错系统。
问答系统( QA system )
比较著名的有:苹果 Siri 、 IBM Watson 、微软小冰等。问答系统往往需要语音识别、合成,自然
语言理解、知识图谱等多项技术的配合才会实现得比较好
4.分词技术
1.中文分词的概念与分类
处理中文文本时,需要进行分词处理,将句子转化为词的表示,这个切词处理过程就是中文分词。
分词即将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,分词过程就是找到这样分界符的过程。它通过计算机自动识别出句子的词,在词间加入边界标记符,分隔出各个词汇。
英文分词很好分,每个空格即可分个词:S = "... to be or not to be..."
L = [..., to, be, or, not, to, be, ...],
2.中文分词的方法
基于规则的分词是一种机械分词方法,主要是通过维护词典,在切分语句时,将语句的每个字符串与词典中的词进行逐一匹配,找到则切分,否则不予切分。
按照匹配切分的方式,主要有正向最大匹配法、逆向最大匹配法以及双向最大匹配法三种方法。
1.正向最大匹配法
比如我们现在有个词典,最长词的长度为5,词典中存在“南京市长”和“长江大桥”两个词。现采用正向最大匹配对句子“南京市长江大桥”进行分词,那么首先从句子中取出前五个字“南京市长江”,发现词典中没有该词,于是缩小长度,取前4个字“南京市长”,词典中存在该词,于是该词被确认切分。再将剩下的“江大桥”按照同样方式切分,得到“江”“大桥”,最终分为“南京市长”“江”“大桥”3个词。显然,这种结果还不是我们想要的。
2.逆向最大匹配法
逆向最大匹配法从被处理文档的末端开始匹配扫描,每次取最末端的i个字符(i为词典中最长词数)作为匹配字段,若匹配失败,则去掉匹配字段最前面的一个字,继续匹配。相应地,它使用的分词词典是逆序词典,其中的每个词条都将按逆序方式存放。在实际处理时,先将文档进行倒排处理,生成逆序文档。然后,根据逆序词典,对逆序文档用正向最大匹配法处理即可。
单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。比如之前的“南京市长江大桥”,按照逆向最大匹配,最终得到“南京市”“长江大桥”。当然,如此切分并不代表完全正确,可能有个叫“江大桥”的“南京市长”也说不定。
3.双向最大匹配
双向最大匹配法(Bi-direction Matching method)是将正向最大匹配法得到的分词结果和逆向最大匹配法得到的结果进行比较,然后按照最大匹配原则,选取词数切分最少的作为结果。
“南京市长江大桥”,采用该方法,中间产生“南京市/长江/大桥”和“南京市/长江大桥”两种结果,最终选取词数较少的“南京市/长江大桥”这一结果。
3.分词的作用
词作为语言语义理解的最小单元,是人类理解文本语言的基础。因此也是AI解决NLP领域高阶任务,如自动问答,机器翻译,文本生成的重要基础环节。
流行中文分词工具Jieba:
愿景:做“趁手”中文分词,做最好的 Python 中文分词组件。
5.JieBa
1.介绍
- Jieba (结巴)是一个开源库,在 GitHub 上很受欢迎,使用频率很高。GitHub 链接: github.com/fxsjy/jieba社区活跃:该项目会持续更新,实际生产实践中遇到的问题能够在社区反馈并得到解决,适合长期使用。功能丰富。 Jieba 其实并不是只有分词这一个功能,其是一个开源框架,提供了很多在分词之上的算法,如关键词提取、词性标注等。提供多种编程语言实现。 Jieba 官方提供了 Python 、 C++ 、 Go 、 R 、 iOS 等多平台多语言支持,不仅如此,还提供了很多热门社区项目的扩展插件,如 ElasticSearch 、 solr 、 lucene 等。在实际项目中,进行扩展十分容易。使用简单。 Jieba 的 API 总体来说并不多,且需要进行的配置并不复杂,方便上手
2.使用JieBa
pip install jieba
pip install -i pypi.tuna.tsinghua.edu.cn/simple jieba
Jieba 提供了三种分词模式:
● 精确模式:试图将句子最精确地切开,适合文本分析。
● 全模式:把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义。
● 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
3.词性标注
1.什么是词性标注
词性是词汇基本的语法属性,通常也称为词类。词性标注是在给定句子中判定每个词的语法范畴,
确定其词性并加以标注的过程。
词性: 语言中对词的一种分类方法,以语法特征为主要依据、兼顾词汇意义对词进行划分的结果,常见的词性有14种,如:名词,动词,形容词等。
顾名思义,词性标注(Part-Of-Speech tagging,简称POS)就是标注出一段文本中每个词汇的词性。举例:
我爱自然语言处理
==>
我 /rr, 爱 /v, 自然语言 /n, 处理 /vn
rr: 人称代词
v: 动词
n: 名词
vn: 动名词
2.词性标注的作用
词性标注以分词为基础 , 是对文本语言的另一个角度的理解 , 因此也常常成为 AI 解决 NLP 领域高
阶任务的重要基础环节 .
例如,表示人、地点、事物以及其他抽象概念的名称即为名词,表示动作或状态变化的词为动词,
描述或修饰名词属性、状态的词为形容词。如给定一个句子:“这儿是个非常漂亮的公园”,对其
的标注结果应如下:“这儿 / 代词 是 / 动词 个 / 量词 非常 / 副词 漂亮 / 形容词 的 / 结构助词 公
园 / 名词”。
3.常见词性
4.北大词性标注集部分标注的词性表
5.使用JieBa词性标注
使用 jieba 进行中文词性标注:
import jieba.posseg as pseg
pseg.lcut(" 我爱北京天安门 ")
[pair(' 我 ', 'r'), pair(' 爱 ', 'v'), pair(' 北京 ', 'ns'), pair(' 天安门 ', 'ns')]
结果返回一个装有 pair 元组的列表 , 每个 pair 元组中分别是词汇及其对应的词性 , 具体词性含
义请参照 附录 : jieba 词性对照表
6.使用hanlp词性标注
hanlp主要基于深度学习技术通过神经网络进行分词,通常使用 BiLSTM-CRF(双向长短期记忆网络+条件随机场)模型或其变体作为核心架构。
BiLSTM: 能够有效捕捉句子中上下文(当前字前后相邻的字)的长距离依赖信息,理解字在词内和词边界的潜在模式。
CRF: 在 BiLSTM 的输出之上,进一步对整个句子进行结构化预测,考虑所有字之间的标签依赖关系(比如“B”后面不能跟“O”,最可能跟“M”或“E”),从而得到全局最优的分词序列标签。
使用 hanlp 进行中文词性标注:
import hanlp
加载中文命名实体识别的预训练模型 CTB5_POS_RNN_FASTTEXT_ZH
tagger = hanlp.load(hanlp.pretrained.pos.CTB5_POS_RNN_FASTTEXT_ZH)
输入是分词结果列表
tagger([' 我 ', ' 的 ', ' 希望 ', ' 是 ', ' 希望 ', ' 和平 '])
结果返回对应的词性
['PN', 'DEG', 'NN', 'VC', 'VV', 'NN']
4.命名实体识别
1.命名实体
通常我们将人名, 地名,机构名等专有名词统称命名实体,其构成方法具有各自的规律性,因此,通常把对这些词的识别在词汇形态处理(如汉语切分)任务中独立处理,称为命名实体识别( Named Entities Recognition , NER )。 NER 研究的命名实体一般分为 3 大类(实体类、时
间类和数字类)和 7 小类(人名、地名、组织机构名、时间、日期、货币和百分比)。如:周杰伦, 黑山县, 孔子学院,俄罗斯。
例如:
“ 人名”是一种概念,或者说实体类型,那么“周杰伦”就是一种“人名”实体了。
“ 时间”是一种实体类型,那么“中秋节”就是一种“时间”实体了。
2.命名实体识别 (Named Entity Recognition ,简称 NER)
指识别出一段文本中可能存在的命名实体。就是将你想要获取到的实体类型,从一句话里面挑出来的过程。
如:小明 在 北京大学 的 燕园 看了
PER ORG LOC
中国男篮 的一场比赛
ORG
如上面的例子所示:“小明在北京大学的燕园看了中国男篮 的一场比赛”,通过 NER 模型,
将“小明 ” 以 PER , “北京大学” 以 ORG ,“燕园” 以 LOC , “中国男篮” 以 ORG 为类别分
别挑了出来。
NER是一种序列标注问题,因此他们的数据标注方式也遵照序列标注问题的方式,主要是BIO和BIOES两种。这里直接介绍BIOES,明白了BIOES,BIO也是类似的。
先列出来BIOES分别代表的意思:
B,即Begin,表示开始
I,即Intermediate,表示中间
E,即End,表示结尾
S,即Single,表示单个字符
O,即Other,表示其他,用于标记无关字符
将“小明在北京大学的燕园看了中国男篮的一场比赛”这句话,进行标注,结果就是:
[B-PER,E-PER,O,B-ORG,I-ORG,I-ORG,E-ORG,O,B-LOC,E-LOC,O,O,B-ORG,I-ORG,I-ORG,E-ORG,O,O,O,O]
那么,换句话说,NER的过程,就是根据输入的句子,预测出其标注序列的过程。
上面的标注结果为:
- 小明(B-PER,E-PER):表示“小明”是一个人名实体,B-PER表示人名实体的开始,E-PER表示人名实体的结束。北京大学(B-ORG,I-ORG,I-ORG,E-ORG):表示“北京大学”是一个组织实体,B-ORG表示组织实体的开始,I-ORG表示组织实体的中间部分,E-ORG表示组织实体的结束。燕园(B-LOC,E-LOC):表示“燕园”是一个地点实体,B-LOC表示地点实体的开始,E-LOC表示地点实体的结束。中国男篮(B-ORG,I-ORG,I-ORG,E-ORG):表示“中国男篮”是一个组织实体,B-ORG表示组织实体的开始,I-ORG表示组织实体的中间部分,E-ORG表示组织实体的结束。其他字符标记为O,表示它们不属于任何命名实体。通过这种方式,NER系统能够识别文本中的不同实体,并为每个实体分配正确的类别标签。
3.命名实体识别的作用:
同词汇一样,命名实体也是人类理解文本的基础单元,因此也是 AI 解决 NLP 领域高阶任务的重要
基础环节。
import hanlp
加载中文命名实体识别的预训练模型 MSRA_NER_BERT_BASE_ZH
recognizer = hanlp.load(hanlp.pretrained.ner.MSRA_NER_BERT_BASE_ZH)
这里注意它的输入是对句子进行字符分割的列表 , 因此在句子前加入了 list()
>>> list(' 上海华安工业(集团)公司董事长谭旭光和秘书张晚霞来到美 国纽约现代艺术博物馆
参观。 ')
[' 上 ', ' 海 ', ' 华 ', ' 安 ', ' 工 ', ' 业 ', ' ( ', ' 集 ', ' 团 ', ' ) ', ' 公 ', ' 司 ', ' 董 ', ' 事 ', ' 长 ', ' 谭 ',
' 旭 ', ' 光 ', ' 和 ', ' 秘 ', ' 书 ', ' 张 ', ' 晚 ', ' 霞 ', ' 来 ', ' 到 ', ' 美 ', ' 国 ', ' 纽 ', ' 约 ', ' 现 ', ' 代 ', ' 艺 ',' 术 ', ' 博 ', ' 物 ', ' 馆 ', ' 参 ', ' 观 ', ' 。 ']
recognizer(list(' 上海华安工业(集团)公司董事长谭旭光和秘书张晚霞来到美国纽约现代艺
术博物馆参观。 '))
[(' 上海华安工业(集团)公司 ', 'NT', 0, 12), (' 谭旭光 ', 'NR', 15, 18), (' 张晚霞 ', 'NR', 21, 24),
(' 美国 ', 'NS', 26, 28), (' 纽约现代艺术博物馆 ', 'NS', 28, 37)]
返回结果是一个装有 n 个元组的列表 , 每个元组代表一个命名实体 , 元组中的每一项分别代表具
体的命名实体 , 如 : ' 上海华安工业(集团)公司 '; 命名实体的类型 , 如 : 'NT'- 机构名 ; 命名实体
的开始索引和结束索引 , 如 : 0, 12.
6.关键词提取算法
1.TF-IDF 算法
TF-IDF 算法( Term Frequency-Inverse Document Frequency ,词频–逆文档频次算法)是一
种基于统计的计算方法,常用于评估在一个文档集中一个词对某份文档的重要程度。这种作用显然
很符合关键词抽取的需求,一个词对文档越重要,那就越可能是文档的关键词,人们常将 TF-IDF
算法应用于关键词提取中。
算法的名称就可以看出, TF-IDF 算法由两部分组成: TF 算法以及 IDF 算法。 TF 算法是统计一个
词在一篇文档中出现的频次,其基本思想是,一个词在文档中出现的次数越多,则其对文档的表达
能力也就越强。而 IDF 算法则是统计一个词在文档集的多少个文档中出现,其基本的思想是,如果
一个词在越少的文档中出现,则其对文档的区分能力也就越强。
Term Frequency-Inverse Document Frequency ,词频 - 逆文档频率
2.TF (词频)
词语在一篇文章中出现的次数,出现的次数越多表示这个词对这篇文章越重要
通常需要归一化,以防止它偏向于长文章
3.IDF (逆文档频率)
如果在所有的语料中,包含某个词语的文章数越多,那么这个词语的区分度就越低,重要长度
也就越低,通常,我们需要过滤掉 IDF 过低和过高的词语
在词袋模型中,我们可以使用作为每个词的权重
4.sklearn.feature_extraction.text 包中的三个函数
CountVectorizer
从文本分词,计算每个文档的 TF 矩阵(这里 TF 为真实的词频,未归一化)
TfidfTransformer
从 TF 矩阵,计算 TF-IDF 矩阵(每个文档做了归一化)
TfidfVectorizer
等于 CountVectorizer + TfidfTransformer
5.TF算法公式
TF 算法和 IDF 算法也能单独使用,在最早的时候就是如此。但是在使用过程中,学者们发现这两
种算法都有其不足之处。 TF 仅衡量词的出现频次,但是没有考虑到词的对文档的区分能力。比如
针对下面这篇文档:
世界献血日,学校团体、献血服务志愿者等可到血液中心参观检验加工过程,我们会对检验结果进
行公示,同时血液的价格也将进行公示。
上文中“献血”“血液”“进行”“公示”等词出现的频次均为 2 ,如果从 TF 算法的角度,他们
对于这篇文档的重要性是一样的。但是实际上明显“血液”“献血”对这篇文档来说更关键。而
IDF 则是相反,强调的是词的区分能力,但是一个词既然能在一篇文档中频繁出现,那说明这个词
能够很好地表现该篇文档的特征,忽略这一点显然也是不合理的。于是,学者们将这两种算法综合
进行使用,构成 TF-IDF 算法,从词频、逆文档频次两个角度对词的重要性进行衡量。
世界献血日,学校团体、献血服务志愿者等可到血液中心参观检验加工过程,我们会对检验结
果进行公示,同时血液的价格也将进行公示。
其中 nij 表示词 i 在文档 j 中的出现频次,但是仅用频次来表示,长文本中的词出现频次高的概
率会更大,这一点会影响到不同文档之间关键词权值的比较。所以在计算的过程中一般会对词频进
行归一化。分母部分就是统计文档中每个词出现次数的总和,也就是文档的总词数。还是以上文文
档为例,“献血”一词出现次数为 2 ,文档的总词数为 30 ,则 tf (献血) =n (献血) /n (总)
=2/30≈0.067 。更直白的表示方式就是, tf ( word ) = ( word 在文档中出现的次数) / (文
档总词数)。
|D| 为文档集中总文档数, |Di| 为文档集中出现词 i 的文档数量。分母加 1 是采用了拉普拉斯平滑,
避免有部分新的词没有在语料库中出现过而导致分母为零的情况出现,增强算法的健壮性。
表示词项(i)的逆文档频率。
表示文档集合中的总文档数。
表示包含词项(i)的文档数量。
TF-IDF 算法就是 TF 算法与 IDF 算法的综合使用,具体计算方法见下式。对于这两种方法怎么组合
,学者们也做了很多的研究, tf 和 idf 是相加还是相乘, idf 的计算究竟要取对数还是不取对数。
经过大量的理论推导和实验研究后,发现下式的计算方式是较为有效的计算方式之一。
表示词项
在文档
中的词频。
表示词项在文档中出现的次数。
表示文档(j)中所有词项出现的次数之和。
表示文档集合中的总文档数。
表示包含词项(i)的文档数量。
以上文文档为例,经过计算得到“献血”“血液”“进行”“公示”四个词出现的频次均为 2 ,因
此他们的 tf 值都是 0.067 。现假设我们具有的文档集有 1000 篇文档,其中出现“献血”“血液”
“进行”“公示”的文档数分别为 10 、 15 、 100 、 50 ,则根据式( 5.2 ), idf (献
血) =log ( 1000/10 ) =10 。同理可得, idf (血液) =4.20 , idf (进行) =2.30 , idf (进
行) =3.00 。
得到这些信息后,根据上式计算每个词的 tf-idf 值,可以知道“献血”的 tf-idf 值最高,为最适合
这篇文档的关键词。当然,关键词数量可以不止一个,可以根据 tf-idf 值由大到小排序取前 n 个作
为关键词。
除了上面提到的传统的 TF-IDF 算法之外, TF-IDF 算法也有很多变种的加权方法。
传统的 TF-IDF 算法中,仅考虑了词的两个统计信息(出现频次、在多少个文档出现),因此,其对文本的信息利用程度显然也是很少的。
除了上面的信息外,在一个文本中还有许多信息能对关键词的提取起到很好的指导作用,例如
每个词的词性、出现的位置等。在某些特定的场景中,如在传统的 TF-IDF 基础上,加上这些辅助
信息,能对关键词提取的效果起到很好的提高作用。在文本中,名词作为一种定义现实实体的词,
带有更多的关键信息,如在关键词提取过程中,对名词赋予更高的权重,能使提取出来的关键词更
合理。
此外,在某些场景中,文本的起始段落和末尾段落比起其他部分的文本更重要,如对出现在这
些位置的词赋予更高的权重,也能提高关键词的提取效果。算法本身的定义是死的,但是结合我们
的应用场景,对算法进行合适的重塑及改造,使之更适应对应场景的应用环境,无疑能对我们想要
得到的结果起到更好的指导作用。
7.句法分析
句法分析( Parsing )是从单词串得到句法结构的过程,而实现该过程的工具或程序被称为句法分
析器( Parser )。
将一段文本使用张量进行表示,其中一般将词汇为表示成向量,称作词向量,再由各个词向量按顺序
组成矩阵形成文本表示 .
1.文本张量表示的作用 :
将文本表示成张量(矩阵)形式,能够使语言文本可以作为计算机处理程序的输入,进行接下来一系
列的解析工作 .
2.文本张量表示的方法 :
1.one-hot 编码
one-hot 词向量表示 :
又称独热编码,将每个词表示成具有 n 个元素的向量,这个词向量中只有一个元素是 1 ,其他
元素都是 0 ,不同词汇元素为 0 的位置不同,其中 n 的大小是整个语料中不同词汇的总数 .
这样会有一个问题,词少的时候还可以这样做,但是词比较多的时候,就会表述稀疏
2.表述稀疏(Sparse Representation)
指的是数据集中大部分元素为零(或接近零)的表示方式。
1.表现特征:
一个具有 N 个类别的特征,经过 One-Hot 编码后会变成 N 维的向量。
在该向量中,仅有一个位置为 1,其余 N-1 个位置都为 0。
例如:颜色特征(红、绿、蓝)编码为:
红 → [1, 0, 0]
绿 → [0, 1, 0]
蓝 → [0, 0, 1]
2. 稀疏度计算:
在长度为 N 的向量中,非零值仅占 1/N。
例如:当 N=100 时,99% 的元素都是 0。
3.假设:
我们的 feature_1 有两种可能的取值,比如是男 / 女,这里男用 1 表示,女用 2 表示。
feature_2 代表 成绩比如有ABCD,4个等级
feature_3 代表身高 低 中 高。
one-hot 编码就是保证每个样本中的单个特征只有 1 位处于状态1 ,其他的都是 0 。
上述状态用 one-hot 编码如下图所示:
3.one-hot编码的优缺点
优势:操作简单,容易理解.
劣势:完全割裂了词与词之间的联系,而且在大语料集下,每个向量的长度过大,占据大量内存.
说明
正因为one-hot编码明显的劣势,这种编码方式被应用的地方越来越少,取而代之的是接下来我们要学习的稠密向量的表示方法word2vec和word embedding
2.Word2vec
1.词袋
词袋(Bag-of-Words,简称 BoW)模型是最早的以词语为基本处理单元的文本向量化方法。
2.词袋的工作流程
假设我们有一个微小的文档集合:
- 文档1 (D1): 我爱吃苹果文档2 (D2): 她喜欢吃香蕉文档3 (D3): 苹果是一种水果
步骤 1: 分词(Tokenization)
- D1: ["我", "爱", "吃", "苹果"]D2: ["她", "喜欢", "吃", "香蕉"]D3: ["苹果", "是", "一种", "水果"]
步骤 2: 构建词表(Vocabulary)
收集所有文档中的唯一单词,并排序(通常按字母序):
[“一种”, “吃”, “喜欢”, “她”, “我”, “爱”, “是”, “水果”, “苹果”, “香蕉”]
词表大小 = 10个词 (位置0-9)
步骤 3: 生成词频向量(向量化)
为每个文档创建一个长度为10的向量(对应词表),统计每个词出现的频率。
但是该向量与原来文本中单词出现的顺序没有关系,而是词典中每个单词在文本中出现的频率。
3.词袋的问题
该方法虽然简单易行,但是存在如下三方面的问题:
● 维度灾难。很显然,如果词典中包含 10000 个单词,那么每个文本需要用 10000 维的向量表示
,也就是说除了文本中出现的词语位置不为 0 ,其余 9000 多的位置均为 0 ,如此高维度的向量会
严重影响计算速度。
● 无法保留词序信息。
● 存在语义鸿沟的问题。
词袋模型的问题,就是无法抓取到核心的信息,因为它忽略了语法和文法,只是把
一句话当成一个词的合集。例如,“这部电影非常难看”和“无聊,无趣,毫无意义”有着类似
的意义,但是“这部电影一点也不难看”和前面一句话有着几乎一样的特征表示,但是却代表着
截然不同的意思。
为了解决这一问题,我们使用了 word2vec 方法进行特征提取,由于该方法比较复杂且归属
于深度学习相关方法,该方法比词袋模型先进的地方是,它可以将文本嵌入到低维空间,并且不
丢失文本的顺序信息,是一种非常方便的端到端的训练模型。
4.word2vec 词向量
词向量( word2vec )技术就是为了利用神经网络从大量无标注的文本中提取有用信息而产生的
我们将 king 这个词从一个可能非常稀疏的向量空间,映射到现在这个四维向量所在的空间,这个过程称为 word embedding (词嵌入),即将高维词向量嵌入到一个低维空间
经过我们一系列的降维神操作,有了用 Dristributed representation 表示的较短的词向量,
我们就可以较容易的分析词之间的关系了,比如我们将词的维度降维到 2 维,有一个有趣的
研究表明,用下图的词向量表示我们的词时,我们可以发现:
国王的特征中 减去男性的特征 加上女性的特征 就变成了王后的特征
3.Word Embedding
8.KNN算法
KNN ( K Near Neighbor ): k 个最近的邻居,即每个样本都可以用它最接近的k 个邻居来代表,即如果一个样本在特征空间中的 k 个最相似 ( 即特征空间中最邻近 ) 的样本中的大多数属于某一个类别,则该样本也属于这个类别。
最近邻 (k-Nearest Neighbors , KNN) 算法是一种分类算法, 1968 年由 Cover 和 Hart 提出,应用场景有字符识别、文本分类、图像识别等领域。
该算法的思想是:一个样本与数据集中的 k 个样本最相似,如果这 k 个样本中的大多数属于某一个类别,则该样本也属于这个类别,即,对每一个测试样本,基于事先选择的距离度量, KNN 算法在训练集中找到距离最近 ( 最相似 ) 的 k 个样本,然后将 k 个样本的类别的投票结果作为测试样本的类别。
用 KNN 算法来预测《唐人街探案》的电影类型
特征选择:选择 “搞笑镜头”“拥抱镜头”“打斗镜头” 的数量作为特征。
将每部电影看作特征空间中的一个点,
比如《功夫熊猫 1》对应点 (39, 0, 31) 。
距离度量:常用欧氏距离计算电影之间的距离。例如计算《唐人街探案》(设其搞笑镜头 23 个、拥抱镜头 3 个、打斗镜头 17 个 )
与《功夫熊猫 1》的欧氏距离:
K 值确定:K 值是一个超参数,需人为设定。比如设 K = 3 ,
即找与《唐人街探案》距离最近的 3 部电影。
分类决策:找出距离最近的 3 部电影后,统计这 3 部电影中出现最多的电影类型。
若最近的 3 部电影中,有 2 部是喜剧片,1 部是动作片,那么根据 KNN 算法,就将《唐人街探案》预测为喜剧片 。
zhuanlan.zhihu.com/p/264367144