问题很简单.哪个CBOW和skip-gram对于大数据集更好?(以及小数据集的答案如下.)
我很困惑,因为Mikolov本人,[Link]
Skip-gram:适用于少量训练数据,甚至代表罕见的单词或短语.
CBOW:训练比跳过快几倍,频繁单词的准确性略高
但是,谷歌TensorFlow,[链接]
CBOW对许多分布信息进行平滑(通过将整个上下文视为一个观察).在大多数情况下,这对于较小的数据集来说是有用的.
但是,skip-gram将每个上下文 - 目标对视为一个新的观察,当我们有更大的数据集时,这往往会做得更好.我们将在本教程的其余部分重点介绍skip-gram模型.
这是一个Quora帖子,支持第一个想法[Link],然后还有另一个Quora帖子,它暗示了第二个想法[Link] - 似乎可以从前面提到的可靠来源中得到.
或者就像Mikolov所说的那样:
总的来说,最好的做法是尝试一些实验,看看什么最适合你,因为不同的应用程序有不同的要求.
但肯定有关于此事的经验或分析判决或最终说法?
在我试图实施的论文中,它说,
在这项工作中,推文使用三种类型的文本表示建模.第一个是由tf-idf(术语频率 - 逆文档频率)加权的词袋模型(第2.1.1节).第二个代表一个句子,通过平均所有单词的嵌入(在句子中),第三个代表一个句子,通过平均所有单词的加权单词嵌入,单词的权重由tf-idf给出(第2.1.2节) ).
我不确定所提到的第三种表示形式,因为使用单词权重的加权单词嵌入由tf-idf给出.我甚至不确定它们是否可以一起使用.
我正在使用 SentenceTransformers 库(此处: https: //pypi.org/project/sentence-transformers/#pretrained-models)使用预训练模型创建句子的嵌入bert-base-nli-mean-tokens。我有一个应用程序将部署到无法访问互联网的设备。如何在本地保存此模型,以便当我调用它时,它会在本地加载模型,而不是尝试从互联网下载?正如库维护人员明确指出的那样,该方法SentenceTransformer从互联网下载模型(请参见此处:https: //pypi.org/project/sentence-transformers/#pretrained-models),并且我找不到在本地保存模型的方法。
我正在尝试使用tensorflow hub的嵌入模块作为可服务.我是tensorflow的新手.目前,我使用Universal Sentence Encoder嵌入作为查找将句子转换为嵌入,然后使用这些嵌入来查找与另一个句子的相似性.
我目前将句子转换为嵌入的代码是:
with tf.Session() as session:
session.run([tf.global_variables_initializer(), tf.tables_initializer()])
sen_embeddings = session.run(self.embed(prepared_text))
Run Code Online (Sandbox Code Playgroud)
Prepared_text是一个句子列表.如何使用此模型并使其成为可维护的?
我正在建立一个RNN LSTM网络,根据作者的年龄(二进制分类 - 年轻/成人)对文本进行分类.
似乎网络没有学习,突然开始过度拟合:
一种可能性是数据表示不够好.我只是根据频率对单词进行排序并给出了索引.例如:
unknown -> 0
the -> 1
a -> 2
. -> 3
to -> 4
Run Code Online (Sandbox Code Playgroud)
所以我试图用word嵌入替换它.我看了几个例子,但是我无法在我的代码中实现它.大多数示例如下所示:
embedding = tf.Variable(tf.random_uniform([vocab_size, hidden_size], -1, 1))
inputs = tf.nn.embedding_lookup(embedding, input_data)
Run Code Online (Sandbox Code Playgroud)
这是否意味着我们正在构建一个学习嵌入的层?我认为应该下载一些Word2Vec或Glove并使用它.
无论如何,让我说我想构建这个嵌入层...
如果我在我的代码中使用这两行,我会收到一个错误:
TypeError:传递给参数'indices'的值的DataType float32不在允许值列表中:int32,int64
所以我想我必须改变input_data类型int32.所以我这样做(毕竟这是所有指数),我得到了这个:
TypeError:输入必须是序列
我尝试用一个列表包装inputs(参数tf.contrib.rnn.static_rnn):[inputs]如本答案中所建议的那样,但是产生了另一个错误:
ValueError:输入大小(输入的维度0)必须可通过形状推理访问,但锯值为None.
更新:
x在传递它之前,我正在将张量取消堆叠embedding_lookup.嵌入后我移动了拆散.
更新的代码:
MIN_TOKENS = 10
MAX_TOKENS = 30
x = tf.placeholder("int32", [None, MAX_TOKENS, 1])
y = tf.placeholder("float", [None, N_CLASSES]) …Run Code Online (Sandbox Code Playgroud) 我目前正在使用Keras开发文本分类工具。它可以工作(工作正常,并且我的验证精度达到98.7),但是我无法确定一维卷积层如何与文本数据一起工作。
我应该使用哪些超参数?
我有以下几句话(输入数据):
这是一个非常简单的模型(我制作了更复杂的结构,但奇怪的是,它甚至在不使用LSTM的情况下也能更好地工作):
model = Sequential()
model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length))
model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(labels_count, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
Run Code Online (Sandbox Code Playgroud)
我的主要问题是:Conv1D层应使用哪些超参数?
model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))
Run Code Online (Sandbox Code Playgroud)
如果我有以下输入数据:
这是否意味着filters=32只会扫描前32个单词,而完全扫描其余的单词(kernel_size=2)?我应该将过滤器设置为951(句子中最多单词数)吗?
图片示例:
例如,这是一个输入数据: http //joxi.ru/krDGDBBiEByPJA
这是卷积层的第一步(步骤2): http
这是第二步(步骤2): http //joxi.ru/brRG699iJ3Ra1m
如果filters = 32,层重复32次?我对么?因此,我不会在句子中说第156个单词,因此这些信息会丢失吗?
我使用fasttext.train_unsupervised()python 中的函数训练了我的无监督模型。我想将它保存为 vec 文件,因为我将使用此文件作为pretrainedVectors函数中的参数fasttext.train_supervised()。pretrainedVectors只接受 vec 文件,但我在创建这个 vec 文件时遇到了麻烦。有人能帮我吗?
附言。我能够以 bin 格式保存它。如果您建议我一种将 bin 文件转换为 vec 文件的方法,这也会很有帮助。
I have trained a Word2Vec model using Gensim 3.8.0. Later I tried to use the pretrained model using Gensim 4.0.o on GCP. I used the following code:
model = KeyedVectors.load_word2vec_format(wv_path, binary= False)
words = model.wv.vocab.keys()
self.word2vec = {word:model.wv[word]%EMBEDDING_DIM for word in words}
Run Code Online (Sandbox Code Playgroud)
I was getting error that "model.mv" has been removed from Gensim 4.0.0. Then I used the following code:
model = KeyedVectors.load_word2vec_format(wv_path, binary= False)
words = model.vocab.keys()
word2vec = {word:model[word]%EMBEDDING_DIM for word in words}
Run Code Online (Sandbox Code Playgroud)
And getting the following error: …
在数据集中,我有 5000000 行,我想在我的数据集中添加一个名为“嵌入”的列。
dataset = dataset.add_column('embeddings', embeddings)
变量embeddings是一个大小为 (5000000, 512) 的 numpy memmap 数组。
但我收到这个错误:
ArrowInvalidTraceback(最近一次调用最后一次)位于 ----> 1 dataset = dataset.add_column('embeddings', embeddings)
/opt/conda/lib/python3.8/site-packages/datasets/arrow_dataset.py inwrapper(*args, **kwargs) 486 } 487 # 应用实际函数 --> 488 out: Union["Dataset", " DatasetDict"] = func(self, *args, **kwargs) 489 数据集: List["Dataset"] = list(out.values()) if isinstance(out, dict) else [out] 490 # 重新应用格式到输出
/opt/conda/lib/python3.8/site-packages/datasets/fingerprint.py inwrapper(*args, **kwargs) 404 # 调用实际函数 405 --> 406 out = func(self, *args, * *kwargs) 407 408 # 更新就地变换的指纹+更新就地变换的历史记录
/opt/conda/lib/python3.8/site-packages/datasets/arrow_dataset.py in add_column(self, name, column, new_fingerprint) …
我正在尝试使用CLIP来计算字符串之间的相似度。(我知道 CLIP 通常用于文本和图像,但它也应该只适用于字符串。)
我提供了简单文本提示的列表,并计算它们嵌入之间的相似度。相似之处消失了,但我不知道我做错了什么。
import torch
import clip
from torch.nn import CosineSimilarity
cos = CosineSimilarity(dim=1, eps=1e-6)
def gen_features(model, text):
tokens = clip.tokenize([text]).to(device)
text_features = model.encode_text(tokens)
return text_features
def dist(v1, v2):
#return torch.dist(normalize(v1), normalize(v2)) # euclidean distance
#return cos(normalize(v1), normalize(v2)).item() # cosine similarity
similarity = (normalize(v1) @ normalize(v2).T)
return similarity.item()
device = "cuda" if torch.cuda.is_available() else "cpu"
model_name = "ViT-B/32"
model, _ = clip.load(model_name, device=device)
sentences = ["A cat", "A dog", "A labrador", "A poodle", "A wolf", "A lion", …Run Code Online (Sandbox Code Playgroud) word-embedding ×10
python ×6
nlp ×3
tensorflow ×3
word2vec ×3
fasttext ×1
gensim ×1
keras ×1
numpy ×1
pyarrow ×1
python-3.x ×1
rnn ×1
tf-idf ×1