对于Gensim,我经常使用三个函数,例如:
model = gensim.models.Word2Vec(corpus,size=100,min_count=5)
gensim的输出,但我无法理解如何在的等效SciSpacy命令中设置大小和min_count参数
model = spacy.load('en_core_web_md')
(输出是一个嵌入模型(太大,无法在此处添加((。
这是我经常使用的另一个命令:
model.most_similar(positive=['car'])
这是gensim的输出/SciSpacy的预期输出:
[('vehicle', 0.7857330441474915),
('motorbike', 0.7572781443595886),
('train', 0.7457204461097717),
('honda', 0.7383008003234863),
('volkswagen', 0.7298516035079956),
('mini', 0.7158907651901245),
('drive', 0.7093928456306458),
('driving', 0.7084407806396484),
('road', 0.7001082897186279),
('traffic', 0.6991947889328003)]
这是我经常使用的第三个命令:
print(model.wv['car'])
Gensim的输出/SciSpacy的预期输出(实际上,该矢量的长度为100(:
[ 1.0942473 2.5680697 -0.43163642 -1.171171 1.8553845 -0.3164575
1.3645878 -0.5003705 2.912658 3.099512 2.0184739 -1.2413547
0.9156444 -0.08406237 -2.2248871 2.0038593 0.8751471 0.8953876
0.2207374 -0.157277 -1.4984075 0.49289042 -0.01171476 -0.57937795...]
有人能给我看一下SciSpacy的等效命令吗?例如,对于"gensim.models.Word2Vec",我找不到如何在SciSpacy中指定向量的长度(大小参数(,或单词在语料库中的最小次数(min_count((例如,我看了这里和这里(,但我不确定我是否错过了它们?
实现目标的一种可能方法是:
- 通过
nlp.pipe
解析文档- 收集所有单词和成对的相似性
- 处理相似性以获得所需结果
让我们准备一些数据:
import spacy
nlp = spacy.load("en_core_web_md", disable = ['ner', 'tagger', 'parser'])
然后,要得到一个向量,就像在model.wv['car']
中一样:
nlp("car").vector
为了获得像model.most_similar(positive=['car'])
这样的最相似的单词,让我们处理语料库:
corpus = ["This is a sentence about cars. This a sentence aboout train"
, "And this is a sentence about a bike"]
docs = nlp.pipe(corpus)
tokens = []
tokens_orth = []
for doc in docs:
for tok in doc:
if tok.orth_ not in tokens_orth:
tokens.append(tok)
tokens_orth.append(tok.orth_)
sims = np.zeros((len(tokens),len(tokens)))
for i, tok in enumerate(tokens):
sims[i] = [tok.similarity(tok_) for tok_ in tokens]
然后检索top=3
最相似的单词:
def most_similar(word, tokens_orth = tokens_orth, sims=sims, top=3):
tokens_orth = np.array(tokens_orth)
id_word = np.where(tokens_orth == word)[0][0]
sim = sims[id_word]
id_ms = np.argsort(sim)[:-top-1:-1]
return list(zip(tokens_orth[id_ms], sim[id_ms]))
most_similar("This")
[('this', 1.0000001192092896), ('This', 1.0), ('is', 0.5970357656478882)]
PS
我还注意到你要求规格的尺寸和频率。嵌入长度在初始化模型时是固定的,因此在此之后不能更改。如果你愿意,你可以从一个空白模型开始,并提供你熟悉的嵌入。至于频率,它是可行的,通过计算所有的单词并丢弃任何低于所需阈值的单词。但同样,底层嵌入将来自未过滤的文本。SpaCy与Gensim的不同之处在于,它使用现成的嵌入,而Gensim则对其进行训练。