我正在使用WMD计算句子之间的相似度。例如:
distance = model.wmdistance(sentence_obama, sentence_president)
Run Code Online (Sandbox Code Playgroud)
参考:https : //markroxor.github.io/gensim/static/notebooks/WMD_tutorial.html
但是,也存在基于WMD的相似性方法 (WmdSimilarity).
参考:https : //markroxor.github.io/gensim/static/notebooks/WMD_tutorial.html
两者之间有什么区别,除了明显的一个是距离,另一个是相似性?
更新:两者完全相同,只是表示形式不同。
n_queries = len(query)
result = []
for qidx in range(n_queries):
# Compute similarity for each query.
qresult = [self.w2v_model.wmdistance(document, query[qidx]) for document in self.corpus]
qresult = numpy.array(qresult)
qresult = 1./(1.+qresult) # Similarity is the negative of the distance.
# Append single query result to list of all results.
result.append(qresult)
Run Code Online (Sandbox Code Playgroud)
https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/similarities/docsim.py
在这个关于 fastText 的视频的15:10,它提到了句法类比和语义类比。但我不确定它们之间有什么区别。
有人可以帮助解释示例的区别吗?
我有一组预先训练好的 word2vec 词向量和一个语料库。我想用词向量来表示语料库中的词。语料库中有一些我没有训练过的词向量。处理那些没有预训练向量的单词的最佳方法是什么?
我听到了几个建议。
对每个缺失的单词使用一个零向量
为每个丢失的单词使用一个随机数向量(有很多关于如何绑定这些随机数的建议)
我有一个想法:取一个向量,其值是所有预训练向量中该位置所有值的平均值
任何有此问题经验的人都对如何处理这个问题有想法吗?
我正在使用 gensim 加载 fasttext 的预训练词嵌入
de_model = KeyedVectors.load_word2vec_format('wiki.de\wiki.de.vec')
但这给了我一个内存错误。
有什么办法可以加载它吗?
我在gensim中有一个大型的经过预训练的Word2Vec模型,我想从中使用预训练的词向量作为Keras模型中的嵌入层。
问题在于嵌入量很大,而且我不需要大多数单词向量(因为我知道哪些单词可以作为输入出现)。因此,我想摆脱它们以减小嵌入层的大小。
有没有一种方法可以根据单词白名单来保留所需的单词矢量(包括对应的索引!)?
我正在训练一个 RNN,它的单词特征集非常少,大约 10,000 个。我计划在添加 RNN 之前从嵌入层开始,但我不清楚真正需要什么维度。我知道我可以尝试不同的值(32、64 等),但我宁愿先有一些直觉。例如,如果我使用一个 32 维的嵌入向量,那么每维只需要 3 个不同的值来完全描述空间 ( 32**3>>10000)。
或者,对于一个字数很少的空间,是否真的需要使用嵌入层,还是从输入层直接转到 RNN 更有意义?
我有此代码适用于英语但不适用于波斯语
from gensim.models import Word2Vec as wv
for sentence in sentences:
tokens = sentence.strip().lower().split(" ")
tokenized.append(tokens)
model = wv(tokenized
,size=5,
min_count=1)
print('done2')
model.save('F:/text8/text8-phrases1')
print('done3')
print(model)
model = wv.load('F:/text8/text8-phrases1')
print(model.wv.vocab)
Run Code Online (Sandbox Code Playgroud)
输出
> '??': <gensim.models.keyedvectors.Vocab object at 0x0000027716EEB0B8>,
> '????': <gensim.models.keyedvectors.Vocab object at
> 0x0000027716EEB160>, '??????': <gensim.models.keyedvectors.Vocab
> object at 0x0000027716EEB198>, '???????':
> <gensim.models.keyedvectors.Vocab object at 0x0000027716EEB1D0>,
> '???????': <gensim.models.keyedvectors.Vocab object at
> 0x0000027716EEB208>, '???????': <gensim.models.keyedvectors.Vocab
> object at 0x0000027716EEB240>, '?????':
> <gensim.models.keyedvectors.Vocab object at 0x0000027716EEB278>,
> '?????': <gensim.models.keyedvectors.Vocab object at
> …Run Code Online (Sandbox Code Playgroud) 我只想知道 alpha 的值在 gensimword2vec和fasttextword-embedding 模型中的作用?我知道 alpha 是initial learning rate,它的默认值是0.075表单 Radim 博客。
如果我将其更改为更高的值,即 0.5 或 0.75 会怎样?它的作用会是什么?是否允许更改相同?但是,我已将其更改为 0.5 并在 D = 200、window = 15、min_count = 5、iter = 10、workers = 4 的大型数据上进行实验,结果对于 word2vec 模型非常有意义。然而,使用 fasttext 模型,结果有点分散,意味着相关性较低和不可预测的高低相似性分数。
为什么对于具有不同精度的两种流行模型,相同数据的结果不精确?的值alpha在模型构建过程中是否起着如此重要的作用?
任何建议表示赞赏。
我已经使用 keras 来使用预训练的词嵌入,但我不太确定如何在 scikit-learn 模型上做到这一点。
我也需要在 sklearn 中执行此操作,因为我正在使用vecstack集成 keras 顺序模型和 sklearn 模型。
这就是我为 keras 模型所做的:
glove_dir = '/home/Documents/Glove'
embeddings_index = {}
f = open(os.path.join(glove_dir, 'glove.6B.200d.txt'), 'r', encoding='utf-8')
for line in f:
values = line.split()
word = values[0]
coefs = np.asarray(values[1:], dtype='float32')
embeddings_index[word] = coefs
f.close()
embedding_dim = 200
embedding_matrix = np.zeros((max_words, embedding_dim))
for word, i in word_index.items():
if i < max_words:
embedding_vector = embeddings_index.get(word)
if embedding_vector is not None:
embedding_matrix[i] = embedding_vector
model = Sequential()
model.add(Embedding(max_words, embedding_dim, input_length=maxlen)) …Run Code Online (Sandbox Code Playgroud) 在描述 BERT的论文中,有一段关于 WordPiece Embeddings 的内容。
我们使用 WordPiece 嵌入(Wu 等人,2016 年)和 30,000 个标记词汇。每个序列的第一个标记总是一个特殊的分类标记([CLS])。与此标记对应的最终隐藏状态用作分类任务的聚合序列表示。句子对被打包成一个序列。我们以两种方式区分句子。首先,我们用一个特殊的标记 ([SEP]) 将它们分开。其次,我们向每个标记添加一个学习嵌入,指示它属于句子 A 还是句子 B。 如图 1 所示,我们将输入嵌入表示为 E,将特殊 [CLS] 标记的最终隐藏向量表示为 C 2 RH,以及第 i 个输入标记的最终隐藏向量为 Ti 2 RH。对于给定的令牌,它的输入表示是通过对相应的标记、段和位置嵌入求和来构建的。这种结构的可视化可以在图 2 中看到。
据我了解,WordPiece 将 Words 拆分为像 #I #like #swim #ing 这样的词块,但它不会生成嵌入。但是我在论文和其他来源中没有找到任何关于如何生成这些令牌嵌入的信息。他们是否在实际的预训练之前进行了预训练?如何?或者它们是随机初始化的?
word-embedding ×10
nlp ×6
gensim ×4
keras ×4
word2vec ×4
fasttext ×3
python ×2
glove ×1
nltk ×1
persian ×1
python-3.x ×1
scikit-learn ×1
tensorflow ×1