计算文本相似度-Word2Vec计算_word2vec 文本相似度计算_Eric_LH的博客-程序员秘密

技术标签: 自然语言处理基础  自然语言处理  

来源于https://juejin.im/post/5b237b45f265da59a90c11d6
Word2Vec,顾名思义,其实就是将每一个词转换为向量的过程。
如果不了解的话可以参考:https://blog.csdn.net/itplus/article/details/37969519
这里我们可以直接下载训练好的 Word2Vec 模型,
模型的链接地址为:https://pan.baidu.com/s/1TZ8GII0CEX32ydjsfMc0zw
是使用新闻、百度百科、小说数据来训练的 64 维的 Word2Vec 模型,数据量很大,整体效果还不错,我们可以直接下载下来使用,这里我们使用的是 news_12g_baidubaike_20g_novel_90g_embedding_64.bin 数据,然后实现 Sentence2Vec,代码如下:

import gensim
import jieba
import numpy as np
from scipy.linalg import norm

model_file = './word2vec/news_12g_baidubaike_20g_novel_90g_embedding_64.bin'
model = gensim.models.KeyedVectors.load_word2vec_format(model_file, binary=True)

def vector_similarity(s1, s2):
    def sentence_vector(s):
        words = jieba.lcut(s)
        v = np.zeros(64)
        for word in words:
            v += model[word]
        v /= len(words)
        return v

    v1, v2 = sentence_vector(s1), sentence_vector(s2)
    return np.dot(v1, v2) / (norm(v1) * norm(v2))

在获取 Sentence Vector 的时候,我们首先对句子进行分词,然后对分好的每一个词获取其对应的 Vector,然后将所有 Vector 相加并求平均,这样就可得到 Sentence Vector 了,然后再计算其夹角余弦值即可。

调用示例如下:

s1 = '你在干嘛'
s2 = '你正做什么'
vector_similarity(s1, s2)

结果如下:

0.6701133967824016

这时如果我们再回到最初的例子看下效果:

strings = [
    '你在干什么',
    '你在干啥子',
    '你在做什么',
    '你好啊',
    '我喜欢吃香蕉'
]

target = '你在干啥'

for string in strings:
    print(string, vector_similarity(string, target))

依然是前面的例子,我们看下它们的匹配度结果是多少,运行结果如下:

你在干什么 0.8785495016487204
你在干啥子 0.9789649689827049
你在做什么 0.8781992402695274
你好啊 0.5174225914249863
我喜欢吃香蕉 0.582990841450621

可以看到相近的语句相似度都能到 0.8 以上,而不同的句子相似度都不足 0.6,这个区分度就非常大了,可以说有了 Word2Vec 我们可以结合一些语义信息来进行一些判断,效果明显也好很多。所以总体来说,Word2Vec 计算的方式是非常好的。另外学术界还有一些可能更好的研究成果,这个可以参考知乎上的一些回答:
https://www.zhihu.com/question/29978268/answer/54399062
。以上便是进行句子相似度计算的基本方法和 Python 实现,
本节代码地址:
https://github.com/AIDeepLearning/SentenceDistance

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Eric_LH/article/details/83151481

智能推荐

传智播客---Servlet监听器的介绍与使用_传智播客 监控是怎么做的_javadaddy的博客-程序员秘密

监听器:监听器就是一个java程序,功能就是监听另一个java对象的变化(方法调用、属性变更)监听器监听过程:事件源、事件对象、监听器对象 、操作事件源 1、存在被监听对象(事件源) 2、存在监听器对象  3、在事件源中注册监听器  4、操作事件源,使事件源发生改变 ,产生事件对象  事件对象 就是 事件源的改变  5、事件对象会被传递给监听器,触发监听器相应行为

Kafka06:【案例】Java操作Kafka:Java代码实现生产者代码、Java代码实现消费者代码、消费者代码扩展、Consumer消费offset查询_做一个有趣的人Zz的博客-程序员秘密

前面我们使用基于console的生产者和消费者对topic实现了数据的生产和消费,,这个基于控制台的生产者和消费者主要是让我们做测试用的。在实际工作中,我们有时候需要将生产者和消费者功能集成到我们已有的系统中,此时就需要写代码实现生产者和消费者的逻辑了。在这我们使用java代码来实现生产者和消费者的功能。一、Java代码实现生产者代码1、创建maven项目先创建maven项目,db_kafka2、添加依赖添加kafka的maven依赖。<dependency> <

想用Android studio使用C语言编写一款音乐播放的app,如何操作呢?请告诉我具体的步骤或实例..._长野君的博客-程序员秘密

你可以使用Android Studio的Android Native Development Kit(NDK)来编写C语言代码,以构建你的音乐播放应用。具体步骤如下:1.下载安装Android Studio;2.安装Android NDK;3.创建新的Android项目,添加必要的C语言文件到项目中;4.编写C/C++代码;5.使用Android Studio编译和调试代码;6.生成可安装的APK...

Hive环境搭建之本地MySQL模式_曾牛的博客-程序员秘密

