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

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

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

6.5 Word2Vec 替代方案

Word2Vec 是一项突破,但它依赖于必须使用反向传播进行训练的神经网络模型。自 Mikolov 首次推广词嵌入以来,研究人员提出了越来越准确和高效的方式来将单词的含义嵌入向量空间。

  1. Word2vec
  2. GloVE
  3. fastText

由杰弗里·彭宁顿(Jeffrey Pennington)领导的斯坦福自然语言处理研究人员^([44])开始研究 Word2Vec 为什么效果那么好,并找到正在优化的成本函数。他们首先统计单词共现次数并将其记录在一个方阵中。他们发现他们可以计算这个共现矩阵的奇异值分解(SVD)^([45]),将其拆分为 Word2Vec 生成的相同两个权重矩阵。^([46]) 关键是以相同方式对共现矩阵进行归一化。但在某些情况下,Word2Vec 模型无法收敛到斯坦福研究人员用 SVD 方法实现的相同全局最优解。正是对单词共现的全局向量(整个语料库中的共现)进行直接优化赋予了 GloVe 其名称。

GloVe 可以生成等效于 Word2Vec 输入权重矩阵和输出权重矩阵的矩阵,生成具有与 Word2Vec 相同准确性但时间大大缩短的语言模型。GloVe 通过更有效地利用文本数据来加快处理速度。GloVe 可以在较小的语料库上进行训练,仍然能够收敛。^([47]) SVD 算法已经被改进了几十年,因此 GloVe 在调试和算法优化方面有了一个优势。Word2Vec 依赖于反向传播来更新形成单词嵌入的权重。神经网络的反向传播比在 SVD 中使用的更成熟的优化算法效率低。

即使 Word2Vec 首先将通过单词向量进行语义推理的概念普及开来,你的得力助手应该是 GloVe 来训练新的单词向量模型。通过 GloVe,你更有可能找到这些向量表示的全局最优解,从而获得更准确的结果。而且 spaCy 将其作为默认的嵌入算法,因此当你运行:

>>> import spacy
>>>
>>> nlp = spacy.load("en_core_web_sm")
>>> text = "This is an example sentence."
>>> doc = nlp(text)
>>>
>>> for token in doc:
...    print(token.text, token.vector)

这些结果是使用 GloVe 计算得出的!

GloVe 的优点:

  • 训练速度更快
  • 更好的 RAM/CPU 效率(可以处理更大的文档)
  • 更有效地利用数据(有助于处理较小的语料库)
  • 在相同的训练量下更准确

6.5.1 fastText

来自 Facebook 的研究人员将 Word2Vec 的概念推进了一步^([48]),通过向模型训练添加了一个新的技巧。他们称之为 fastText 的新算法预测周围的n-字符 n-gram 而不仅仅是周围的单词,就像 Word2Vec 所做的那样。例如,单词"whisper"会生成以下 2 个和 3 个字符的 n-gram:

['wh', 'whi', 'hi', 'his', 'is', 'isp', 'sp', 'spe', 'pe', 'per', 'er']

fastText 然后对每个n字符 n-gram(称为“子词”)进行向量表示的训练,包括单词、拼写错误的单词、部分单词,甚至单个字符。这种方法的优势在于,它比原始的 Word2Vec 方法更好地处理罕见或新的单词。

fastText 分词器将为较长的单词的两半创建向量,如果该较长的单词的使用频率远低于构成它的子词。例如,如果您的语料库只提到 “Superwoman” 一两次,但却成千上万次使用 “super” 和 “woman”,那么 fastText 可能会为 “super” 和 “woman” 创建向量。如果您的 fastText 语言模型在训练结束后在现实世界中遇到单词 “Superwoman”,它将合并 “Super” 和 “woman” 的向量以创建单词 “Superwoman” 的向量。这减少了 fastText 需要分配通用的 Out of Vocabulary(OOV)向量的单词数量。在您的 NLU 流水线的 “思维” 中,OOV 单词向量看起来像 “未知单词”。它的效果与您在完全陌生的语言中听到一个外来单词的效果相同。虽然 Word2vec 只能 “知道” 如何嵌入它以前见过的单词,但 fastText 由于其子词方法而更加灵活。它还相对轻量且运行速度更快。

作为 fastText 发布的一部分,Facebook 发布了 294 种语言的预训练 fastText 模型。在 Facebook 研究的 Github 页面^([49])上,您可以找到从 阿布哈兹语祖鲁语 的模型。模型集合甚至包括罕见的语言,如 萨特兰弗里西亚语,该语言仅由少数德国人使用。Facebook 提供的预训练 fastText 模型仅在可用的维基百科语料库上进行了训练。因此,模型的词汇量和准确性会因语言而异。

我们在 nessvec 包中包含了用于为 OOV 单词创建新向量的 fastText 逻辑。我们还通过 Peter Norvig 的著名的优雅拼写纠正算法^([50])增强了 fastText 流水线,以处理拼写错误和错别字。这将为您提供最佳选择,即一个易于理解的训练算法和当您需要在现实世界中使用您训练过的向量时,一个强大的推断或预测模型。

使用预训练模型增强您的 NLP

通过利用来自地球上最强大的公司的开源预训练嵌入来提升您的 NLP 流水线的能力。预训练的 fastText 向量几乎可以在任何可想象的语言中找到。如果您想查看您的词嵌入的所有可用选项,请查看 fastText 模型存储库(github.com/facebookresearch/fastText/blob/main/docs/pretrained-vectors.md)。而对于多语言支持,您可以在 fastText 嵌入的 Common Crawl 版本中找到许多支持的 157 种语言的组合模型(fasttext.cc/docs/en/crawl-vectors.html)。如果您愿意,您可以使用 fastText 页面上的 bin+text 链接下载您语言的所有不同版本的嵌入。但如果您想节省一些时间,只需下载 100 万…

警告

