【语言与知识主题月】词义相似度评测
才能我浪费99 发布于2020-07-02 浏览:1496 回复:5
1
收藏

1.功能描述:
词义相似度:依托全网海量优质数据和深度神经网络技术,通过词语向量化来计算两个词之间的相似度,满足高精度要求的业务场景需求
我在词向量评测的文章里其实已经介绍了用求两个词向量余弦的方法实现了计算两个词的相似的的方法,参见:
https://ai.baidu.com/forum/topic/show/960643
结果发现百度已经直接提供了词义相似度的API,这就评测一下,并与我上次的方法进行对比。

2.平台接入

具体接入方式比较简单,可以参考我的另一个帖子,这里就不重复了:
http://ai.baidu.com/forum/topic/show/943327

3.调用攻略(Python3)及评测

3.1首先认证授权:

在开始调用任何API之前需要先进行认证授权,具体的说明请参考:

http://ai.baidu.com/docs#/Auth/top

具体Python3代码如下:

# -*- coding: utf-8 -*-
#!/usr/bin/env python

import urllib
import base64
import json
#client_id 为官网获取的AK, client_secret 为官网获取的SK
client_id =【百度云应用的AK】
client_secret =【百度云应用的SK】

#获取token
def get_token():
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
request = urllib.request.Request(host)
request.add_header('Content-Type', 'application/json; charset=UTF-8')
response = urllib.request.urlopen(request)
token_content = response.read()
#print (token_content)
if token_content:
token_info = json.loads(token_content)
token_key = token_info['access_token']
return token_key

3.2百度词向量表示接口调用:

详细说明请参考: https://ai.baidu.com/ai-doc/NLP/Fk6z52fjc

说明的比较清晰,这里就不重复了。

大家需要注意的是:词向量表示
API访问URL:https://aip.baidubce.com/rpc/2.0/nlp/v2/word_emb_sim

Body请求示例:

{
"word_1":"北京",
"word_2":"上海"
}

Python3调用代码如下:

def word_emb_sim(word_1,word_2):
    token=get_token()
    url = 'https://aip.baidubce.com/rpc/2.0/nlp/v2/word_emb_sim'
    params = dict()
    params['word_1'] = word_1
    params['word_2'] = word_2
    params = json.dumps(params).encode('utf-8')
    access_token = token
    url = url + "?access_token=" + access_token
    request = urllib.request.Request(url=url, data=params)
    request.add_header('Content-Type', 'application/json')
    response = urllib.request.urlopen(request)
    content = response.read()
    if content:
        content=content.decode('GBK')
        data = json.loads(content)
        print (data)

这是用词向量余弦求取相似度的代码:

def word_emb_vec(word):
    token=get_token()
    url = 'https://aip.baidubce.com/rpc/2.0/nlp/v2/word_emb_vec'
    params = dict()
    params['word'] = word
    params = json.dumps(params).encode('utf-8')
    access_token = token
    url = url + "?access_token=" + access_token
    request = urllib.request.Request(url=url, data=params)
    request.add_header('Content-Type', 'application/json')
    response = urllib.request.urlopen(request)
    content = response.read()
    if content:
        content=content.decode('GBK')
        data = json.loads(content)
        print (data)
        vec=data['vec']
        
        return vec

def get_cos(word1,word2):
    vector1=word_emb_vec(word1)
    vector2=word_emb_vec(word2)
    op7=np.dot(vector1,vector2)/(np.linalg.norm(vector1)*(np.linalg.norm(vector2)))
    print(op7)

4.功能评测:
相似度API方式
word_emb_sim('男生','女生')
0.735483
word_emb_sim('北京','上海')
0.456862

词向量余弦方式:
get_cos('男生','女生')
0.7354834999425102
get_cos('北京','上海')
0.45686141993444884

通过对比可以发现,调用相似度API的结果与通过词向量余弦的方法,得到的结果是一样的。

5.测试结论和建议
通过评估发现,词语相似度计算的很准确。通过高质量的词向量,可以对词的相似度进行准确的评估。本功能可以用于:
深度语义解析:该技术常用于计算两个给定词语的语义相似度,基于自然语言中的分布假设,即越是经常共同出现的词之间的相似度越高
领先技术应用:词义相似度是自然语言处理中的重要基础技术,是专名挖掘、query改写、词性标注等常用技术的基础之一

收藏
点赞
1
个赞
共5条回复 最后由才能我浪费99回复于2020-07-14
#6才能我浪费99回复于2020-07-14

可以用于很多场景

0
#5才能我浪费99回复于2020-07-14

用起来很方便

0
#4worddict回复于2020-07-13

以后判断词义就方便多了

0
#3worddict回复于2020-07-13

写的很不错

0
#2才能我浪费99回复于2020-07-02

整体感觉很不错

0
TOP
切换版块