自然语言处理 — 基础知识



一,基本概念

自然语言处理(Natural Language Processing,简称NLP)是人工智能和语言学领域的一个分支,它涉及到计算机和人类(自然)语言之间的相互作用。它的主要目标是让计算机能够理解、解释和生成人类语言的数据。NLP结合了计算机科学、人工智能和语言学的技术和理论,旨在填补人与机器之间的交流隔阂。

1.1 自然语言处理的基本介绍

在定义NLP之前,先了解几个相关概念:

  • 语言(Language):是人类用于沟通的一种结构化系统,可以包括声音、书写符号或手势。

  • 自然语言(Natural Language):是指自然进化中通过使用和重复,无需有意计划或预谋而形成的语言。

  • 计算语言学(Computational Linguistics):是语言学和计算机科学之间的跨学科领域,它包括:

    a.计算机辅助语言学(Computer-aided Linguistics):利用计算机研究语言的学科,主要为语言学家所实践。

    b.自然语言处理(NLP):使计算机能够解决以自然语言表达的数据问题的技术,主要由工程师和计算机科学家实践。

​ NLP的研究范围广泛,包括但不限于语言理解(让计算机理解输入的语言)、语言生成(让计算机生成人类可以理解的语言)、机器翻译(将一种语言翻译成另一种语言)、情感分析(分析文本中的情绪倾向)、语音识别和语音合成等。

​ 在中文环境下,自然语言处理的定义和应用也与英文环境相似,但需要考虑中文的特殊性,如中文分词、中文语法和语义分析等,因为中文与英文在语言结构上有很大的不同,这对NLP技术的实现提出了特殊的挑战。自然语言处理使计算机不仅能够理解和解析人类的语言,还能在一定程度上模仿人类的语言使用方式,进行有效的沟通和信息交换。

1.2 为什么使用NLP

  • 每种动物都有自己的语言,机器也是!

  • 自然语言处理(NLP)就是在机器语言和人类语言之间沟通的桥梁,以实现人机交流的目的。人类通过语言来交流,猫通过喵喵叫来交流。

  • 机器也有自己的语言,那就是数字信息。

  • NLP 就是让机器学会处理我们的语言!请添加图片描述

二.NLP的应用方向

请添加图片描述

2.1 自然语言理解(NLU)

子任务 数据集 数据规模 语言 下载地址 备注
情感分析 SST-2 训练 67 k / 验证 872 / 测试 1.8 k 英文 https://nlp.stanford.edu/sentiment/ 句子级二分类
情感分析 ChnSentiCorp 训练 9.6 k / 验证 1.2 k / 测试 1.2 k 中文 https://github.com/pengming617/bert_classification/tree/master/data/ChnSentiCorp 酒店、书籍等评论
文本分类 AG News 训练 120 k / 测试 7.6 k 英文 https://www.di.unipi.it/~gulli/AG_corpus_of_news_articles.html 4 类新闻主题
文本分类 THUCNews 训练 180 k / 验证 5 k / 测试 5 k 中文 https://github.com/gaussic/THUCNews 10 类新闻
信息检索 MS MARCO Passage Ranking 训练 502 k 查询-段落对 英文 https://microsoft.github.io/msmarco/ 段落级相关性
抽取式阅读理解 SQuAD 1.1 训练 87 k / 验证 10 k 问答对 英文 https://rajpurkar.github.io/SQuAD-explorer/ 基于维基段落
抽取式阅读理解 CMRC 2018 训练 10 k / 验证 3.2 k / 测试 4.9 k 中文 https://github.com/ymcui/cmrc2018 中文维基
语义匹配 LCQMC 训练 239 k / 验证 8.8 k / 测试 12.5 k 中文 http://icrc.hitsz.edu.cn/info/1031/1146.htm 句子对是否同义
自然语言推理 SNLI 训练 550 k / 验证 10 k / 测试 10 k 英文 https://nlp.stanford.edu/projects/snli/ 三分类:蕴含/矛盾/中立
命名实体识别 CoNLL-2003 训练 14 k / 验证 3.3 k / 测试 3.4 k 句 英文 https://www.clips.uantwerpen.be/conll2003/ner/ 4 类实体
命名实体识别 MSRA-NER 训练 46 k / 测试 4.4 k 句 中文 https://github.com/OYE93/Chinese-NLP-Corpus/tree/master/NER/MSRA 人名、地名、机构名
文本摘要 CNN/DailyMail 训练 287 k / 验证 13 k / 测试 11 k 英文 https://huggingface.co/datasets/cnn_dailymail 新闻生成 3-4 句摘要

