我想加载一个 word2vec 模型并通过执行单词类比任务来评估它(例如a 对 b 就像 c 对某事?)。为此,首先我加载我的 w2v 模型:
model = Word2VecModel.load(spark.sparkContext, str(sys.argv[1]))
Run Code Online (Sandbox Code Playgroud)
然后我调用映射器来评估模型:
rdd_lines = spark.read.text("questions-words.txt").rdd.map(getAnswers)
Run Code Online (Sandbox Code Playgroud)
该getAnswers函数每次从questions-words.txt 中读取一行,其中每一行包含问题和评估我的模型的答案(例如,雅典希腊巴格达伊拉克,其中 a=雅典,b=希腊,c=巴格达和某事=伊拉克)。阅读该行后,我创建了current_question和actual_answer(例如:current_question=Athens Greece Baghdad和actual_answer=Iraq)。之后,我调用getAnalogy用于计算类比的函数(基本上,给出它计算答案的问题)。最后,在计算完类比之后,我返回答案并将其写入文本文件。
问题是我收到以下异常:
Exception: It appears that you are attempting to reference SparkContext from a broadcast variable, action, or transformation. SparkContext can only be used on the driver, not in code that it run on workers.
Run Code Online (Sandbox Code Playgroud)
我认为它被抛出是因为我在 map 函数中使用了模型。这个问题与我的问题类似,但我不知道如何将该答案应用到我的代码中。我怎么解决这个问题?以下是完整代码:
def getAnalogy(s, …Run Code Online (Sandbox Code Playgroud) 我正在尝试将预先训练的 Google 新闻 word2vec 模型适应我的特定领域。对于我正在查看的领域,已知某些单词彼此相似,因此在理想的世界中,这些单词的 Word2Vec 表示应该代表它。我知道我可以在特定领域数据的语料库上训练预训练模型来更新向量。
但是,如果我确定某些单词非常相似并且应该放在一起,那么我是否可以将该约束合并到 word2vec 模型中?在数学上,我想在 word2vec 的损失函数中添加一个术语,如果我知道相似的两个在向量空间中的位置彼此不靠近,则该函数会提供惩罚。有没有人对如何实现这一点有建议?这是否需要我解压 word2vec 模型,或者是否有办法将附加项添加到损失函数中?
有没有办法将Google或Glove 的预训练向量(模型)(例如GoogleNews-vectors-negative300.bin.gz)加载到 spark 中并执行诸如从 spark 提供的 findSynonyms 之类的操作?还是我需要从头开始加载和操作?
在这篇文章中,在 Spark 中加载 Word2Vec 模型,Tom Lous 建议将 bin 文件转换为 txt 并从那里开始,我已经这样做了..但接下来是什么?
在我昨天发布的一个问题中,我得到了一个答案,即 Parquet 格式的模型可以在 spark 中加载,因此我发布这个问题是为了确保没有其他选择。
如何将预训练的词嵌入加载到 KerasEmbedding层中?
我glove.6B.50d.txt从https://nlp.stanford.edu/projects/glove/下载了(glove.6B.zip 文件),但我不确定如何将它添加到 Keras 嵌入层。请参阅:https : //keras.io/layers/embeddings/
似乎格式是,对于每一行,字符串就像“字号……”。所以很容易分裂。但是当我用下面的脚本分割它们时
import numpy as np
def loadGloveModel(gloveFile):
print "Loading Glove Model"
f = open(gloveFile,'r')
model = {}
for line in f:
splitLine = line.split()
word = splitLine[0]
embedding = np.array([float(val) for val in splitLine[1:]])
model[word] = embedding
print "Done.",len(model)," words loaded!"
return model
Run Code Online (Sandbox Code Playgroud)
我加载手套 840B 300d.txt。但是得到错误,我打印了我得到的 splitLine
['contact', 'name@domain.com', '0.016426', '0.13728', '0.18781', '0.75784', '0.44012', '0.096794' ... ]
Run Code Online (Sandbox Code Playgroud)
或者
['.', '.', '.', '.', '0.033459', '-0.085658', '0.27155', ...]
Run Code Online (Sandbox Code Playgroud)
请注意,此脚本在 glove.6b.* 中运行良好
我正在使用 GloVe 词嵌入将文本数据的分类模型分为两类(即将每个评论分为两类)。我有两列,一列包含文本数据(评论),另一列是二进制目标变量(评论是否可操作)。我能够使用 text2vec 文档中的以下代码为文本数据生成 Glove 词嵌入。
glove_model <- GlobalVectors$new(word_vectors_size = 50,vocabulary =
glove_pruned_vocab,x_max = 20L)
#fit model and get word vectors
word_vectors_main <- glove_model$fit_transform(glove_tcm,n_iter = 20,convergence_tol=-1)
word_vectors_context <- glove_model$components
word_vectors <- word_vectors_main+t(word_vectors_context)
Run Code Online (Sandbox Code Playgroud)
如何构建模型并生成对测试数据的预测?
命令 model.most_similar(positive=['france'], topn=100) 给出与“france”最相似的前 100 个单词。但是,我想知道是否有一种方法可以将超过相似度阈值的最相似的词输出到给定的词。有没有类似下面的方法?:model.most_similar(positive=['france'], threshold=0.9)
如果有任何关于学习方法(或更可能的学习程序)的好例子,我也阅读了这篇论文并用谷歌搜索
对于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 特征子词?
它如何在初始时对子词进行矢量化?等等
一些关于词和文档嵌入主题的论文(word2vec、doc2vec)提到他们使用斯坦福 CoreNLP 框架来标记/词形还原/词性标记输入的词/句子:
语料库使用斯坦福 CoreNLP (Manning et al., 2014) 进行词形还原和 POS 标记,并且每个标记都被替换为其引理和词性标记
( http://www.ep.liu.se/ecp/131/039/ecp17131039.pdf )
对于预处理,我们使用斯坦福 CoreNLP 对单词进行标记和小写
( https://arxiv.org/pdf/1607.05368.pdf )
所以我的问题是:
为什么第一篇论文应用 POS 标签?然后每个令牌会被替换为类似的东西{lemma}_{POS},整个东西用来训练模型吗?还是标签用于过滤令牌?例如,gensims WikiCorpus 默认应用词形还原,然后只保留几种类型的词性(动词、名词等)并去除其余部分。那么推荐的方式是什么?
在我看来,第二篇论文中的引述就像他们只是将单词分开然后小写。这也是我在使用维基语料库之前第一次尝试的。在我看来,这应该为文档嵌入提供更好的结果,因为大多数 POS 类型都有助于句子的含义。我对吗?
在最初的 doc2vec 论文中,我没有找到有关其预处理的详细信息。
我一直在关注 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) word2vec ×10
nlp ×4
stanford-nlp ×4
python ×3
apache-spark ×2
gensim ×2
keras ×2
tensorflow ×2
doc2vec ×1
fasttext ×1
pyspark ×1
r ×1
scala ×1
text2vec ×1