自然语言处理 --- 基础知识
自然语言处理(NLP)是人工智能领域的重要分支,旨在实现计算机与人类语言之间的交互。它结合计算机科学、人工智能和语言学技术,主要目标包括语言理解、生成、翻译、情感分析等。NLP在中文环境面临分词、语法分析等特殊挑战。其应用涵盖自然语言理解(NLU)、转换(NLT)和生成(NLG)三大方向,涉及情感分析、文本分类、机器翻译、语音识别等任务。常用数据集包括SST-2、THUCNews、WMT14等,规
自然语言处理 — 基础知识
文章目录
一,基本概念
自然语言处理(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)序列:指的是一个按顺序排列的元素集合。这些元素可以是字符、单词、句子,甚至更抽象的结构。序列的每个元素都有特定的顺序和位置,这意味着它们不能随意重排,否则会影响其意义或功能。
序列的常见类型
- 字符序列:
- 一个字符串就是一个字符序列,每个字符按顺序排列。
- 例子:
"hello"是一个由h、e、l、l、o组成的字符序列。
- 单词序列:
- 一句话可以看作是一个单词序列,每个单词按照一定顺序排列。
- 例子:
"I love NLP"是一个由I、love、NLP组成的单词序列。
- 时序数据:
- 在时间序列中,元素是按时间顺序排列的,常用于预测问题。
- 例子:股票价格数据可以看作是随时间变化的数值序列。
- 语音序列:
- 在语音处理任务中,语音信号可以被分解为按时间顺序排列的帧序列(特征向量序列)。
- 其他序列:
- 序列还可以表示一些更抽象的结构,比如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发布了CLIP和DALL·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曲线等。同一种评价方法也往往适用于多种类型的模型。在实际的生产环境中,模型性能评价的侧重点可能会不一样,不同的业务场景对模型的性能有不同的要求,如可能造成经济损失的预测结果会要求模型的精度更高。
更多推荐

所有评论(0)