2019-12-01 19:35:16

作者:Steeve Huang

编译:ronghuaiyang

导读

嵌入是NLP的基础,这篇文章教你使用Gensim来实现Word2Vec和FastText,并通俗易懂的描述了Word2Vec和FastText的基本原理。

在自然语言处理(NLP)中,我们经常将单词映射成向量,以便机器能够理解它。单词嵌入是一种映射类型,它允许具有相似含义的单词具有相似的表示。本文将介绍两种最先进的word嵌入方法,Word2VecFastText及其在Gensim中的实现。

传统方法

传统的表示单词的方法是独热向量,它本质上是一个只有一个目标元素为1,其他元素为0的向量。向量的长度等于语料库中所有唯一词汇量的大小。按照惯例,这些独特的单词是按字母顺序编码的。也就是说,以“a”开头的单词的独热向量中1的位置具有较小的索引,而以“z”开头的单词有较高的索引。

虽然单词的这种表示方法简单且易于实现,但是存在几个问题。首先,给定两个单词独热表示形式,你无法推断它们之间的任何关系。例如,单词“endure”和“tolerate”虽然意思相似,但它们向量表示中的“1”相距甚远。此外,稀疏性是另一个问题,因为向量中有许多冗余的“0”。这意味着我们正在浪费大量的空间。我们需要更好的表示来解决这些问题。

Word2Vec

Word2Vec是这些问题的有效解决方案,它利用了目标单词的上下文。从本质上讲,我们想用一个神经网络的隐含层来表示单词。

有两种类型的Word2Vec,Skip-gram和Continuous Bag of Words(CBOW)。在下面的段落中,我将简要描述这两种方法的工作原理。

Skip-gram

对于Skip-gram,输入是目标单词,而输出是目标单词的上下文单词。例如,假设窗口大小为5,在句子“I have a cute dog”中,输入为“a”,而输出为“I”、“have”、“cute”和“dog”。所有的输入和输出都是相同尺寸的独热编码。网络包含1个隐含层,其维数等于嵌入大小,小于输入/输出向量大小。在输出层的末尾,使用softmax函数,用来输出向量的每个元素描述特定单词在上下文中出现的可能性。下图显示了网络结构。

将目标词的独热表示输入网络后,提取隐藏层,得到目标词的嵌入。

使用skip-gram,表示维度从词汇量(V)减小到隐含层的长度(N),并且向量在描述单词之间的关系时更加“有意义”。通过减去两个相关单词得到的向量有时表示一个有意义的概念,如性别或动词时态,如下图所示(降维)。

CBOW

Continuous Bag of Words(CBOW)与skip-gram非常相似,只是它交换了输入和输出。这个想法是,给定一个上下文,我们想知道哪个单词最有可能出现在其中。

skip-gram和CBOW最大的区别在于单词vector的生成方式。对于CBOW,所有以目标词为目标的例子都被输入到网络中,并取提取的隐含层的平均值。例如,假设我们只有两句话,“He is a nice guy”和“She is a wise queen”。为了计算单词“a”的单词表示,我们需要输入这两个例子,“He is nice guy”和“She is wise queen”到神经网络中,并取隐藏层中值的平均值。skip-gram只输入一个目标词的独热向量作为输入。

据说,skip-gram在罕见的词汇中表现得更好。不过,整体来看,skip-gram和CBOW的性能基本相同。

实现

我将向你展示如何使用Gensim、一个功能强大的NLP工具包和一个TED Talk数据集来执行word嵌入。

首先,我们使用urllib下载数据集,从文件中提取副标题。

 import numpy as npimport osfrom random import shuffleimport reimport urllib.requestimport zipfileimport lxml.etree#download the dataurllib.request.urlretrieve("https://wit3.fbk.eu/get.php?path=XML_releases/xml/ted_en-20160408.zip&filename=ted_en-20160408.zip", filename="ted_en-20160408.zip")# extract subtitlewith zipfile.ZipFile('ted_en-20160408.zip', 'r') as z:doc = lxml.etree.parse(z.open('ted_en-20160408.xml', 'r'))input_text = '\n'.join(doc.xpath('//content/text()'))

