自然语言处理实战第二版(MEAP)(三)(3)

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_基础版,每接口每天50万次
NLP自然语言处理_高级版,每接口累计50万次
简介: 自然语言处理实战第二版(MEAP)(三)

自然语言处理实战第二版(MEAP)(三)(2)https://developer.aliyun.com/article/1517953

6.2 应用

哎呀,这些令人惊叹的词向量有什么用?词向量可以在需要机器理解单词或短 N-gram 的任何地方使用。以下是一些词向量在现实世界中已被证明有用的 N-gram 的示例:

  • 标签
  • 标签和关键词
  • 命名实体(人、地点、事物)
  • 标题(歌曲、诗歌、书籍、文章)
  • 职称和企业名称
  • 网页标题
  • 网页 URL 和文件路径
  • Wikipedia 文章标题

甚至有许多实际应用场景,您的 NLP 流水线可以利用词向量理解这些短语的能力:

  • 语义搜索工作、网页等等
  • 舌尖上的词查找器
  • 改写标题或句子
  • 情感塑造
  • 回答词类比问题
  • 用文字和名称推理

在学术界,研究人员使用词向量解决了 200 多个 NLP 问题:

  • 词性标注
  • 命名实体识别(NER)
  • 类比查询
  • 相似度查询
  • 音译
  • 依赖关系解析

6.2.1 寻求含义

在过去(20 年前),搜索引擎尝试根据网页中的 TF-IDF 分数找到您输入的所有单词。良好的搜索引擎尝试将您的搜索词与同义词一起增强。它们有时甚至会改变您的单词,以猜测您实际上在输入特定的单词组合时“意味着”什么。因此,如果您搜索“sailing cat”,它们会将“cat”更改为“catamaran”,以为您消除歧义。在幕后,在排名结果时,搜索引擎甚至可能将像“positive sum game”的查询更改为“nonzero sum game”,以将您发送到正确的维基百科页面。

信息检索研究人员随后发现了如何使潜在语义分析更加有效——词嵌入。事实上,GloVE 词嵌入算法只是从网页中提取的数百万句子上的潜在语义分析。[13] 这些新的词嵌入(向量)使得搜索引擎能够直接将你的查询的“含义”与网页匹配,而不需要猜测你的意图。你的搜索词的嵌入提供了你的搜索意图的直接数值表示,基于这些单词在互联网上的平均含义。

警告

词嵌入不代表对单词的预期解释。它们代表了用于训练词嵌入语言模型的文档和页面的所有人的单词的平均含义。这意味着词嵌入包含了用于训练模型的网页的所有人的偏见和刻板印象。

搜索引擎不再需要进行同义词替换、词干提取、词形还原、大小写转换和基于硬编码规则的消歧义。它们基于搜索索引中所有页面的文本创建词嵌入。不幸的是,主导性的搜索引擎决定利用这种新发现的力量,将词嵌入与产品和广告匹配,而不是真实的单词。AdWords 和 iAds 的单词嵌入根据营销人员支付的费用加权,以转移你的注意力,使你远离你的真实搜索意图。基本上,大型科技公司使企业能够贿赂搜索引擎,以操纵你并训练你成为他们的消费僵尸。

如果你使用一个更诚实的搜索引擎,如 Startpage,^([14]) DISROOT,^([15]) 或 Wolfram Alpha ^([16]),你会发现它们会给你真正想要的东西。如果你有一些黑网页或私人文件,你想将它们用作组织或个人生活的知识库,你可以自主托管一个具备尖端 NLP 技术的搜索引擎:Elastic Search,^([17]) Meilisearch,^([18]) SearX,^([19]) Apache Solr,^([20]) Apache Lucene,^([21]) Qwant,^([22]) 或 Sphinx。^([23])即使是 PostgreSQL 也能在全文搜索精度方面胜过主流搜索引擎。当你使用一个彻头彻尾诚实的搜索引擎时,你会惊讶地发现你对这个世界的看法变得更加清晰。

这些语义搜索引擎使用向量搜索来查询单词和文档嵌入(向量)数据库。

开源的 Python 工具,比如 NBOOST 或 PynnDescent,让你可以将单词嵌入与你喜欢的 TF-IDF 搜索算法集成起来。([24])如果你想要一种可扩展的方法来搜索你精细调整过的嵌入和向量,你可以使用近似最近邻算法来索引你喜欢的向量。([25])

这就是单词嵌入的优点。所有你所熟悉的向量代数数学知识,如计算距离,同样适用于单词嵌入。只不过这个距离现在代表的是单词在意义上的距离,而不是物理距离。而且这些新的嵌入比你熟悉的 TF-IDF 向量中的数千个维度更紧凑和更加有意义。

你可以使用“意义距离”在单词数据库中搜索所有与你心中想要的职业名称相近的职位名称,这可能会揭示出一些你没有想到的职业名称。或者你的搜索引擎可以被设计为在搜索查询中添加其他词语,以确保返回相关的职业标题。这就像是一个可以理解词义的自动完成搜索框,被称为语义搜索

>>> from nessvec.indexers import Index  # #1
>>> index = Index(num_vecs=100_000)  # #2
>>> index.get_nearest("Engineer").round(2)
Engineer       0.00
engineer       0.23
Engineers      0.27
Engineering    0.30
Architect      0.35
engineers      0.36
Technician     0.36
Programmer     0.39
Consultant     0.39
Scientist      0.39