bin+text wiki.en.zip 文件(dl.fbaipublicfiles.com/fasttext/vectors-wiki/wiki.en.zip)大小为 9.6 GB。仅文本 wiki.en.vec 文件大小为 6.1 GBdl.fbaipublicfiles.com/fasttext/vectors-wiki/wiki.en.vec)。如果您使用的是 nessvec 包而不是 gensim,它将仅下载大小为 600MB 的 wiki-news-300d-1M.vec.zip 文件(dl.fbaipublicfiles.com/fasttext/vectors-english/wiki-news-300d-1M.vec.zip)。该 wiki-news-300d-1M.vec.zip 包含来自维基百科和新闻网页中最受欢迎的 100 万个单词(不区分大小写)的 300-D 向量。

nessvec 包将创建一个内存映射的 DataFrame,其中包含所有预训练向量。内存映射文件(.hdf5)通过按需惰性加载你所需的向量,可以防止你的计算机内存(RAM)不足。

>>> from nessvec.files import load_fasttext
>>> df = load_fasttext()  # #1
>>> df.head().round(2)
      0     1     2    ...   297   298   299
,    0.11  0.01  0.00  ...  0.00  0.12 -0.04
the  0.09  0.02 -0.06  ...  0.16 -0.03 -0.03
.    0.00  0.00 -0.02  ...  0.21  0.07 -0.05
and -0.03  0.01 -0.02  ...  0.10  0.09  0.01
of  -0.01 -0.03 -0.03  ...  0.12  0.01  0.02
>>> df.loc['prosocial']  # #2
0      0.0004
1     -0.0328
2     -0.1185
        ...
297    0.1010
298   -0.1323
299    0.2874
Name: prosocial, Length: 300, dtype: float64
注意

为了加速您的词嵌入流程,您可以使用 Bloom 嵌入。Bloom 嵌入不是用于创建嵌入的新算法,而是用于存储和检索高维向量的更快、更精确的索引方法。Bloom 嵌入表中的向量每个都代表两个或更多单词的组合含义。诀窍是减去您不需要的单词,以便重新创建您正在寻找的原始嵌入。幸运的是,SpaCy 在其 v2.0 语言模型中已经实现了所有这些效率。这就是 SpaCy 如何能够为数百万个单词创建单词嵌入,同时仅存储 20k 个唯一的向量。

6.5.2 Word2Vec vs LSA

现在您可能想知道词嵌入与第四章的 LSA 主题-单词向量相比如何。这些是使用 PCA(主成分分析)在您的 TF-IDF 向量上创建的词嵌入。LSA 还为您提供了主题-文档向量,您可以将其用作整个文档的嵌入。LSA 主题-文档向量是您为任何文档创建嵌入的所有单词的主题-单词向量的总和。如果您想为整个文档获取一个与主题-文档向量类似的单词向量,您将为您的文档中的所有单词求和。这非常接近 Doc2vec 文档向量的工作原理。

如果您的主题向量的 LSA 矩阵的大小为 N[words] × N[topics],则 LSA 单词向量是该 LSA 矩阵的行。这些行向量捕捉了单词的含义,其中有大约 200 到 300 个实值,就像 Word2Vec 一样。而 LSA 主题-单词向量和 Word2Vec 向量一样有用,可以用于查找相关和不相关的术语。正如您在 GloVe 讨论中了解到的那样,Word2Vec 向量可以使用用于 LSA 的相同 SVD 算法来创建。但是,Word2Vec 通过创建一个从一个文档到下一个文档重叠的滑动窗口,从而更多地利用了文档中相同数量的单词。这样它可以在滑动之前重复使用相同的单词五次。

那么增量或在线训练呢?LSA 和 Word2Vec 算法都允许将新文档添加到你的语料库中,并调整现有的单词向量以考虑新文档中的共现。但只能更新你词汇表中的现有 “桶”。添加全新的词汇会改变你词汇表的总大小,因此你的独热向量也会改变。如果你想在模型中捕捉新词,那就需要重新开始训练。

LSA 比 Word2Vec 训练更快。对于长文档,它在区分和聚类这些文档方面表现更好。事实上,斯坦福的研究人员使用了这种更快的基于 PCA 的方法来训练 GloVE 向量。你可以使用 nessvec 包比较三种最流行的词嵌入。^([52])

Word2Vec 的 “杀手级应用” 是它可能的语义推理。LSA 主题-词向量也可以做到,但通常不够准确。如果你想要接近 Word2Vec 推理的准确性和 “哇” 因素,你需要将文档分成句子,然后只使用短语来训练你的 LSA 模型。使用 Word2Vec,你可以回答像 哈利·波特 + “大学” = 霍格沃茨 这样的问题。作为领域特定 word2vec 模型的绝佳示例,请查看哈利·波特、指环王的单词模型,参见 ^([53])。

LSA 的优势:

  • 更快的训练
  • 更好地区分长文档

Word2Vec 和 GloVe 的优势:

  • 更有效地利用大型语料库
  • 更准确的词语推理,比如回答类比问题

6.5.3 静态 vs 上下文化的嵌入

在现实世界中,你可能会遇到两种类型的词嵌入:静态和上下文化的。

静态词嵌入可以单独用于单词或独立的 N-Grams。一旦训练完成,向量就保持不变。这些是你用于类比和其他想解决的词向量推理问题的词嵌入类型。你将在这里训练一个语言模型来创建静态词嵌入。单词的上下文只会用来训练模型。一旦你的词嵌入训练完成,你将不会使用单词使用的上下文来调整你的词嵌入,因为你 使用 的是你训练好的词嵌入。这意味着一个词的不同含义或意思都被压缩成一个单一的静态向量。到目前为止我们见过的所有嵌入 - Word2Vec、GloVe 和 fasttext - 都是静态嵌入。Word2Vec 在 “World Bank” 这个名字和 “river bank” 这个表达中都会返回相同的嵌入。

