问题一:
16
0
length:4
length:4
length:4
length:4
29
0
length:2
length:2
16
0
length:5
length:5
length:5
length:5
length:5
38
本来非零元素应该为5*8为40个,可是因为一句话中的相似词,会出现重复,所以可能出现前一个词的相似度和相似词,被后一个词所覆盖
会导致出来的准确率不够准,
也会导致
为此,我们可能要引入word2vec里词的判断,只加入相似度大于某一个阈值的词。然而,这样的话,对于长短句子,怎么进行公平的比较?
【可能我们topn 要测试一下取大一点了】
topn设大有助于让我们更倾向于出现相同词,而不是相似词
可能要做一个相同词的匹配,如果出现相同词,这个相同词要加在最后再进行word2vec词相似度的写入,这样才不会被其他词所覆盖
又或者,我们在相似度赋值的时候,使用相加的方式?
比如 但是 有一个相似词 但,相似度是0.8,
然后 可是 有一个相似词 但,相似度是0.7,我们对于对于这个词的赋值,使用叠加1.5?好像也怪怪的。
我觉得应该对于重复的词,我们取完全一样的相似度分布
比如两个句子都出现但是,那么我们对 但是,取一模一样的词分布(可以把重复的词放在末尾进行赋值)
对于两个不同的词,他们有相同的相似词呢?取相似度大的吧?这样的话,如果出现了这个词,则也对近义词理解有帮助
对了,对于basesimilarity,我们应该取vec的非零值的个数,而不是用词数相乘,而且这样的话不用传topn,只要传入vec或者leng(vec nonzero)就好,
这样会更准确,
对了,我把所有相似度的分布,画成图,然后问一下大家怎么做归一化
改进的话,是不是可以把设置的权重调低?
考虑一下只是图谱如何弄
====================
今天出现了一个算法bug
微信提示收到多少钱
['微信', '收到', '提示', '多少钱']
0.31954264640808105
{'confidence': 0.3207103750440659, 'answer': "(匹配):微信提示收到多少钱('微信', '收到', '提示', '多少钱')\n (标准):微信提示收到多少钱"}
{'confidence': 0.1334743309275807, 'answer': "(匹配):终身版的多少钱('多少钱', '终身版')\n (标准):这个收银系统怎么收费?"}
{'confidence': 0.13280269790244556, 'answer': "(匹配):可以通过微信个人收款码?('微信', '收款码')\n (标准):可以通过微信个人收款码?"}
{'confidence': 0.13262952072991352, 'answer': "(匹配):银豹有微信拉粉吗?('微信', '拉粉')\n (标准):银豹有微信拉粉吗?"}
{'confidence': 0.1312973178102419, 'answer': "(匹配):有没有微信商户版的?('微信', '商户')\n (标准):有没有微信商户版的?"}
{'confidence': 0.13003625241844238, 'answer': "(匹配):微信怎么绑?('微信', '绑')\n (标准):微信怎么绑?"}
{'confidence': 0.13003625241844238, 'answer': "(匹配):微信里怎么看到银豹后台?('微信', '后台')\n (标准):微信里怎么看到银豹后台?"}
{'confidence': 0.13003625241844238, 'answer': "(匹配):你们只支持微信吗?('微信', '支持')\n (标准):你们支持微信和支付宝吗?"}
{'confidence': 0.1296702929762439, 'answer': "(匹配):漏单没有提示的吗?('漏单', '提示')\n (标准):系统能查看漏单或提示漏单吗?"}
{'confidence': 0.12954782946680146, 'answer': "(匹配):刷卡器多少钱?('刷卡器', '多少钱')\n (标准):刷卡器多少钱?"}
微信提示收到多少钱
['微信', '收到', '提示', '多少钱']
0.3296504020690918
{'confidence': 1.0, 'answer': "(匹配):微信提示收到多少钱('微信', '收到', '提示', '多少钱')\n (标准):微信提示收到多少钱"}
{'confidence': 0.13507810593582123, 'answer': "(匹配):终身版的多少钱('多少钱', '终身版')\n (标准):这个收银系统怎么收费?"}
{'confidence': 0.13367660240019172, 'answer': "(匹配):可以通过微信个人收款码?('微信', '收款码')\n (标准):可以通过微信个人收款码?"}
{'confidence': 0.13367660240019172, 'answer': "(匹配):银豹有微信拉粉吗?('微信', '拉粉')\n (标准):银豹有微信拉粉吗?"}
{'confidence': 0.13231996486433337, 'answer': "(匹配):有没有微信商户版的?('微信', '商户')\n (标准):有没有微信商户版的?"}
{'confidence': 0.13100580420257674, 'answer': "(匹配):微信怎么绑?('微信', '绑')\n (标准):微信怎么绑?"}
{'confidence': 0.13100580420257674, 'answer': "(匹配):收银机是多少钱('多少钱', '收银机')\n (标准):收银机是多少钱"}
{'confidence': 0.13100580420257674, 'answer': "(匹配):微信里怎么看到银豹后台?('微信', '后台')\n (标准):微信里怎么看到银豹后台?"}
{'confidence': 0.13100580420257674, 'answer': "(匹配):漏单没有提示的吗?('漏单', '提示')\n (标准):系统能查看漏单或提示漏单吗?"}
{'confidence': 0.13100580420257674, 'answer': "(匹配):你们只支持微信吗?('微信', '支持')\n (标准):你们支持微信和支付宝吗?"}
同样的一句话,可是两次提问,回答的却不一样。我中间有加一些别的。
经测试,应该是我直接赋值vec1,vec2出了问题,以后碰到函数里面更改了vec1vec2的,最好还是用vec1_temp=vec1.copy()比较安全
vec1_temp = vec1.copy()
vec2_temp = vec2.copy()
vec_index1 = vec1_nonzero_nonkeyword&vec2_zero
vec_index2 = vec2_nonzero_nonkeyword&vec1_zero
vec1_temp[vec_index1] = 1
vec2_temp[vec_index2] = 1
==========
经检验,一个词的句子与一个词的句子,他们之间完全相同,相似度最低是0.82,所以如果要去掉分词之后完全相同的,就去掉0.80以上的就行
微信店铺
['微信店铺']
0.4010460376739502
{'confidence': 0.8242659161988843, 'answer': "(匹配):有没有微信店铺?('微信店铺',)\n (标准):有没有微信店铺?"}
{'confidence': 0.11767885635119946, 'answer': "(匹配):微信店铺和网上商城是一回事吗?('网上商城', '微信店铺')\n (标准):微信店铺和网上商城是一回事吗?"}
{'confidence': 0.0833948963312266, 'answer': "(匹配):微信店铺有什么用处?('微信店铺', '用处')\n (标准):微信店铺有什么用处?"}
=============================
今天遇到一个问题,当我要加入不重要词的时候,对于个TRUE FALSE的np array操作,然后使用这个向量作为nonkeywords
发现巨慢! 查找一次竟然要用2秒
我后来把这个向量改为0101的形式,然后使用vec_not_special = (vec_not_special==1),速度才回到正常值
为什么会这样??
vec1,vec_not_special = sent2vec(q1_cut,model,topn=10,sent_raw=question)
vec_not_special = (vec_not_special==1)
vec1_count_nonzero = np.sum(vec1!=0)
vec1_nonzero_nonkeyword = (vec1>0)&vec_not_special