SciSpacy 相当于 Gensim 的 functions/parameters
SciSpacy equivalent of Gensim's functions/parameters
对于 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'])
这是来自 SciSpacy 的 gensim/Expected 输出:
[('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'])
SciSpacy 输出 Gensim/Expected 的输出(实际上这个向量的长度为 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)(例如,我查看了 here and here),但我不确定我是否遗漏了它们?
实现您的目标的可能方法是:
- parse you documents via
nlp.pipe
- collect all the words and pairwise similarities
- process similarities to get the desired results
让我们准备一些数据:
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 训练它们。
对于 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'])
这是来自 SciSpacy 的 gensim/Expected 输出:
[('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'])
SciSpacy 输出 Gensim/Expected 的输出(实际上这个向量的长度为 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)(例如,我查看了 here and here),但我不确定我是否遗漏了它们?
实现您的目标的可能方法是:
- parse you documents via
nlp.pipe
- collect all the words and pairwise similarities
- process similarities to get the desired results
让我们准备一些数据:
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 训练它们。