作者 | Kourosh Alizadeh

编译 | VK
来源 | Towards Data Science

在过去,我在为我的一个项目训练词向量,但我一直在碰壁。我在研究哲学史上的文本,试图找到可以揭示作者如何使用一个词的向量。但我一直得到这样的结果:

如果你斜视得很厉害,也许这是有道理的。毕竟,爱确实与完美有关,对吧?

但是相似性分数很小,我们不想为了让结果有意义而眯着眼睛看。

为了解决这个问题,我试着调整超参数,但结果甚至比这更差。

但后来我灵机一动。我将使用GloVe预训练好的词向量作为基线,而不是单独在我的数据集上训练数据。这意味着基本上我的机器已经知道基本的英语了,然后只需要微调以更准确地匹配我的数据。

这个过程比我预期的要困难一些,而且我找不到任何完整的教程,所以我想我应该写一个。这个过程基本上有三个步骤,我将按顺序介绍它们。如果你只想得到一个结果,可以跳到最后查看笔记本。

本教程需要Gensim Word2Vec库。

步骤1:加载向量

要训练GloVe嵌入,你需要将嵌入加载到你的系统中。你可以在这里下载:https://nlp.stanford.edu/projects/glove/

一旦你有了一个文件,你可以用下面的代码来加载它。

glove_file = datapath('YOUR_DATAPATH_HERE')
tmp_file = get_tmpfile("test_word2vec.txt")_ = glove2word2vec(glove_file, tmp_file)glove_vectors = KeyedVectors.load_word2vec_format(tmp_file)

这实际上是从GloVe网站获取的.txt文件,并以Gensim Word2Vec库的适当格式加载它。此时,你可以执行通常的相似性搜索来测试是否所有内容都正确加载。

正如你所看到的,GloVe嵌入比我们之前得到的更有意义。

步骤2:建立一个玩具模型来更新

在这一步中,你基本上不需要使用GloVe就可以从数据构建Word2Vec模型。此模型使你能够捕获新词,并构建包含特定数据集的词汇表,如果你处理的文本不仅仅是普通英语,这将非常有用。

# 为了让它工作,输入将是一个标识的列表
# 因为我的数据是在一个数据帧中,我选择了适当的series
documents = df[df['school'] == 'rationalism']['sent_tokenized']# 然后列进列表
sentences = [sentence for sentence in documents]# 清理句子
stopwords = [YOUR_STOPWORDS_HERE]
cleaned_sentences = []
for sentence in sentences:cleaned = [word.lower() for word in sentence]cleaned = [word for word in cleaned if word not in stopwords]cleaned_sentences.append(cleaned)# 在你的数据集中建立一个word2vec模型
base_model = Word2Vec(size=300, min_count=5)
base_model.build_vocab(cleaned_sentences)
total_examples = base_model.corpus_count

很好,现在你有了一个蹩脚的模型可以作为基础。

步骤3:再训练

在这里,你将获取现有模型,添加GloVe词汇表和起始权重,并在数据集上重新训练它。

# 添加GloVe的词汇和权重
base_model.build_vocab([list(glove_vectors.vocab.keys())], update=True)# 训练你的数据
base_model.train(cleaned_sentences, total_examples=total_examples, epochs=base_model.epochs)
base_model_wv = base_model.wv

结果将是一组新的单词向量,它们使用GloVe的原始权重,但现在也在你自己的数据上调整了。下面是一个结果示例:

你可能不太了解理性主义哲学,但相信我,这是非常有道理的。他们的主要焦点之一是上帝,我们可以看到,在讨论上帝的爱时,几乎所有这些都是有意义的——上帝爱我们是因为他是好人,他的恩典是爱的表现,他给我们自由是因为他爱我们,等等。

另一个更好的测试方法是,在你的特定数据集中运行。most_similar来检验你的新向量和原来的GloVe向量。下面是我得到的结果的一个例子:

你可以看到,在哲学语料库中,“哲学”与科学和形而上学相联系,而在基本语料库中,没有这种联系。

这很有道理。形而上学在英语口语中(与占星术和超自然有关)和哲学(是一个主要的分支领域)有着截然不同的含义。

所以当哲学家谈论哲学时,形而上学总是在讨论中,但是当普通人谈论哲学时,他们几乎不会把它与形而上学联系起来。哲学家也认为自己是科学的,或者在与自然科学的对话中,一般公众通常看不到哲学和科学之间的紧密联系。

额外步骤:将所有内容整合在一起

好,太好了!现在,你有了一个漂亮的词嵌入,可以用它来生成对语料库的见解,也可以用在深度学习或其他应用程序中。

剩下的就是在一个单一的函数中把所有的函数集合起来:

def train_glove(source, glove_vectors, threshold=10, stopwords=[],min_count=20):# 隔离数据帧的相关部分documents = df[df['source'] == source]['sent_tokenized']# 格式化要使用的系列sentences = [sentence for sentence in documents]# 如果需要,删除停止词stopwords = []cleaned = []for sentence in sentences:cleaned_sentence = [word.lower() for word in sentence]cleaned_sentence = [word for word in sentence if word not in stopwords]cleaned.append(cleaned_sentence)# 这些后续步骤不在我们最初的描述中,因为它们对任务来说不是必要的# 如果这些短语足够常见的话,它们可以让你得bigrams,甚至是trigrams# 获取bigramsbigram = Phrases(cleaned, min_count=min_count, threshold=threshold, delimiter=b' ')bigram_phraser = Phraser(bigram)bigramed_tokens = []for sent in cleaned:tokens = bigram_phraser[sent]bigramed_tokens.append(tokens)# 获取trigramstrigram = Phrases(bigramed_tokens, min_count=min_count, threshold=threshold, delimiter=b' ')trigram_phraser = Phraser(trigram)trigramed_tokens = []for sent in bigramed_tokens:tokens = trigram_phraser[sent]trigramed_tokens.append(tokens)# 创建一个玩具模型来更新model = Word2Vec(size=300, min_count=5)model.build_vocab(trigramed_tokens)total_examples = model.corpus_count# 添加GloVe的词汇和权重model.build_vocab([list(glove_vectors.vocab.keys())], update=True)# 训练我们的数据model.train(trigramed_tokens, total_examples=total_examples, epochs=model.epochs)model_wv = model.wv# 删除模型以节省内存,并返回词向量进行分析del modelreturn model_wv

