chatopera / Synonyms

:herb: 中文近义词:聊天机器人,智能问答工具包
https://bot.chatopera.com/
Other
5.02k stars 904 forks source link

无相关词相似性计量值过大的原因;请求分享训练Word2vec模型训练的参数、技巧 #43

Closed qycsmmu closed 6 years ago

qycsmmu commented 6 years ago

description

1.使用Synonyms过程中发现其会过高估计无关联词的相似性,测试至今,感觉其输出的最小词相似度都是0.5左右(例如:synonyms.compare("骨折", "巴赫", seg=False)=0.544),是因为您在设计包时有意设计了这个下限吗?

  1. 用户似乎不能再您训练的Word2vec模型中添加自己的语料再训练模型,请问您是否可将您基于中文wiki训练Word2vec模型的的参数设置情况分享给大家学习下?我在自己训练过程中发现模型表现不好,即便很相似的词,相似性也不超过0.28。。。。
  2. 训练时参数设置和语料大小间的关联是否有些经验规则可以提升模型效果?

    current

    synonyms.compare("骨折", "巴赫", seg=False)=0.544

    expected

    后续建议: 建议后续开发允许用户自定义语料重新训练的模型,应用领域会更广。此外,建议有机会尝试下稍新点的glove模型,据说词相似性计量效果会更好。

    solution

environment

Windows 10

hailiang-wang commented 6 years ago
  1. 你试试最新的package, 这个 case: synonyms.compare("骨折", "巴赫", seg=False)=0.544, 我没有重现

    screen shot 2018-03-01 at 4 24 27 pm
  2. 现在没有更改现有词表的方式。 目前整个项目代码量不大,可参考自己实现,或者优化这个项目,提交PR。

  3. 该项目使用Google 发布的Word2vec, 并不是 gensim. Google的代码基于C编写,执行效率高,有很多优化的地方,比gensim的代码更好。

hailiang-wang commented 6 years ago

训练过程,设置参数主要靠试。数据不同,最优的参数也会不同。 这里并没有更多经验可以分享。

qycsmmu commented 6 years ago

您好,我将电脑中旧版本的包卸载掉后又重新安装的(安装界面如下),但测试结果不变(见图),请问是因为Python版本的问题吗?有啥解决办法吗?

11 22
hailiang-wang commented 6 years ago

重现了,所以,这是一个bug: 在py3上计算不准确。

image

我在开发的时候使用 py2, 然后验证 py3的功能是不是ok。你能帮忙解决这个bug吗?

qycsmmu commented 6 years ago
2 3

您好,我初学Python没多久,能力有限可能无法修复这个bug,但我也尽自己最大能力尝试了看看能否找出问题所在,学习您的代码后我发现有两个地方有些疑问如上图所示:

  1. 您的编剧距离函数似乎不对,测试后发现变换字符后相似性保持不变,且与另一个Levenshtein.distance包里的编辑距离输出结果有差异,很抱歉我没能理清这个距离的计算方法并修改代码。好像求过编剧距离后再算相似性分母有好几种取法。
  2. 我不太了解word2vec模型后面相似性计算的原理,有点奇怪相似性函数中为何采用系数5和0.8分别整合word2vec输出和编剧距离?是否有参考依据?这个系数是权重的意思吗(权重不该相加和为1)?不过从这个测试case来看,结果高得离谱好像还是编辑距离弄得(u * 0.8) 非常抱歉饿哦能做到的只有这些,确实不很了解算法原理,看了很久也不太明白,上述所提拙见仅供参考,如有不当请包涵,非常期待您能尽快找到并修复此bug,毕竟Python3现在的用户很不少了。。。
hailiang-wang commented 6 years ago

感谢发现问题和帮助分析。现在已经解决了,使用最新的 v2.3版本就可以。 需要补充说明的是,相似度的分数是经过平滑处理的,也就是高的分数为降一些,低的分数会升一些。平滑处理能使得整体上分数分布更加合理。

@qycsmmu

qycsmmu commented 6 years ago

非常感谢您的及时更新,今早更新再测试后发现结果确实没有之前高得离谱,但似乎仍然无法基于py3.6重现您基于py2.2所做的示例结果(如下图所示),尤其case: synonyms.compare("骨折", "巴赫",seg=False)=0.287(py3.6),从上述回答中可以看出您基于py2.2版本时得出的结果为0.023,直观看起来似乎更加合理,所以有些疑惑为什么同样的case在py2和py3上不能一致重现?似乎不太说得通啊,因为采用了不同的相似性计量公式吗? 此外,所说的对相似度平滑处理是否有参考的资料(博客或者文献啥的),想多了解下这个平滑的方法。谢谢您的回复。

1 2
qycsmmu commented 6 years ago

重传一下完整测试结果,PS(吐槽下github的附件上传功能,经常要试好几遍才可以。。。。。。)

1
hailiang-wang commented 6 years ago

又做了一些优化,现在可以用2.5版本了,效果更好。