您可以看到,查找词嵌入的最近邻居有点像在同义词词典中查找一个词。但这是一个比您当地书店或在线词典更模糊且完整的词典。您很快就会看到如何自定义此词典以适应您喜欢的任何领域。例如,您可以训练它只与英国的职位发布一起使用,或者甚至是印度或澳大利亚,具体取决于您的兴趣区域。或者您可以训练它更好地处理硅谷的技术工作而不是纽约的金融和银行工作。您甚至可以训练它处理 2 元组和 3 元组,如果您想要它处理更长的职位头衔,比如"软件开发人员"或"NLP 工程师"。

关于词嵌入的另一个好处是它们是模糊的。您可能已经注意到了“工程师”的几个附近邻居,这些邻居在同义词词典中可能找不到。而且您可以根据需要不断扩展列表。所以如果你在考虑一个软件工程师而不是一名建筑师,你可能会想要扫描get_nearest()列表以寻找另一个单词进行搜索,比如"程序员":

>>> index.get_nearest("Programmer").round(2)
Programmer    -0.00
programmer     0.28
Developer      0.33
Programmers    0.34
Programming    0.37
Engineer       0.39
Software       0.40
Consultant     0.42
programmers    0.42
Analyst        0.42
dtype: float64
>>> index.get_nearest("Developer").round(2)
Developer     -0.00
developer      0.25
Developers     0.25
Programmer     0.33
Software       0.35
developers     0.37
Designer       0.38
Architect      0.39
Publisher      0.39
Development    0.40

哇,这很奇怪。看起来"开发者"这个头衔经常也与"出版商"这个词联系在一起。在与 Manning 出版公司的开发编辑、开发经理甚至技术开发编辑一起工作之前,我从来没有想过为什么会这样。就在今天,这些"开发者"催促我加紧写这一章节。

6.2.2 合并词嵌入

关于词嵌入的另一个好处是您可以以任何您喜欢的方式将它们组合起来创建新单词!嗯,当然,您可以以传统的方式将多个单词组合在一起,只需将字符串附加在一起。在 Python 中,您可以使用加法或+运算符来实现这一点:

>>> "Chief" + "Engineer"
'ChiefEngineer'
>>> "Chief" + " " + "Engineer"
'Chief Engineer'

词嵌入数学运算的效果甚至比这更好。您可以将这些词的含义相加,试图找到一个单词来捕捉您所添加的两个单词的含义

>>> chief = (index.data[index.vocab["Chief"]]
...     + index.data[index.vocab["Engineer"]])
>>> index.get_nearest(chief)
Engineer     0.110178
Chief        0.128640
Officer      0.310105
Commander    0.315710
engineer     0.329355
Architect    0.350434
Scientist    0.356390
Assistant    0.356841
Deputy       0.363417
Engineers    0.363686

所以,如果你想有一天成为一名"首席工程师",看起来"科学家"、"建筑师"和"副手"也可能是你在路上会遇到的职位头衔。

那么在本章开头提到的那个尖端的词语查找应用程序呢?您是否曾经试图回忆起一个著名人士的名字,只是对他们有一个笼统的印象,比如说这样:

早在 20 世纪初,她在欧洲发明了与物理有关的东西。

如果您将该句输入 Google 或 Bing,您可能不会得到您正在寻找的直接答案,“玛丽·居里”。Google 搜索很可能只会给您一些著名物理学家的列表链接,包括男性和女性。

你需要浏览几页才能找到你要的答案。但是一旦你找到“Marie Curie”,Google 或 Bing 就会记住它。下次你寻找一个科学家的时候,它们可能会在提供你搜索结果方面变得更加优秀。(至少,在我们研究这本书时,它对我们提供的搜索结果做到了这一点。我们不得不使用私人浏览器窗口来确保您的搜索结果与我们的相似。)

通过词向量,你可以搜索结合了“woman”、“Europe”、“physics”、“scientist”和“famous”的词汇或名称,并且这会让你接近你寻找的“Marie Curie”这个词语的记号。而想要实现这一点,你只需将你想要组合的每个单词的向量相加即可:

>>> answer_vector = wv['woman'] + wv['Europe'] + wv['physics'] +
...     wv['scientist']

在这章节中,我们会向你展示确切的方法来做这个查询。你甚至可以看到如何使用词向量数学来消除一些单词中的性别偏见:

>>> answer_vector = wv['woman'] + wv['Europe'] + wv['physics'] +\
...     wv['scientist'] - wv['male'] - 2 * wv['man']

通过词向量,你可以从“女人”中去掉“男人”!

6.2.3 类比题

如果你把你的问题转化为一个类比题,会怎样?你的“查询”会变成这样:

谁与核物理学的关系,如同 Louis Pasteur 与细菌的关系?

再次强调,Google 搜索、Bing 甚至 Duck Duck Go 对这个问题并没有太大帮助^([26])。但是用词向量,解决方案就像是从“germs(细菌)”中减去“Louis Pasteur”,然后加入一些“physics(物理学)”:

>>> answer_vector = wv['Louis_Pasteur'] - wv['germs'] + wv['physics']

