前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >conceptnet-numberbatch: 结合常识知识的词向量 - 概述及使用

conceptnet-numberbatch: 结合常识知识的词向量 - 概述及使用

作者头像
blmoistawinde
发布2020-12-01 10:57:25
1.3K0
发布2020-12-01 10:57:25
举报
文章被收录于专栏:润风拂过存甘霖

在NLP领域,常识知识的使用越发成为热点,因为其有希望帮助克服现有模型的局限:它们仅从训练数据中学到的有偏的、浅薄的知识,而并不擅长像人一样进行真正的推理。

常识知识的表示形式有很多:有的是以的形式,如ConceptNet;有的是以模型的形式,如COMET;而本文要介绍的应该是其中比较易于使用的一种,词向量形式。其代表是conceptnet-numberbatch。

简介

ConceptNet Numberbatch 是一组词向量,可以直接以向量形式表达词的语义。

它是ConceptNet开源项目的一部分,ConceptNet是最常用的常识知识图谱之一。

相比于其他词向量(word2vec, glove) ConceptNet Numberbatch的优势是它同时利用了文本和ConceptNet中的半结构化信息进行学习,因此它能够学习到一些从一般语料中可能无法直接学习到的一些语义。

另外,它支持词组;支持多种语言(包括中文);针对性别偏见等现象做了一定的优化。

因此,它号称为“你能找到的最好的词向量”,不过这点至少在它创立之时而言或许确实不假。

使用

首先从其官网下载, 这里我选择最新最全的版本:

在这里插入图片描述
在这里插入图片描述

其第一行是其中词语的数量和每个词向量的维度

代码语言:javascript
复制
9161912 300

其后每行的格式是词语标识 向量

代码语言:javascript
复制
/c/en/absolute_value -0.0847 -0.1316 -0.0800 -0.0708 -0.2514 -0.1687 -...
/c/en/absolute_zero 0.0056 -0.0051 0.0332 -0.1525 -0.0955 -0.0902 0.07...
/c/en/absoluteless 0.2740 0.0718 0.1548 0.1118 -0.1669 -0.0216 -0.0508...
/c/en/absolutely 0.0065 -0.1813 0.0335 0.0991 -0.1123 0.0060 -0.0009 0...
/c/en/absolutely_convergent 0.3752 0.1087 -0.1299 -0.0796 -0.2753 -0.1...

词向量的加载方式与word2vec等类似,不再赘述。

但有一点值得注意,前面的词语标识并不是简单的单词,事实上,它的格式是/c/语言代号/词语,其中,常用的语言代号为en(英语),zh(中文),其他可详见其介绍

而词语有专门的变换规则,为了查到相关的词向量,我们不能直接用词语查找,而是必须要使用原库提供的text_to_uri.py进行转换

下载该文件或下载该库,在其同一路径下,可以这样调用它

代码语言:javascript
复制
from text_to_uri import standardized_uri
standardized_uri('en', 'a test phrase')
代码语言:javascript
复制
'/c/en/test_phrase'
代码语言:javascript
复制
standardized_uri('en', '100 yuan')
代码语言:javascript
复制
'/c/en/###_yuan'
代码语言:javascript
复制
standardized_uri('zh', '你好')
代码语言:javascript
复制
'/c/zh/你好'

如果我们有一段话,需要获得每个词的向量又要如何操作呢?

ConceptNet Numberbatch同时支持单个词语和一些词组,不过为了操作的方便,一般不使用词组,而都是直接使用单个词语的向量。这样,我们可以用现有的工具先进行分词,再进行变换,就可以找到对应向量了。

代码语言:javascript
复制
import numpy as np
from text_to_uri import standardized_uri
from nltk import word_tokenize
sentence = "hello world"
words = word_tokenizer(sentence)
for wd in words:
	concept = standardized_uri("en", wd)
	# 假设词向量存在一个叫word2vec的字典中,获得其向量emb(如果找不到,就使用0向量)
	emb = word2vec.get(concept, np.zeros(300))

本文内容就到此为止了。对于常识知识研究领域有更多兴趣的读者,还可以在这里找到我们整理的一份常识知识必读论文列表,希望能提供一些帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/11/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 使用
相关产品与服务
灰盒安全测试
腾讯知识图谱(Tencent Knowledge Graph,TKG)是一个集成图数据库、图计算引擎和图可视化分析的一站式平台。支持抽取和融合异构数据,支持千亿级节点关系的存储和计算,支持规则匹配、机器学习、图嵌入等图数据挖掘算法,拥有丰富的图数据渲染和展现的可视化方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档