相比之下,上下文化的词嵌入可以根据前后的嵌入和单词进行更新或细化。单词出现的顺序相对于其他单词的顺序对于上下文化的词嵌入很重要。这意味着对于“not happy”这个二元组的自然语言理解(NLU),在上下文化的词嵌入中,它的嵌入会比静态词嵌入更接近于“unhappy”的嵌入。

正如您所想象的那样,上下文化的嵌入对各种应用非常有用,例如语义搜索。在创建它们方面取得了巨大的突破,这是因为引入了双向变压器神经网络,例如 BERT(双向编码器变换器),我们将在第九章深入讨论。BERT 嵌入的性能优于旧的算法,例如 World2Vec 和 GloVe,因为它不仅考虑了嵌入的单词右侧和左侧的上下文,还考虑了句子中单词的顺序。因此,它成为了许多自然语言处理应用的热门选择。

6.5.4 可视化单词关系

语义单词关系可能非常强大,它们的可视化可以导致有趣的发现。在本节中,我们演示了将单词向量可视化为 2D 的步骤。

要开始,让我们从 Google 新闻语料库的 Google Word2Vec 模型中加载所有单词向量。您可以想象,这个语料库包含了大量关于“Portland”和“Oregon”的提及,以及许多其他城市和州的名称。您将使用 nlpia 包来保持简单,这样您就可以快速开始使用 Word2Vec 向量。

列表 6.5 使用 nlpia 加载预训练的 FastText 语言模型
>>> from nessvec.indexers import Index
>>> index = Index()  # #1
>>> vecs = index.vecs
>>> vecs.shape
(3000000, 300)
警告

Google 新闻的word2vec模型非常庞大:300 个向量维度的 300 万个单词。完整的单词向量模型需要 3 GB 的可用内存。如果您的可用内存有限,或者您想快速从单词模型中加载一些最常见的术语,请查看第十三章。

现在,在 gensim 中的这个 KeyedVectors 对象保存了一个包含 300 万个 Word2Vec 向量的表。我们从 Google 创建的文件中加载了这些向量,该文件用于存储他们在大量 Google 新闻文章上训练的 Word2Vec 模型。在所有这些新闻文章中,肯定有很多州和城市的单词。以下列表仅显示了词汇表中的一些单词,从第一百万个词开始:

列表 6.6 检查 word2vec 词汇频率
>>> import pandas as pd
>>> vocab = pd.Series(wv.vocab)
>>> vocab.iloc[1000000:100006]
Illington_Fund             Vocab(count:447860, index:2552140)
Illingworth                 Vocab(count:2905166, index:94834)
Illingworth_Halifax       Vocab(count:1984281, index:1015719)
Illini                      Vocab(count:2984391, index:15609)
IlliniBoard.com           Vocab(count:1481047, index:1518953)
Illini_Bluffs              Vocab(count:2636947, index:363053)

请注意,复合词和常见的 n-gram 用下划线字符(“_”)连接在一起。还请注意,键值映射中的“值”是一个包含词的索引位置的 gensim Vocab 对象,因此您可以检索 Word2Vec 向量,但还包括它在 Google 新闻语料库中出现的次数。

正如你之前所看到的,如果你想检索特定词的 300-D 向量,你可以在这个 KeyedVectors 对象上使用方括号 *getitem* 任何词或 n-gram:

>>> wv['Illini']
array([ 0.15625   ,  0.18652344,  0.33203125,  0.55859375,  0.03637695,
       -0.09375   , -0.05029297,  0.16796875, -0.0625    ,  0.09912109,
       -0.0291748 ,  0.39257812,  0.05395508,  0.35351562, -0.02270508,
       ...
       ])

我们选择第 100 万个词(按词典字母顺序)的原因是因为前几千个 “词” 是类似 “#####” 和其他符号的标点符号,在谷歌新闻语料库中经常出现。我们只是幸运地发现了 “Illini” 出现在你的列表中。单词 “Illini” 指的是一群人,通常是足球运动员和球迷,而不是像 “Illinois” 那样的单一地理区域 —— 大多数 “Fighting Illini” 的球迷生活在那里。让我们看看这个 “Illini” 向量跟 “Illinois” 向量有多接近:

清单 6.7 “Illinois” 和 “Illini” 之间的距离
>>> import numpy as np
>>> np.linalg.norm(wv['Illinois'] - wv['Illini'])  # #1
3.3653798
>>> cos_similarity = np.dot(wv['Illinois'], wv['Illini']) / (
...     np.linalg.norm(wv['Illinois']) *\
...     np.linalg.norm(wv['Illini']))  # #2
>>> cos_similarity
0.5501352
>>> 1 - cos_similarity # #3
0.4498648

这些距离意味着单词 “Illini” 和 “Illinois” 在含义上只是适度接近的。

现在让我们检索所有美国城市的 Word2Vec 向量,这样你就可以使用它们的距离将它们绘制到一个意义的二维地图上。你将如何在那个 KeyedVectors 对象中找到所有城市和州的词汇表?你可以像在上一个清单中一样使用余弦距离来找到所有接近 “state” 或 “city” 的词的向量。

但是,与其阅读全部 300 万个词和词向量,不如加载另一个数据集,其中包含来自世界各地的城市和州(地区)列表。

清单 6.8 一些美国城市数据
>>> from nlpia.data.loaders import get_data
>>> cities = get_data('cities')
>>> cities.head(1).T
geonameid                       3039154
name                          El Tarter
asciiname                     El Tarter
alternatenames     Ehl Tarter,Эл Тартер
latitude                        42.5795
longitude                       1.65362
feature_class                         P
feature_code                        PPL
country_code                         AD
cc2                                 NaN
admin1_code                          02
admin2_code                         NaN
admin3_code                         NaN
admin4_code                         NaN
population                         1052
elevation                           NaN
dem                                1721
timezone                 Europe/Andorra
modification_date            2012-11-03

来自 Geocities 的这个数据集包含大量信息,包括纬度、经度和人口。你可以用它进行一些有趣的可视化或地理距离与 Word2Vec 距离的比较。但是现在你只是尝试将 Word2Vec 距离映射到二维平面上,并看看它是什么样子的。现在让我们专注于美国:

清单 6.9 一些美国州数据
>>> us = cities[(cities.country_code == 'US') &\
...     (cities.admin1_code.notnull())].copy()
>>> states = pd.read_csv(\
...     'http://www.fonz.net/blog/wp-content/uploads/2008/04/states.csv')
>>> states = dict(zip(states.Abbreviation, states.State))
>>> us['city'] = us.name.copy()
>>> us['st'] = us.admin1_code.copy()
>>> us['state'] = us.st.map(states)
>>> us[us.columns[-3:]].head()
                     city  st    state
geonameid
4046255       Bay Minette  AL  Alabama
4046274              Edna  TX    Texas
4046319    Bayou La Batre  AL  Alabama
4046332         Henderson  TX    Texas
4046430           Natalia  TX    Texas

现在,除了缩写外,你还可以为每个城市提供完整的州名。让我们检查一下那些州名和城市名是否存在于你的 Word2Vec 词汇表中:

>>> vocab = pd.np.concatenate([us.city, us.st, us.state])
>>> vocab = np.array([word for word in vocab if word in wv.wv])
>>> vocab[:10]

即使你只看美国城市,你也会发现很多同名的大城市,比如俄勒冈州的波特兰和缅因州的波特兰。所以让我们将该城市所在州的本质合并到你的城市向量中。要结合 Word2Vec 中词的含义,你需要将向量相加。这就是 “类比推理” 的魔力。

这是将各州的 Word2Vec 向量添加到城市向量中并将所有这些新向量放入一个大的 DataFrame 的一种方法。我们使用州的全名或缩写(在你的 Word2Vec 词汇表中的任何一个)。

清单 6.10 用美国州词向量扩充城市词向量
>>> city_plus_state = []
>>> for c, state, st in zip(us.city, us.state, us.st):
...     if c not in vocab:
...         continue
...     row = []
...     if state in vocab:
...         row.extend(wv[c] + wv[state])
...     else:
...         row.extend(wv[c] + wv[st])
...     city_plus_state.append(row)
>>> us_300D = pd.DataFrame(city_plus_state)

根据你的语料库,你的词关系可以代表不同的属性,例如地理接近性或文化或经济相似性。但是这些关系在很大程度上取决于训练语料库,并且它们会反映出语料库。

词向量是有偏的!

词向量是根据训练语料库中的词关系进行学习的。如果你的语料库是关于金融的,那么你的"银行"词向量主要是关于进行存款的企业。如果你的语料库是关于地质学的,那么你的"银行"词向量将会与河流和溪流有关。如果你的语料库主要是关于母系社会,有女性银行家和男性在河边洗衣服,那么你的词向量会带有性别偏见。

下面的例子展示了在 Google 新闻文章上训练的词模型的性别偏见。如果你计算"男人"和"护士"之间的距离,并将其与"女人"和"护士"之间的距离进行比较,你将能够看到这种偏见。

>>> word_model.distance('man', 'nurse')
0.7453
>>> word_model.distance('woman', 'nurse')
0.5586

辨识和补偿这样的偏差对任何在偏见世界中训练模型的 NLP 从业者来说都是一个挑战。

作为训练语料库使用的新闻文章共享一个共同组件,那就是城市的语义相似性。文章中语义上相似的地点似乎是可以互换的,因此词模型学习到它们是相似的。如果你的训练语料库不同,你的词关系可能会有所不同。

在地理上相距很远的城市,却因为大小和文化相似而聚集在一起,比如圣地亚哥和圣荷塞,或者类似度假地点的火奴鲁鲁和里诺。

幸运的是,你可以使用传统的代数方法将城市的向量加到州和州的缩写的向量中。就像你在第四章中发现的那样,你可以使用主成分分析(PCA)等工具,将你的 300 维向量维度减少为人类可理解的 2D 表示。PCA 使你能够在 2D 图中看到这些 300D 向量的投影或"阴影"。最重要的是,PCA 算法确保了这个投影是你的数据的最佳视图,尽可能地保持向量相隔较远。PCA 就像一位优秀的摄影师,在构图之前从各个可能的角度查看某物。

在对城市+州+缩写向量求和之后,甚至都不需要对向量长度进行归一化,因为 PCA 会为你处理这一切。

我们将这些"增强的"城市词向量保存在nlpia软件包中,这样你就可以加载它们在你的应用程序中使用。在下面的代码中,你可以使用 PCA 将它们投影到一个 2D 图中。

列表 6.11 美国城市的泡泡图
>>> from sklearn.decomposition import PCA
>>> pca = PCA(n_components=2)  # #1
>>> us_300D = get_data('cities_us_wordvectors')
>>> us_2D = pca.fit_transform(us_300D.iloc[:, :300])  # #2

图 6.8 显示了所有这些美国城市的 300 维词向量的 2D 投影:

图 6.9 Google 新闻 Word2Vec 300-D 向量使用 PCA 投影到 2D 地图上


注意

低语义距离(接近零的距离值)表示单词之间的高相似性。语义距离,或"意义"距离,由在用于训练的文档中附近出现的单词决定。如果两个术语的 Word2Vec 向量在单词向量空间中接近,则它们通常在相似的上下文中使用(与附近的相似单词一起使用)。例如,“旧金山"与"加利福尼亚"之间接近,因为它们经常在句子中附近出现,并且它们附近使用的单词的分布是相似的。两个术语之间的大距离表达了共享上下文和共享意义的低可能性(它们在语义上不相似),例如"汽车"和"花生”。

如果你想要探索图 6.8 中显示的城市地图,或者尝试绘制一些自己的向量,列表 6.12 展示了如何操作。我们为 Plotly 的离线绘图 API 构建了一个包装器,应该可以帮助处理您已经将数据"去规范化"的 DataFrame。Plotly 包装器期望一个 DataFrame,其中每个样本都有一行,并且每个特征都有一列。这些特征可以是分类特征(如时区)和连续的实值特征(如城市人口)。由此产生的绘图是交互式的,对于探索许多类型的机器学习数据特别有用,尤其是复杂事物(如单词和文档的向量表示)的向量表示。