如果你对无关领域的人,比如音乐家和科学家的笼统类比题感兴趣,你也可以参与其中。

谁是音乐界的玛丽·居里?

或者

玛丽·居里与科学的关系,如同谁与音乐的关系?

你能搞清楚那个问题的向量空间数学会是什么吗?

你可能在英语类比题的标准化测试中见过这样的问题,比如 SAT、ACT 或 GRE 考试。有时它们是用正式的数学符号写成这样的:

MARIE CURIE : SCIENCE :: ? : MUSIC

这样做是否会更容易猜出这些单词的向量数学?一种可能性是这样的:

>>> wv['Marie_Curie'] - wv['science'] + wv['music']

而且你可以回答关于人和职业以外的事物的类似问题,比如体育队和城市:

The Timbers are to Portland as what is to Seattle?

在标准化测试形式中,如下所示:

TIMBERS : PORTLAND :: ? : SEATTLE

但是,更常见的是,标准化测试使用英语词汇词汇,并提问一些没有趣味性的问题,例如以下问题:

WALK : LEGS :: ? : MOUTH

或者

ANALOGY : WORDS :: ? : NUMBERS

所有这些“口头禅”式的问题对于词向量来说是小菜一碟,即使没有多个选项供你选择,回答类比题仍然很困难。自然语言处理会通过词向量来解救你。

词嵌入可以用来回答甚至这些模糊的问题和类比问题。 只要答案的向量存在于您的词汇表中,词嵌入就可以帮助您记住您舌尖上的任何单词或名称。(对于谷歌预先训练的 Word2Vec 模型,您的单词几乎肯定存在于谷歌训练的 100 亿字的新闻源中,除非您的单词是在 2013 年之后创建的。)并且嵌入甚至可以处理您甚至无法以搜索查询或类比形式提出的问题。

您可以在本章稍后的“类比推理”部分了解一些嵌入数学知识。

6.2.4 Word2Vec 创新

在我们的大脑神经元的连接中,彼此靠近使用的单词会堆积在一起,并最终定义这些单词在我们大脑中的含义。 作为一个幼儿,您会听到人们谈论“足球”,“消防车”,“计算机”和“书籍”之类的东西,您可以逐渐弄清楚它们的含义。 令人惊讶的是,您的机器不需要身体或大脑来理解单词,就像幼儿一样。

孩子可以在现实世界或图片书中指出几次物体后学会一个单词。 孩子永远不需要阅读字典或同义词词典。 就像一个孩子一样,机器“弄清楚”而不需要字典、同义词词典或任何其他受监督的机器学习数据集。 机器甚至不需要看到物体或图片。 该机器完全是由您解析文本和设置数据集的方式进行自我监督的。 您只需要大量的文本。

在之前的章节中,您可以忽略单词的附近上下文。 您所需做的只是计算在同一文档中使用单词的次数。 结果,如果您使您的文档非常非常短,这些共现次数就变得有用起来,用于表示单词本身的含义。 这是 Tomas Mikolov 及其 Word2vec NLP 算法的关键创新。 John Rubert Firth 推广了“一个单词由其周围的公司所特征化”的概念。[27])但要使词嵌入有用,则需要 Tomas Mikolov 专注于非常小的单词“公司”以及 21 世纪计算机的计算能力以及大量的机器可读文本语料库。 您不需要字典或同义词词典来训练您的词嵌入。 您只需要大量的文本。

这就是你在本章要做的事情。 你要教会机器成为一个海绵,就像一个幼儿一样。 您要帮助机器弄清楚单词的含义,而无需明确标记单词及其词典定义。 您只需要从任意随机书籍或网页中提取一堆随机句子。 一旦你对这些句子进行了分词和分段,这是您在前几章中学到的,您的 NLP 流水线将在每次读取新一批句子时变得越来越聪明。

在第二章和第三章中,你将词语与其邻居隔离开,并只关心每个 文档 中是否存在。你忽略了一个词的邻居对其意义的影响以及这些关系如何影响陈述的整体意义。我们的词袋概念将每个文档中的所有词混在一起形成一个统计性的袋子。在本章中,你将从只有少于十个标记的“邻域”中创建更小的词袋。你还将确保这些邻域有边界,以防止词语的意义溢出到相邻的句子中去。这个过程将有助于将你的词嵌入语言模型聚焦在彼此最相关的词上。

词嵌入可以帮助你识别同义词、反义词,或者只是属于同一类别的词,比如人、动物、地点、植物、名字或概念。在第四章的语义分析中我们以前也可以做到这一点,但是对词语邻近性的更严格的限制将体现在词嵌入的更严格的准确性上。词语的潜在语义分析(LSA)没有捕捉到词语的所有字面意义,更不用说暗示或隐藏的意义了。一些词语的内涵对于 LSA 过大的词袋来说更加模糊。

词嵌入

词嵌入(有时被称为 词向量)是词义的高维数值向量表示,包括其字面和隐含的含义。因此,词嵌入可以捕捉词语的 内涵。在一个嵌入的某个地方,有一个关于“人性”、“动物性”、“地方性”、“物品性”甚至“概念性”的分数。词嵌入将所有这些分数以及其他词性的分数组合成一个密集的浮点值向量(没有零)。

