alv*_*vas 15 python dictionary del gensim word2vec
给出一个模型,例如
from gensim.models.word2vec import Word2Vec
documents = ["Human machine interface for lab abc computer applications",
"A survey of user opinion of computer system response time",
"The EPS user interface management system",
"System and human system engineering testing of EPS",
"Relation of user perceived response time to error measurement",
"The generation of random binary unordered trees",
"The intersection graph of paths in trees",
"Graph minors IV Widths of trees and well quasi ordering",
"Graph minors A survey"]
texts = [d.lower().split() for d in documents]
w2v_model = Word2Vec(texts, size=5, window=5, min_count=1, workers=10)
Run Code Online (Sandbox Code Playgroud)
可以从w2v词汇表中删除单词,例如
# Originally, it's there.
>>> print(w2v_model['graph'])
[-0.00401433 0.08862179 0.08601206 0.05281207 -0.00673626]
>>> print(w2v_model.wv.vocab['graph'])
Vocab(count:3, index:5, sample_int:750148289)
# Find most similar words.
>>> print(w2v_model.most_similar('graph'))
[('binary', 0.6781558990478516), ('a', 0.6284914612770081), ('unordered', 0.5971308350563049), ('perceived', 0.5612867474555969), ('iv', 0.5470727682113647), ('error', 0.5346164703369141), ('machine', 0.480206698179245), ('quasi', 0.256790429353714), ('relation', 0.2496253103017807), ('trees', 0.2276223599910736)]
# We can delete it from the dictionary
>>> del w2v_model.wv.vocab['graph']
>>> print(w2v_model['graph'])
KeyError: "word 'graph' not in vocabulary"
Run Code Online (Sandbox Code Playgroud)
但是当我们在删除后对其他单词进行相似性时graph,我们会看到graph弹出的单词,例如
>>> w2v_model.most_similar('binary')
[('unordered', 0.8710334300994873), ('ordering', 0.8463168144226074), ('perceived', 0.7764195203781128), ('error', 0.7316686511039734), ('graph', 0.6781558990478516), ('generation', 0.5770125389099121), ('computer', 0.40017056465148926), ('a', 0.2762695848941803), ('testing', 0.26335978507995605), ('trees', 0.1948457509279251)]
Run Code Online (Sandbox Code Playgroud)
如何从gensim中的Word2Vec模型中完全删除单词?
要回答@ vumaasha的评论:
你能否提供一些关于你想删除一个单词的细节
让我说我的语料库中所有单词中的单词世界,以学习所有单词之间的密集关系.
但是当我想生成相似的单词时,它应该只来自域特定单词的子集.
.most_similar()从那时过滤单词可以产生足够多的东西但是让我们说特定领域的空间很小,我可能正在寻找一个排名第1000的最相似的单词,效率很低.
如果从单词向量中完全删除该单词会更好,那么.most_similar()单词将不会返回特定域之外的单词.
小智 7
我编写了一个函数,该函数从KeyedVectors中删除不在预定义单词列表中的单词。
def restrict_w2v(w2v, restricted_word_set):
new_vectors = []
new_vocab = {}
new_index2entity = []
new_vectors_norm = []
for i in range(len(w2v.vocab)):
word = w2v.index2entity[i]
vec = w2v.vectors[i]
vocab = w2v.vocab[word]
vec_norm = w2v.vectors_norm[i]
if word in restricted_word_set:
vocab.index = len(new_index2entity)
new_index2entity.append(word)
new_vocab[word] = vocab
new_vectors.append(vec)
new_vectors_norm.append(vec_norm)
w2v.vocab = new_vocab
w2v.vectors = new_vectors
w2v.index2entity = new_index2entity
w2v.index2word = new_index2entity
w2v.vectors_norm = new_vectors_norm
Run Code Online (Sandbox Code Playgroud)
它基于Word2VecKeyedVectors重写与单词相关的所有变量。
用法:
w2v = KeyedVectors.load_word2vec_format("GoogleNews-vectors-negative300.bin.gz", binary=True)
w2v.most_similar("beer")
Run Code Online (Sandbox Code Playgroud)
[('beers',0.8409687876701355),
('lager',0.7733745574951172),
('Beer',0.71753990650177),
('drinks',0.668931245803833),
('lagers',0.6570086479187012),
('Yuengling_Lager',0.655455470085144),
( 'microbrew',0.6534324884414673),
('Brooklyn_Lager',0.6501551866531372),
('suds',0.6497018337249756),
('brewed_beer',0.6490240097045898)
restricted_word_set = {"beer", "wine", "computer", "python", "bash", "lagers"}
restrict_w2v(w2v, restricted_word_set)
w2v.most_similar("beer")
Run Code Online (Sandbox Code Playgroud)
[('lagers',0.6570085287094116),
('wine',0.6217695474624634),
('bash',0.20583480596542358,
('computer',0.06677375733852386),
('python',0.005948573350906372)]
没有直接的方法可以做你正在寻找的事情。然而,你并没有完全迷失。该方法most_similar在类中实现WordEmbeddingsKeyedVectors(检查链接)。您可以查看此方法并修改它以满足您的需要。
下面显示的行执行计算相似单词的实际逻辑,您需要将变量替换limited为与您感兴趣的单词对应的向量。然后你就完成了
limited = self.vectors_norm if restrict_vocab is None else self.vectors_norm[:restrict_vocab]
dists = dot(limited, mean)
if not topn:
return dists
best = matutils.argsort(dists, topn=topn + len(all_words), reverse=True)
Run Code Online (Sandbox Code Playgroud)
更新:
limited = self.vectors_norm if restrict_vocab is None else self.vectors_norm[:restrict_vocab]
Run Code Online (Sandbox Code Playgroud)
如果你看到这一行,则意味着如果restrict_vocab使用它,它会限制词汇表中的前 n 个单词,只有当你按频率对词汇表进行排序时,它才有意义。如果您没有通过restrict_vocab,self.vectors_norm则进入limited
most_similar 方法调用另一个方法init_sims。[self.vector_norm][4]这会初始化如下所示的值
self.vectors_norm = (self.vectors / sqrt((self.vectors ** 2).sum(-1))[..., newaxis]).astype(REAL)
Run Code Online (Sandbox Code Playgroud)
所以,你可以挑选你感兴趣的单词,准备它们的规范并用它来代替有限的。这应该有效