资源 | 知网(HowNet)知识库的简单调用指南

机器之心整理

参与:蒋思源

机器之心曾采访过语知科技的董强先生,在那一篇文章中,我们详细讨论了基于知网知识库的 NLP 解决方案。虽然我们已经了解了这种方法的潜力,但只有真正实现了调用过程,并明确体会到知网知识库的强大之处,我们才真正对这种方法有一个直观的理解。

基于知网(HowNet)知识库的方法在实践和研究中确实大大提升了 NLP 的性能。在最近的 ACL 2017 会议中,清华大学牛艺霖、谢若冰、刘知远和孙茂松等人发表了一篇名为《Improved Word Representation Learning with Sememes》的论文。该论文首次将义原信息考虑到词向量的学习任务中,在很大程度上提升了词向量的表示能力。该论文是以经典的 skip-gram 模型为基础提出来的改进模型,相对于 skip-gram 模型只考虑了上下文信息,该论文提出的模型同时考虑词的义原信息以及义原信息与词义之间的关系。

除此之外,清华大学袁星驰,谢若冰,刘知远,孙茂松等人还在 IJCAIL 2017 上发表了一篇名为《Lexical Sememe Prediction via Word Embeddings and Matrix Factorization》的论文。该论文介绍了义原信息(sememe)在提高词向量表示能力方面的作用,并且首次提出从已有的人工标注数据集学习词汇与义原的通用的关系,借助协同过滤和矩阵分解的方法,自动构造出新词的义原。

  • 论文:Improved Word Representation Learning with Sememes
  • 地址:http://www.thunlp.org/~lzy/publications/acl2017_sememe.pdf
  • PaperWeekly 解读
  • 论文:Lexical Sememe Prediction via Word Embeddings and Matrix Factorization
  • 地址:http://www.thunlp.org/~lzy/publications/ijcai2017_sememe.pdf
  • PaperWeekly 解读

由此可见,知网知识库确实为 NLP 提供了一个强大的平台。下面在详细解释调用 API 之前,我们先简要了解知网知识库的结构与概念。之后我们再详细说明整个 API 的参数与调用过程。

义原的定义

知识是一个系统,是一个包含着各种概念与概念之间的关系,以及概念的属性与属性之间的关系的系统。富有知识的人不仅掌握了更多的概念,同时也掌握了更多的概念之间的关系以及概念的属性与属性之间的关系。所以知网是一种可以被称为知识系统的常识性知识库。它以通用的概念为描述对象,建立并描述这些概念之间的关系。

董强先生表明,义原(Sememe)是最基本的、不易于再分割的意义的最小单位。例如:「人」虽然是一个非常复杂的概念,它可以是多种属性的集合体,但我们也可以把它看作为一个义原。我们设想所有的概念都可以分解成各种各样的义原。同时我们也设想应该有一个有限的义原集合,其中的义原可以组合成一个无限的概念集合。如果我们能够把握这一有限的义原集合,并利用它来描述概念之间的关系以及属性与属性之间的关系,我们就有可能建立我们设想的知识系统。

董强先生说:「义原的是知网基本应用的描述单位,它是基于我们的观察而得出,比如说现代汉语词典,它仅使用 2000 多汉字就能解释所有的词条。所以知网的方法就是对大约六千个汉字进行考察和分析来提取有限的义原集合。以事件类为例,在中文中具有事件义原的汉字(单纯词)中曾提取出 3200 个义原。但我们需要对重复义原进行合并,3200 个事件义原在初步合并后可得到 1700 个,进一步归类后得到大约 800 多个义原。因为这些义原完全不涉及多音节的词语,所以我们需要将其作为标注集去标注多音节的词。最后我们需要对所有 2800 多个义原进行编码,编码采用助记符的形式表达,如词语「打开」,其中一个概念是「打开一个东西(盒子)」的动作,用义原 {open|打开} 表示,另外一个意思例如「打开一盏灯」,义原的表示的方式就是 {turn on|打开}。」

概念的表征

知网还着力要反映概念之间和概念的属性之间的关系。知网知识网络体系明确地提供给了计算机,因此我们可以输入形式化的知识而构建计算机系统来实现自然语言处理任务。我们不仅需要义原,同时还需要它们之间的关系来表示知识。通常一个词其具体的概念会采用树型的结构利用义原和关系描述该概念。例如「医院」这一个词的概念根据具体语境可定义为 DEF={InstitutePlace|场所:domain={medical|医},{doctor|医治:content={disease|疾病},location={~}}},我们可以看到整个词的概念属性可以由多个义原按照关系和层次进行定义。

