我想使用亲和力传播对我的 word2vec 集群进行聚类并获取集群中心单词。
我当前的代码如下。
model = word2vec.Word2Vec.load("word2vec")
word_vectors = model.wv.syn0
affprop = AffinityPropagation(affinity="precomputed", damping=0.5)
af= affprop.fit(word_vectors)
Run Code Online (Sandbox Code Playgroud)
但是,这会引发以下错误:
ValueError: S must be a square array (shape=(77, 300))
据我了解,300 意味着 word2vec 隐藏层维度,77 是我的词汇量。
我只是想知道如何对非方阵的 word2vec 向量使用亲和传播。
请帮我!
这个问题完全超出了我的想象。我正在使用 gensim 训练 Word2Vec 模型。我提供了多种语言的数据,即英语和印地语。当我试图找到最接近“man”的单词时,我得到的是:
\n\nmodel.wv.most_similar(positive = [\'man\'])\nOut[14]: \n[(\'woman\', 0.7380284070968628),\n (\'lady\', 0.6933152675628662),\n (\'monk\', 0.6662989258766174),\n (\'guy\', 0.6513140201568604),\n (\'soldier\', 0.6491742134094238),\n (\'priest\', 0.6440571546554565),\n (\'farmer\', 0.6366012692451477),\n (\'sailor\', 0.6297377943992615),\n (\'knight\', 0.6290514469146729),\n (\'person\', 0.6288090944290161)]\n--------------------------------------------\nRun Code Online (Sandbox Code Playgroud)\n\n问题是,这些都是英文单词。然后我试图找到相同含义的印地语和英语单词之间的相似性,
\n\nmodel.similarity(\'man\', \'\xe0\xa4\x86\xe0\xa4\xa6\xe0\xa4\xae\xe0\xa5\x80\')\n__main__:1: DeprecationWarning: Call to deprecated `similarity` (Method will \nbe removed in 4.0.0, use self.wv.similarity() instead).\nOut[13]: 0.078265618974427215\nRun Code Online (Sandbox Code Playgroud)\n\n这个准确度应该比所有其他准确度都要好。我的印地语语料库是通过翻译英语语料库制作的。因此,这些词出现在类似的上下文中。因此他们应该很接近。
\n\n这就是我在这里所做的:
\n\n#Combining all the words together.\nall_reviews=HindiWordsList + EnglishWordsList\n\n#Training FastText model\ncpu_count=multiprocessing.cpu_count()\nmodel=Word2Vec(size=300,window=5,min_count=1,alpha=0.025,workers=cpu_count,max_vocab_size=None,negative=10)\nmodel.build_vocab(all_reviews)\nmodel.train(all_reviews,total_examples=model.corpus_count,epochs=model.iter)\nmodel.save("word2vec_combined_50.bin")\nRun Code Online (Sandbox Code Playgroud)\n 我试图通过输入单词列表并输出一个单词来计算语义相似度,该单词是列表中相似度最高的单词。
例如
如果我传递一个单词列表
words = ['portugal', 'spain', 'belgium', 'country', 'netherlands', 'italy']
Run Code Online (Sandbox Code Playgroud)
它应该输出类似这样的东西-
['country']
Run Code Online (Sandbox Code Playgroud) 我正在阅读这个关于 Gensim 的答案most_similar:
它执行向量算术:添加正向量,减去负向量,然后从结果位置列出最接近该角度的已知向量。
但当我测试时,情况并非如此。我使用 Gensim 数据集训练了 Word2Vec"text8"并测试了这两个:
model.most_similar(positive=['woman', 'king'], negative=['man'])
>>> [('queen', 0.7131118178367615), ('prince', 0.6359186768531799),...]
Run Code Online (Sandbox Code Playgroud)
model.wv.most_similar([model["king"] + model["woman"] - model["man"]])
>>> [('king', 0.84305739402771), ('queen', 0.7326322793960571),...]
Run Code Online (Sandbox Code Playgroud)
它们显然不一样。0.713甚至第一个和第二个中的皇后得分0.732也不相同。
所以我再次问这个问题,Gensim 是如何most_similar工作的?为什么上面两者的结果不同呢?
我想distance在我的程序中实现word2vec 的一部分.不幸的是,它不是在C/C++或Python中,但首先我不理解非二进制表示.这就是我获取文件的方式
./word2vec -train text8-phrase -output vectorsphrase.txt -cbow 0 -size 300 -window 10 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 0
当我检查来自法国的vectorsphrase.txt文件时,我得到的是:
france -0.062591 0.264201 0.236335 -0.072601 -0.094313 -0.202659 -0.373314 0.074684 -0.262307 0.139383 -0.053648 -0.154181 0.126962 0.432593 -0.039440 0.108096 0.083703 0.148991 0.062826 0.048151 0.005555 0.066885 0.004729 -0.013939 -0.043947 0.057280 -0.005259 -0.223302 0.065608 -0.013932 -0.199372 -0.054966 -0.026725 0.012510 0.076350 -0.027816 -0.187357 0.248191 -0.085087 0.172979 -0.116789 0.014136 0.131571 0.173892 0.316052 -0.045492 0.057584 0.028944 -0.193623 0.043965 -0.166696 0.111058 0.145268 …Run Code Online (Sandbox Code Playgroud) 无论如何要改变使用的窗口大小pyspark.mllib.feature.Word2Vec或永久固定为5?这似乎是一个相当重要的特征.
我在这里看不到这个选项:https: //spark.apache.org/docs/1.4.1/api/scala/index.html#org.apache.spark.mllib.feature.Word2Vec
我正在做一个项目,我需要一个预训练的skip-gram模型向量.我听说还有一个名为skip-n-gram模型的变体可以提供更好的结果.
我想知道我自己需要训练什么样的模型?因为我只需要它们来为我的模型初始化嵌入层.
我搜索得足够多但没有得到很好的例子.我需要你的建议.我在哪里可以获得这种预先训练过的模型,或者没有预先训练好的模型.
我目前的doc2vec代码如下.
# Train doc2vec model
model = doc2vec.Doc2Vec(docs, size = 100, window = 300, min_count = 1, workers = 4, iter = 20)
Run Code Online (Sandbox Code Playgroud)
我也有一个word2vec代码如下.
# Train word2vec model
model = word2vec.Word2Vec(sentences, size=300, sample = 1e-3, sg=1, iter = 20)
Run Code Online (Sandbox Code Playgroud)
我很感兴趣,同时使用DM和DBOW在doc2vec两者跳过克和CBOW在word2vec.
在Gensim中,我找到了下面提到的句子: "通过word2vec的"skip-gram和CBOW模型",使用分层softmax或负抽样,生成具有深度学习的单词向量"
因此,我很困惑使用分层softmax或负抽样.请告诉我这两种方法有什么不同.
另外,我有兴趣知道在dm,DBOW,Skip-gram和CBOW方面需要改变哪些参数才能使用分层softmax和/或负采样?
我的应用程序是一个推荐系统:)
运行Word2Vec的Spark示例,我意识到它接受了一个字符串数组并给出了一个向量。我的问题是,它不应该返回矩阵而不是向量吗?我期望每个输入单词一个向量。但是它返回一个向量周期!
或者也许它应该接受字符串,而不是一个字符串数组(一个单词)作为输入。然后,可以,它可以返回一个向量作为输出。但是接受一个字符串数组并返回一个向量对我来说没有任何意义。
[更新]
根据@Shaido的请求,以下是我的微小更改以打印输出模式的代码:
public class JavaWord2VecExample {
public static void main(String[] args) {
SparkSession spark = SparkSession
.builder()
.appName("JavaWord2VecExample")
.getOrCreate();
// $example on$
// Input data: Each row is a bag of words from a sentence or document.
List<Row> data = Arrays.asList(
RowFactory.create(Arrays.asList("Hi I heard about Spark".split(" "))),
RowFactory.create(Arrays.asList("I wish Java could use case classes".split(" "))),
RowFactory.create(Arrays.asList("Logistic regression models are neat".split(" ")))
);
StructType schema = new StructType(new StructField[]{
new StructField("text", new ArrayType(DataTypes.StringType, true), false, …Run Code Online (Sandbox Code Playgroud) word2vec ×10
nlp ×5
python ×5
gensim ×3
apache-spark ×2
doc2vec ×1
java ×1
scikit-learn ×1
text-mining ×1