列表 6.12 美国城市单词向量的气泡图
>>> import seaborn
>>> from matplotlib import pyplot as plt
>>> from nlpia.plots import offline_plotly_scatter_bubble
>>> df = get_data('cities_us_wordvectors_pca2_meta')
>>> html = offline_plotly_scatter_bubble(
...     df.sort_values('population', ascending=False)[:350].copy()\
...         .sort_values('population'),
...     filename='plotly_scatter_bubble.html',
...     x='x', y='y',
...     size_col='population', text_col='name', category_col='timezone',
...     xscale=None, yscale=None,  # 'log' or None
...     layout={}, marker={'sizeref': 3000})
{'sizemode': 'area', 'sizeref': 3000}

要生成您的 300-D 单词向量的 2D 表示,您需要使用降维技术。我们使用了 PCA。为了减少从 300-D 到 2D 的压缩过程中丢失的信息量,减少输入向量中包含的信息范围是有帮助的。因此,您限制了您的单词向量与城市相关联。这就像在计算 TF-IDF(词频 - 逆文档频率)或 BOW(词袋模型)向量时,限制了语料库的领域或主题。

对于具有更大信息量的更多种类的向量混合,您可能需要一种非线性嵌入算法,例如 t-SNE(t-分布随机近邻嵌入)。我们将在后面的章节中讨论 t-SNE 和其他神经网络技术。一旦你掌握了这里的单词向量嵌入算法,t-SNE 就会更有意义。

6.5.5 建立联系

在这一部分,我们将构建所谓的图(graph)。图数据结构非常适合表示数据中的关系。从本质上讲,一个图可以被描述为具有通过关系(edges)连接在一起的实体(节点或顶点)。社交网络是最适合存储数据的图数据结构的典型例子。在本节中,我们将使用一种特定类型的图,即无向图。这种类型的图是指关系没有方向。一个非定向关系的例子可以是两个人之间在 Facebook 上的朋友关系,因为彼此之间没有互相认可的话,其中一个人不能成为另一个人的朋友。另一种类型的图是定向图。这种类型的图具有单向关系。在 Twitter 上的粉丝或关注者就是这种关系的一个例子。你可以关注某人而不被他们关注回来,因此你可以有粉丝而不必互相认可这种关系。

要在本章中可视化思想和思考之间的关系,您可以创建一个无向图,其中连句具有相似含义的句子之间有连接(边缘)。您将使用一个力导向布局引擎,将所有相似的概念节点推到一起形成簇。但首先,您需要为每个句子创建某种嵌入。句子旨在包含一个单一的思想,您将如何使用词嵌入为句子创建一个嵌入?

您可以将在前几节中学到的关于词嵌入的知识应用到创建句子嵌入。您只需对句子中的每个单词的嵌入求平均,就可以为每个句子创建一个单一的 300 维嵌入。

极端概括

句子嵌入或思维向量实际上包含了什么?这取决于您如何创建它。您已经知道如何使用 SpaCy 和 nessvec 创建词嵌入。您可以通过对句子中所有单词的嵌入求平均来创建句子嵌入;

from nessvec.files import load_glove
从 NLPiA 手稿中提取自然语言

您可以从 nlpia2 项目(gitlab.com/tangibleai/nlpia2/)的src/nlpia2/data/manuscript目录中以 adoc 格式下载本书的任何章节。这里的示例将使用第六章的 adoc 手稿。如果您自己编写一本书或软件文档,请不要这样做。在文本中嵌入代码并用该代码处理您正在处理的文本的递归循环会让您的大脑崩溃。但现在您可以享受所有这些头痛的成果,通过处理您现在正在阅读的文字。

示例 6.13 从nlpia2仓库下载 adoc 文本
>>> import requests
>>> repo = 'https://gitlab.com/tangibleai/nlpia2/-/raw/main'
>>> name = 'Chapter-06_Reasoning-with-word-embeddings-word-vectors.adoc'
>>> url = f'{repo}/src/nlpia2/data/{name}'
>>> adoc_text = requests.get(url)

现在您需要将该文本保存到一个.adoc 文件中,以便您可以使用命令行工具将其呈现为 html。

示例 6.14 将 adoc 字符串写入磁盘
>>> from pathlib import Path
>>> path = Path.cwd() / name
>>> with path.open('w') as fout:
...     fout.write(adoc_text)

现在,您希望将adoc文本转换为 HTML,以便更容易将自然语言文本与格式化字符和其他“不自然”文本分开。您可以使用名为Asciidoc3的 Python 软件包将任何AsciiDoc(.adoc)文本文件转换为 HTML。

列表 6.15 将 AsciiDoc 文件转换为 HTML
>>> import subprocess
>>> subprocess.run(args=[   # #1
...     'asciidoc3', '-a', '-n', '-a', 'icons', path.name])

现在,您已经有了一个 HTML 文本文件,可以使用BeautifulSoup软件包提取文本。

>>> if os.path.exists(chapt6_html) and os.path.getsize(chapt6_html) > 0:
...     chapter6_html = open(chapt6_html, 'r').read()
...     bsoup = BeautifulSoup(chapter6_html, 'html.parser')
...     text = bsoup.get_text()  # #1

现在,您已经有了本章的文本,可以运行spaCy的小型英语语言模型以获得句子嵌入向量。spaCy将在Doc对象内对token向量进行平均。^([55]) 除了获取句子向量外,您还希望获取每个句子的名词短语([56])([57]),这些短语将成为句子向量的标签。