词嵌入的密度和高(但不要太高)维度既是它们的强大之处,也是它们的局限之所在。这就是为什么在你的管道中同时使用密集的、高维度的嵌入和稀疏的超高维 TFIDF 向量或离散的词袋向量时,密集的、高维度的嵌入最有价值。

6.3 人工智能依赖于嵌入

词嵌入不仅是自然语言理解准确性的一大飞跃,也是对人工通用智能(AGI)希望的一次突破。

你认为你能区分出机器智能和非智能信息的区别吗?这可能没有你想象的那么明显。即使是大科技公司的“深度思维”也被他们最新最伟大的聊天机器人——2023 年的 Bing 和 Bard 给愚弄了。更简单、更真实的对话式搜索工具,如 you.com 和 neeva.com 及其聊天界面,在大多数互联网研究任务中都胜过了大科技公司的搜索。

哲学家道格拉斯·霍夫斯塔特在衡量智能时指出了一些要注意的事项。脚注[道格拉斯·R·霍夫斯塔特,《哥德尔、艾舍尔、巴赫:永恒的金边》(GEB),第 26 页]

  • 灵活性
  • 处理模糊性
  • 忽略无关细节
  • 寻找相似性和类比
  • 生成新的想法

很快你就会看到词嵌入是如何在你的软件中实现这些智能方面的。例如,词嵌入通过赋予单词模糊性和细微差别,使得以前的表示(如 TF-IDF 向量)无法做到的灵活性得以实现。在你的聊天机器人的以前版本中,如果你想要你的机器人对常见的问候做出灵活的回应,你就必须列举出所有可能的说法。

但是使用词嵌入,你可以用一个嵌入向量识别单词"hi"、"hello"和"yo"的含义。你可以通过提供尽可能多的文本来为你的机器人创建所有可能遇到的概念的嵌入。不再需要手工制作你的词汇表。

谨慎

像词嵌入一样,智能本身是一个高维概念。这使得人工通用智能(AGI)成为一个难以捉摸的目标。要小心,不要让你的用户或老板认为你的聊天机器人是普遍具有智能的,即使它似乎实现了霍夫斯塔特的所有"基本要素"。

6.4 Word2Vec

2012 年,微软的实习生托马斯·米科洛夫找到了一种将单词的含义嵌入到向量空间中的方法。词嵌入或单词向量通常具有 100 到 500 个维度,取决于用于训练它们的语料库中的信息广度。米科洛夫训练了一个神经网络来预测每个目标单词附近的单词出现次数。米科洛夫使用了一个单隐藏层的网络,因此几乎任何线性机器学习模型都可以工作。逻辑回归、截断的奇异值分解、线性判别分析或朴素贝叶斯都可以很好地工作,并且已经成功地被其他人用来复制米科洛夫的结果。2013 年,在谷歌工作时,米科洛夫和他的队友发布了用于创建这些单词向量的软件,并将其称为"Word2Vec"。^([28])

Word2Vec 语言模型仅通过处理大量未标记的文本语料库来学习单词的含义。没有人需要为 Word2Vec 词汇表中的单词打标签。没有人需要告诉 Word2Vec 算法"玛丽·居里"是一位科学家,“Timbers” 是一支足球队,西雅图是一个城市,波特兰是俄勒冈州和缅因州的城市。也没有人需要告诉 Word2Vec 足球是一项运动,团队是一群人,城市既是"地方"也是"社区"。Word2Vec 可以自己学会这一切以及更多!你所需要的只是一个足够大的语料库,以便在与科学、足球或城市相关的其他单词附近提到"玛丽·居里"、“Timbers” 和"波特兰"。

Word2Vec 的这种无监督性质是使其如此强大的原因。世界充满了未标记、未分类和无结构的自然语言文本。

无监督学习和监督学习是机器学习的两种根本不同的方法。

监督学习

在监督学习中,人类或人类团队必须使用目标变量的正确值标记数据。标签的一个示例是第四章中短信消息的"垃圾邮件"分类标签。人类更难标记的标签可能是单词"红色"或"火"的热度内涵的百分比得分。当人们想到机器学习时,他们大多数时候想到的是监督学习。监督模型只有在它能够衡量期望输出(标签)与其预测之间的差异时才能变得更好。

相反,无监督学习使机器能够直接从数据中学习,而无需任何人类的协助。训练数据不必由人类组织、结构化或标记。因此,像 Word2Vec 这样的无监督学习算法非常适用于自然语言文本。

无监督学习

在无监督学习中,您训练模型执行一个任务,但没有任何标签,只有原始数据。像 k-means 或 DBSCAN 这样的聚类算法是无监督学习的例子。像主成分分析(PCA)和 t-分布随机邻居嵌入(t-SNE)这样的降维算法也是无监督机器学习技术。在无监督学习中,模型发现数据点之间的关系模式。无监督模型只需向其提供更多数据,就可以变得更加智能(更准确)。

不是尝试训练神经网络直接学习目标词义(基于该词义的标签),而是教会网络预测句子中目标词附近的词。所以在这个意义上,你确实有标签:你试图预测的附近单词。但是因为标签来自数据集本身,并且不需要手动标记,Word2Vec 训练算法绝对是一种无监督学习算法。

