前言:
第一章基本都是NLP的概念和发展介绍了吧...
重复的内容不谈,,说一下补充和相关的思考。
1 语言处理
“自然语言处理”根据百度百科定义[1]:
自然语言处理( Natural Language Processing, NLP)旨在使机器理解、解释并生成人类语言,实现人机之间有效沟通,使计算机能够执行语言翻译、情感分析、文本摘要等任务。
从中拆解,“自然语言”是形式,交互对象的“人”与“计算机”,目的在于“沟通”。所以成为了语言学、计算机、人工智能、图书情报等等学科的交叉领域。
进一步思考一下,我们想让计算机输出“hello word”,那么我们先在py文件中写:
print("hello word")然后使用python运行,计算机就能够输出“hello word”。
这其实是使用代码(以及配套软件)的形式,让计算机“理解”了“输出hello word”的意图。一般而言,代码(编程语言)与“自然语言”是属于两类,高级编程语言会出于易读性、方便使用性等目的,去接近自然语言的形式(而自然语言最大的问题就是不确定性与模糊性了)。
当然,这种编程的方法,必然不属于、也不应该属于“自然语言处理”,但大抵是可以同归属于“语言处理”。。。那么语言的定义是什么呢?似乎没有过于明确的定义,很多都是“描述性的而非规定性的: 语言学家的定义旨在科学地描述人类语言的本质特征,而不是规定语言“应该”是什么样子”,参考《语言学纲要》相关内容[2](这本书写的挺有意思)与考研材料[3],“语言”的定义似乎可以是:
语言是一种特殊的社会现象,是人类作为必不可少的思维工具和最重要的交际工具来使用的一种音义结合的符号系统。语言是由语音、词汇、语法构成的体系。
大概可以认为“语言”具有文本和声音两种形式,在后续以“文本”形式为主要说明。有一段难以查明出处的话,对编程语言(文中称为“算法语言”)与自然语言进行了论述:
人类思维职能的延伸使机器能代替人的一部分脑力劳动,出现了人直接命令机器进行操作的前景。这将给语言研究带来重大的影响。要给机器下命令,必须使机器“懂"得一种语言。但机器远不能理解自然语言,因而创造了使它能够识别的、高度形式化的算法语言。初期的算法语言比较烦琐,跟自然语言的距离很大,人们要掌握它,相当费事。近年来,经过人们的不断改进,算法语言有逐步向自然语言靠拢的趋势,出现很多方案,大大方便了操作计算机的人员的学习和使用,同时也提高了机器的效能。不过自然语言太复杂,人们没有办法让机器全部接受。如果我们把自然语言分析得很透彻,连机器也能识别,那么人和机器就能直接对话,不必经过算法语言的中介了。
所以,照猫画虎地,“语言处理”可以近似定义:
语言处理( Language Processing, LP)旨在使机器理解、解释并生成语言,实现人机之间有效沟通,使计算机能够执行以语言为载体的人类所意图的任务。
可以看出,“语言”是承载了“意图”的,承担了“交际”与“思维”的工具属性。无非就是“编程语言”会追求精确性,“自然语言”会贴近口语化,就是一些俚语、方言、小语种、歧义、指代等等。。“自然语言处理”的处理对象往往也是自然语言,任务也是与自然语言相关的。而“编程语言”的处理对象,,姑且算是底层的01机器语言..?任务则依旧将其限定在“以语言为载体”的基础上。但是,语言的“交际”与“思维”属性大大拓展了“任务”的范围。“指令”,一种结构化很强的语言(可能是编程语言、也可能是自然语言),比如shutdown -p,它生成后被执行,会带来什么结果?电脑立刻关机。因为其能够传递“意图”,从而达成控制的目的,由此产生的影响,即“任务范围”、“能干的事情”就很多了,比如让屏幕打印特定字符、进行运算、甚至通过控制声光电......但应该是可以用“人类所意图的任务”来概括。这也是为什么其与“人工智能”密切相关了。
因此,当以“自然语言”为形式的“大语言模型”快速发展,最先落地的,除了一开始的对话、问答,就是代码生成了。。而文本训练中除了人类书籍等自然语言,不管是出于就近原则(训练LLM的是互联网公司,代码资源多)、便利性(网络原生的高质量文本,代码占比客观)、目的性(就是为了提高编程能力)还是什么原因,也往往会添加大量的程序代码(即:编程语言)。所以使得,真的是“大语言模型”,而不单纯的“大自然语言模型”,在编程方面具有较为天然的优势。进一步地,基于大语言模型的智能体,也是以语言文本的形式(前文所说的“指令”)进行了工具使用。
分词、词性标注、关系抽取、机器翻译、文本摘要等等,确实都是传统NLP领域的研究热点,spaCy、HanLP、nltk等开源包的功能很全面了。但是由于“大语言模型”太火,,很多都直接“碾压式”代替掉了,比如使用提示词“请对下面的文本进行XXX任务,要求是YYY”。。nltk库我个人有用到,一些分词(好像是BERT)、文本评估(BLEU分数等)还由于历史发展原因存在依赖关系。
反正就是从原本比较小众的语言信息学的领域,再到被计算机、人工智能领域广泛使用。。
- 杂念1:有人问过,为什么平时用的大模型写硬件代码不好?,,个人感觉大概是因为没有相关训练文本(互联网公司从互联网上找的互联网文本),加上泛化性有限。
- 杂念2:大语言模型与代码模型(大编程语言模型)天然地接近,因此在Web开发等写代码领域落地迅速,,同时由于“语言”承载“意图”,因此被认为接近AGI(通用人工智能)。。但是看过一个观点“大语言模型在模态上与写代码相通通,但是与现实世界有缺失确实,不足以实现世界模型、AGI。。”换句话就是,思维离不开语言,但是不等于语言(扯远了,,关我啥事......)
2 文本数字化表示
核心就是转化为数字,把“语言”文本转化为一串数字,才能在计算机里做运算。
根据项目所言[4],总结了一下,发展历程、形态变化大概就是:
1、人为定义的特征:根据句子中的词频等特征,如向量空间模型(Vector Space Model, VSM)
2、条件概率统计得到:根据⼀个词前⾯的N-1个词,计算当前词的出现概率,如N-gram模型。马尔可夫(Andrey Markov)在 1906 年提出,最初用于分析普希金长诗《叶甫盖尼·奥涅金》中字母的转移概率,是用统计方法研究自然语言的最早尝试。1948 年,克劳德·香农(Claude Shannon)在《通信的数学理论》中将马尔可夫过程系统性地引入自然语言建模,明确提出了"用前文预测下一个符号"的概率思想。1975 年,Jelinek 等人在论文 《Continuous Speech Recognition by Statistical Methods》中,首次将 N-gram 语言模型应用于语音识别任务投入实际使用。
3、神经网络词嵌入:
Embedding(嵌入)是指把文本(也可能包括图像、视频等其他模态数据)转成能表达语义信息的浮点数向量[5]。使用神经网络学习文本的低维稠密分布式表示,比如规定用512维向量来表示,神经网络自己学习得到每一维度干什么、总体是干什么,目标是让向量空间的几何距离对应语义关联程度。
2001年Yoshua Bengio 等人发表了论文《A Neural Probabilistic Language Model》,首次提出用神经网络(前馈神经网络)来构建语言模型。
(1)静态词嵌入:基于局部窗口的上下文共现关系训练,生成全局唯一的静态词向量,如Word2Vec
(2)动态上下文嵌入:根据词汇所处的具体语境生成差异化的词向量,用于解决一词多义问题
比如“train”,作为名词“火车”,与作为动词“训练”,“苹果”是水果,还是科技公司,其中所代表的东西差异还是比较大了。。感觉更指向了其本质所代表的事物(一对多),而不是在字面(一对一)
ELMo、Bert应该都属于此类,不过神经网络架构不同,前者是双向LSTM结构、后者是Transformer自注意力机制。
- 杂念1:把文本转化为图(知识图谱)也算是与数字化(或者说向量化)并列的表示方法吧...?可以通过谓词逻辑进行符号推断,虽然目前实际用的时候大多也是进行了向量化表示,比如实体关系标注识别、嵌入推理等等。。
- 杂念2:底层还是在概率统计,但非线性变换映射多了,,从效果来看,就成了“自发涌现出的高阶抽象得到的语义表示”
[1]自然语言处理(语言处理方式)_百度百科
[2]叶蜚声、徐通锵著,王洪君、李娟修订:《语言学纲要》(修订版),北京大学出版社,2010.
[3]187个《语言学纲要》名词解释整理(一)
[4]https://github.com/datawhalechina/happy-llm
[5]【科普】大家一直说的Embedding(嵌入)是什么?,一文看懂!-CSDN博客