让我们看看input_text变量存储了什么,如下图所示。

input_text

很明显,有一些多余的信息对我们理解对话没有帮助,比如括号里描述声音的单词和说话人的名字。我们用正则表达式把这些词去掉。

 # remove parenthesisinput_text_noparens = re.sub(r'\([^)]*\)', '', input_text)# store as list of sentencessentences_strings_ted = []for line in input_text_noparens.split('\n'):m = re.match(r'^(?:(?P<precolon>[^:]{,20}):)?(?P<postcolon>.*)$', line)sentences_strings_ted.extend(sent for sent in m.groupdict()['postcolon'].split('.') if sent)# store as list of lists of wordssentences_ted = []for sent_str in sentences_strings_ted:tokens = re.sub(r"[^a-z0-9]+", " ", sent_str.lower()).split()sentences_ted.append(tokens)

现在,已经将sentences_ted转换为一个二维数组,每个元素都是一个单词。让我们打印出第一个和第二个元素。

sentences_ted

这是准备输入Gensim中定义的Word2Vec模型的格式。Word2Vec模型可以很容易地用一行代码进行训练,如下面的代码所示。

 from gensim.models import Word2Vecmodel_ted = Word2Vec(sentences=sentences_ted, size=100, window=5, min_count=5, workers=4, sg=0)
  • sentences:拆分句子后的列表。
  • size:嵌入向量的维数
  • window:查看的上下文单词的数量
  • min_count:告诉模型忽略总计数小于这个数字的单词。
  • workers:使用的线程数
  • sg:使用skip-gram还是CBOW

现在,让我们来看看哪些单词与“man”最相似。

 model_ted.wv.most_similar(“man”)

似乎与men/women/kid相关的词语与“man”最为相似。

虽然Word2Vec成功地处理了由独热向量引起的问题,但是它有几个限制。最大的挑战是它不能表示训练数据集中没有出现的单词。即使使用包含更多词汇的更大的训练集,一些很少使用的罕见词汇也永远无法映射到向量。

FastText

FastText是Facebook在2016年提出的Word2Vec的扩展。FastText不是将单个单词输入神经网络,而是将单词分解成几个n-grams(子单词)。例如,单词apple的三元组是app、ppl和ple(忽略单词边界的开始和结束)。“apple”的嵌入向量是所有这些n-grams的和。在对神经网络进行训练后,我们将对给定训练数据集的所有n-grams进行单词嵌入。稀有单词现在可以正确地表示了,因为它们的一些n-grams很可能也出现在其他单词中。在下一节中,我将向你展示如何在Gensim中使用FastText。

实现

与Word2Vec类似,我们只需要一行代码就可以指定训练单词嵌入的模型。

 from gensim.models import FastTextmodel_ted = FastText(sentences_ted, size=100, window=5, min_count=5, workers=4,sg=1)

让我们用单词Gastroenteritis来尝试一下,这个单词很少使用,也没有出现在训练数据集中。

 model_ted.wv.most_similar("Gastroenteritis")

虽然在训练数据集中没有“Gastroenteritis”这个词,但它仍然能够找出这个词与一些医学术语密切相关。如果我们在前面定义的Word2Vec中尝试这样做,它将弹出错误,因为在训练数据集中不存在这样的单词。尽管训练FastText模型(n-grams的数量>单词数)需要更长的时间,但是它的性能比Word2Vec更好,并且允许适当地表示罕见的单词。

英文原文:https://towardsdatascience.com/word-embedding-with-word2vec-and-fasttext-a209c1d3e12c