2.2 自然语言转换(NLT)

子任务 数据集 数据规模 语言对 下载地址 备注
机器翻译 WMT14 EN-DE 训练 4.5 M 句 EN↔DE https://www.statmt.org/wmt14/translation-task.html Transformer 基准
机器翻译 IWSLT15 EN-VI 训练 133 k 句 EN↔VI https://wit3.fbk.eu/2015-01 较小规模
非抽取式阅读理解 MS MARCO QnA 训练 1.0 M 英文 https://microsoft.github.io/msmarco/ 生成式问答
文本风格转换 GYAFC 训练 110 k / 验证 28 k 英文 https://github.com/raosudha89/GYAFC-dataset 正式 ↔ 非正式
语音识别 LibriSpeech 960 h 语音 英文 http://www.openslr.org/12 16 kHz 朗读语音
语音识别 AISHELL-1 178 h 语音 中文 http://www.openslr.org/33 16 kHz 朗读语音
意图改写 ParaNMT 训练 50 M 句对 英文 https://github.com/john-hewitt/para-nmt-50m 句子级改写

2.3 自然语言生成(NLG)

子任务 数据集 数据规模 语言 下载地址 备注
文本生成 WikiText-103 训练 1800 万词 英文 https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-103-v1.zip 语言建模
文本生成 LCCC-large 训练 6.8 M 对话 中文 https://github.com/thu-coai/CDial-GPT 开放域闲聊
语音合成 LJSpeech 13 k 音频-文本 英文 https://keithito.com/LJ-Speech-Dataset/ 24 kHz 女声
语音合成 BZNSYP 10 k 音频-文本 中文 https://www.data-baker.com/open_source.html 24 kHz 女声
文本到知识 WebNLG 训练 35 k 三元组-文本 英文 https://webnlg-challenge.loria.fr/ RDF → 文本
语义解析 ATIS 5 k 查询-SQL 英文 https://github.com/h-zh/ATIS-SQL 航班查询

三,NLP基础概念

下面总结一些NLP中常用的概念名词,便于理解任务。

​ (1)词表/词库(Vocabulary):文本数据集中出现的所有单词的集合。

​ (2)语料库(Corpus):用于NLP任务的文本数据集合,可以是大规模的书籍、文章、网页等。

​ (3)词嵌入(Word Embedding):将单词映射到低维连续向量空间的技术,用于捕捉单词的语义和语法信息。

​ (4)停用词(Stop Words):在文本处理中被忽略的常见单词,如"a"、“the”、"is"等,它们通常对文本的意义贡献较 小。

​ (5)分词(Tokenization):将文本分割成一个个单词或标记的过程,为后续处理提供基本的单位。

​ (6) 词频(Term Frequency):在给定文档中,某个单词出现的次数。

​ (7)逆文档频率(Inverse Document Frequency):用于衡量一个单词在整个语料库中的重要性,是将词频取倒数并取 对数的值。

​ (8) TF-IDF(Term Frequency-Inverse Document Frequency):一种常用的文本特征表示方法,综合考虑了词频和逆文档频率。

​ (9) 词袋模型(Bag of Words):将文本表示为一个单词的集合,忽略了单词的顺序和语法结构。

(10)N-gram:连续的N个单词构成的序列,用于捕捉文本中的局部特征和上下文信息。

(11)序列:指的是一个按顺序排列的元素集合。这些元素可以是字符、单词、句子,甚至更抽象的结构。序列的每个元素都有特定的顺序和位置,这意味着它们不能随意重排,否则会影响其意义或功能。