整个知识网络都是以义原为基础建立起来的概念性系统。义原是通过关系描述概念的最小单位,知网认为它是一种最基本的概念,任何复杂的概念都是由基本概念通过某种关系构建而成,而知网用基本单位描述这种关系的方法我们称之为 KDML(Knowledge Database Markup Language),这种描述方法将复杂中多个义原嵌套和多个关系嵌套的问题解决了。

关于知网更多信息请查看:http://www.keenage.com/zhiwang/c_zhiwang.html

下面,我们将开始介绍知网知识库的 API 参数与调用过程,此外这一部分还提供了调用案例,读者可根据该实例尝试调用知网知识库。

一、API参数集

参数名

说明

备注

api_key

注册用户的认证唯一标识,用户注册登录后即可看到

接口调用必传参数

text

需要分析的文本,适用于中、英文语义分析接口

UTF-8编码格式,语义解析必传参数

word1

相似性/相关性接口的传入词语一

中、英文词语均可,必传参数

word2

相似性/相关性接口的传入词语二

中、英文词语均可,必传参数

unitId

词语在知网词典中的义项ID号,语义解析接口的衍生接口,从语义解析接口返回的结果中即可提取出“unitId”

每个字(词)拥有唯一unitId,详情参考【调用示例】

pattern

pos:词性标注;st:语义标注;sd:语义判定;all:全文解析

用以指定所需提供的分析结果

二、调用方式

  • 注册成为知网用户,获得知网用户唯一标识apiKey
  • 按照样例调用接口获取相应服务
  • 注意:当日调用接口的次数不得超过5000次
  • 参数传递建议使用post提交

三、调用示例

调用示例中为目前网站免费提供的接口,鉴于中、英文分析接口相对复杂,如有疑问请参考【接口调用流程演示】或联系管理员

接口功能

示例URL

返回值

Method

中文分析

http://yuzhinlp.com/api/call_chn.do &apiKey=xxxxxxxx&input="我爱中国,我爱世界。"

Json字符串,详情查看【接口调用流程演示】

post

英文分析

http://yuzhinlp.com/api/call_eng.do&apiKey=xxxxxxxx&input="I love China, I love this world!"

Json字符串,详情查看【接口调用流程演示】

post

词语相似度检测

http://yuzhinlp.com/api/call_similarity.do&apiKey=xxxxxxxx&word1=doctor&word2=护士

Json字符串,例:{"similarity":"0.018605"},其中"similarity"为key,"0.018605"代表相似度结果

post

词语相关性检测

http://yuzhinlp.com/api/call_relevance.do&apiKey=xxxxxxxx&word1=doctor&word2=护士

Json字符串,例:{"relevance":"1"},其中"relevance"为key,"1"为值,1代表相关,0代表不相关

post

根据UNITID查询详细词性

http://yuzhinlp.com/api/call_UnitIdApi.do&unitId=202591

Json字符串,详情查看【接口调用流程演示】

post

四、接口调用流程演示

1、编写接口调用工具类

该流程是建立于【调用方式】的基础上,以中文语义解析接口为例,请务必设定为post提交,并设置参数编码为UTF-8