另一个领域是时间序列建模中使用这种无监督训练技术。时间序列模型通常是根据先前数值窗口来预测序列中的下一个值。在很多方面,时间序列问题与自然语言问题非常相似,因为它们处理有序数值(单词或数字)的序列。

预测本身并不是 Word2Vec 起作用的原因。预测只是达到目的的一种手段。你真正关心的是 Word2Vec 逐渐建立起来帮助它生成这些预测的内部表示,即向量。这种表示将比潜在语义分析(LSA)和潜在狄利克雷分配(LDiA)在第四章中产生的单词-主题向量更多地捕捉到目标单词的含义(其语义)。

注意

通过尝试使用较低维度的内部表示重新预测输入的模型被称为自动编码器。这可能对你来说有些奇怪。这就像要求机器回显你刚刚问过它的内容,只是它们不能在你说话时把问题写下来。机器必须将你的问题压缩成速记。它必须对你提出的所有问题使用相同的速记算法(函数)。机器学习了你的陈述的新速记(向量)表示。

如果你想了解更多关于无监督深度学习模型的信息,这些模型可以创建像单词这样的高维对象的压缩表示,请搜索术语“自动编码器”。^([29])它们也是开始使用神经网络的常见方式,因为它们几乎可以应用于任何数据集。

Word2Vec 将学习关于你可能不会想到与所有单词相关联的事物。你知道每个单词都有一些地理位置、情感(积极性)和性别吗?如果你的语料库中的任何单词具有某种质量,比如“地点性”、“人性”、“概念性”或“女性”,那么所有其他单词在你的单词向量中也会为这些质量得分。当 Word2Vec 学习单词向量时,单词的含义会传递给相邻的单词。

你语料库中的所有单词都将由数字向量表示,类似于第四章中讨论的单词-主题向量。只是这一次,“主题”意味着更具体、更精确的东西。在 LSA 中,单词只需出现在同一文档中,它们的含义就会互相“融合”,并被合并到它们的单词-主题向量中。对于 Word2Vec 单词向量,这些单词必须彼此靠近 — 通常在同一句子中的五个单词之内,并且在同一句子中。并且 Word2Vec 单词向量的“主题”权重可以相加和相减,以创建新的有意义的单词向量!

一个可能帮助你理解单词向量的心理模型是将单词向量视为一系列权重或分数的列表。每个权重或分数与该单词的特定含义维度相关联。

第 6.1 节 计算 nessvector
>>> from nessvec.examples.ch06.nessvectors import *  # #1
>>> nessvector('Marie_Curie').round(2)
placeness     -0.46
peopleness     0.35  # #2
animalness     0.17
conceptness   -0.32
femaleness     0.26

使用nlpia工具(gitlab.com/tangibleai/nessvec/-/blob/main/src/nessvec/examples/ch06/nessvectors.py)可以为 Word2Vec 词汇表中的任何单词或n-gram 计算“nessvectors”。这种方法适用于你能想到的任何“ness”组件。

Mikolov 在尝试想出用向量数值表示单词的方法时开发了 Word2Vec 算法。他对第四章中你在做的不太准确的词情感数学算法不满意。他希望使用类似于你刚刚在前一节中使用类比问题的类比推理。这个概念听起来可能很高级,但实际上它只是意味着你可以用词向量进行数学运算,并且当你将向量转换回单词时答案是有意义的。你可以对代表它们的单词进行词向量相加和相减来推理,并回答类似于你上面的例子的问题,比如以下问题。(对于不了解美国体育的人来说,波特兰伐木者队和西雅图声浪队是美国职业足球联赛的球队。)

wv['Timbers'] - wv['Portland'] + wv['Seattle'] = ?

理想情况下,你希望这个数学(词向量推理)可以给你这个:

wv['Seattle_Sounders']

类似地,你的类比问题“'玛丽·居里’与’物理学’相当于 *__*与’古典音乐’相当?”可以被看作是一个数学表达式,如下:

wv['Marie_Curie'] - wv['physics'] + wv['classical_music'] = ?

在这一章中,我们想要改进在第四章中介绍的 LSA 词向量表示。使用 LSA 构建的整个文档的主题向量非常适用于文档分类、语义搜索和聚类。但是,LSA 产生的主题-词向量并不足以用于语义推理、短语或复合词的分类和聚类。很快你将学会如何训练单层神经网络以产生这些更准确、更有趣的词向量。并且你将看到,它们已经取代了 LSA 词-主题向量,用于许多涉及短文档或陈述的应用中。

6.4.1 类比推理

Word2Vec 首次公开亮相是在 2013 年的 ACL 会议上。[^[30]] 这场以枯燥标题“在连续空间词表示中的语言规律性”为题的演讲描述了一个非常准确的语言模型。与相应的 LSA 模型(11%)相比,Word2Vec 嵌入更准确(45%),可以回答类似上面的类比问题。[^[31]] 然而,这种准确度的提高如此出乎意料,以至于 Mikolov 的最初论文被国际学习表示研讨会拒绝接受。[^[32]] 评审人员认为该模型的性能太好以至于不可信。Mikolov 的团队花了近一年的时间才发布源代码并被计算语言学协会接受。

突然之间,有了词向量,问题就变得像这样:

Portland Timbers + Seattle - Portland = ?

