python-3.x - Gensim 中使用高 alpha 值的 Word2Vec 的一些不同问题
问题描述
我在 gensim 中实现 word2vec,在一个带有嵌套列表(句子形式的句子中标记化单词的集合)的语料库上,有 408226 个句子(列表)和总共 3150546 个单词或标记。
我得到了一个有意义的结果(就使用 model.wv.similarity 的两个词之间的相似性而言),选择的值为 200 作为大小,窗口为 15,min_count 为 5,iter 为 10,alpha 为 0.5。所有都是词形还原词,这些都输入到词汇表为 32716 的模型中。
根据计算相似度值时使用的数据,默认 alpha 值、大小、窗口和尺寸所产生的结果对我来说毫无意义。然而,将 alpha 值设为 0.5 时,在诱导两个词之间有意义的相似度得分方面,我给出了一些有意义的结果。但是,当我计算前 n 个相似词时,它又是毫无意义的。我是否需要更改初始训练过程中使用的整个参数。
我仍然无法揭示确切的原因,为什么该模型在计算所用语料库的两个单词之间的相似性时表现良好,具有如此高的 alpha 值,而在计算前 n 个相似单词并为输入单词评分时它是没有意义的。为什么会这样?
它是否正在向最佳解决方案发散。如何检查这个?
任何想法为什么会这样,我们深表感谢。
注意:我在带有 anaconda 提示符的 Windows 机器上使用 Python 3.7,并从文件中向模型提供输入。
这是我尝试过的。
import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')
from gensim.models import Word2Vec
import ast
path = "F:/Folder/"
def load_data():
global Sentences
Sentences = []
for file in ['data_d1.txt','data_d2.txt']:
with open(path + file, 'r', encoding = 'utf-8') as f1:
Sentences.extend(ast.literal_eval(*f1.readlines()))
load_data()
def initialize_word_embedding():
model = Word2Vec(Sentences, size = 200, window = 15, min_count = 5, iter = 10, workers = 4)
print(model)
print(len(model.wv.vocab))
print(model.wv.similarity(w1 = 'structure', w2 = '_structure_'))
similarities = model.wv.most_similar('system')
for word, score in similarities:
print(word , score)
initialize_word_embedding()
Sentences 列表示例如下:
[['科学家','时间','彗星','活动','升华','碳','二氧化','接近','冰','系统'],['不一致','年龄', '系统', '年份', '大小', '碰撞'], ['智能', '系统'], ['例子', '应用', '过滤器', '图像', '运动', '渠道','估计', '均衡', '例子', '应用', '过滤器', '系统']]
data_d1.txt
anddata_d2.txt
是一个嵌套列表(词形化标记词列表的列表)。我已经对原始数据进行了预处理并将其保存在一个文件中。现在给出与输入相同的内容。为了计算词形还原标记,我使用了流行的 WordNet 词形还原器。
我需要词嵌入模型来计算两个词之间的相似度并计算给定输入词的 most_similar 词。我为该model.wv.similarity()
方法获得了一些有意义的分数,而在计算most_similar()
单词的单词时(例如,system
如上所示)。我没有得到想要的结果。
我猜这个模型正在偏离全局最小值,使用高 alpha 值。
我很困惑维度大小应该是什么,用于诱导一些有意义的结果的窗口,因为没有关于如何计算大小和窗口的规则。
任何建议表示赞赏。总句子和单词的大小在上面的问题中指定。
结果我在没有设置 alpha = 0.5 的情况下得到了什么
编辑最近的评论:
结果:
Word2Vec(词汇=32716,大小=200,alpha=0.025)
set
和之间的相似性_set_
是:0.000269373188960656
这对我来说毫无意义,因为它在准确性方面非常低,但是,通过将 alpha 设置为 0.5,我得到了 71%,这对我来说似乎很有意义,因为这两个词set
都是相同的域。
说明:set
两个域的单词应该相同(因为我正在将两个域的数据与相同的单词进行比较)。不要与 word 混淆_set_
,这是因为 word 与 set 相同,我_
在开头和结尾注入了一个字符,以区分两个不同域的相同。
排名前 10 的单词和分数_set_
是:
_niche_ 0.6891741752624512
_intermediate_ 0.6883598566055298
_interpretation_ 0.6813371181488037
_printer_ 0.675414502620697
_finer_ 0.6625382900238037
_pertinent_ 0.6620787382125854
_respective_ 0.6619025468826294
_converse_ 0.6610435247421265
_developed_ 0.659270167350769
_tent_ 0.6588765382766724
而 set 的前 10 个单词是:
cardinality 0.633270263671875
typereduction 0.6233855485916138
zdzisław 0.619156002998352
crisp 0.6165326833724976
equivalenceclass 0.605925977230072
pawlak 0.6058803200721741
straight 0.6045454740524292
culik 0.6040038466453552
rin 0.6038737297058105
multisets 0.6035065650939941
为什么对于两个不同cosine similarity value
的数据,单词是 0.00 。set
解决方案
推荐阅读
- javascript - passport.deserializeUser 仅在不通过 'getUserById' 传递 'id' 时工作
- flutter - 59:18:错误:没有为类“DatabaseException”定义方法“isDuplicateColumnError”
- html - 在没有主机的情况下将图标添加到 HTML 文件?
- vb.net - 保存 PNG 图像后元数据中的额外字符/字节
- r - 如何修复 hddplot 包安装错误
- scenekit - SceneKit 粒子和混合模式
- javascript - JavaScript:通过图像 src 获取元素
- javascript - Snapshot.val() 返回对象的最后一个属性
- linux - Linux 系统调用是否在异常处理程序中执行?
- uwp - Gridview 不显示 GTK (Ubuntu) 中的元素