如果有任何关于学习方法(或更可能的学习程序)的好例子,我也阅读了这篇论文并用谷歌搜索
对于word2vec,假设有语料句
我每天早上带着妈妈包的饭盒去上学
然后窗口大小为 2,它将尝试通过使用周围的词来获取 'school' 的向量
['去','去','一起','午餐']
现在,FastText 说它使用 subword 来获取向量,所以它肯定是使用 n gram subword,例如 n=3,
['sc', 'sch', 'cho', 'hoo', 'ool', 'school']
到这里,我明白了。但尚不清楚其他词是否用于“学校”的学习。我只能猜测周围的其他词也像 word2vec 一样被使用,因为论文中提到
=> 术语Wc和Wt都用在函数中
其中 Wc 是上下文词,Wt 是序列 t 处的词。
但是,FastText 是如何学习词向量的还不清楚。
.
.
请清楚说明FastText学习过程是如何进行的?
.
.
更确切地说,我想知道,如果FastText也遵循相同的步骤,Word2Vec同时学习到正克表征子字除。还是仅使用带有单词的 n-gram 特征子词?
它如何在初始时对子词进行矢量化?等等
我很困惑如何格式化我自己预先训练的权重为KerasEmbedding层,如果我还设置mask_zero=True。这是一个具体的玩具示例。
假设我有 4 个单词的词汇表,[1,2,3,4]并且正在使用由以下定义的向量权重:
weight[1]=[0.1,0.2]
weight[2]=[0.3,0.4]
weight[3]=[0.5,0.6]
weight[4]=[0.7,0.8]
Run Code Online (Sandbox Code Playgroud)
我想嵌入长度不超过 5 个单词的句子,所以我必须在将它们输入到嵌入层之前对它们进行零填充。我想掩盖零,以便进一步的图层不使用它们。
阅读用于嵌入的 Keras 文档,它说 0 值不能出现在我的词汇表中。
mask_zero:输入值 0 是否是应屏蔽的特殊“填充”值。这在使用可能需要可变长度输入的循环层时很有用。如果为 True,则模型中的所有后续层都需要支持屏蔽,否则将引发异常。如果 mask_zero 设置为 True,结果,索引 0 不能在词汇表中使用(input_dim 应等于词汇表的大小 + 1)。
所以我感到困惑的是如何为嵌入层构造权重数组,因为“索引 0 不能在词汇表中使用”。如果我将权重数组构建为
[[0.1,0.2],
[0.3,0.4],
[0.5,0.6],
[0.7,0.8]]
Run Code Online (Sandbox Code Playgroud)
那么通常情况下, word1会指向索引 1,在这种情况下,它保存 word 的权重2。还是当您指定时mask_zero=True,Keras 内部会使其1指向索引 0?或者,您是否只是在索引零中添加一个零向量,如下所示?
[[0.0,0.0],
[0.1,0.2],
[0.3,0.4],
[0.5,0.6],
[0.7,0.8]]
Run Code Online (Sandbox Code Playgroud)
在我看来,第二个选项是将零放入词汇表中。换句话说,我很困惑。任何人都可以阐明这一点吗?
我一直在关注 Towards Data Science 关于 word2vec 和 skip-gram 模型的教程,但我偶然发现了一个我无法解决的问题,尽管搜索了几个小时并尝试了很多不成功的解决方案。
由于使用了 keras.layers 中的 Merge 层,它向您展示了如何构建 skip-gram 模型架构的步骤似乎已被弃用。
我似乎对此进行了很多讨论,大多数答案是您现在需要使用 Keras 的功能 API 来合并层。但问题是,我是 Keras 的初学者,不知道如何将我的代码从 Sequential 转换为 Functional,这是作者使用的代码(我复制了):
from keras.layers import Merge
from keras.layers.core import Dense, Reshape
from keras.layers.embeddings import Embedding
from keras.models import Sequential
# build skip-gram architecture
word_model = Sequential()
word_model.add(Embedding(vocab_size, embed_size,
embeddings_initializer="glorot_uniform",
input_length=1))
word_model.add(Reshape((embed_size, )))
context_model = Sequential()
context_model.add(Embedding(vocab_size, embed_size,
embeddings_initializer="glorot_uniform",
input_length=1))
context_model.add(Reshape((embed_size,)))
model = Sequential()
model.add(Merge([word_model, context_model], mode="dot"))
model.add(Dense(1, kernel_initializer="glorot_uniform", activation="sigmoid"))
model.compile(loss="mean_squared_error", optimizer="rmsprop")
# view model summary …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用基于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) 我一直在考虑单词序列的 0-padding 以及如何将 0-padding 转换为 Embedding 层。乍一看,人们会认为您还想保持 embeddings = 0.0。但是,Embeddinglayer in 会keras为任何输入标记生成随机值,并且无法强制它生成 0.0。注意,mask_zero做一些不同的事情,我已经检查过了。
有人可能会问,为什么要担心这一点,即使嵌入不是 0.0,只要它们相同,代码似乎也能工作。所以我想出了一个例子,尽管有点做作,其中将 0 填充标记的嵌入设置为 0.0 会有所不同。
我使用了 20 News Groups 数据集from sklearn.datasets import fetch_20newsgroups。我做了一些最小的预处理:删除标点符号、停用词和数字。我from keras.preprocessing.sequence import pad_sequences用于 0-padding。我将大约 18K 个帖子分成训练和验证集,训练/验证的比例 = 4/1。我创建了一个简单的 1 个密集隐藏层网络,输入是扁平化的嵌入序列:
EMBEDDING_DIM = 300
MAX_SEQUENCE_LENGTH = 1100
layer_size = 25
dropout = 0.3
sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32', name='dnn_input')
embedding_layer = Embedding(len(word_index) + 1, EMBEDDING_DIM, input_length=MAX_SEQUENCE_LENGTH, name = 'embedding_dnn')
embedded_sequences = embedding_layer(sequence_input)
x = Flatten(name='flatten_dnn')(embedded_sequences) …Run Code Online (Sandbox Code Playgroud) machine-learning text-classification keras word-embedding zero-padding
我需要创建一个“搜索引擎”体验:从一个简短的查询(几个字),我需要在数千个文档的语料库中找到相关文档。
在分析了几种方法之后,我使用 Google 的 Universal Sentence Encoder 得到了非常好的结果。问题是我的文档可能很长。对于这些很长的文本,看起来性能正在下降,所以我的想法是将文本切成句子/段落。
所以我最终得到了每个文档的向量列表(代表文档的每个部分)。
我的问题是:是否有最先进的算法/方法来计算向量列表的得分?我真的不想将它们合并为一个,因为它会产生与以前相同的效果(相关部分会在文档中被稀释)。任何评分算法来总结查询和文本不同部分之间的多个余弦相似度?
重要信息:我可以有短文本和长文本。所以我可以为一个文档有 1 到 10 个向量。
我在阅读有关 BERT 和 ELMo 的论文时看到了这两个术语,所以我想知道它们之间是否有区别。
所以我试图建立一个词嵌入模型,但我一直收到这个错误。在训练过程中,准确率没有变化,val_loss 保持“nan”
数据的原始形状是
x.shape, y.shape
((94556,), (94556, 2557))
Run Code Online (Sandbox Code Playgroud)
然后我重塑它:
xr= np.asarray(x).astype('float32').reshape((-1,1))
yr= np.asarray(y).astype('float32').reshape((-1,1))
((94556, 1), (241779692, 1))
Run Code Online (Sandbox Code Playgroud)
然后我通过我的模型运行它
model = Sequential()
model.add(Embedding(2557, 64, input_length=150, embeddings_initializer='glorot_uniform'))
model.add(Flatten())
model.add(Reshape((64,), input_shape=(94556, 1)))
model.add(Dense(512, activation='sigmoid'))
model.add(Dense(128, activation='sigmoid'))
model.add(Dense(64, activation='relu'))
model.add(Dense(10, activation='sigmoid'))
model.add(Dense(1, activation='relu'))
# compile the mode
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# summarize the model
print(model.summary())
plot_model(model, show_shapes = True, show_layer_names=False)
Run Code Online (Sandbox Code Playgroud)
训练后,我得到了每个时期的恒定准确度和 val_loss nan
history=model.fit(xr, yr, epochs=20, batch_size=32, validation_split=3/9)
Epoch 1/20
WARNING:tensorflow:Model was constructed with shape (None, 150) for input Tensor("embedding_6_input:0", shape=(None, 150), dtype=float32), but …Run Code Online (Sandbox Code Playgroud) 我想通过使用 transform.BertTokenizer 对多个句子进行编码来创建一个小批量。它似乎适用于单个句子。如何使它适用于几个句子?
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
# tokenize a single sentence seems working
tokenizer.encode('this is the first sentence')
>>> [2023, 2003, 1996, 2034, 6251]
# tokenize two sentences
tokenizer.encode(['this is the first sentence', 'another setence'])
>>> [100, 100] # expecting 7 tokens
Run Code Online (Sandbox Code Playgroud) word-embedding huggingface-transformers huggingface-tokenizers
我正在使用以下代码启动 Webworker,它使用 Universal Sentence Encoder 创建嵌入
const initEmbeddingWorker = (filePath) => {
let worker = new Worker(filePath);
worker.postMessage({init: 'init'})
worker.onmessage = (e) => {
worker.terminate();
}
}
Run Code Online (Sandbox Code Playgroud)
网络工作者代码
onmessage = function (e) {
if(e.data.init && e.data.init === 'init') {
fetchData();
}
}
const fetchData = () => {
//fetches data from indexeddb
createEmbedding(data, storeEmbedding);
}
const createEmbedding = (data, callback) => {
use.load().then(model => {
model.embed(data).then(embeddings => {
callback(embeddings);
})
});
}
const storeEmbedding = (matrix) => {
let data …Run Code Online (Sandbox Code Playgroud) word-embedding ×10
keras ×4
nlp ×4
python ×4
tensorflow ×3
word2vec ×2
elmo ×1
fasttext ×1
javascript ×1
reshape ×1
similarity ×1
web-worker ×1
zero-padding ×1