列表 6.16 使用 spaCy 获取句子嵌入和名词短语
>>> import spacy
>>> nlp = spacy.load('en_core_web_md')
>>> config = {'punct_chars': None}
>>> nlp.add_pipe('sentencizer', config=config)
>>> doc = nlp(text)
>>> sentences = []
>>> noun_phrases = []
>>> for sent in doc.sents:
...     sent_noun_chunks = list(sent.noun_chunks)
...     if sent_noun_chunks:
...         sentences.append(sent)
...         noun_phrases.append(max(sent_noun_chunks))
>>> sent_vecs = []
>>> for sent in sentences:
...    sent_vecs.append(sent.vector)

现在,您已经有了句子向量和名词短语,您应该对句子向量进行标准化^([58]),以使所有向量的长度(或2-范数)为 1。计算 2-范数的方式与计算直角三角形对角线的长度相同,您将各个维度长度的平方相加,然后对这些平方和取平方根。

>>> import numpy as np
>>> vector = np.array([1, 2, 3, 4])  # #1
>>> np.sqrt(sum(vector**2))
5.47...
>>> np.linalg.norm(vector)  # #2
5.47...

对 300 维向量中的数据进行标准化可以将所有值调整到相同的尺度,同时保留它们之间的差异。^([59])

列表 6.17 使用 NumPy 对句子向量嵌入进行标准化
>>> import numpy as np
>>> for i, sent_vec in enumerate(sent_vecs):
...     sent_vecs[i] = sent_vec / np.linalg.norm(sent_vec)

在将句子向量进行标准化后,您可以计算所有这些向量之间以及与彼此的相似性。当您计算列表中所有可能的对象对之间的成对相似性时,会生成一个称为相似性矩阵关联矩阵的方阵。^([60]) 如果您使用每个向量与其他所有向量的点积进行计算,则计算的是您在之前章节中熟悉的余弦相似度。

列表 6.18 获取相似性/关联矩阵
>>> np_array_sent_vecs_norm = np.array(sent_vecs)
>>> similarity_matrix = np_array_sent_vecs_norm.dot(
...     np_array_sent_vecs_norm.T)  # #1

相似度矩阵通过将句子嵌入的标准化矩阵(N维,300 个维度)与其自身的转置进行点积计算得到。这样就得到了一个形状为 NN 的矩阵,矩阵的每一行和列都对应本章中的一个句子。矩阵的上半对角线和下半对角线的值完全相同。这是由于乘法的交换律。无论你如何进行乘法或相似度计算,一个向量与另一个的相似度是相同的。

使用相似度矩阵,您现在可以创建一个无向图,使用句子向量之间的相似性来创建那些相似的句子之间的图边。下面的代码使用一个名为NetworkX的库来创建无向图数据结构。在内部,数据存储在嵌套的字典中 - 一种字典的字典的字典… - “一直到底的字典”。就像链表一样,嵌套的字典允许快速查找稀疏数据。您使用点积计算了相似度矩阵作为密集矩阵,但需要将其变为稀疏矩阵,因为您不希望图中的每个句子都与其他句子相连接。您将会打破那些相距很远(相似度低)的句子对之间的连接。

列表 6.19 创建无向图
>>> import re
>>> import networkx as nx
>>> similarity_matrix = np.triu(similarity_matrix, k=1)  # #1
>>> iterator = np.nditer(similarity_matrix,
...     flags=['multi_index'], order='C')
>>> node_labels = dict()
>>> G = nx.Graph()
>>> pattern = re.compile(
...    r'[\w\s]*[\'\"]?[\w\s]+\-?[\w\s]*[\'\"]?[\w\s]*'
...    )  # #2
>>> for edge in iterator:
...     key = 0
...     value = ''
...     if edge > 0.95:  # #3
...         key = iterator.multi_index[0]
...         value = str(noun_phrases[iterator.multi_index[0]])
...         if (pattern.fullmatch(value)
...             and (value.lower().rstrip() != 'figure')):
...                 node_labels[key] = value
...         G.add_node(iterator.multi_index[0])
...         G.add_edge(iterator.multi_index[0],
...             iterator.multi_index[1], weight=edge)

有了全新的图(网络),您现在可以使用matplotlib.pyplot来可视化它。

列表 6.20 绘制无向图
>>> import matplotlib.pyplot as plt
>>> plt.subplot(1, 1, 1)  # #1
>>> pos = nx.spring_layout(G, k=0.15, seed=42)  # #2
>>> nx.draw_networkx(G,
...    pos=pos,  # #3
...    with_labels=True,
...    labels=node_labels,
...    font_weight='bold')
>>> plt.show()

最后,您可以看到您的无向图如何展示了本书自然语言中的概念集群!力导向图中的弹簧根据它们与其他概念的连接将相似的概念拉在一起。每个节点代表本章句子的平均词嵌入。而(或线)表示那些意思相似的句子之间的连接。从绘图中可以看出,中心的大集群节点(句子)连接得最多。而中心集群外还有其他更小的集群节点,如体育和城市等主题。

图 6.10 用词嵌入连接概念


中心密集的概念集群应包含关于本章主要思想及其关系的一些信息。放大后,您会看到这些段落大多关于用词和数字来表示词汇,因为这正是本章所讨论的内容。

图 6.11 第六章中心放大的无向图绘制


本章的结尾包括一些练习,供您练习本节所涵盖的内容。

6.5.6 不自然的词汇

诸如 Word2Vec 之类的词嵌入不仅对英语单词有用,而且对于任何表示符号序列的符号都有用,其中符号序列和符号的接近程度代表它们的含义。如果您的符号具有语义,那么嵌入可能会有用。正如您可能已经猜到的那样,词嵌入也适用于英语以外的其他语言。

嵌入还适用于象形文字,比如中国传统文字和日本汉字,以及埃及墓穴中神秘的象形文字。嵌入和基于向量的推理甚至适用于试图混淆词义的语言。您可以对一个大量收集而来的从“Pig Latin”转录的“秘密”消息或由儿童或罗马帝王发明的任何其他语言进行基于向量的推理。像 RO13 这样的凯撒密码([63])或*替换密码*([64]) 都容易受到 Word2Vec 的基于向量的推理的攻击。你甚至不需要一个解码器环(如图 6.9 所示)。您只需要一个可以处理的大量消息或n-grams 的 Word2Vec 嵌入器,以找到单词或符号的共现。

