java零基础 package Java Spring 分布式服务 Transformer mAPI forms parameters casting background xampp vue论坛 vue入门 传智播客python axure组件库下载 js键值对数组 ipex接口 coreldraw入门学习 python如何注释 python中不等于 java发邮件 java开发学习 java数组添加元素 java取当前时间 java线程死锁 java接口调用 linuxsleep sql综合利用工具 jb51 马赛克软件 pr缩放 steam怎么卸载 linux运维之道 华为ff linux安卓模拟器 鬼灵战马 ocr文字识别软件免费下载 cad怎么拉伸 id书籍排版教程 CST软件
当前位置: 首页 > 学习教程  > 编程学习

计算文本相似度-Word2Vec计算

2021/1/9 1:56:34 文章标签: word计算

来源于https://juejin.im/post/5b237b45f265da59a90c11d6 Word2Vec,顾名思义,其实就是将每一个词转换为向量的过程。 如果不了解的话可以参考:https://blog.csdn.net/itplus/article/details/37969519 这里我们可以直接下载训练好的 Word2Vec…

来源于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


本文链接: http://www.dtmao.cc/news_show_1100111.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?