序列的常见类型

  1. 字符序列
    • 一个字符串就是一个字符序列,每个字符按顺序排列。
    • 例子:"hello" 是一个由 hello 组成的字符序列。
  2. 单词序列
    • 一句话可以看作是一个单词序列,每个单词按照一定顺序排列。
    • 例子:"I love NLP" 是一个由 IloveNLP 组成的单词序列。
  3. 时序数据
    • 在时间序列中,元素是按时间顺序排列的,常用于预测问题。
    • 例子:股票价格数据可以看作是随时间变化的数值序列。
  4. 语音序列
    • 在语音处理任务中,语音信号可以被分解为按时间顺序排列的帧序列(特征向量序列)。
  5. 其他序列
    • 序列还可以表示一些更抽象的结构,比如DNA序列(由碱基组成的序列)、事件序列等。

四,NLP发展历史

1950年代 - 自然语言处理的起点
1954年,乔治城-IBM实验展示了基于规则的机器翻译系统,能够将俄语翻译成英语,标志着NLP的起点。

1990年代 - 统计方法的兴起
随着计算能力的提升,基于统计的语言处理方法成为主流。n元语法、**隐马尔科夫模型(HMM)**被广泛用于机器翻译、语音识别等任务。

2000年代 - 机器学习的普及
支持向量机(SVM)朴素贝叶斯等传统机器学习算法被用于文本分类、情感分析等任务,推动了数据驱动方法的发展;以及NNLM 语言模型的提出。
2013年 - 词向量模型Word2Vec的提出
Mikolov等人提出Word2Vec模型,能够将词表示为连续的向量,捕捉词的语义关系,这是词嵌入技术的重大突破。
2014年 - Seq2Seq模型用于文本生成和机器翻译
Sutskever等人提出了序列到序列(Seq2Seq)模型,并成功应用于机器翻译、文本摘要等任务,引入了编码器-解码器结构。
2015年 - 注意力机制(Attention)的提出
Bahdanau等人提出了注意力机制,大幅提升了Seq2Seq模型的效果,使得模型能够更加灵活地处理长序列依赖问题,尤其在机器翻译中取得了突破性进展。

2017年 - Transformer模型的提出
Vaswani等人提出了Transformer模型,完全基于自注意力机制,取代了传统RNN结构,成为后来许多NLP模型的基础。

2018年 - BERT模型的提出
谷歌发布了BERT(Bidirectional Encoder Representations from Transformers),这是第一个双向预训练的语言模型,能够在多个NLP任务中实现最先进的性能。

2020年 - GPT-3的发布
OpenAI发布了GPT-3,一个拥有1750亿参数的大型语言模型,展示了强大的少样本学习和文本生成能力,在对话系统和内容生成等任务中表现优异。

2021年 - 多模态模型的兴起
OpenAI发布了CLIPDALL·E,将文本和图像结合,实现了跨模态内容理解与生成,进一步扩展了NLP的应用领域。

预训练模型工具包 : https://github.com/huggingface/

五,NLP的基本流程

​ 中文NLP的基本流程和英文相比有一些特殊性,主要表现在文本预处理环节。首先,中文文本没有像英文单词那样用空格隔开,因此不能像英文一样直接用最简单的空格和标点符号完成分词,一般需要用分词算法完成分词。其次,中文的编码不是utf-8,而是Unicode,因此在预处理的时候,有编码处理的问题。中文NLP的基本流程由语料获取、语料预处理、文本向量化、模型构建、模型训练和模型评价等六部分组成。

(1)语料获取

在进行NLP之前,人们需要得到文本语料。文本语料的获取一般有以下几种方法。
(1)利用已经建好的数据集或第三方语料库,这样可以省去很多处理成本。

(2)获取网络数据。很多时候要解决的是某种特定领域的应用,仅靠开放语料库无法满足需求,这时就需要通过爬虫技术获取需要的信息。

(3)与第三方合作获取数据。通过购买的方式获取部分需求文本数据。

(2)语料预处理