图 6.12 解码器环


Word2Vec 甚至可以从非自然的词或 ID 号码(如大学课程号码(CS-101)、型号号码(Koala E7270 或 Galaga Pro)以及序列号、电话号码和邮政编码)中获取信息和关系。^([65]) 要获取关于此类 ID 号码间关系的最有用信息,您需要一系列包含这些 ID 号码的语句。如果 ID 号码经常包含具有意义的符号位置结构,将这些 ID 号码标记为最小的语义包(例如自然语言中的词或音节)可以提供帮助。

6.6 小结

  • 词向量和面向向量的推理可以解决一些令人惊讶的微妙问题,如类比问题和单词之间的非同位关系。
  • 要使您的词向量保持最新并提高其与您感兴趣的当前事件和概念的相关性,可以使用gensim或 PyTorch 重新训练和微调您的词嵌入。
  • nessvec软件包是一个有趣的新工具,可以帮助您找到舌尖上的词或可视化一个单词的“角色卡”。
  • 词嵌入可以揭示人名、地名、商号甚至职业名称中一些意外的隐藏含义。
  • 对城市和国家的词向量进行 PCA 投射,可以揭示地理上相距遥远的地方之间的文化亲近程度。
  • 将潜在语义分析向量转化为更强大的词向量的关键在于在创建n-grams 时尊重句子边界。
  • 机器只需使用预训练的词嵌入就能轻松通过标准化测试中的词类比部分。

6.7 自我测试

  1. 使用预训练的词嵌入,仅根据自然语言摘要,计算 Dota 2 英雄的力量、敏捷性和智力。^([66])
  2. 在本书的另一章节(或任何其他文本)中可视化概念之间的连接图,从而更好地理解它们。
  3. 尝试结合这本书所有章节的词嵌入图形可视化。
  4. 给出示例,说明词向量如何使得霍夫斯塔德的智能八要素中至少两个成为可能。
  5. Fork nessvec 存储库并创建您自己喜欢的词或著名人物的可视化或 nessvector“角色卡”。也许是您的英雄的“正念”、“道德”、“善意”或“影响力”?人类是复杂的,用来描述他们的词是多维的。
  6. 使用 PCA 和词嵌入创建一些城市或靠近您位置的物体的二维地图。尝试将二元词组合作为一个单独的点,然后分别作为每个词的两个单独的点。地理词的位置是否在某种程度上对应其地理位置?非地理词呢?

[1] 感谢马克·福斯特对我的混乱善意的影响以及对世界的影响!