import java.util.ArrayList;    import java.util.List;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import com.alibaba.fastjson.JSONObject;

    public class ApiTest {
        public static void main(String[] args){
            //创建post请求
            CloseableHttpClient httpclient = HttpClients.createDefault();
            HttpPost httpPost = new HttpPost("http://yuzhinlp.com/api/call_chn.do");
            //post请求传入参数
            List<NameValuePair> parameters = new ArrayList<NameValuePair>();
            parameters.add(new BasicNameValuePair("apiKey", "YourApiKey"));
            parameters.add(new BasicNameValuePair("input", "它好你也好"));
            CloseableHttpResponse response = null;
            try {
                UrlEncodedFormEntity formEntity; 
//设置参数编码
                formEntity = new UrlEncodedFormEntity(parameters, "UTF-8"); 
                httpPost.setEntity(formEntity);
                // 执行请求
                response = httpclient.execute(httpPost);
                // 判断返回状态是否为200
                if (response.getStatusLine().getStatusCode() == 200) {
                    //调用结果
                     String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                    JSONObject object = JSONObject.parseObject(content);
                    String result = object.get("success").toString();
                    //打印到控制台        
                    System.out.println(result);                     
                 }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                try {  
                    if (response != null) {
                        response.close();
                    }
                    httpclient.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

2、接口运行返回结果

运行后返回Json格式数据结果,其中包含连个父节点分别为"sentence"(您输入的文本内容)和"nodes"(分析结果),"nodes"节点下包含另一个Json格式的数据,即为您所输入的每一个字/词的详细分析结果,其中子节点中的参数含义请参照【参数节点描述】

[{            "sentence": "你来跑,我来追,追上你我就嘿嘿嘿。",             "nodes": [{                    "NoID_1": "000",                     "MaskID": "",                     "NoID_2": "000",                     "expression": "ROOT",                     "FH": "",                     "Son": "",                     "ES": "",                     "YS": "",                     "DP": "",                     "DeepSon": "",                     "log": "",                     "DeepLog": "",                     "POS": "",                     "UnitID": ""                },                ...,                {                    "NoID_1": " 18",                     "MaskID": " ",                     "NoID_2": " 18",                     "expression": "嘿嘿",                     "FH": "000",                     "Son": "                              ",                     "ES": "   ",                     "YS": "   ",                     "DP": "   ",                     "DeepSon": "         ",                     "log": "",                     "DeepLog": "",                     "POS": "echo",                     "UnitID": "074279"                },{                    "NoID_1": " 21",                     "MaskID": " ",                     "NoID_2": " 21",                     "expression": "。",                     "FH": "000",                     "Son": "                              ",                     "ES": "   ",                     "YS": "   ",                     "DP": "   ",                     "DeepSon": "         ",                     "log": "",                     "DeepLog": "",                     "POS": "pun",                     "UnitID": "010349"                }]        }]

3、返回结果参数含义明细表

名称

描述

NoID_1

输入文本经过词法处理后各定形词语在文本中排列的序号

MaskID

加工过程中,为了简化句子复杂度暂时屏蔽的标记

NoID_2

输入文本经过命名体识别和语义判定后在文本中排列的序号

expression

各个定形后的词语

FH

词语的父节点的序号

Son

词语的子节点的序号

ES

词语的姐姐节点的序号

YS

词语的妹妹节点的序号

DP

词语的深层父节点的序号

DeepSon

词语的深层子节点的序号

log

词语的逻辑语义关系

DeepLog

词语的深层逻辑语义关系

POS

词语的词性

UnitID

词语在知网词典中的义项ID号

4、关于UNITID详细词性的查询

在中、英文语义解析的基础上,调用“call_UnitIdApi.do”接口,并传入参数apiKey和UnitID。其中apiKey为您的凭证,UnitID参数则从刚才中、英文语义解析接口返回的数据中提取。返回结果如下:

UnitID 详细数据:
      NO.=074279
      W_C=嘿嘿
      G_C=echo [2] [hei1 hei1]
      S_C=
      E_C=
      W_E=hey
      G_E=noun [3 heynoun-0static声 ]
      S_E=
      E_E=
      DEF={sound|声:{MakeSound|发声:content={~},time={laugh|笑}}}
      RMK=

5、UntiID属性参数对照表

名称

描述

NO.

记录编号

W_C

中文词语

G_C

中文信息

S_C

中文情感标识

E_C

中文样例

W_E

英文词语

G_E

英文信息

S_E

英文情感标识

E_E

英文样例

DEF

概念定义

RMK

备注

五、信息提取服务

六、技术优势

  • 完善的多语种的知识系统
  • 独有的义原分类体系
  • 独有的概念描述方式(KDML)
  • 完善的事件关系与角色框架
  • 事件关系与角色转换规则,赋予系统推理能力
  • 可使深度学习直接在语义层面进行计算
  • 无需为每种语言分别建立学习模型

七、应用场景

  • 语音指令解析:以分词和词性标注为基础,分析语音命令中的关键名词、动词、数量、时间等,准确理解命令的含义,提高用户体验
  • 多轮交互式搜索:通过专名识别定位多轮对话中的核心实体,自动判断后续对话中对该实体的进一步信息需求
  • 实体数据库构建:通过挖掘实体之间、实体与关键词之间的关联,构建实体信息(如人物、机构)数据库
  • 语言理解:通过分析用户Query的依存句法结构信息,抽取其中的语义主干及相关语义成分,帮助智能产品实现对用户意图的精准理解
  • 知识发掘:对大规模非结构化文本数据进行句法结构分析,从中抽取实体、概念、语义关系等信息,帮助构建领域知识或世界知识
  • 语言结构匹配:基于语言对(Query-WebTitle)之间的句法结构信息进行语言的匹配计算,帮助提升语义匹配计算的准确率
  • 搜索query改写:通过寻找搜索query中词语的相似词,进行合理的替换,从而达到改写query的目的,提高搜索结果的多样性
  • 专有名词挖掘:通过词语间语义相关性计算寻找人名、地名、机构名等词的相关词,扩大专有名词的词典,更好的辅助应用
  • 深度学习训练(技术结合):集合DNN深度学习大量样本训练模型,完成词语的向量化,建立高精度的词向量表示体系
  • 信息检索:在很多应用中都需要根据文本来检索其相似文本,需求场景非常普遍。不仅适用于纯文本检索,还可以利用标签等来检索图片、视频
  • 新闻推荐:通过用户刚刚浏览的新闻标题,检索出其他的相似新闻推荐给用户
  • 智能客服:用户输入一个问题时,自动为用户寻找相似的问题和答案

本文为机器之心整理,转载请联系本公众号获得授权。

原文发布于微信公众号 - 机器之心(almosthuman2014)

原文发表时间:2017-09-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PPV课数据科学社区

用 Python 做文本挖掘的流程

作者:肖智博 来源:https://zhuanlan.zhihu.com/p/19630762 点击阅读原文可进入超链接。 收集数据 数据集。如果是已经被人做...

49280
来自专栏架构师之路

洗稿,技术上怎么判断文章相似性?

这几天“差评洗稿”的事情,闹得沸沸扬扬,楼主本身也是内容创作的手艺人,简单说两句。

21440
来自专栏素质云笔记

R︱Yandex的梯度提升CatBoost 算法(官方述:超越XGBoost/lightGBM/h2o)

俄罗斯搜索巨头 Yandex 昨日宣布开源 CatBoost ,这是一种支持类别特征,基于梯度提升决策树的机器学习方法。 CatBoost 是由 Yand...

60790
来自专栏程序人生

谈谈状态机

题记:上周做 BBL 里讲了我们 Tubi TV 内部做 DSL 的一些简单实践,大家反馈不错。有同事建议我给大家先补补 FSM,之后再进阶 CFG,可能会更顺...

39570
来自专栏Aloys的开发之路

OOAD与UML笔记

UML基础介绍 1.UML的定义 统一建模语言(UML)是一种图形化的语言,它可以帮助我们在OOAD过程中标识元素、构建模块、分析过程并可通过文档说明系统中的重...

20980
来自专栏落影的专栏

OpenGL ES实践教程(九)OpenGL与视频混合

前言 前面的实践教程: OpenGL ES实践教程1-Demo01-AVPlayer OpenGL ES实践教程2-Demo02-摄像头采集数据和渲染 O...

61550
来自专栏好好学java的技术栈

“365算法每日学计划”:03打卡-贪心算法

自从开始做公众号开始,就一直在思考,怎么把算法的训练做好,因为思海同学在算法这方面的掌握确实还不够。因此,我现在想做一个“365算法每日学计划”。

25520
来自专栏大数据挖掘DT机器学习

Python NLTK自然语言处理:词干、词形与MaxMatch算法

CSDN:白马负金羁 自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。自然语言工具箱(NLTK,Natural Language Toolkit)...

55050
来自专栏CDA数据分析师

为什么说 Python 是数据科学的发动机(二)工具篇(附视频中字)

毋庸置疑,Python是用于数据分析的最佳编程语言,因为它的库在存储、操作和获取数据方面有出众的能力。 在PyData Seattle 2017中,Jake V...

247100
来自专栏数据魔术师

运筹学教学|修正单纯形法(revised simplex algorithm)代码分享及详细注释

欢声笑语中,小编学会了单纯形法,心里还有点小傲骄!!准备晚上去PUBG里面潇洒一把~ ? 然而,老板突然来电话说,单纯形法有升级的版本!需要我赶紧准备一份代码。...

1.1K80

扫码关注云+社区

领取腾讯云代金券