我一直在寻找的例子星火网站Word2Vec的:
val input = sc.textFile("text8").map(line => line.split(" ").toSeq)
val word2vec = new Word2Vec()
val model = word2vec.fit(input)
val synonyms = model.findSynonyms("country name here", 40)
Run Code Online (Sandbox Code Playgroud)
我如何做有趣的矢量,如国王 - 男人+女人=女王.我可以使用model.getVectors,但不知道如何继续进行.
我一直在阅读关于Word2Vec的文章(例如这篇文章),我认为我理解训练向量以最大化在相同上下文中找到的其他单词的概率.
但是,我不明白为什么余弦是衡量单词相似度的正确方法.余弦相似性表示两个矢量指向同一方向,但它们可能具有不同的大小.
例如,余弦相似性比较文档的词袋是有意义的.两个文档可能具有不同的长度,但具有相似的单词分布.
为什么不说欧几里德距离呢?
任何人都可以解释为什么余弦相似性适用于word2Vec?
我试图重现本文的结果:https://arxiv.org/pdf/1607.06520.pdf
特别是这部分:
为了识别性别子空间,我们采用了十个性别对差异向量并计算了其主要成分(PC).如图6所示,有一个方向可以解释这些向量中的大部分方差.第一个特征值明显大于其余特征值.
我使用与作者相同的单词向量集(Google News Corpus,300维度),我将其加载到word2vec中.
作者引用的"十个性别对差异向量"是根据以下单词对计算得出的:
我用以下方式计算了每个规范化向量之间的差异:
model = gensim.models.KeyedVectors.load_word2vec_format('GoogleNews-vectors-
negative300.bin', binary = True)
model.init_sims()
pairs = [('she', 'he'),
('her', 'his'),
('woman', 'man'),
('Mary', 'John'),
('herself', 'himself'),
('daughter', 'son'),
('mother', 'father'),
('gal', 'guy'),
('girl', 'boy'),
('female', 'male')]
difference_matrix = np.array([model.word_vec(a[0], use_norm=True) - model.word_vec(a[1], use_norm=True) for a in pairs])
Run Code Online (Sandbox Code Playgroud)
然后我根据论文在得到的矩阵上执行PCA,包含10个组件:
from sklearn.decomposition import PCA
pca = PCA(n_components=10)
pca.fit(difference_matrix)
Run Code Online (Sandbox Code Playgroud)
但是当我看到时,我得到了非常不同的结果pca.explained_variance_ratio_:
array([ 2.83391436e-01, 2.48616155e-01, 1.90642492e-01,
9.98411858e-02, 5.61260498e-02, 5.29706681e-02,
2.75670634e-02, 2.21957722e-02, 1.86491774e-02,
1.99108478e-32])
Run Code Online (Sandbox Code Playgroud)
或用图表:
当应该超过60%时,第一个组件占差异的不到30%!
我得到的结果类似于当我尝试在随机选择的向量上进行PCA时得到的结果,所以我一定做错了,但我无法弄清楚是什么.
注意:我试过没有规范化向量,但我得到了相同的结果.
我正在尝试使用意大利维基百科" http://dumps.wikimedia.org/itwiki/latest/itwiki-latest-pages-articles.xml.bz2 " 从gensim训练word2vec模型
但是,我不确定这个语料库的最佳预处理是什么.
Gensim模型接受标记化句子列表.我的第一个尝试是使用Gensim的标准WikipediaCorpus预处理器.这提取每篇文章,删除标点符号并拆分空格.使用这个工具,每个句子都对应一个完整的模型,我不确定这个事实对模型的影响.
在此之后,我使用默认参数训练模型.不幸的是,在训练之后,似乎我没有想要获得非常有意义的相似之处.
对于此任务,维基百科语料库中最合适的预处理是什么?(如果这个问题太宽泛,请指点相关教程/文章帮助我)
这是我第一次试用的代码:
from gensim.corpora import WikiCorpus
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
corpus = WikiCorpus('itwiki-latest-pages-articles.xml.bz2',dictionary=False)
max_sentence = -1
def generate_lines():
for index, text in enumerate(corpus.get_texts()):
if index < max_sentence or max_sentence==-1:
yield text
else:
break
from gensim.models.word2vec import BrownCorpus, Word2Vec
model = Word2Vec()
model.build_vocab(generate_lines()) #This strangely builds a vocab of "only" 747904 words which is << than those reported in the literature 10M words
model.train(generate_lines(),chunksize=500)
Run Code Online (Sandbox Code Playgroud) 我正在构建一个聊天机器人,所以我需要使用Word2Vec对用户的输入进行矢量化.
我正在使用谷歌300万字的预训练模型(GoogleNews-vectors-negative300).
所以我使用Gensim加载模型:
import gensim
model = gensim.models.KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
Run Code Online (Sandbox Code Playgroud)
问题是加载模型大约需要2分钟.我不能让用户等那么久.
那么我该怎么做才能加快加载时间呢?
我想过将300万个单词中的每一个及其相应的向量放入MongoDB数据库中.这肯定会加快速度,但直觉告诉我这不是一个好主意.
我最近下载了英语的fasttext预训练模型.我有两个文件:
我不确定这两个文件有什么区别?
我熟悉使用BOW功能进行文本分类,其中我们首先找到语料库词汇表的大小,这些词汇表的大小就是我们的特征向量.对于每个句子/文件及其所有组成单词,我们然后根据该单词/文档中该单词的缺席/存在而放置0/1.
但是,既然我正在尝试使用每个单词的向量表示,那么创建全局词汇是必不可少的吗?
我一直在使用gensim的word2vec库尝试word2vec一段时间.我的问题是我是否必须从输入文本中删除停用词?因为,基于我最初的实验结果,我可以看到像'of','when'......(停用词)这样的词语,当我这样做时model.most_similar('someword')......
但是我没有看到任何提到word2vec需要删除停用词的地方?word2vec是否应该处理停用词,即使你不删除它们?
有什么必须做预处理事情(比如主题建模,你几乎必须要删除掉词)?
我有大量的文本,每个文本都在快速增长.我需要实现相似性搜索.
我们的想法是将每个单词嵌入为word2vec,并通过向量添加每个单词的嵌入来将每个文本表示为标准化向量.随后对文本的添加只会通过向其添加新的单词向量来优化结果文本的向量.
是否可以通过在文档中仅存储每个文本的规范化向量的坐标来使用弹性搜索来进行余弦相似性?如果是这样,这种搜索的正确索引结构是什么?
我使用gensim在我自己的语料库上训练了doc2vec和相应的word2vec.我想用t-sne用文字来形象化word2vec.如图所示,图中的每个点都有"单词".
我在这里看了一个类似的问题:t-sne on word2vec
在它之后,我有这个代码:
import gensim import gensim.models as g
from sklearn.manifold import TSNE
import re
import matplotlib.pyplot as plt
modelPath="/Users/tarun/Desktop/PE/doc2vec/model3_100_newCorpus60_1min_6window_100trainEpoch.bin"
model = g.Doc2Vec.load(modelPath)
X = model[model.wv.vocab]
print len(X)
print X[0]
tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X[:1000,:])
plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
plt.show()
Run Code Online (Sandbox Code Playgroud)
这给出了一个带点但没有单词的图形.那是我不知道哪个点代表哪个词.如何用点显示单词?
word2vec ×10
nlp ×6
gensim ×4
python ×2
scikit-learn ×2
apache-spark ×1
fasttext ×1
pca ×1
text ×1
vector ×1