如果你想看到实际的结果,你可以查看Philosophy数据项目的单词使用分析页面:http://philosophydata.com/w2v.html。

代码地址:https://github.com/kcalizadeh/phil_nlp

感谢阅读!


往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑黄海广老师《机器学习课程》课件合集
本站qq群851320808,加入微信群请扫码:

【NLP】基于GloVe词向量的迁移学习相关推荐

  1. NLP-分类模型-2016-文本分类:FastText【使用CBOW的模型结构;作用:①文本分类、②训练词向量、③词向量模型迁移(直接拿FastText官方已训练好的词向量来使用)】【基于子词训练】

    <原始论文:Bag of Tricks for Efficient Text Classification> <原始论文:Enriching Word Vectors with Su ...

  2. 一个基于PyTorch实现的Glove词向量的实例

    简介 词向量技术,也称为词嵌入技术(word-embedding),是一种将高维稀疏的向量压缩到低维稠密向量的技术.常见于自然语言处理领域对单词的预处理过程,例如将单词的one-hot向量是高维稀疏的 ...

  3. 2.8 GloVe词向量-深度学习第五课《序列模型》-Stanford吴恩达教授

    Glove 词向量 (GloVe Word Vectors) 你已经了解了几个计算词嵌入的算法,另一个在NLP社区有着一定势头的算法是GloVe算法,这个算法并不如Word2Vec或是Skip-Gra ...

  4. NLP【05】pytorch实现glove词向量(附代码详解)

    上一篇:NLP[04]tensorflow 实现Wordvec(附代码详解) 下一篇:NLP[06]RCNN原理及文本分类实战(附代码详解) 完整代码下载:https://github.com/ttj ...

  5. 详解GloVe词向量模型

      词向量的表示可以分成两个大类1:基于统计方法例如共现矩阵.奇异值分解SVD:2:基于语言模型例如神经网络语言模型(NNLM).word2vector(CBOW.skip-gram).GloVe.E ...

  6. 机器阅读理解笔记之glove词向量与attentive readerimpatient reader和bi-DAF

    glove词向量模型 词向量的表示可以分成两类: 基于统计方法 共现矩阵.svd 基于语言模型 神经网络语言模型,word2vector,glove,elmo  word2vector中的skip-g ...

  7. 【Pytorch基础教程37】Glove词向量训练及TSNE可视化

    note Glove模型目标:词的向量化表示,使得向量之间尽可能多蕴含语义和语法信息.首先基于语料库构建词的共现矩阵,然后基于共现矩阵和GloVe模型学习词向量. 对词向量计算相似度可以用cos相似度 ...

  8. NLP中的词向量及其应用

    https://www.toutiao.com/a6643219722961682947/ 2019-01-06 11:25:24 词向量基本上是一种单词表示形式,它将人类对语言的理解与机器的理解连接 ...

  9. 论文阅读:基于多模态词向量的语句距离计算方法

    论文信息 华阳. 基于多模态词向量的语句距离计算方法[D].哈尔滨工业大学,2018. 1.主要工作 简述语句间的距离问题:自然语言处理任务是度量文本间的距离:不同阶段语言学习的难度可以抽象为距离,本 ...

最新文章

  1. 报名 | 挑战极限,参加2天清华数据Hackathon,赢得4万元奖金
  2. Android ContentResolver
  3. Linux下快捷键使用
  4. java数组之binarySearch查找
  5. java基础---二维数组方面的一些小编程
  6. C和指针之结构体大小和成员变量位置距离结构开始存储的位置偏移字节
  7. n2n内网穿透打洞部署全过程 + nginx公网端口映射
  8. 使用MaxCompute LOAD命令批量导入OSS数据最佳实践—STS方式LOAD开启KMS加密OSS数据
  9. 计算机负数次幂科学表示,负数的科学计数法怎么表示
  10. FileItem 出现部分中文乱码解决办法
  11. TCP和UDP的不同
  12. python字典长度可变吗_为什么Python中字典的key必须是不可变的?
  13. vue 点击div 获取位置_Vue中div contenteditable 的光标定位方法
  14. 简约个人介绍主页源码,免费创建个人主页
  15. java计算机毕业设计基于安卓Android的团务智慧管理APP
  16. 让xcode5能使用ios6.1模拟器
  17. How to create swiping gesture list items for Windows Phone 7
  18. 《网络基础》p84.interface gigabitethernet 0/0/0报错
  19. python查文章字数
  20. 使用python爬取图书封面

热门文章

  1. Swift -- 6.函数和闭包
  2. (转)NAT与NAT穿透 原理
  3. struts2+spring3.2简单demo
  4. VS2008的网页报表可以直接打印了
  5. myBatis异常提示For input string: {1=null}
  6. 文件上传api——MultipartFile
  7. macos 安装 brew
  8. 24-hadoop-hiveserver2jdbc-正则数据导入
  9. Python subprocess执行持续输出shell命令的控制
  10. [转]Android 代码自动提示功能