可以通过向量代数解决(见图 6.1)。

图 6.2 Word2Vec 数学的几何表示


word2vec 语言模型“知道”术语“波特兰”和“波特兰木材人”之间的距离大致与“西雅图”和“西雅图音速”相同。并且每对词之间的向量位移大致在同一方向。因此,word2vec 模型可以用来回答您的体育队类比问题。您可以将“波特兰”与“西雅图”的差异添加到代表“波特兰木材人”的向量中。这应该会让您接近“西雅图音速”的向量。

方程 6.1 计算足球队问题的答案


在添加和减去词向量后,你得到的结果向量几乎永远不会完全等于词向量词汇表中的某个向量。Word2Vec 词向量通常具有数百个维度,每个维度都有连续的实值。尽管如此,在您的词汇表中,与结果最接近的向量通常会成为您的 NLP 问题的答案。与该附近向量相关联的英文单词是您关于体育队和城市的问题的自然语言答案。

Word2Vec 允许您将自然语言标记发生计数和频率的向量转换为远低维度的 Word2Vec 向量的向量空间。在这个较低维度的空间中,您可以进行数学运算,然后将它们转换回自然语言空间。您可以想象这种能力对于聊天机器人、搜索引擎、问答系统或信息提取算法有多有用。

注意

2013 年的初始论文由 Mikolov 和他的同事发表,仅能够实现 40% 的答案准确率。但是在 2013 年,这种方法超过了任何其他语义推理方法。自其最初发表以来,Word2Vec 的性能进一步提高。这是通过在极大的语料库上进行训练来实现的。参考实现是在 Google 新闻语料库的 1000 亿个词上进行训练的。这是您在本书中经常看到的预训练模型。

研究小组还发现,单数词和复数词之间的差异往往具有大致相同的数量级和方向:

方程 6.2 单词的单数和复数版本之间的距离


但是,他们的发现并没有止步于此。他们还发现,距离关系远不止简单的单数与复数关系。距离适用于其他语义关系。Word2Vec 研究人员很快发现他们可以回答涉及地理、文化和人口统计学的问题,例如:

"San Francisco is to California as what is to Colorado?"
San Francisco - California + Colorado = Denver
更多使用词向量的理由

单词的向量表示不仅对于推理和类比问题有用,还对于你在自然语言向量空间模型中使用的所有其他事情有用。从模式匹配到建模和可视化,如果你知道如何使用本章的词向量,你的 NLP 流程的准确性和实用性将会提高。

例如,在本章后面,我们将向你展示如何在 2D“语义地图”上可视化词向量,就像图 6.3 所示的那样。你可以将其视为受欢迎旅游目的地的卡通地图,或者是那些你在公交站海报上看到的印象派地图之一。在这些卡通地图中,语义上和地理上靠近的事物被紧密放在一起。在卡通地图中,艺术家调整了各个位置的图标的比例和位置,以符合地方的“感觉”。借助词向量,机器也可以对单词和地方有所了解,并决定它们之间应该有多远的距离。

因此,借助你在本章学习的词向量,你的机器就能够生成像图 6.3 中一样的印象派地图。^([33])

图 6.3 十个美国城市的词向量投影到 2D 地图上


如果你熟悉这些美国城市,你可能会意识到这并不是一个准确的地理地图,但它却是一个相当不错的语义地图。我常常把两个德克萨斯州大城市休斯顿和达拉斯搞混,它们的词向量几乎一模一样。而加利福尼亚州的大城市的词向量在我脑海里形成了一个文化三角形。

词向量对于聊天机器人和搜索引擎也非常有用。对于这些应用,词向量可以帮助克服模式的僵硬、脆弱性或关键字匹配的一些问题。比如,你正在搜索关于得克萨斯州休斯顿的著名人物的信息,但你不知道他们搬到了达拉斯。从图 6.3 中,你可以看到,使用词向量进行语义搜索可以轻松处理包含丹佛和休斯顿等城市名称的搜索。即使基于字符的模式无法理解“给我介绍一个丹佛煎蛋”的不同于“给我介绍丹佛掘金队”,但基于词向量的模式可以。基于词向量的模式很可能能够区分食物项(煎蛋)和篮球队(掘金队),并据此恰当地回应用户的任何问题。

6.4.2 学习词向量

词嵌入是表示单词意义(语义)的向量。然而,单词的意义是一个难以捉摸的模糊事物。一个孤立的个体单词有一个非常模糊的意义。以下是一些可能影响单词意义的事情:

  • 被传达的思想是谁的
  • 该单词的理解对象
  • 单词被使用的上下文(何地和何时)
  • 假定的领域知识或背景知识
  • 所需表达的单词意义

你的大脑可能会以与我的大脑完全不同的方式理解一个词。随着时间的推移,你大脑中的一个词的含义也会发生变化。当你将一个词与其他概念建立新联系时,你会对这个词了解到新的东西。随着你学习新概念和新词汇,你会根据新词对你大脑的印象学习到这些新词的新联系。嵌入用于表示你大脑中由新词创建的神经元连接的演变模式。而这些新向量有数百个维度。