获取语料后还需要对语料进行预处理,常见的语料预处理如下。
(1)去除数据中非文本内容。大多数情况下,获取的文本数据中存在很多无用的内容,如爬取的一些HTML代码、CSS标签和不需要的标点符号等,这些都需要分步骤去除。少量非文本内容可以直接用 Python的正则表达式删除,复杂的非文本内容可以通过 Python的 Beautiful Soup库去除。

(2)中文分词。常用的中文分词软件有很多,如jieba、FoolNLTK、HanLP、THULAC、NLPIR、LTP等。其中jieba是使用 Python语言编写的,其安装方法很简单,使用“pip install jieba”命令即可完成安装。

(3)词性标注。词性标注指给词语打上词类标签,如名词、动词、形容词等,常用的词性标注方法有基于规则的算法、基于统计的算法等。

(4)去停用词。停用词就是句子中没必要存在的词,去掉停用词后对理解整个句子的语义没有影响。中文文本中存在大量的虚词、代词或者没有特定含义的动词、名词,在文本分析的时候需要去掉。

(3)文本向量化(特征工程)

​ 文本数据经过预处理去除数据中非文本内容、中文分词、词性标注和去停用词后,基本上是干净的文本了。但此时还是无法直接将文本用于任务计算,需要通过某些处理手段,预先将文本转化为特征向量。一般可以调用一些模型来对文本进行处理,常用的模型有词袋模型(Bag of Words Model)、独热表示、TF-IDF 表示、n元语法(n-gram)模型和 Word2Vec模型等。

(4)模型构建
文本向量化后,根据文本分析的需求选择合适的模型进行模型构建,同类模型也需要多准备几个备选用于效果对比。过于复杂的模型往往不是最优的选择,模型的复杂度与模型训练时间呈正相关,模型复杂度越高,模型训练时间往往也越长,但结果的精度可能与简单的模型相差无几。NLP中使用的模型包括机器学习模型和深度学习模型两种。常用的机器学习模型有SVM、Naive Bayes、决策树、K-means 等。常用的深度学习模型有TextCNN、RNN、LSTM、GRM、Seq2Seq、transformer等。

(5)模型训练
模型构建完成后,需要进行模型训练,其中包括模型微调等。训练时可先使用小批量数据进行试验,这样可以避免直接使用大批量数据训练导致训练时间过长等问题。在模型训练的过程中要注意两个问题:一个为在训练集上表现很好,但在测试集上表现很差的过拟合问题;另一个为模型不能很好地拟合数据的欠拟合问题。同时;还要避免出现梯度消失和梯度爆炸问题。
仅训练一次的模型往往无法达到理想的精度与效果,还需要进行模型调优迭代,提升模型的性能。模型调优往往是一个复杂、冗长且枯燥的过程,需要多次对模型的参数做出修正;调优的同时需要权衡模型的精度与泛用性,在提高模型精度的同时还需要避免过拟合。在现实生产与生活中,数据的分布会随着时间的推移而改变,有时甚至会变化得很急剧,这种现象称为分布漂移(Distribution Drift)。当一个模型随着时间的推移,在新的数据集中的评价不断下降时,就意味着这个模型无法适应新的数据的变化,此时模型需要进行重新训练。

(6)模型评价
模型训练完成后,还需要对模型的效果进行评价。模型的评价指标指主要有准确率(Accuracy)、精确率(Precision)、召回率、F1值、ROC曲线、AUC线等。针对不同类型的模型,所用的评价指标往往也不同,例如分类模型常用的评价方法有准确率、精确率AUC曲线等。同一种评价方法也往往适用于多种类型的模型。在实际的生产环境中,模型性能评价的侧重点可能会不一样,不同的业务场景对模型的性能有不同的要求,如可能造成经济损失的预测结果会要求模型的精度更高。

Logo

纵情码海钱塘涌,杭州开发者创新动! 属于杭州的开发者社区!致力于为杭州地区的开发者提供学习、合作和成长的机会;同时也为企业交流招聘提供舞台!

更多推荐