zoukankan      html  css  js  c++  java
  • one-hot句子向量 对比度增强

    one-hot映射时,如何选取TOPN作为每一个词承载的word2vec的信息?

    我们已经知道,对于这种例子:

    怎么绑定手机号?

    怎么关联手机号?

    他们的相似度取决于绑定和关联这两个词如何相似。


    #取top2词的相似度
    vec_i = np.array([1, 0.73, 0.71, 0])
    vec_j = np.array([0.71, 0.73, 1, 0.71])

    dist = linalg.norm(vec_i - vec_j)
    sim = 1.0 / (1.0 + dist)

    print(sim)
    0.549468959038795

    #取top1词的相似度
    vec_i = np.array([ 1, 0.73, 0 ])
    vec_j = np.array([ 0.71, 0 , 1 ] )
    dist = linalg.norm(vec_i - vec_j)
    sim = 1.0 / (1.0 + dist)

    print(sim)
    0.44021580019602347

    #取top3词的相似度
    vec_i = np.array([ 1, 0.73, 0.71, 0.69, 0])
    vec_j = np.array([0.71, 0.668, 1, 0, 0.71])
    dist = linalg.norm(vec_i - vec_j)
    sim = 1.0 / (1.0 + dist)

    print(sim)
    0.48229348920534326

    在这种情况下,选取TOP2相似度是最高的,可以很好的近似匹配。思想是,在取的TOPN尽可能少的情况下,让TOPN里,相同的词出现的尽可能多,有助于提高相似度。可是那对于不相似的句子呢?

    我们应该让相似的句子,相似度更高,不相似的句子,相似度更低,拉开差距。




    方案一:按照原来的TOP3+similarity

    怎么 怎样 如何 怎么样 支付 付款 微信支付 收款 打印 打 印 打出
    怎么支付 [ 1, 0.85, 0.83, 0.70, 1, 0.77, 0.72, 0.67, 0, 0, 0, 0]
    如何支付 [0.83, 0.87, 1, 0.63, 1, 0.77, 0.72, 0.67, 0, 0, 0, 0]
    如何打印 [0.83, 0.87, 1, 0.63, 0, 0, 0, 0, 1, 0.78, 0.69, 0.69]

    怎么支付-如何支付=0.7992345674654612
    如何支付-如何打印=0.3064740995892663
    怎么支付-如何打印=0.3051741090737826

    方案二:如果两个句子之间,映射完之后有相同词的,相似度保留,如果没有相同词,那么就令那个词为1,这样可以有效的拉开相似度句子,和不相似的句子之间的相似度差距。
                  怎么     怎样     如何    怎么样    支付    付款    微信支付     收款     打印     打    印    打出
    怎么支付      [ 1,     0.85,   0.83,   0.70,    1,     0.77,  0.72,      0.67,    0,      0,    0,    0]
    如何支付      [0.83,    0.87,    1,    0.63,    0,       0,     0,        0,      1,      1,     1,   1]
    (这是第一对)

                   怎么     怎样     如何    怎么样    支付    付款    微信支付     收款     打印     打    印    打出

    如何支付 [0.83, 0.87, 1, 0.63, 1, 1, 1, 1, 0, 0, 0, 0]
    如何打印        [0.83,    0.87,    1,    0.63,    0,        0,     0,        0,     1,      1,    1,   1]
    
    
                 怎么     怎样     如何    怎么样    支付    付款    微信支付     收款     打印     打    印    打出

    怎么支付 [ 1, 0.85, 0.83, 0.70, 1, 0.77, 0.72, 0.67, 0, 0, 0, 0]
    如何打印      [0.83,    0.87,    1,    0.63,    0,        0,     0,        0,     1,    0.78,  0.69,   0.69]

    怎么支付-如何支付=0.7992345674654612
    如何支付-如何打印=0.2612038749637414
    怎么支付-如何打印=0.26044652136360963


    结果:明显的降低了不同意思的句子之间的差距,对于不同的句子之间,进行了相似度对比增强。对于原本就很相似的句子,影响不大。

    不过如果我们要这么做,需要多做一步,就是对于已经生成的两个句子向量做比对,将没有同时出现的词,做1值处理。
    而且具体效果,需要我们实际测试才知道。



  • 相关阅读:
    Python随笔,day1
    利用php抓取蜘蛛爬虫痕迹的示例代码
    explain(执行计划)工具使用
    MyISAM和 InnoDB中索引的数据结构
    页面静态化技术(真静态和伪静态的实现)
    关于MySQL字符集和校对集问题
    客户端禁用cookie后session的解决方法
    解决Ajax中的缓存问题
    MySQL中列类型的选择需要注意的问题
    MySQL中索引的分类和基本操作
  • 原文地址:https://www.cnblogs.com/yjybupt/p/9927955.html
Copyright © 2011-2022 走看看