想象一个年轻的女孩说:“我妈妈是医生。”^([34]) 想象一下对她来说,“医生”这个词意味着什么。然后想象一下,随着她的成长,她对这个词的理解,她的自然语言理解处理算法是如何演变的。随着时间的推移,她将学会区分医生(M.D.)和哲学博士(Ph.D.)。想象一下,当她自己开始考虑申请医学院或博士项目的可能性时,这个词对她来说意味着什么。想象一下,这个词对她的父亲或母亲,即医生,意味着什么。想象一下,这个词对一个没有医疗保健资源的人来说意味着什么。

创建有用的单词数值表示是棘手的。你想要编码或嵌入向量中的含义不仅取决于你想要代表的含义,还取决于何时何地你希望你的机器处理和理解这个含义。在 GloVe、Word2Vec 和其他早期单词嵌入的情况下,目标是表示“平均”或最流行的含义。创建这些表示的研究人员关注的是类比问题和其他衡量人类和机器对单词理解的基准测试。例如,我们在本章前面的代码片段中使用了预训练的 fastText 单词嵌入。

提示

预训练的单词向量表示可用于诸如维基百科、DBPedia、Twitter 和 Freebase 等语料库。^([35]) 这些预训练模型是你的单词向量应用的绝佳起点。

  • 谷歌提供了基于英文 Google 新闻文章的预训练word2vec模型。^([36])
  • Facebook 发布了他们的词模型,称为fastText,涵盖了 294 种语言。^([37])

幸运的是,一旦你决定了词嵌入的“受众”或“用户”,你只需要收集这些单词的用法示例。Word2Vec、GloVe 和 fastText 都是无监督学习算法。你只需要一些来自你和你的用户感兴趣领域的原始文本。如果你主要关注医生,你可以训练你的嵌入在医学期刊的一系列文本上。或者,如果你想要最普遍的单词表示的理解,机器学习工程师通常使用维基百科和在线新闻文章来捕捉单词的含义。毕竟,维基百科代表了我们对世界上一切的集体理解。

现在,当你拥有你的语料库时,你如何为你的词嵌入语言模型创建训练集呢?在早期,主要有两种方法:

  1. 连续词袋模型(CBOW)
  2. 连续的skip-gram

连续的词袋模型(CBOW)方法从附近的上下文单词(输入单词)预测目标单词(输出或“目标”单词)。与第三章中学习的词袋(BOW)向量唯一的区别在于,CBOW 是针对每个文档内的连续滑动窗口的单词创建的。因此,你将有几乎与所有文档中的单词序列中的单词数量相同的 CBOW 向量。而对于 BOW 向量,你只有每个文档一个向量。这为你的词嵌入训练集提供了更多信息以使其生成更准确的嵌入向量。使用 CBOW 方法,你可以从原始文档中提取的每个可能短语创建大量的微小合成文档。

图 6.4 CBOW 神经网络架构


对于 skip-gram 方法,在这种方法中,你也会创建大量合成文档。你只需反转预测目标,这样就可以使用 CBOW 目标来预测 CBOW 特征。它预测与感兴趣的单词(输入单词)相关的上下文单词(“目标”单词)。尽管这些看起来像是你的词对被颠倒了,但你很快就会发现结果几乎是数学上等价的。

图 6.5 Skip-gram 神经网络架构


你可以看到,两种神经网络方法产生相同数量的训练样本,并为 skip-gram 和 CBOW 方法创建相同数量的训练样本。

Skip-gram 方法

在 skip-gram 训练方法中,你预测上下文单词附近的单词。想象一下,你的语料库包含了 Bayard Rustin 和 Larry Dane Brimner 关于个人主义的明智拒绝。^([38])

我们都是一个整体。如果我们不知道这一点,那我们将会以艰难的方式发现它。

——Bayard Rustin

_《We Are One: The Story of Bayard Rustin》,2007,第 46 页 _,Larry Dane Brimner

定义

skip-gram 是一个 2-gram 或两个 gram,其中每个 gram 都在彼此的附近。通常情况下,这些 grams 可以是您的分词器设计为预测的文本块 - 通常是单词。

对于连续的 skip-gram 训练方法,skip-grams 是跳过零到四个单词以创建 skip-gram 对的单词对。使用 Word2Vec skip-gram 方法训练单词嵌入时,skip-gram 中的第一个单词称为“上下文”单词。上下文单词是输入到 Word2Vec 神经网络中的。skip-gram 对中的第二个单词通常被称为“目标”单词。目标单词是语言模型和嵌入向量被训练以预测的单词 - 输出。

图 6.6 跳过-gram 方法的训练输入和输出示例


在图 6.6 中,您可以看到 skip-gram 方法创建单词嵌入的神经网络架构是什么样子的。

softmax 是什么?

softmax 函数通常用作神经网络输出层的激活函数,当网络的目标是学习分类问题时。softmax 将输出结果压缩在 0 到 1 之间,所有输出节点的总和始终加起来为 1。因此,具有 softmax 函数的输出层的结果可以被视为概率。

对于每个K 输出节点,可以使用归一化指数函数计算 softmax 输出值:


如果您的三神经元输出层的输出向量如下所示:

方程 6.3 例子 3D 向量


softmax 激活后的“压缩”向量将如下所示:

方程 6.4 例子 3D 向量经过 softmax 后


请注意,这些值的总和(四舍五入到 3 个有效数字)约为 1.0,就像概率分布一样。

