在LDA模型中,每次我在同一个语料库上进行训练时,都会生成不同的主题,通过设置np.random.seed(0),LDA模型将始终以完全相同的方式进行初始化和训练。
来自的Word2Vec模型是否相同gensim?通过将随机种子设置为常数,在同一数据集上运行的不同样本会产生相同的模型吗?
但是奇怪的是,它已经在不同情况下为我提供了相同的矢量。
>>> from nltk.corpus import brown
>>> from gensim.models import Word2Vec
>>> sentences = brown.sents()[:100]
>>> model = Word2Vec(sentences, size=10, window=5, min_count=5, workers=4)
>>> model[word0]
array([ 0.04985042, 0.02882229, -0.03625415, -0.03165979, 0.06049283,
0.01207791, 0.04722737, 0.01984878, -0.03026265, 0.04485954], dtype=float32)
>>> model = Word2Vec(sentences, size=10, window=5, min_count=5, workers=4)
>>> model[word0]
array([ 0.04985042, 0.02882229, -0.03625415, -0.03165979, 0.06049283,
0.01207791, 0.04722737, 0.01984878, -0.03026265, 0.04485954], dtype=float32)
>>> model = Word2Vec(sentences, size=20, window=5, min_count=5, workers=4)
>>> model[word0]
array([ 0.02596745, 0.01475067, …Run Code Online (Sandbox Code Playgroud) 我一直在阅读一些带有深度学习论文的NLP,并发现微调似乎是一个简单但却令人困惑的概念.这里提出了同样的问题,但仍然不太清楚.
如Y. Kim,"用于句子分类的卷积神经网络"和KS Tai,R.Socher,以及CD Manning,"改进树的语义表示"等论文所述,将预训练的单词嵌入微调到特定于任务的单词嵌入.- 结构化的长期短期记忆网络,"只是简单地提一下,没有详细说明.
我的问题是:
使用word2vec或Glove生成的Word嵌入作为预训练的单词向量用作(X)下游任务的输入要素,如解析或情感分析,这意味着那些输入向量插入到某个特定任务的新神经网络模型中,同时训练这个新模型,不知何故我们可以获得更新的特定于任务的单词嵌入.
但据我所知,在训练过程中,反向传播的作用是更新(W)模型的权重,它不会改变输入特征(X),那么原始单词嵌入的精确程度如何?这些微调的载体来自哪里?
我正在研究一种复发语言模型.要学习可用于初始化我的语言模型的单词嵌入,我使用的是gensim的word2vec模型.训练之后,word2vec模型为词汇表中的每个单词保存两个向量:单词嵌入(输入/隐藏矩阵的行)和上下文嵌入(隐藏/输出矩阵的列).
作为概括这个帖子有这两个嵌入矢量组合至少三种常用的方法:
但是,我找不到关于最佳策略的适当论文或报告.所以我的问题是:
相关(但未答复)的问题:
我正在使用 spaCy 作为主题建模解决方案的一部分,并且我需要将派生词向量映射到词向量词汇表中的“最接近”或“最相似”词。
我看到 gensim 有一个函数 (WordEmbeddingsKeyedVectors.similar_by_vector) 来计算这个,但我想知道 spaCy 是否有这样的东西来将向量映射到其词汇表 (nlp.vocab) 中的单词?
我正在尝试使用 BERT 获取给定词嵌入的文本表示(或最接近的词)。基本上我试图获得与 gensim 类似的功能:
>>> your_word_vector = array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)
>>> model.most_similar(positive=[your_word_vector], topn=1))
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经能够使用bert-as-service生成上下文词嵌入,但无法弄清楚如何获得与此嵌入最接近的词。我使用了预训练的 bert 模型(uncased_L-12_H-768_A-12)并且没有做任何微调。
我从 Keras 转到 PyTorch。我想使用 GloVe 向量创建一个 PyTorch 嵌入层(大小为 的矩阵V x D,其中V是词汇单词索引,D是嵌入向量维度),但对所需的步骤感到困惑。
在 Keras 中,您可以通过让 Embedding 层构造函数采用参数来加载 GloVe 向量weights:
# Keras code.
embedding_layer = Embedding(..., weights=[embedding_matrix])
Run Code Online (Sandbox Code Playgroud)
在查看 PyTorch 和 TorchText 库时,我发现嵌入应该加载两次,一次在 a 中Field,然后在一个Embedding层中再次加载。这是我找到的示例代码:
# PyTorch code.
# Create a field for text and build a vocabulary with 'glove.6B.100d'
# pretrained embeddings.
TEXT = data.Field(tokenize = 'spacy', include_lengths = True)
TEXT.build_vocab(train_data, vectors='glove.6B.100d')
# Build …Run Code Online (Sandbox Code Playgroud) 有没有最新的预训练多语言词嵌入(多种语言联合映射到同一个向量空间)?
我查看了以下内容,但它们不符合我的需求:
这是我试图解决的问题:
我有一个公司名称列表,可以是任何语言(主要是英语),并且我有一个英文关键字列表,用于衡量给定公司名称与关键字的接近程度。现在我有一个简单的关键字匹配解决方案,但我想使用预训练的嵌入来改进它。正如您在以下示例中看到的,存在几个挑战:
公司名称示例:“cheapfootball ltd.”、“wholesalefootball ltd.”、“footballer ltd.”、“soccershop ltd.”
关键词示例:“足球”
nlp word-embedding pre-trained-model fasttext bert-language-model
我正在尝试使用 BERT 进行文档嵌入。我使用的代码是两个来源的组合。我使用BERT Document Classification Tutorial with Code和BERT Word Embeddings Tutorial。下面是代码,我将每个文档的前 510 个令牌提供给 BERT 模型。最后,我将 K 均值聚类应用于这些嵌入,但每个聚类的成员完全无关。我想知道这怎么可能。也许我的代码有问题。如果您查看我的代码并判断它是否有问题,我将不胜感激。我使用 Google colab 来运行此代码。
# text_to_embedding function
import torch
from keras.preprocessing.sequence import pad_sequences
def text_to_embedding(tokenizer, model, in_text):
'''
Uses the provided BERT 'model' and 'tokenizer' to generate a vector
representation of the input string, 'in_text'.
Returns the vector stored as a numpy ndarray.
'''
# ===========================
# STEP 1: Tokenization
# ===========================
MAX_LEN = 510
# 'encode' will:
# (1) …Run Code Online (Sandbox Code Playgroud) 我想使用最先进的 LM T5 来获取句子嵌入向量。我找到了这个存储库https://github.com/UKPLab/sentence-transformers 据我所知,在 BERT 中我应该将第一个标记作为 [CLS] 标记,它将是句子嵌入。在此存储库中,我在 T5 模型上看到相同的行为:
cls_tokens = output_tokens[:, 0, :] # CLS token is first token
Run Code Online (Sandbox Code Playgroud)
这种行为正确吗?我从 T5 中获取了编码器并用它编码了两个短语:
"I live in the kindergarden"
"Yes, I live in the kindergarden"
Run Code Online (Sandbox Code Playgroud)
它们之间的余弦相似度仅为“0.2420”。
我只需要了解句子嵌入是如何工作的——我应该训练网络来寻找相似性以获得正确的结果吗?或者我的基础预训练语言模型就足够了?
我正在尝试使用基于Google 的 BERT 的词嵌入来计算两个任意文档的文档相似度(最近邻)。为了从 Bert 获得词嵌入,我使用bert-as-a-service。文档相似度应该基于 Word-Mover-Distance 和 python wmd-relax包。
我以前的尝试是从wmd-relaxgithub 存储库中的本教程开始的:https : //github.com/src-d/wmd-relax/blob/master/spacy_example.py
import numpy as np
import spacy
import requests
from wmd import WMD
from collections import Counter
from bert_serving.client import BertClient
# Wikipedia titles
titles = ["Germany", "Spain", "Google", "Apple"]
# Standard model from spacy
nlp = spacy.load("en_vectors_web_lg")
# Fetch wiki articles and prepare as specy document
documents_spacy = {}
print('Create spacy document')
for title in titles:
print("... fetching", …Run Code Online (Sandbox Code Playgroud) word-embedding ×10
nlp ×5
python ×5
word2vec ×3
gensim ×2
pytorch ×2
embedding ×1
fasttext ×1
python-3.x ×1
random ×1
similarity ×1
spacy ×1