使用Gensim来实现Word2Vec和FastText相关推荐

  1. gensim中的word2vec使用

    介绍 一句话, G e n s i m Gensim Gensim中的word2vec类就是用来训练词向量的,这个类实现了词向量训练的两种基本模型 s k i p − g r a m skip-gra ...

  2. 【自然语言处理】Gensim中的Word2Vec

    Gensim中的Word2Vec BOW 和 TF-IDF 都只着重于词汇出现在文件中的次数,未考虑语言.文字有上下文的关联,针对上下文的关联,Google 研发团队提出了词向量 Word2vec,将 ...

  3. 学习笔记四:word2vec和fasttext

    FastText:快速的文本分类器 文章目录 一.word2vec 1.1 word2vec为什么 不用现成的DNN模型 1.2 word2vec两种模型:CBOW和Skip-gram 1.2 wor ...

  4. 【python gensim使用】word2vec词向量处理中文语料

    word2vec介绍 word2vec官网:https://code.google.com/p/word2vec/ word2vec是google的一个开源工具,能够根据输入的词的集合计算出词与词之间 ...

  5. 调用gensim库训练word2vec词向量

    首先准备符合规定输入的语料: import jieba raw_text = ["你站在桥上看风景","看风景的人在楼上看你","明月装饰了你的窗子& ...

  6. bert获得词向量_NLP中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert

    作者:JayLou,NLP算法工程师 知乎专栏:高能NLP之路 https://zhuanlan.zhihu.com/p/56382372 本文以QA形式对自然语言处理中的词向量进行总结:包含word ...

  7. 词向量与词向量拼接_nlp中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert

    本文以QA形式对自然语言处理中的词向量进行总结:包含word2vec/glove/fastText/elmo/bert. 2020年更新:NLP预训练模型的全面总结JayLou娄杰:史上最全!PTMs ...

  8. [Python人工智能] 九.gensim词向量Word2Vec安装及《庆余年》中文短文本相似度计算

    从本专栏开始,作者正式开始研究Python深度学习.神经网络及人工智能相关知识.前一篇详细讲解了卷积神经网络CNN原理,并通过TensorFlow编写CNN实现了MNIST分类学习案例.本篇文章将分享 ...

  9. 使用gensim框架及Word2Vec词向量模型获取相似词

    使用gensim框架及Word2Vec词向量模型获取相似词 预备知识 Word2Vec模型下载 加载词向量模型 预备知识 gensim框架 gensim是基于Python的一个框架,它不但将Pytho ...

最新文章

  1. 【SVN多用户开发】代码冲突解决办法
  2. css修改select下拉列表的默认样式
  3. 用了fastapi还需要nginx_专门为API接口开发出现,FastAPI零门槛学习
  4. 在Linux上安装Elasticsearch Kibaba.md
  5. 45W快充没了?三星Galaxy Note10 Pro可能还是25W快充
  6. python画饼图存在的问题_python_使用matplotlib画饼状图(pie)
  7. python模块heapq之简单学习使用
  8. 手机pdf文件转语音_录音语音转文字手机版下载-录音语音转文字免费版下载v1.0.0...
  9. 7-5 判断上三角矩阵
  10. 企业中常用的vlan划分方法
  11. 【NLP】文献翻译2——英语单词语义相似性的Word2Vec模型分析
  12. 硬盘录像机常见问题解答硬盘录像机故障解决
  13. 我给浏览器加了个语音搜索功能
  14. 两台计算机互联方案,如何连接两台电脑
  15. YunCharging充电桩系统开源源码,配套设备+小程序直接商用落地
  16. Python使用阿里API进行身份证识别
  17. win10使用markdownpad2报错 An error occurred with the HTML rendering component. This issue may be fixed b
  18. git与gerrit基础概念
  19. zookeeper四字监控命令
  20. 兔子繁衍问题(PTA)

热门文章

  1. ubuntu下解决“无法获得锁 ”的方法_cppmylove的博客-CSDN博客_无法获得锁
  2. 清华张悠慧:AI时代,「图灵完备」之后,「类脑计算完备」如何设计?
  3. GPT-3等三篇论文获NeurIPS2020最佳论文奖 | AI日报
  4. 你认识这些布道师吗?
  5. 是起点,而非终点——评《程序员的思维修炼》
  6. 用rufus f2 制作Ubuntu16.04 U盘启动盘
  7. 深入理解指针以及二级指针(指针的指针)
  8. 哈夫曼树--链式结构(建立huffman树、编码、解码)
  9. 【干货书】深度学习合成数据
  10. 苏子怡:大数据思维融入建筑节能 | 提升之路系列