图 6.4 显示了前两个周围单词的数字网络输入和输出。在这种情况下,输入单词是“Monet”,网络的预期输出是“Claude”或“painted”,这取决于训练对。

图 6.7 跳过-gram 训练的网络示例


注意

当您查看单词嵌入的神经网络结构时,您会注意到实现看起来与您在第五章中发现的内容相似。

自然语言处理实战第二版(MEAP)(三)(4)https://developer.aliyun.com/article/1517960

相关文章
|
6月前
|
数据采集 机器学习/深度学习 自然语言处理
NLP助力非结构化文本抽取:实体关系提取实战
本文介绍了一套基于微博热帖的中文非结构化文本分析系统,通过爬虫代理采集数据,结合NLP技术实现实体识别、关系抽取及情感分析。核心技术包括爬虫模块、请求配置、页面采集和中文NLP处理,最终将数据结构化并保存为CSV文件或生成图谱。代码示例从基础正则规则到高级深度学习模型(如BERT-BiLSTM-CRF)逐步演进,适合初学者与进阶用户调试与扩展,展现了中文NLP在实际场景中的应用价值。
490 3
NLP助力非结构化文本抽取:实体关系提取实战
|
5月前
|
数据采集 缓存 自然语言处理
NLP驱动网页数据分类与抽取实战
本文探讨了使用NLP技术进行网页商品数据抽取时遇到的三大瓶颈:请求延迟高、结构解析慢和分类精度低,并以目标站点goofish.com为例,展示了传统方法在采集商品信息时的性能问题。通过引入爬虫代理降低封禁概率、模拟真实用户行为优化请求,以及利用关键词提取提升分类准确性,实现了请求成功率从65%提升至98%,平均请求耗时减少72.7%,NLP分类错误率下降73.6%的显著优化效果。最终,代码实现快速抓取并解析商品数据,支持价格统计与关键词分析,为构建智能推荐模型奠定了基础。
124 0
NLP驱动网页数据分类与抽取实战
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
从词袋到Transformer:自然语言处理的演进与实战
自然语言处理(NLP)是人工智能的重要分支,从早期的规则系统发展到如今的深度学习模型,经历了词袋模型、词嵌入、RNN/LSTM/GRU,再到革命性的Transformer架构。本文通过代码和案例详细介绍了这些技术的演进,并展示了如何从简单的词袋模型过渡到强大的Transformer,涵盖文本分类等实战应用,帮助读者深入理解NLP的核心技术和未来发展潜力。
|
自然语言处理 PyTorch 算法框架/工具
掌握从零到一的进阶攻略:让你轻松成为BERT微调高手——详解模型微调全流程,含实战代码与最佳实践秘籍,助你应对各类NLP挑战!
【10月更文挑战第1天】随着深度学习技术的进步,预训练模型已成为自然语言处理(NLP)领域的常见实践。这些模型通过大规模数据集训练获得通用语言表示,但需进一步微调以适应特定任务。本文通过简化流程和示例代码,介绍了如何选择预训练模型(如BERT),并利用Python库(如Transformers和PyTorch)进行微调。文章详细说明了数据准备、模型初始化、损失函数定义及训练循环等关键步骤,并提供了评估模型性能的方法。希望本文能帮助读者更好地理解和实现模型微调。
1072 2
掌握从零到一的进阶攻略:让你轻松成为BERT微调高手——详解模型微调全流程,含实战代码与最佳实践秘籍,助你应对各类NLP挑战!
|
机器学习/深度学习 人工智能 自然语言处理
Python自然语言处理实战:文本分类与情感分析
本文探讨了自然语言处理中的文本分类和情感分析技术,阐述了基本概念、流程,并通过Python示例展示了Scikit-learn和transformers库的应用。面对多义性理解等挑战,研究者正探索跨域适应、上下文理解和多模态融合等方法。随着深度学习的发展,这些技术将持续推动人机交互的进步。
625 1
|
自然语言处理 监控 数据挖掘
|
自然语言处理 API 数据库
自然语言处理实战第二版(MEAP)(六)(5)
自然语言处理实战第二版(MEAP)(六)
141 3
|
人工智能 自然语言处理 Java
Java中的自然语言处理应用实战
Java中的自然语言处理应用实战
|
机器学习/深度学习 数据采集 人工智能
Python 高级实战:基于自然语言处理的情感分析系统
**摘要:** 本文介绍了基于Python的情感分析系统,涵盖了从数据准备到模型构建的全过程。首先,讲解了如何安装Python及必需的NLP库,如nltk、sklearn、pandas和matplotlib。接着,通过抓取IMDb电影评论数据并进行预处理,构建情感分析模型。文中使用了VADER库进行基本的情感分类,并展示了如何使用`LogisticRegression`构建机器学习模型以提高分析精度。最后,提到了如何将模型部署为实时Web服务。本文旨在帮助读者提升在NLP和情感分析领域的实践技能。
1074 0
|
机器学习/深度学习 自然语言处理 PyTorch
【从零开始学习深度学习】48.Pytorch_NLP实战案例:如何使用预训练的词向量模型求近义词和类比词
【从零开始学习深度学习】48.Pytorch_NLP实战案例:如何使用预训练的词向量模型求近义词和类比词