标签: word-embedding

Fasttext 算法只使用词和子词?还是句子?

如果有任何关于学习方法(或更可能的学习程序)的好例子,我也阅读了这篇论文并用谷歌搜索

对于word2vec,假设有语料句

我每天早上带着妈妈包的饭盒去上学

然后窗口大小为 2,它将尝试通过使用周围的词来获取 'school' 的向量

['去','去','一起','午餐']

现在,FastText 说它使用 subword 来获取向量,所以它肯定是使用 n gram subword,例如 n=3,

['sc', 'sch', 'cho', 'hoo', 'ool', 'school']

到这里,我明白了。但尚不清楚其他词是否用于“学校”的学习。我只能猜测周围的其他词也像 word2vec 一样被使用,因为论文中提到

=> 术语WcWt都用在函数中

其中 Wc 是上下文词,Wt 是序列 t 处的词。

但是,FastText 是如何学习词向量的还不清楚。

.

.

请清楚说明FastText学习过程是如何进行的?

.

.

更确切地说,我想知道,如果FastText也遵循相同的步骤,Word2Vec同时学习到正克表征子字。还是仅使用带有单词的 n-gram 特征子词?

它如何在初始时对子词进行矢量化?等等

nlp vectorization word2vec word-embedding fasttext

5
推荐指数
1
解决办法
3422
查看次数

如何正确使用 mask_zero=True 进行预训练权重的 Keras 嵌入?

我很困惑如何格式化我自己预先训练的权重为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)

在我看来,第二个选项是将零放入词汇表中。换句话说,我很困惑。任何人都可以阐明这一点吗?

python keras tensorflow word-embedding

5
推荐指数
1
解决办法
2578
查看次数

在 Keras 上合并层(点积)

我一直在关注 Towards Data Science 关于 word2vec 和 skip-gram 模型的教程,但我偶然发现了一个我无法解决的问题,尽管搜索了几个小时并尝试了很多不成功的解决方案。

https://towardsdatascience.com/understanding-feature-engineering-part-4-deep-learning-methods-for-text-data-96c44370bbfa

由于使用了 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)

python word2vec keras tensorflow word-embedding

5
推荐指数
1
解决办法
1万
查看次数

Word Mover Distance 和 Bert-Embedding 的文档相似度

我正在尝试使用基于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)

python nlp similarity word-embedding

5
推荐指数
1
解决办法
3066
查看次数

Keras 嵌入层:将零填充值保持为零

我一直在考虑单词序列的 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

5
推荐指数
1
解决办法
1011
查看次数

用于大文档相似性的通用句子编码器

我需要创建一个“搜索引擎”体验:从一个简短的查询(几个字),我需要在数千个文档的语料库中找到相关文档。

在分析了几种方法之后,我使用 Google 的 Universal Sentence Encoder 得到了非常好的结果。问题是我的文档可能很长。对于这些很长的文本,看起来性能正在下降,所以我的想法是将文本切成句子/段落。

所以我最终得到了每个文档的向量列表(代表文档的每个部分)。

我的问题是:是否有最先进的算法/方法来计算向量列表的得分?我真的不想将它们合并为一个,因为它会产生与以前相同的效果(相关部分会在文档中被稀释)。任何评分算法来总结查询和文本不同部分之间的多个余弦相似度?

重要信息:我可以有短文本和长文本。所以我可以为一个文档有 1 到 10 个向量。

nlp machine-learning cosine-similarity word-embedding

5
推荐指数
1
解决办法
449
查看次数

句子编码和上下文词嵌入有什么区别?

我在阅读有关 BERT 和 ELMo 的论文时看到了这两个术语,所以我想知道它们之间是否有区别。

nlp word-embedding elmo bert-language-model

5
推荐指数
1
解决办法
1254
查看次数

警告:警告:tensorflow:Model 是用形状 (None, 150) 构建的,但它在形状不兼容的输入上被调用 (None, 1)

所以我试图建立一个词嵌入模型,但我一直收到这个错误。在训练过程中,准确率没有变化,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)

python reshape keras tensorflow word-embedding

5
推荐指数
1
解决办法
2万
查看次数

如何使用transformers.BertTokenizer 对多个setence 进行编码?

我想通过使用 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

5
推荐指数
1
解决办法
5434
查看次数

Universal Sentence Encoder tensorflowjs 使用 webworker 优化性能

我正在使用以下代码启动 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)

javascript web-worker word-embedding tensorflow.js

5
推荐指数
1
解决办法
104
查看次数