Hive共有三种安装模式:1.单用户模式(本地模式、嵌入模式);2.本地MySQL模式;3.远程MySQL模式。三者的区别是:1.单用户模式是本地模式的一种,它的元信息存储在hive自带的Derby数据库中,同一时刻只能为一个用户提供服务,功能是用于测试hive程序;2.本地MySQL模式的元信息存储在本地MySQL中,同一时刻可以为多个用户提供服务,功能是用于开发测试hive程序;3.远程MyS...

zzuli 1530 小L玩滚球游戏——————思维_陶鸿杰的博客-程序员秘密

1530: 小L玩滚球游戏时间限制: 1 Sec 内存限制: 128 MB提交: 54 解决: 18题目描述小L正在玩滚球游戏,有n个水晶球在轨道上以不同开始位置和速度从近往远的方向滚动,如果两个水晶球在滚动过程中相遇,它们就会融合成一个水晶球,然后以速度较慢的水晶球的速度继续向前滚动, 问经过时间t后,轨道上还有多少水晶球。输入第一行输入两个整数n、t,n代表水晶球的数量(1 &...

探讨C++11新标准(二)-移动语义和右值引用_鸿毛不浮 水漫富士的博客-程序员秘密

今天我们主要讨论C++11的移动语义和右值引用,其中包含一些问题,什么是移动语义?,C++11如何支持他,为什么需要移动语义?强制移动move函数,本章主要讨论以上问题,有兴趣的可以继续往下阅读。为什么需要移动语义?我们先来看看这段C++11之前的代码string a(1000, 'a');//对象a有1000个字符假设他有一个函数将a中的1000个字符反转一下返回一个新的对象。string Revarsal(string & str){ string temp; //do som

随便推点

C语言基因序列比对,三代序列比对算法minimap2的优缺点_斯码特钢的博客-程序员秘密

由于二代测序序列长度短(~300 bp),错误率低(<0.02%),其测序错误主要为替换错误,可通过哈希查找或数据压缩等方法直接查询每条序列在基因组中的准确比对区域,得到比对结果。而三代测序序列一方面错误率较高(~15%),且错误类型主要为插入或删除错误,难以通过文本查找直接找到序列在基因组中的比对区域,需要采用针对性的查询策略找到比对区域。另一方面,在比对阶段,由于三代序列读段长(平均长度...

八、springboot 简单优雅的通过docker-compose 构建_程序员爱酸奶的博客-程序员秘密

前言这个项目有一段时间没有更新了,不过我可没有偷懒哟,是偷偷准备了一个大招,现在是时候展示啦哈哈。我们今天要做的,就是将我们的项目通过docker-compose 构建成镜像运行。为什么要这样做呢?比我我前面的这些教程,用到了mysql,如果你们想要运行我的程序,就必须在自己电脑上装mysql 数据库才行,也就是项目用依赖了哪些环境,都必须先将这些环境部署好才能运行项目,那我们要做的,只用安装...

MySQL 查询语句指定字段默认值,count聚合结果为0的情况,_count默认0_是小方啦的博客-程序员秘密

嘤嘤嘤 逃过了面试sql 一进公司 sql 写了两天 ,后悔上学没好好学,嘤嘤嘤 哭泣,那就来个总结吧!纯干货 不拖沓(主要是我文采不咋 条理性也不咋,简单直接看sql吧)查询语句 指定字段默认值,使用 if主要是想使用UNION 时给一个字段 默认值SELECT IFNULL( NULL, '默认值' ) AS 'name' , t.*FROMaa t想让count 聚合的时候分组有的为零 也显示个数SELECT IFNULL( count( *), 0 ) AS 'no'

Jsp调用Action的几种方法_jsp action_wellven_chen的博客-程序员秘密

由于最近刚刚开始接触Spring+SpringMVC+mybatis的SSM框架来开发Web应用,页面使用的是Jsp。所以经常会从Jsp页面调用到后端Java中Action类,因此希望总结一下,下次遇到类似问题不用再翻代码去查看:1. 最常见的form表单提交:一般情况下,比如在登陆界面,因为主要只涉及到登陆的功能,我们会使用form表单提交的方式来向后端Action传值以及跳转页面...

Qt信号槽中槽函数为虚函数的一些感想_weixin_30429201的博客-程序员秘密

有时候,在写connect的时候会去犹豫一个问题----我的槽函数到底需不需要为虚函数。这个问题在我每次写connect的时候我都会反问自己,因为确实,如果你不去深究里面的moc,你发现不了太多问题。 比如有这么一个demo.#include <QApplication>#include <QObject>#include &lt...

(转载) STL Vector容器_weixin_34234829的博客-程序员秘密

STL之二:vector容器用法详解 vector类常用的函数如下所示构造函数增加函数删除函数遍历函数判断函数大小函数其他函数示例初始化示例增加及获得元素示例修改元素示例删除向量示例进一步理解vector如下图所示综合示例 vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组。...

推荐文章

热门文章

相关标签