一个模型,例如
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)
可以从w2 v词汇表中删除这个词,例如。
# 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"
但是当我们在删除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)]
如何在gensim中从Word 2 Vec模型中完全删除单词?
已更新
回复@vumaasha的评论:
你能给予一些细节来说明为什么你想删除一个词吗
- 让我们在语料库中的所有单词中说出我的单词宇宙,以了解所有单词之间的密集关系。
- 但是当我想生成相似的单词时,它应该只来自特定领域单词的子集。
- 可以从
.most_similar()
生成足够多的词,然后过滤这些词,但是假设特定域的空间很小,我可能会寻找一个排名第1000位的最相似的词,这是低效的。 - 最好将单词从单词向量中完全删除,这样
.most_similar()
单词就不会返回特定域之外的单词。
7条答案
按热度按时间1l5u6lss1#
我写了一个函数,从KeyedVectors中删除不在预定义单词列表中的单词。
它重写了所有与Word2VecKeyedVectors相关的变量。
使用方法:
[('beers',0.8409687876701355),
('lager',0.7733745574951172),
('Beer',0.71753990650177),
('饮料',0.668931245803833),
('lagers',0.6570086479187012),
('Yuengling_Lager',0.655455470085144),
('微酿',0.6534324884414673),
('Brooklyn_Lager',0.6501551866531372),
('泡沫',0.6497018337249756),
('brewed_beer',0.6490240097045898)]
[('lagers ',0.6570085287094116),
('wine',0.6217695474624634),
('bash',0.20583480596542358),
('computer',0.06677375733852386),
('python',0.005948573350906372)]
ltskdhd12#
没有直接的方法来做你正在寻找的东西。然而,你并没有完全迷失。方法
most_similar
在类WordEmbeddingsKeyedVectors
中实现(查看链接)。您可以查看此方法并修改它以满足您的需要。下面显示的行执行计算相似单词的实际逻辑,您需要将变量
limited
替换为与您感兴趣的单词对应的向量。那你就完了更新:
如果你看到这一行,这意味着如果使用
restrict_vocab
,它限制了词汇表中的前n个单词,只有当你按频率对词汇表进行排序时,它才有意义。如果不传递restrict_vocab,则self.vectors_norm
将进入limited方法most_similar调用另一个方法
init_sims
。这将修改[self.vector_norm][4]
的值,如下所示所以,你可以挑选你感兴趣的单词,准备他们的规范,并使用它来代替有限的。这应该工作
um6iljoc3#
请注意,这不会修剪模型本身。它修剪相似性查找所基于的
KeyedVectors
对象。假设您只想在模型中保留前5000个单词。
这样做是因为BaseKeyedVectors class包含以下属性:self.vectors,self.vectors_norm,self.vocab,self.vector_size,self. index2word.
这样做的好处是,如果您使用
save_word2vec_format()
等方法编写KeyedVectors,则文件要小得多。izkcnapc4#
试过了,觉得最直接的方法如下:
1.获取文本文件格式的Word 2 Vec嵌入。
1.确定与您想要保留的词向量相对应的行。
1.写一个新的文本文件Word 2 Vec嵌入模型。
1.加载模型并享受(如果您愿意,可以保存为二进制文件,等等).
我的示例代码如下:
FYI. FASTINGATTEMPT我尝试了@zsozso的方法(使用@Taegyung建议的
np.array
修改),让它在夜间运行至少12小时,它仍然停留在从受限集合中获取新词.)。这可能是因为我有很多实体...但我的文本文件方法在一个小时内就能奏效。密码
tyg4sfes5#
与zsozso的答案相同,但对于Gensim 4:
使用方法:
它为我工作(Gensim 4.3.1)
irlmq6kh6#
但是当我想生成相似的单词时,它应该只来自特定领域单词的子集。
您可以使用
most_similar_to_given
从您选择的集合中获取最相似的单词。该方法在引擎盖下使用余弦相似性。示例
krugob8w7#
对于任何在当今时代来到这里的人,我建议使用这种方法:https://stackoverflow.com/a/74850545
用较小的词汇制作模型,这是gensim原生的,非常快,通常是很好的练习。