[2] Papers With Code 上的表示学习方法( paperswithcode.com/area/methodology/representation-learning

[3] “This is your brain on drugs”( en.wikipedia.org/wiki/This_Is_Your_Brain_on_Drugs

[4] 请查看《Node Embeddings》作者泰德·凯为圣地亚哥机器学习读书会所做的总结( github.com/SanDiegoMachineLearning/bookclub/blob/master/graph/graphml-05-GNN1.pdf

[5] 由 Lisa Beinborn 编写的《语言-大脑编码实验的稳健评估》( arxiv.org/abs/1904.02547)( beinborn.eu/

[6] 脚注:“将人类认知模式与 NLP 模型联系起来”) 采访了 Lisa Beinborn( beinborn.eu/

[7] 康奈尔大学的 T.米切尔等人撰写的《永不止步的语言学习》( proai.org/NELL_aaai15.pdf

[8] 维基百科上关于“神经语言编程”的解释( en.wikipedia.org/wiki/Neuro-linguistic_programming

[9] ‘r/NLP’ subreddit( www.reddit.com/r/NLP

[10] 在’r/NaturalLanguage/'上有一个真正的 NLP subreddit( www.reddit.com/r/NaturalLanguage

[11] 丹尼尔·丹尼特的《直觉泵及其他思维工具》第 96 页

[12] Papers With Code 上有关“词嵌入”的主题( paperswithcode.com/task/word-embeddings

[13] 斯坦福开源的 GloVE 算法的 C 版本( github.com/stanfordnlp/GloVe)和 Python 版本( github.com/lapis-zero09/compare_word_embedding/blob/master/glove_train.py

[14] Startpage 隐私保护网络搜索(www.startpage.com/

[15] DISROOT 非营利搜索引擎(search.disroot.org

[16] Wolfram Alpha 采用最先进的自然语言处理技术(wolframalpha.com/

[17] ElasticSearch 后端源代码(github.com/elastic/elasticsearch)和前端 SearchKit 演示(demo.searchkit.co/type/all?query=prosocial%20AI

[18] Meilisearch 源代码和自托管 Docker 镜像(github.com/meilisearch/meilisearch)以及托管服务(www.meilisearch.com/

[19] SearX git 仓库(github.com/searx/searx

[20] Apache Solr 主页和 Java 源代码(solr.apache.org/

[21] Apache Lucene 主页(lucene.apache.org/

[22] Qwant 网络搜索引擎位于法规保护您免受操纵和欺骗的欧洲(www.qwant.com/

[23] Sphinx 主页和 C 源代码(sphinxsearch.com/

[24] Cole Thienes 和 Jack Pertschuk 的《如何在 3 分钟内构建语义搜索引擎》(mng.bz/yvjG

[25] PynnDescent Python 软件包(pypi.org/project/pynndescent/

[26] 如果你不相信我们,请尝试它们全部。

[27] 查看维基百科文章(en.wikipedia.org/wiki/John_Rupert_Firth

[28] “在向量空间中高效估计词表示”2013 年 9 月,Mikolov、Chen、Corrado 和 Dean(arxiv.org/pdf/1301.3781.pdf)。

[29] 查看名为“无监督特征学习和深度学习教程”的网页(ufldl.stanford.edu/tutorial/unsupervised/Autoencoders/)。

[30] 查看 Tomas Mikolov、Wen-tau Yih 和 Geoffrey Zweig 的《连续空间词表示中的语言学规律》PDF(www.aclweb.org/anthology/N13-1090)。

[31] 查看 Radim Řehůřek 对 Tomas Mikolov 的采访(rare-technologies.com/rrp#episode_1_tomas_mikolov_on_ai)。

[32] 查看“ICRL2013 开放评论”(openreview.net/forum?id=idpCdOWtqXd60&noteId=C8Vn84fqSG8qa)。

[33] 您可以在mng.bz/M5G7找到生成这些交互式二维词图的代码。

[34] 请参阅第三部分“思考意义或内容的工具”第 59 页和第十五章“爸爸是医生”第 p. 页,书名为《直觉泵和其他思维工具》,作者丹尼尔·丹尼特(Daniel C. Dennett)

[35] 请查看标题为 “GitHub - 3Top/word2vec-api: Simple web service providing a word embedding model” 的网页(github.com/3Top/word2vec-api#where-to-get-a-pretrained-model)。

[36] Google Drive 上的原始 Google 300D Word2Vec 模型(drive.google.com/file/d/0B7XkCwpI5KDYNlNUTTlSS21pQmM

[37] 请查看标题为 “GitHub - facebookresearch/fastText: Library for fast text representation and classification.” 的网页(github.com/facebookresearch/fastText)。

[38] 维基百科关于 Bayard Rustin(en.wikipedia.org/wiki/Bayard_Rustin)和 Larry Dane Brimner(en.wikipedia.org/wiki/Larry_Dane_Brimner)的条目,Bayard Rustin 是一位民权领袖,Larry Dane Brimner 是 150 多本儿童书籍的作者。

[39] 由 Tomas Mikolov 团队撰写的论文提供了更多细节(arxiv.org/pdf/1310.4546.pdf)。

[40] 请参阅 gitlab.com/tangibleai/nlpia2 上的 README 文件以获取安装说明。

[41] Google 在此处托管了由 Mikolov 在 Google Drive 上训练的原始模型 here

[42] 《表面与本质:类比作为思维的燃料和火焰》,作者道格拉斯·霍夫斯塔德(Douglas Hoffstadter)和埃曼纽尔·桑德(Emmanuel Sander)。

[43] Morse 检测器,由凯尔·戈尔曼(Kyle Gorman)和俄勒冈卫生科学大学(OHSU)开发,可在 pypi 上找到,并在 github.com/cslu-nlp/DetectorMorse 查看。

[44] 斯坦福 GloVe 项目(nlp.stanford.edu/projects/glove/)。

[45] 有关奇异值分解的更多细节,请参阅第五章和附录 C。

[46] 《GloVe:全球词向量表示》,作者 Jeffrey Pennington、Richard Socher 和 Christopher D. Manning:nlp.stanford.edu/pubs/glove.pdf

[47] Gensim 对 Word2Vec 和 GloVe 性能的比较:rare-technologies.com/making-sense-of-Word2Vec/#glove_vs_word2vec

[48] 将子词信息与词向量丰富化,由 Bojanowski 等人撰写:arxiv.org/pdf/1607.04606.pdf

[49] 请查看标题为 “fastText/pretrained-vectors.md” 的网页(github.com/facebookresearch/fastText/blob/main/docs/pretrained-vectors.md)。

[50] 彼得·诺维格(Peter Norvig)提供的拼写纠正代码和解释(norvig.com/spell-correct.html

[51] SpaCy 中等语言模型文档(spacy.io/models/en#en_core_web_md

[52] Nessvec 源代码(gitlab.com/tangibleai/nessvec)和教程视频(proai.org/nessvec-videos

[53] Niel Chah 的 word2vec4everything 仓库(github.com/nchah/word2vec4everything

[54] 请查看标题为 ‘图(抽象数据类型)’ 的 Wiki 页面:en.wikipedia.org/wiki/Graph_(abstract_data_type)

[55] spaCy 的 Span 对象的向量属性默认为标记向量的平均值(spacy.io/api/span#vector

[56] 请查看标题为 ‘名词短语’ 的 Wiki 页面:en.wikipedia.org/wiki/Noun_phrase

[57] spaCy 的 Span.noun_chunks:spacy.io/api/span#noun_chunks

[58] 请查看标题为 ‘范数(数学)— 欧几里得范数’ 的 Wiki 页面:en.wikipedia.org/wiki/Norm_(mathematics)#Euclidean_norm

[59] 请查看标题为 ‘为什么数据标准化对机器学习模型是必要的’ 的网页:mng.bz/aJ2z

[60] 请查看标题为 ‘亲和矩阵’ 的网页:deepai.org/machine-learning-glossary-and-terms/affinity-matrix

[61] 欲获取更多信息,请查看 NetworkX 网页:networkx.org/

[62] NetworkX 文档有更多细节(networkx.org/documentation/stable/reference/introduction.html#data-structure

[63] 欲查看标题为 “凯撒密码 - 维基百科” 的网页,请访问(en.wikipedia.org/wiki/Caesar_cipher

[64] 欲查看标题为 “替换密码 - 维基百科” 的网页,请访问(en.wikipedia.org/wiki/Substitution_cipher

[65] 请查看 Kwyk 撰写的文章 “Word2Vec 的非 NLP 应用 - Towards Data Science”(archive.ph/n5yw3)。

[66] nessvecnlpia2 包包含 FastText、GloVE 和 Word2vec 加载器(gitlab.com/tangibleai/nessvec),而 nlpia2 包含用于下载 Dota 2 角色卡的 ch06_dota2_wiki_heroes.hist.pygitlab.com/tangibleai/nlpia2/-/blob/main/src/nlpia2/etl/ch06_dota2_wiki_heroes.hist.py)。

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

热门文章

最新文章